diff options
7 files changed, 107 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt index 27466d4f58bc..7509a8ad0c88 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt @@ -19,11 +19,11 @@ package com.android.systemui.controls.dagger import android.content.Context import com.android.internal.widget.LockPatternUtils import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT -import com.android.systemui.controls.settings.ControlsSettingsRepository import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.controller.ControlsTileResourceConfiguration import com.android.systemui.controls.controller.ControlsTileResourceConfigurationImpl import com.android.systemui.controls.management.ControlsListingController +import com.android.systemui.controls.settings.ControlsSettingsRepository import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.SysUISingleton import com.android.systemui.settings.UserTracker diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java index 628964af3380..25a5c61a5f7d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java @@ -22,6 +22,7 @@ import android.content.Context; import android.hardware.display.NightDisplayListener; import android.os.Handler; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.media.dagger.MediaModule; import com.android.systemui.qs.AutoAddTracker; @@ -53,6 +54,7 @@ import dagger.Provides; public interface QSModule { @Provides + @SysUISingleton static AutoTileManager provideAutoTileManager( Context context, AutoAddTracker.Builder autoAddTrackerBuilder, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java index 8b1a02b05e0f..576df7ac7add 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java @@ -29,6 +29,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.ReduceBrightColorsController; @@ -47,6 +48,7 @@ import com.android.systemui.util.UserAwareController; import com.android.systemui.util.settings.SecureSettings; import java.util.ArrayList; +import java.util.Collection; import java.util.Objects; import javax.inject.Named; @@ -165,9 +167,10 @@ public class AutoTileManager implements UserAwareController { if (!mAutoTracker.isAdded(BRIGHTNESS) && mIsReduceBrightColorsAvailable) { mReduceBrightColorsController.addCallback(mReduceBrightColorsCallback); } - if (!mAutoTracker.isAdded(DEVICE_CONTROLS)) { - mDeviceControlsController.setCallback(mDeviceControlsCallback); - } + // We always want this callback, because if the feature stops being supported, + // we want to remove the tile from AutoAddTracker. That way it will be re-added when the + // feature is reenabled (similar to work tile). + mDeviceControlsController.setCallback(mDeviceControlsCallback); if (!mAutoTracker.isAdded(WALLET)) { initWalletController(); } @@ -323,14 +326,30 @@ public class AutoTileManager implements UserAwareController { @Override public void onControlsUpdate(@Nullable Integer position) { if (mAutoTracker.isAdded(DEVICE_CONTROLS)) return; - if (position != null) { + if (position != null && !hasTile(DEVICE_CONTROLS)) { mHost.addTile(DEVICE_CONTROLS, position); + mAutoTracker.setTileAdded(DEVICE_CONTROLS); } - mAutoTracker.setTileAdded(DEVICE_CONTROLS); mHandler.post(() -> mDeviceControlsController.removeCallback()); } + + @Override + public void removeControlsAutoTracker() { + mAutoTracker.setTileRemoved(DEVICE_CONTROLS); + } }; + private boolean hasTile(String tileSpec) { + if (tileSpec == null) return false; + Collection<QSTile> tiles = mHost.getTiles(); + for (QSTile tile : tiles) { + if (tileSpec.equals(tile.getTileSpec())) { + return true; + } + } + return false; + } + private void initWalletController() { if (mAutoTracker.isAdded(WALLET)) return; Integer position = mWalletController.getWalletPosition(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt index e2bebbe22554..f0949ac347ba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt @@ -25,6 +25,8 @@ interface DeviceControlsController { * If controls become available, initiate this callback with the desired position */ fun onControlsUpdate(position: Int?) + + fun removeControlsAutoTracker() } /** Add callback, supporting only a single callback at once */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt index 341eb3b0425c..49504827e073 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt @@ -21,16 +21,15 @@ import android.content.Context import android.content.SharedPreferences import android.provider.Settings import android.util.Log - import com.android.systemui.R import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.dagger.SysUISingleton import com.android.systemui.settings.UserContextProvider +import com.android.systemui.statusbar.phone.AutoTileManager import com.android.systemui.statusbar.policy.DeviceControlsController.Callback import com.android.systemui.util.settings.SecureSettings - import javax.inject.Inject /** @@ -87,6 +86,10 @@ public class DeviceControlsControllerImpl @Inject constructor( * incorrect. */ override fun setCallback(callback: Callback) { + if (!controlsComponent.isEnabled()) { + callback.removeControlsAutoTracker() + return + } // Treat any additional call as a reset before recalculating removeCallback() this.callback = callback diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java index 8cfcc075bfaf..f568547d3b59 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE; +import static com.android.systemui.statusbar.phone.AutoTileManager.DEVICE_CONTROLS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -50,6 +51,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.ReduceBrightColorsController; @@ -70,6 +72,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; @@ -77,6 +80,7 @@ import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.mockito.stubbing.Answer; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -543,6 +547,61 @@ public class AutoTileManagerTest extends SysuiTestCase { } @Test + public void testAddControlsTileIfNotPresent() { + String spec = DEVICE_CONTROLS; + when(mAutoAddTracker.isAdded(eq(spec))).thenReturn(false); + when(mQsTileHost.getTiles()).thenReturn(new ArrayList<>()); + + mAutoTileManager.init(); + ArgumentCaptor<DeviceControlsController.Callback> captor = + ArgumentCaptor.forClass(DeviceControlsController.Callback.class); + + verify(mDeviceControlsController).setCallback(captor.capture()); + + captor.getValue().onControlsUpdate(3); + verify(mQsTileHost).addTile(spec, 3); + verify(mAutoAddTracker).setTileAdded(spec); + } + + @Test + public void testDontAddControlsTileIfPresent() { + String spec = DEVICE_CONTROLS; + when(mAutoAddTracker.isAdded(eq(spec))).thenReturn(false); + when(mQsTileHost.getTiles()).thenReturn(new ArrayList<>()); + + mAutoTileManager.init(); + ArgumentCaptor<DeviceControlsController.Callback> captor = + ArgumentCaptor.forClass(DeviceControlsController.Callback.class); + + verify(mDeviceControlsController).setCallback(captor.capture()); + + captor.getValue().removeControlsAutoTracker(); + verify(mQsTileHost, never()).addTile(spec, 3); + verify(mAutoAddTracker, never()).setTileAdded(spec); + verify(mAutoAddTracker).setTileRemoved(spec); + } + + @Test + public void testRemoveControlsTileFromTrackerWhenRequested() { + String spec = "controls"; + when(mAutoAddTracker.isAdded(eq(spec))).thenReturn(true); + QSTile mockTile = mock(QSTile.class); + when(mockTile.getTileSpec()).thenReturn(spec); + when(mQsTileHost.getTiles()).thenReturn(List.of(mockTile)); + + mAutoTileManager.init(); + ArgumentCaptor<DeviceControlsController.Callback> captor = + ArgumentCaptor.forClass(DeviceControlsController.Callback.class); + + verify(mDeviceControlsController).setCallback(captor.capture()); + + captor.getValue().onControlsUpdate(3); + verify(mQsTileHost, never()).addTile(spec, 3); + verify(mAutoAddTracker, never()).setTileAdded(spec); + } + + + @Test public void testEmptyArray_doesNotCrash() { mContext.getOrCreateTestableResources().addOverride( R.array.config_quickSettingsAutoAdd, new String[0]); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt index 64a93cf2c8dc..655775465e1f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt @@ -38,6 +38,7 @@ import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Compan import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.PREFS_CONTROLS_SEEDING_COMPLETED import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_DEFAULT_POSITION import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_PRIORITY_POSITION +import com.android.systemui.util.mockito.mock import com.android.systemui.util.settings.SecureSettings import java.util.Optional @@ -102,6 +103,8 @@ class DeviceControlsControllerImplTest : SysuiTestCase() { `when`(controlsComponent.getControlsListingController()) .thenReturn(Optional.of(controlsListingController)) + `when`(controlsComponent.isEnabled()).thenReturn(true) + controller = DeviceControlsControllerImpl( mContext, controlsComponent, @@ -168,4 +171,15 @@ class DeviceControlsControllerImplTest : SysuiTestCase() { seedCallback.value.accept(SeedResponse(TEST_PKG, true)) verify(callback).onControlsUpdate(QS_DEFAULT_POSITION) } + + @Test + fun testControlsDisabledRemoveFromAutoTracker() { + `when`(controlsComponent.isEnabled()).thenReturn(false) + val callback: DeviceControlsController.Callback = mock() + + controller.setCallback(callback) + + verify(callback).removeControlsAutoTracker() + verify(callback, never()).onControlsUpdate(anyInt()) + } } |