Merge "Fixes to remove controls for tablet" into tm-qpr-dev am: 68fcdeeba6 am: 8b016f2e9a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21121382

Change-Id: Ib75fc0f7f5bb233b1424207ae4682f14de64af35
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Fabian Kozynski
2023-02-09 18:26:23 +00:00
committed by Automerger Merge Worker
7 changed files with 107 additions and 8 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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();

View File

@@ -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 */

View File

@@ -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

View File

@@ -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;
@@ -542,6 +546,61 @@ public class AutoTileManagerTest extends SysuiTestCase {
verify(mAutoAddTracker, times(1)).setTileRemoved(eq("work"));
}
@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(

View File

@@ -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())
}
}