You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.9 KiB
Kotlin
51 lines
1.9 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.browser.infobanner
|
|
|
|
import android.content.Context
|
|
import android.util.AttributeSet
|
|
import android.view.View
|
|
import androidx.annotation.VisibleForTesting
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
import mozilla.components.browser.toolbar.BrowserToolbar
|
|
|
|
/**
|
|
* A [CoordinatorLayout.Behavior] implementation to be used when placing [InfoBanner]
|
|
* below the BrowserToolbar with which is has to scroll.
|
|
*
|
|
* This Behavior will keep the Y translations of [InfoBanner] and the top [BrowserToolbar] in sync
|
|
* so that the banner will be shown between:
|
|
* - the top of the container, being translated over the initial toolbar height (toolbar fully collapsed)
|
|
* - immediately below the toolbar (toolbar fully expanded).
|
|
*/
|
|
class DynamicInfoBannerBehavior(
|
|
context: Context?,
|
|
attrs: AttributeSet?
|
|
) : CoordinatorLayout.Behavior<View>(context, attrs) {
|
|
@VisibleForTesting
|
|
internal var toolbarHeight: Int = 0
|
|
|
|
override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
|
|
if (dependency::class == BrowserToolbar::class) {
|
|
toolbarHeight = dependency.height
|
|
setBannerYTranslation(child, dependency.translationY)
|
|
return true
|
|
}
|
|
|
|
return super.layoutDependsOn(parent, child, dependency)
|
|
}
|
|
|
|
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
|
|
setBannerYTranslation(child, dependency.translationY)
|
|
|
|
return true
|
|
}
|
|
|
|
@VisibleForTesting
|
|
internal fun setBannerYTranslation(banner: View, newYTranslation: Float) {
|
|
banner.translationY = toolbarHeight + newYTranslation
|
|
}
|
|
}
|