Reload StackStateAnimator resources on configuration changes Fixes: 317061579 Test: atest StackStateAnimatorTest Flag: NA Change-Id: Ib88867339c5fbf1265f704e541b84cd81cbb67ce
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 42b56e7..ebe7fb0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -233,7 +233,7 @@ private final ArrayList<AnimationEvent> mAnimationEvents = new ArrayList<>(); private final ArrayList<View> mSwipedOutViews = new ArrayList<>(); private NotificationStackSizeCalculator mNotificationStackSizeCalculator; - private final StackStateAnimator mStateAnimator = new StackStateAnimator(this); + private final StackStateAnimator mStateAnimator; private boolean mAnimationsEnabled; private boolean mChangePositionInProgress; private boolean mChildTransferInProgress; @@ -670,6 +670,7 @@ mExpandHelper.setScrollAdapter(mScrollAdapter); mStackScrollAlgorithm = createStackScrollAlgorithm(context); + mStateAnimator = new StackStateAnimator(context, this); mShouldDrawNotificationBackground = res.getBoolean(R.bool.config_drawNotificationBackground); setOutlineProvider(mOutlineProvider); @@ -1083,6 +1084,7 @@ } mGapHeight = res.getDimensionPixelSize(R.dimen.notification_section_divider_height); mStackScrollAlgorithm.initView(context); + mStateAnimator.initView(context); mAmbientState.reload(context); mPaddingBetweenElements = Math.max(1, res.getDimensionPixelSize(R.dimen.notification_divider_height));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index fb14a91..ab62ed6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
@@ -23,6 +23,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.content.Context; import android.util.Property; import android.view.View; @@ -66,9 +67,8 @@ public static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2; private static final int MAX_STAGGER_COUNT = 5; - private final int mGoToFullShadeAppearingTranslation; - @VisibleForTesting - float mHeadsUpAppearStartAboveScreen; + @VisibleForTesting int mGoToFullShadeAppearingTranslation; + @VisibleForTesting float mHeadsUpAppearStartAboveScreen; private final ExpandableViewState mTmpState = new ExpandableViewState(); private final AnimationProperties mAnimationProperties; public NotificationStackScrollLayout mHostLayout; @@ -92,14 +92,9 @@ private NotificationShelf mShelf; private StackStateLogger mLogger; - public StackStateAnimator(NotificationStackScrollLayout hostLayout) { + public StackStateAnimator(Context context, NotificationStackScrollLayout hostLayout) { mHostLayout = hostLayout; - // TODO(b/317061579) reload on configuration changes - mGoToFullShadeAppearingTranslation = - hostLayout.getContext().getResources().getDimensionPixelSize( - R.dimen.go_to_full_shade_appearing_translation); - mHeadsUpAppearStartAboveScreen = hostLayout.getContext().getResources() - .getDimensionPixelSize(R.dimen.heads_up_appear_y_above_screen); + initView(context); mAnimationProperties = new AnimationProperties() { @Override public AnimationFilter getAnimationFilter() { @@ -118,6 +113,21 @@ }; } + /** + * Needs to be called on configuration changes, to update cached resource values. + */ + public void initView(Context context) { + updateResources(context); + } + + private void updateResources(Context context) { + mGoToFullShadeAppearingTranslation = + context.getResources().getDimensionPixelSize( + R.dimen.go_to_full_shade_appearing_translation); + mHeadsUpAppearStartAboveScreen = context.getResources() + .getDimensionPixelSize(R.dimen.heads_up_appear_y_above_screen); + } + protected void setLogger(StackStateLogger logger) { mLogger = logger; }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt index 3d90cd2..dfbe1ac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt
@@ -21,6 +21,7 @@ import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.res.R import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.shared.NotificationsImprovedHunAnimation import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.AnimationEvent @@ -29,6 +30,7 @@ import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -39,6 +41,8 @@ import org.mockito.Mockito.verify private const val VIEW_HEIGHT = 100 +private const val FULL_SHADE_APPEAR_TRANSLATION = 300 +private const val HEADS_UP_ABOVE_SCREEN = 80 @SmallTest @RunWith(AndroidTestingRunner::class) @@ -53,9 +57,15 @@ private val runnableCaptor: ArgumentCaptor<Runnable> = argumentCaptor() @Before fun setUp() { + overrideResource( + R.dimen.go_to_full_shade_appearing_translation, + FULL_SHADE_APPEAR_TRANSLATION + ) + overrideResource(R.dimen.heads_up_appear_y_above_screen, HEADS_UP_ABOVE_SCREEN) + whenever(stackScroller.context).thenReturn(context) whenever(view.viewState).thenReturn(viewState) - stackStateAnimator = StackStateAnimator(stackScroller) + stackStateAnimator = StackStateAnimator(mContext, stackScroller) } @Test @@ -124,4 +134,22 @@ verify(view, description("should be called at the end of the animation")) .removeFromTransientContainer() } + + @Test + fun initView_updatesResources() { + // Given: the resource values are initialized in the SSA + assertThat(stackStateAnimator.mGoToFullShadeAppearingTranslation) + .isEqualTo(FULL_SHADE_APPEAR_TRANSLATION) + assertThat(stackStateAnimator.mHeadsUpAppearStartAboveScreen) + .isEqualTo(HEADS_UP_ABOVE_SCREEN) + + // When: initView is called after the resources have changed + overrideResource(R.dimen.go_to_full_shade_appearing_translation, 200) + overrideResource(R.dimen.heads_up_appear_y_above_screen, 100) + stackStateAnimator.initView(mContext) + + // Then: the resource values are updated + assertThat(stackStateAnimator.mGoToFullShadeAppearingTranslation).isEqualTo(200) + assertThat(stackStateAnimator.mHeadsUpAppearStartAboveScreen).isEqualTo(100) + } }