Skip to content

Commit

Permalink
Omnibar: safe calling Android methods (#5117)
Browse files Browse the repository at this point in the history
Task/Issue URL:
https://app.asana.com/0/1174433894299346/1208502796109620/f

### Description
This PR adds a safe way to call methods in the `LegacyOmnibarView`. This
is needed because the way we interact with the Omnibar doesn’t take into
account that Dagger might not have injected yet.

### Steps to test this PR
Smoke tests and QA
  • Loading branch information
malmstein authored Oct 10, 2024
1 parent d300277 commit 57598db
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ class LegacyOmnibarView @JvmOverloads constructor(
internal val trackersAnimation: LottieAnimationView by lazy { findViewById(R.id.trackersAnimation) }
internal val duckPlayerIcon: ImageView by lazy { findViewById(R.id.duckPlayerIcon) }

private var privacyShield: PrivacyShield? = null

init {
val attr = context.theme.obtainStyledAttributes(attrs, R.styleable.LegacyOmnibarView, defStyle, 0)
omnibarPosition = OmnibarPosition.entries[attr.getInt(R.styleable.LegacyOmnibarView_omnibarPosition, 0)]
Expand All @@ -163,22 +165,32 @@ class LegacyOmnibarView @JvmOverloads constructor(
super.onAttachedToWindow()

pulseAnimation = PulseAnimation(findViewTreeLifecycleOwner()!!)

val deferredPrivacyShield = privacyShield
if (deferredPrivacyShield != null) {
setPrivacyShield(false, privacyShield = deferredPrivacyShield)
privacyShield = null
}
}

override fun setExpanded(expanded: Boolean) {
when (omnibarPosition) {
OmnibarPosition.TOP -> super.setExpanded(expanded)
OmnibarPosition.BOTTOM -> (behavior as BottomAppBarBehavior).animateToolbarVisibility(expanded)
safeCall {
when (omnibarPosition) {
OmnibarPosition.TOP -> super.setExpanded(expanded)
OmnibarPosition.BOTTOM -> (behavior as BottomAppBarBehavior).animateToolbarVisibility(expanded)
}
}
}

override fun setExpanded(
expanded: Boolean,
animate: Boolean,
) {
when (omnibarPosition) {
OmnibarPosition.TOP -> super.setExpanded(expanded, animate)
OmnibarPosition.BOTTOM -> (behavior as BottomAppBarBehavior).animateToolbarVisibility(expanded)
safeCall {
when (omnibarPosition) {
OmnibarPosition.TOP -> super.setExpanded(expanded, animate)
OmnibarPosition.BOTTOM -> (behavior as BottomAppBarBehavior).animateToolbarVisibility(expanded)
}
}
}

Expand All @@ -193,45 +205,59 @@ class LegacyOmnibarView @JvmOverloads constructor(
isCustomTab: Boolean,
privacyShield: PrivacyShield,
) {
val animationViewHolder = if (isCustomTab) {
customTabToolbarContainer.customTabShieldIcon
} else {
shieldIcon
if (!isAttachedToWindow) {
this.privacyShield = privacyShield
}

safeCall {
val animationViewHolder = if (isCustomTab) {
customTabToolbarContainer.customTabShieldIcon
} else {
shieldIcon
}
privacyShieldView.setAnimationView(animationViewHolder, privacyShield)
cancelTrackersAnimation()
}
}

private fun safeCall(call: () -> Unit) {
if (isAttachedToWindow) {
call()
}
privacyShieldView.setAnimationView(animationViewHolder, privacyShield)
cancelTrackersAnimation()
}

fun renderBrowserViewState(
viewState: BrowserViewState,
tabDisplayedInCustomTabScreen: Boolean,
) {
if (viewState.browserShowing) {
daxIcon.isVisible = viewState.showDaxIcon
duckPlayerIcon.isVisible = viewState.showDuckPlayerIcon
shieldIcon.isInvisible =
!viewState.showPrivacyShield.isEnabled() || viewState.showDaxIcon || viewState.showDuckPlayerIcon
clearTextButton.isVisible = viewState.showClearButton
searchIcon.isVisible = viewState.showSearchIcon
} else {
daxIcon.isVisible = false
duckPlayerIcon.isVisible = false
shieldIcon.isVisible = false
clearTextButton.isVisible = viewState.showClearButton
searchIcon.isVisible = true
}
safeCall {
if (viewState.browserShowing) {
daxIcon.isVisible = viewState.showDaxIcon
duckPlayerIcon.isVisible = viewState.showDuckPlayerIcon
shieldIcon.isInvisible =
!viewState.showPrivacyShield.isEnabled() || viewState.showDaxIcon || viewState.showDuckPlayerIcon
clearTextButton.isVisible = viewState.showClearButton
searchIcon.isVisible = viewState.showSearchIcon
} else {
daxIcon.isVisible = false
duckPlayerIcon.isVisible = false
shieldIcon.isVisible = false
clearTextButton.isVisible = viewState.showClearButton
searchIcon.isVisible = true
}

tabsMenu.isVisible = viewState.showTabsButton && !tabDisplayedInCustomTabScreen
fireIconMenu.isVisible = viewState.fireButton is HighlightableButton.Visible && !tabDisplayedInCustomTabScreen
browserMenu.isVisible = viewState.showMenuButton is HighlightableButton.Visible
tabsMenu.isVisible = viewState.showTabsButton && !tabDisplayedInCustomTabScreen
fireIconMenu.isVisible = viewState.fireButton is HighlightableButton.Visible && !tabDisplayedInCustomTabScreen
browserMenu.isVisible = viewState.showMenuButton is HighlightableButton.Visible

spacer.isVisible = viewState.showVoiceSearch && viewState.showClearButton
spacer.isVisible = viewState.showVoiceSearch && viewState.showClearButton

renderPulseAnimation(viewState)
renderPulseAnimation(viewState)
}
}

fun setScrollingEnabled(enabled: Boolean) {
if (isAttachedToWindow) {
safeCall {
if (enabled) {
omnibarScrolling.enableOmnibarScrolling(toolbarContainer)
} else {
Expand Down Expand Up @@ -297,19 +323,23 @@ class LegacyOmnibarView @JvmOverloads constructor(
}

fun startTrackersAnimation(events: List<Entity>?) {
animatorHelper.startTrackersAnimation(
context = context,
shieldAnimationView = shieldIcon,
trackersAnimationView = trackersAnimation,
omnibarViews = omnibarViews(),
entities = events,
)
if (this::animatorHelper.isInitialized) {
animatorHelper.startTrackersAnimation(
context = context,
shieldAnimationView = shieldIcon,
trackersAnimationView = trackersAnimation,
omnibarViews = omnibarViews(),
entities = events,
)
}
}

fun onNewProgress(
newProgress: Int,
onAnimationEnd: (Animator?) -> Unit,
) {
smoothProgressAnimator.onNewProgress(newProgress, onAnimationEnd)
safeCall {
smoothProgressAnimator.onNewProgress(newProgress, onAnimationEnd)
}
}
}
1 change: 1 addition & 0 deletions app/src/main/res/layout/view_legacy_omnibar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
android:gravity="center"
android:importantForAccessibility="no"
android:padding="6dp"
android:visibility="gone"
android:src="@drawable/ic_find_search_20_a05" />

<FrameLayout
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/view_legacy_omnibar_bottom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
android:gravity="center"
android:importantForAccessibility="no"
android:padding="6dp"
android:visibility="gone"
android:src="@drawable/ic_find_search_20_a05" />

<FrameLayout
Expand Down

0 comments on commit 57598db

Please sign in to comment.