Merge "Fixes to remove controls for tablet" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
68fcdeeba6
@@ -19,11 +19,11 @@ package com.android.systemui.controls.dagger
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.android.internal.widget.LockPatternUtils
|
import com.android.internal.widget.LockPatternUtils
|
||||||
import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
|
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.ControlsController
|
||||||
import com.android.systemui.controls.controller.ControlsTileResourceConfiguration
|
import com.android.systemui.controls.controller.ControlsTileResourceConfiguration
|
||||||
import com.android.systemui.controls.controller.ControlsTileResourceConfigurationImpl
|
import com.android.systemui.controls.controller.ControlsTileResourceConfigurationImpl
|
||||||
import com.android.systemui.controls.management.ControlsListingController
|
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.controls.ui.ControlsUiController
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
import com.android.systemui.settings.UserTracker
|
import com.android.systemui.settings.UserTracker
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.content.Context;
|
|||||||
import android.hardware.display.NightDisplayListener;
|
import android.hardware.display.NightDisplayListener;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
|
||||||
|
import com.android.systemui.dagger.SysUISingleton;
|
||||||
import com.android.systemui.dagger.qualifiers.Background;
|
import com.android.systemui.dagger.qualifiers.Background;
|
||||||
import com.android.systemui.media.dagger.MediaModule;
|
import com.android.systemui.media.dagger.MediaModule;
|
||||||
import com.android.systemui.qs.AutoAddTracker;
|
import com.android.systemui.qs.AutoAddTracker;
|
||||||
@@ -53,6 +54,7 @@ import dagger.Provides;
|
|||||||
public interface QSModule {
|
public interface QSModule {
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
|
@SysUISingleton
|
||||||
static AutoTileManager provideAutoTileManager(
|
static AutoTileManager provideAutoTileManager(
|
||||||
Context context,
|
Context context,
|
||||||
AutoAddTracker.Builder autoAddTrackerBuilder,
|
AutoAddTracker.Builder autoAddTrackerBuilder,
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import android.util.Log;
|
|||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.dagger.qualifiers.Background;
|
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.AutoAddTracker;
|
||||||
import com.android.systemui.qs.QSTileHost;
|
import com.android.systemui.qs.QSTileHost;
|
||||||
import com.android.systemui.qs.ReduceBrightColorsController;
|
import com.android.systemui.qs.ReduceBrightColorsController;
|
||||||
@@ -47,6 +48,7 @@ import com.android.systemui.util.UserAwareController;
|
|||||||
import com.android.systemui.util.settings.SecureSettings;
|
import com.android.systemui.util.settings.SecureSettings;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
@@ -165,9 +167,10 @@ public class AutoTileManager implements UserAwareController {
|
|||||||
if (!mAutoTracker.isAdded(BRIGHTNESS) && mIsReduceBrightColorsAvailable) {
|
if (!mAutoTracker.isAdded(BRIGHTNESS) && mIsReduceBrightColorsAvailable) {
|
||||||
mReduceBrightColorsController.addCallback(mReduceBrightColorsCallback);
|
mReduceBrightColorsController.addCallback(mReduceBrightColorsCallback);
|
||||||
}
|
}
|
||||||
if (!mAutoTracker.isAdded(DEVICE_CONTROLS)) {
|
// We always want this callback, because if the feature stops being supported,
|
||||||
mDeviceControlsController.setCallback(mDeviceControlsCallback);
|
// 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)) {
|
if (!mAutoTracker.isAdded(WALLET)) {
|
||||||
initWalletController();
|
initWalletController();
|
||||||
}
|
}
|
||||||
@@ -323,14 +326,30 @@ public class AutoTileManager implements UserAwareController {
|
|||||||
@Override
|
@Override
|
||||||
public void onControlsUpdate(@Nullable Integer position) {
|
public void onControlsUpdate(@Nullable Integer position) {
|
||||||
if (mAutoTracker.isAdded(DEVICE_CONTROLS)) return;
|
if (mAutoTracker.isAdded(DEVICE_CONTROLS)) return;
|
||||||
if (position != null) {
|
if (position != null && !hasTile(DEVICE_CONTROLS)) {
|
||||||
mHost.addTile(DEVICE_CONTROLS, position);
|
mHost.addTile(DEVICE_CONTROLS, position);
|
||||||
|
mAutoTracker.setTileAdded(DEVICE_CONTROLS);
|
||||||
}
|
}
|
||||||
mAutoTracker.setTileAdded(DEVICE_CONTROLS);
|
|
||||||
mHandler.post(() -> mDeviceControlsController.removeCallback());
|
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() {
|
private void initWalletController() {
|
||||||
if (mAutoTracker.isAdded(WALLET)) return;
|
if (mAutoTracker.isAdded(WALLET)) return;
|
||||||
Integer position = mWalletController.getWalletPosition();
|
Integer position = mWalletController.getWalletPosition();
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ interface DeviceControlsController {
|
|||||||
* If controls become available, initiate this callback with the desired position
|
* If controls become available, initiate this callback with the desired position
|
||||||
*/
|
*/
|
||||||
fun onControlsUpdate(position: Int?)
|
fun onControlsUpdate(position: Int?)
|
||||||
|
|
||||||
|
fun removeControlsAutoTracker()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add callback, supporting only a single callback at once */
|
/** Add callback, supporting only a single callback at once */
|
||||||
|
|||||||
@@ -21,16 +21,15 @@ import android.content.Context
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.controls.ControlsServiceInfo
|
import com.android.systemui.controls.ControlsServiceInfo
|
||||||
import com.android.systemui.controls.dagger.ControlsComponent
|
import com.android.systemui.controls.dagger.ControlsComponent
|
||||||
import com.android.systemui.controls.management.ControlsListingController
|
import com.android.systemui.controls.management.ControlsListingController
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
import com.android.systemui.settings.UserContextProvider
|
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.statusbar.policy.DeviceControlsController.Callback
|
||||||
import com.android.systemui.util.settings.SecureSettings
|
import com.android.systemui.util.settings.SecureSettings
|
||||||
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -87,6 +86,10 @@ public class DeviceControlsControllerImpl @Inject constructor(
|
|||||||
* incorrect.
|
* incorrect.
|
||||||
*/
|
*/
|
||||||
override fun setCallback(callback: Callback) {
|
override fun setCallback(callback: Callback) {
|
||||||
|
if (!controlsComponent.isEnabled()) {
|
||||||
|
callback.removeControlsAutoTracker()
|
||||||
|
return
|
||||||
|
}
|
||||||
// Treat any additional call as a reset before recalculating
|
// Treat any additional call as a reset before recalculating
|
||||||
removeCallback()
|
removeCallback()
|
||||||
this.callback = callback
|
this.callback = callback
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.systemui.statusbar.phone;
|
package com.android.systemui.statusbar.phone;
|
||||||
|
|
||||||
import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE;
|
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.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
@@ -50,6 +51,7 @@ import androidx.test.filters.SmallTest;
|
|||||||
|
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
|
import com.android.systemui.plugins.qs.QSTile;
|
||||||
import com.android.systemui.qs.AutoAddTracker;
|
import com.android.systemui.qs.AutoAddTracker;
|
||||||
import com.android.systemui.qs.QSTileHost;
|
import com.android.systemui.qs.QSTileHost;
|
||||||
import com.android.systemui.qs.ReduceBrightColorsController;
|
import com.android.systemui.qs.ReduceBrightColorsController;
|
||||||
@@ -70,6 +72,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Answers;
|
import org.mockito.Answers;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.InOrder;
|
import org.mockito.InOrder;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
@@ -77,6 +80,7 @@ import org.mockito.MockitoAnnotations;
|
|||||||
import org.mockito.Spy;
|
import org.mockito.Spy;
|
||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -542,6 +546,61 @@ public class AutoTileManagerTest extends SysuiTestCase {
|
|||||||
verify(mAutoAddTracker, times(1)).setTileRemoved(eq("work"));
|
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
|
@Test
|
||||||
public void testEmptyArray_doesNotCrash() {
|
public void testEmptyArray_doesNotCrash() {
|
||||||
mContext.getOrCreateTestableResources().addOverride(
|
mContext.getOrCreateTestableResources().addOverride(
|
||||||
|
|||||||
@@ -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.PREFS_CONTROLS_SEEDING_COMPLETED
|
||||||
import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_DEFAULT_POSITION
|
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.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_PRIORITY_POSITION
|
||||||
|
import com.android.systemui.util.mockito.mock
|
||||||
import com.android.systemui.util.settings.SecureSettings
|
import com.android.systemui.util.settings.SecureSettings
|
||||||
|
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
@@ -102,6 +103,8 @@ class DeviceControlsControllerImplTest : SysuiTestCase() {
|
|||||||
`when`(controlsComponent.getControlsListingController())
|
`when`(controlsComponent.getControlsListingController())
|
||||||
.thenReturn(Optional.of(controlsListingController))
|
.thenReturn(Optional.of(controlsListingController))
|
||||||
|
|
||||||
|
`when`(controlsComponent.isEnabled()).thenReturn(true)
|
||||||
|
|
||||||
controller = DeviceControlsControllerImpl(
|
controller = DeviceControlsControllerImpl(
|
||||||
mContext,
|
mContext,
|
||||||
controlsComponent,
|
controlsComponent,
|
||||||
@@ -168,4 +171,15 @@ class DeviceControlsControllerImplTest : SysuiTestCase() {
|
|||||||
seedCallback.value.accept(SeedResponse(TEST_PKG, true))
|
seedCallback.value.accept(SeedResponse(TEST_PKG, true))
|
||||||
verify(callback).onControlsUpdate(QS_DEFAULT_POSITION)
|
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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user