summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java59
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt14
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())
+ }
}