diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-03-08 03:41:44 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-03-08 03:41:44 +0000 |
commit | ec198dbcaea1a58660e95cb748c7f9722d56e13f (patch) | |
tree | e3b07574396277fa3ffbd062f770a053055fd7bf | |
parent | daa3c8b310ee30c6943f2a1450d8b284f8ba8a59 (diff) | |
parent | 25c8931f7fa532d4c2703b9d6d138064e90fd2dd (diff) | |
download | base-ec198dbcaea1a58660e95cb748c7f9722d56e13f.tar.gz |
Merge cherrypicks of [16838784, 16871451, 16850576] into sc-d2-release.
Change-Id: Ib8e4584756fab274fb3ac9a5ade0b936525d32dc
9 files changed, 64 insertions, 262 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java index 36319380ad50..52db1bd00c8e 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java @@ -105,17 +105,7 @@ public class DozeScreenState implements DozeMachine.Part { updateUdfpsController(); if (mUdfpsController == null) { - mAuthController.addCallback(new AuthController.Callback() { - @Override - public void onAllAuthenticatorsRegistered() { - updateUdfpsController(); - } - - @Override - public void onEnrollmentsChanged() { - updateUdfpsController(); - } - }); + mAuthController.addCallback(mAuthControllerCallback); } } @@ -128,6 +118,11 @@ public class DozeScreenState implements DozeMachine.Part { } @Override + public void destroy() { + mAuthController.removeCallback(mAuthControllerCallback); + } + + @Override public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { int screenState = newState.screenState(mParameters); mDozeHost.cancelGentleSleep(); @@ -222,4 +217,16 @@ public class DozeScreenState implements DozeMachine.Part { mWakeLock.setAcquired(false); } } + + private final AuthController.Callback mAuthControllerCallback = new AuthController.Callback() { + @Override + public void onAllAuthenticatorsRegistered() { + updateUdfpsController(); + } + + @Override + public void onEnrollmentsChanged() { + updateUdfpsController(); + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index e82e9d284bdd..e348f2ca7b31 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -428,7 +428,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca public void setBrightnessMirrorController( BrightnessMirrorController brightnessMirrorController) { mQSPanelController.setBrightnessMirror(brightnessMirrorController); - mQuickQSPanelController.setBrightnessMirror(brightnessMirrorController); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt b/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt deleted file mode 100644 index 65889d792769..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.qs - -import androidx.annotation.VisibleForTesting -import com.android.systemui.settings.brightness.BrightnessController -import com.android.systemui.settings.brightness.BrightnessSliderController -import com.android.systemui.settings.brightness.MirroredBrightnessController -import com.android.systemui.statusbar.policy.BrightnessMirrorController -import javax.inject.Inject - -/** - * Controls brightness slider in QQS, which is visible only in split shade. It's responsible for - * showing/hiding it when appropriate and (un)registering listeners - */ -class QuickQSBrightnessController @VisibleForTesting constructor( - private val brightnessControllerFactory: () -> BrightnessController -) : MirroredBrightnessController { - - @Inject constructor( - brightnessControllerFactory: BrightnessController.Factory, - brightnessSliderControllerFactory: BrightnessSliderController.Factory, - quickQSPanel: QuickQSPanel - ) : this(brightnessControllerFactory = { - val slider = brightnessSliderControllerFactory.create(quickQSPanel.context, - quickQSPanel) - slider.init() - quickQSPanel.setBrightnessView(slider.rootView) - brightnessControllerFactory.create(slider) - }) - - private var isListening = false - private var brightnessController: BrightnessController? = null - private var mirrorController: BrightnessMirrorController? = null - - fun init(shouldUseSplitNotificationShade: Boolean) { - refreshVisibility(shouldUseSplitNotificationShade) - } - - /** - * Starts/Stops listening for brightness changing events. - * It's fine to call this function even if slider is not visible (which would be the case for - * all small screen devices), it will just do nothing in that case - */ - fun setListening(listening: Boolean) { - if (listening) { - // controller can be null when slider was never shown - if (!isListening && brightnessController != null) { - brightnessController?.registerCallbacks() - isListening = true - } - } else { - brightnessController?.unregisterCallbacks() - isListening = false - } - } - - fun checkRestrictionAndSetEnabled() { - brightnessController?.checkRestrictionAndSetEnabled() - } - - fun refreshVisibility(shouldUseSplitNotificationShade: Boolean) { - if (shouldUseSplitNotificationShade) { - showBrightnessSlider() - } else { - hideBrightnessSlider() - } - } - - override fun setMirror(controller: BrightnessMirrorController) { - mirrorController = controller - mirrorController?.let { brightnessController?.setMirror(it) } - } - - private fun hideBrightnessSlider() { - brightnessController?.hideSlider() - } - - private fun showBrightnessSlider() { - if (brightnessController == null) { - brightnessController = brightnessControllerFactory() - mirrorController?.also { brightnessController?.setMirror(it) } - brightnessController?.registerCallbacks() - isListening = true - } - brightnessController?.showSlider() - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index 92690c7d1202..fdd764ce7127 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -30,8 +30,6 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.customize.QSCustomizerController; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.logging.QSLogger; -import com.android.systemui.settings.brightness.BrightnessMirrorHandler; -import com.android.systemui.statusbar.policy.BrightnessMirrorController; import java.util.ArrayList; import java.util.List; @@ -51,9 +49,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> } }; - // brightness is visible only in split shade - private final QuickQSBrightnessController mBrightnessController; - private final BrightnessMirrorHandler mBrightnessMirrorHandler; private final FooterActionsController mFooterActionsController; @Inject @@ -63,13 +58,10 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> @Named(QUICK_QS_PANEL) MediaHost mediaHost, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, DumpManager dumpManager, - QuickQSBrightnessController quickQSBrightnessController, @Named(QQS_FOOTER) FooterActionsController footerActionsController ) { super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); - mBrightnessController = quickQSBrightnessController; - mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); mFooterActionsController = footerActionsController; } @@ -79,7 +71,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> mMediaHost.setExpansion(0.0f); mMediaHost.setShowsOnlyActiveMedia(true); mMediaHost.init(MediaHierarchyManager.LOCATION_QQS); - mBrightnessController.init(mShouldUseSplitNotificationShade); mFooterActionsController.init(); mFooterActionsController.refreshVisibility(mShouldUseSplitNotificationShade); } @@ -88,20 +79,17 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> protected void onViewAttached() { super.onViewAttached(); mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); - mBrightnessMirrorHandler.onQsPanelAttached(); } @Override protected void onViewDetached() { super.onViewDetached(); mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); - mBrightnessMirrorHandler.onQsPanelDettached(); } @Override void setListening(boolean listening) { super.setListening(listening); - mBrightnessController.setListening(listening); mFooterActionsController.setListening(listening); } @@ -115,14 +103,7 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> } @Override - public void refreshAllTiles() { - mBrightnessController.checkRestrictionAndSetEnabled(); - super.refreshAllTiles(); - } - - @Override protected void onConfigurationChanged() { - mBrightnessController.refreshVisibility(mShouldUseSplitNotificationShade); mFooterActionsController.refreshVisibility(mShouldUseSplitNotificationShade); } @@ -146,8 +127,4 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> public int getNumQuickTiles() { return mView.getNumQuickTiles(); } - - public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) { - mBrightnessMirrorHandler.setController(brightnessMirrorController); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java index 3e19cc436dca..992a82b6e7fe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java @@ -35,6 +35,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; @@ -306,4 +307,11 @@ public class DozeScreenStateTest extends SysuiTestCase { // THEN the display screen state will change assertEquals(Display.STATE_DOZE_SUSPEND, mServiceFake.screenState); } + + @Test + public void authCallbackRemovedOnDestroy() { + mScreen.destroy(); + + verify(mAuthController).removeCallback(anyObject()); + } }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt deleted file mode 100644 index de1d86b08785..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.qs - -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.settings.brightness.BrightnessController -import com.android.systemui.statusbar.policy.BrightnessMirrorController -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.Mockito.never -import org.mockito.Mockito.mock -import org.mockito.junit.MockitoJUnit - -@SmallTest -class QuickQSBrightnessControllerTest : SysuiTestCase() { - - @Mock - lateinit var brightnessController: BrightnessController - @get:Rule - val mockito = MockitoJUnit.rule() - - lateinit var quickQSBrightnessController: QuickQSBrightnessController - - @Before - fun setUp() { - quickQSBrightnessController = QuickQSBrightnessController( - brightnessControllerFactory = { brightnessController }) - } - - @Test - fun testSliderIsShownWhenInitializedInSplitShade() { - quickQSBrightnessController.init(shouldUseSplitNotificationShade = true) - - verify(brightnessController).showSlider() - } - - @Test - fun testSliderIsShownWhenRefreshedInSplitShade() { - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - - verify(brightnessController, times(1)).showSlider() - } - - @Test - fun testSliderIsHiddenWhenRefreshedInNonSplitShade() { - // needs to be shown first - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false) - - verify(brightnessController).hideSlider() - } - - @Test - fun testSliderChangesVisibilityWhenRotating() { - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - verify(brightnessController, times(1)).showSlider() - - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false) - verify(brightnessController, times(1)).hideSlider() - } - - @Test - fun testCallbacksAreRegisteredOnlyOnce() { - // this flow simulates expanding shade in portrait... - quickQSBrightnessController.setListening(true) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false) - // ... and rotating to landscape/split shade where slider is visible - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - - verify(brightnessController, times(1)).registerCallbacks() - } - - @Test - fun testCallbacksAreRegisteredOnlyOnceWhenRotatingPhone() { - quickQSBrightnessController.setListening(true) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - - verify(brightnessController, times(1)).registerCallbacks() - } - - @Test - fun testCallbacksAreNotRegisteredWhenSliderNotVisible() { - quickQSBrightnessController.setListening(true) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false) - - verify(brightnessController, never()).registerCallbacks() - } - - @Test - fun testMirrorIsSetWhenSliderIsShown() { - val mirrorController = mock(BrightnessMirrorController::class.java) - quickQSBrightnessController.setMirror(mirrorController) - quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true) - - verify(brightnessController).setMirror(mirrorController) - } -}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt index 59948d310b4f..fb8a6e3d4212 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt @@ -67,8 +67,6 @@ class QuickQSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var tileView: QSTileView @Mock - private lateinit var quickQsBrightnessController: QuickQSBrightnessController - @Mock private lateinit var footerActionsController: FooterActionsController @Captor private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener> @@ -95,7 +93,6 @@ class QuickQSPanelControllerTest : SysuiTestCase() { uiEventLogger, qsLogger, dumpManager, - quickQsBrightnessController, footerActionsController ) @@ -128,13 +125,11 @@ class QuickQSPanelControllerTest : SysuiTestCase() { } @Test - fun testBrightnessAndFooterVisibilityRefreshedWhenConfigurationChanged() { + fun testFooterVisibilityRefreshedWhenConfigurationChanged() { // times(2) because both controller and base controller are registering their listeners verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture()) captor.allValues.forEach { it.onConfigurationChange(Configuration.EMPTY) } - - verify(quickQsBrightnessController).refreshVisibility(anyBoolean()) // times(2) because footer visibility is also refreshed on controller init verify(footerActionsController, times(2)).refreshVisibility(anyBoolean()) } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 211f8d6e3ec7..7590527bbf31 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -7695,7 +7695,9 @@ public class NotificationManagerService extends SystemService { int index = mToastQueue.indexOf(record); if (index >= 0) { - mToastQueue.remove(index); + ToastRecord toast = mToastQueue.remove(index); + mWindowManagerInternal.removeWindowToken( + toast.windowToken, true /* removeWindows */, toast.displayId); } record = (mToastQueue.size() > 0) ? mToastQueue.get(0) : null; } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index e98d077836e0..f7121537c52c 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -60,6 +60,7 @@ import static android.service.notification.NotificationListenerService.FLAG_FILT import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL; +import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static com.google.common.truth.Truth.assertThat; @@ -5572,6 +5573,39 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testRateLimitedToasts_windowsRemoved() throws Exception { + final String testPackage = "testPackageName"; + assertEquals(0, mService.mToastQueue.size()); + mService.isSystemUid = false; + setToastRateIsWithinQuota(false); // rate limit reached + setIfPackageHasPermissionToAvoidToastRateLimiting(testPackage, false); + setAppInForegroundForToasts(mUid, false); + + // package is not suspended + when(mPackageManager.isPackageSuspendedForUser(testPackage, UserHandle.getUserId(mUid))) + .thenReturn(false); + + Binder token = new Binder(); + INotificationManager nmService = (INotificationManager) mService.mService; + + nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null); + + // window token was added when enqueued + ArgumentCaptor<Binder> binderCaptor = + ArgumentCaptor.forClass(Binder.class); + verify(mWindowManagerInternal).addWindowToken(binderCaptor.capture(), + eq(TYPE_TOAST), anyInt(), eq(null)); + + // but never shown + verify(mStatusBar, times(0)) + .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + + // and removed when rate limited + verify(mWindowManagerInternal) + .removeWindowToken(eq(binderCaptor.getValue()), eq(true), anyInt()); + } + + @Test public void backgroundSystemCustomToast_callsSetProcessImportantAsForegroundForToast() throws Exception { final String testPackage = "testPackageName"; |