From ea5fd86ddbb6127a200b2fb3f3ec76eb96a13c42 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 12 Jun 2018 12:06:17 -0700 Subject: [PATCH] Hide quicksetting tile for dev options when it's turned off Merged-In: I3e11700a59c8a88bb586c77a876963b5e6a62c89 Change-Id: I3e11700a59c8a88bb586c77a876963b5e6a62c89 Fixes: 78652607 Bug: 117770924 Test: robotests (cherry picked from commit 4220b1e50ccec65cb47007155e0df7672a94a68d) --- .../development/qstile/DevelopmentTiles.java | 35 ++++++++++- .../development/qstile/DevelopmentTilesTest.java | 71 ++++++++++++++++++++++ 2 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilesTest.java diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java index c28a0504ee..a46dd7caf3 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTiles.java +++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java @@ -16,7 +16,9 @@ package com.android.settings.development.qstile; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; import android.os.IBinder; import android.os.Parcel; import android.os.RemoteException; @@ -26,6 +28,7 @@ import android.provider.Settings; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; import android.support.annotation.VisibleForTesting; +import android.util.EventLog; import android.util.Log; import android.view.IWindowManager; import android.view.ThreadedRenderer; @@ -34,6 +37,8 @@ import android.view.WindowManagerGlobal; import android.widget.Toast; import com.android.internal.app.LocalePicker; +import com.android.internal.statusbar.IStatusBarService; +import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.development.SystemPropPoker; public abstract class DevelopmentTiles extends TileService { @@ -50,7 +55,33 @@ public abstract class DevelopmentTiles extends TileService { } public void refresh() { - getQsTile().setState(isEnabled() ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); + final int state; + if (!DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)) { + // Reset to disabled state if dev option is off. + if (isEnabled()) { + setIsEnabled(false); + SystemPropPoker.getInstance().poke(); + } + final ComponentName cn = new ComponentName(getPackageName(), getClass().getName()); + try { + getPackageManager().setComponentEnabledSetting( + cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP); + final IStatusBarService statusBarService = IStatusBarService.Stub.asInterface( + ServiceManager.checkService(Context.STATUS_BAR_SERVICE)); + if (statusBarService != null) { + EventLog.writeEvent(0x534e4554, "117770924"); // SaftyNet + statusBarService.remTile(cn); + } + } catch (RemoteException e) { + Log.e(TAG, "Failed to modify QS tile for component " + + cn.toString(), e); + } + state = Tile.STATE_UNAVAILABLE; + } else { + state = isEnabled() ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; + } + getQsTile().setState(state); getQsTile().updateTile(); } @@ -241,4 +272,4 @@ public abstract class DevelopmentTiles extends TileService { } } } -} \ No newline at end of file +} diff --git a/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilesTest.java b/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilesTest.java new file mode 100644 index 0000000000..8367fd3980 --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilesTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development.qstile; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.ComponentName; +import android.content.pm.PackageManager; +import android.service.quicksettings.Tile; + +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.development.DevelopmentSettingsEnabler; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; + +@RunWith(SettingsRobolectricTestRunner.class) +public class DevelopmentTilesTest { + + @Mock + private Tile mTile; + @Mock + private PackageManager mPackageManager; + + private DevelopmentTiles mService; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mService = spy(Robolectric.setupService(DevelopmentTiles.ShowLayout.class)); + doReturn(mTile).when(mService).getQsTile(); + } + + @Test + public void refresh_devOptionIsDisabled_shouldResetTileValue() { + final ComponentName cn = new ComponentName( + mService.getPackageName(), mService.getClass().getName()); + doReturn(mPackageManager).when(mService).getPackageManager(); + + DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mService, false); + mService.setIsEnabled(true); + + mService.refresh(); + + verify(mPackageManager).setComponentEnabledSetting(cn, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP); + assertThat(mService.isEnabled()).isFalse(); + } +} -- 2.11.0