From 65c29bf1b9102c8cf527bfd0ed61ed61be59cb26 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Wed, 23 Feb 2022 11:58:01 -0500 Subject: [PATCH] Add restriction to BluetoothTile Add DISALLOW_BLUETOOTH restriction check so clicking in a restricted device will launch a dialog informing the user. Test: atest QSTileImplTest BluetoothTileTest Test: manual using TestDPC Fixes: 208447243 Change-Id: I2e23bc89b59b7f6814208d89bc171fd14b602291 --- .../systemui/qs/tileimpl/QSTileImpl.java | 3 +- .../systemui/qs/tiles/BluetoothTile.java | 2 + .../systemui/qs/tileimpl/QSTileImplTest.java | 26 +++- .../systemui/qs/tiles/BluetoothTileTest.kt | 117 ++++++++++++++++++ 4 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 131589f33feed..999818ff943fa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -116,7 +116,8 @@ public abstract class QSTileImpl implements QSTile, Lifecy private String mTileSpec; @Nullable - private EnforcedAdmin mEnforcedAdmin; + @VisibleForTesting + protected EnforcedAdmin mEnforcedAdmin; private boolean mShowingDetail; private int mIsFullQs; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index c61c18a2a029f..f736231bc22b6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; +import android.os.UserManager; import android.provider.Settings; import android.service.quicksettings.Tile; import android.text.TextUtils; @@ -114,6 +115,7 @@ public class BluetoothTile extends QSTileImpl { @Override protected void handleUpdateState(BooleanState state, Object arg) { + checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_BLUETOOTH); final boolean transientEnabling = arg == ARG_SHOW_TRANSIENT_ENABLING; final boolean enabled = transientEnabling || mController.isBluetoothEnabled(); final boolean connected = mController.isBluetoothConnected(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index ea4d7cc2529cf..c5bc68d6bd7bd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -45,6 +45,7 @@ import android.content.Intent; import android.metrics.LogMaker; import android.os.Handler; import android.os.Looper; +import android.provider.Settings; import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -58,6 +59,7 @@ import com.android.internal.logging.InstanceId; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.testing.UiEventLoggerFake; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; @@ -101,6 +103,7 @@ public class QSTileImplTest extends SysuiTestCase { private StatusBarStateController mStatusBarStateController; @Mock private ActivityStarter mActivityStarter; + private UiEventLoggerFake mUiEventLoggerFake; private InstanceId mInstanceId = InstanceId.fakeInstanceId(5); @@ -113,7 +116,7 @@ public class QSTileImplTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); mUiEventLoggerFake = new UiEventLoggerFake(); when(mHost.indexOf(SPEC)).thenReturn(POSITION); - when(mHost.getContext()).thenReturn(mContext.getBaseContext()); + when(mHost.getContext()).thenReturn(mContext); when(mHost.getUiEventLogger()).thenReturn(mUiEventLoggerFake); when(mHost.getNewInstanceId()).thenReturn(mInstanceId); @@ -342,6 +345,22 @@ public class QSTileImplTest extends SysuiTestCase { mTestableLooper.processAllMessages(); } + @Test + public void testClickOnDisabledByPolicyDoesntClickLaunchesIntent() { + String restriction = "RESTRICTION"; + mTile.getState().disabledByPolicy = true; + EnforcedAdmin admin = EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(restriction); + mTile.setEnforcedAdmin(admin); + + mTile.click(null); + mTestableLooper.processAllMessages(); + assertFalse(mTile.mClicked); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); + verify(mActivityStarter).postStartActivityDismissingKeyguard(captor.capture(), anyInt()); + assertEquals(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS, captor.getValue().getAction()); + } + private void assertEvent(UiEventLogger.UiEventEnum eventType, UiEventLoggerFake.FakeUiEvent fakeEvent) { assertEquals(eventType.getId(), fakeEvent.eventId); @@ -400,6 +419,10 @@ public class QSTileImplTest extends SysuiTestCase { getState().state = Tile.STATE_ACTIVE; } + public void setEnforcedAdmin(EnforcedAdmin admin) { + mEnforcedAdmin = admin; + } + @Override public BooleanState newTileState() { return new BooleanState(); @@ -412,7 +435,6 @@ public class QSTileImplTest extends SysuiTestCase { @Override protected void handleUpdateState(BooleanState state, Object arg) { - } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt new file mode 100644 index 0000000000000..cc472481ad8a6 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt @@ -0,0 +1,117 @@ +package com.android.systemui.qs.tiles + +import android.content.Context +import android.os.Handler +import android.os.Looper +import android.os.UserManager +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import androidx.test.filters.SmallTest +import com.android.internal.logging.MetricsLogger +import com.android.internal.logging.testing.UiEventLoggerFake +import com.android.systemui.SysuiTestCase +import com.android.systemui.classifier.FalsingManagerFake +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.plugins.FalsingManager +import com.android.systemui.plugins.qs.QSTile +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.statusbar.policy.BluetoothController +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper(setAsMainLooper = true) +@SmallTest +class BluetoothTileTest : SysuiTestCase() { + + @Mock + private lateinit var mockContext: Context + @Mock + private lateinit var qsLogger: QSLogger + @Mock + private lateinit var qsHost: QSTileHost + @Mock + private lateinit var metricsLogger: MetricsLogger + private val falsingManager = FalsingManagerFake() + @Mock + private lateinit var statusBarStateController: StatusBarStateController + @Mock + private lateinit var activityStarter: ActivityStarter + @Mock + private lateinit var bluetoothController: BluetoothController + + private val uiEventLogger = UiEventLoggerFake() + private lateinit var testableLooper: TestableLooper + private lateinit var tile: FakeBluetoothTile + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + testableLooper = TestableLooper.get(this) + + Mockito.`when`(qsHost.context).thenReturn(mockContext) + Mockito.`when`(qsHost.uiEventLogger).thenReturn(uiEventLogger) + + tile = FakeBluetoothTile( + qsHost, + testableLooper.looper, + Handler(testableLooper.looper), + falsingManager, + metricsLogger, + statusBarStateController, + activityStarter, + qsLogger, + bluetoothController + ) + + tile.initialize() + testableLooper.processAllMessages() + } + + @Test + fun testRestrictionChecked() { + tile.refreshState() + testableLooper.processAllMessages() + + assertThat(tile.restrictionChecked).isEqualTo(UserManager.DISALLOW_BLUETOOTH) + } + + private class FakeBluetoothTile( + qsTileHost: QSTileHost, + backgroundLooper: Looper, + mainHandler: Handler, + falsingManager: FalsingManager, + metricsLogger: MetricsLogger, + statusBarStateController: StatusBarStateController, + activityStarter: ActivityStarter, + qsLogger: QSLogger, + bluetoothController: BluetoothController + ) : BluetoothTile( + qsTileHost, + backgroundLooper, + mainHandler, + falsingManager, + metricsLogger, + statusBarStateController, + activityStarter, + qsLogger, + bluetoothController + ) { + var restrictionChecked: String? = null + + override fun checkIfRestrictionEnforcedByAdminOnly( + state: QSTile.State?, + userRestriction: String? + ) { + restrictionChecked = userRestriction + } + } +} \ No newline at end of file