From 0162daa6510f845f8636e64a3adc3f914907e95c Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Mon, 19 Sep 2016 10:00:49 -0700 Subject: [PATCH] Disable the control of draw over permission for SystemUI Bug: 31077838 Test: make SettingsTests && adb install -r \ ${OUT}/data/app/SettingsTests/SettingsTests.apk \ && adb shell am instrument -w \ 'com.android.settings.tests/android.support.test.runner.AndroidJUnitRunner' Change-Id: I760590f5558f2d686ffbfe78234a8b08e13883fd --- .../applications/AppStateOverlayBridge.java | 11 ++++ .../applications/DrawOverlayDetails.java | 2 +- .../tests/DrawOverlayDetailsTest.java | 62 +++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java diff --git a/src/com/android/settings/applications/AppStateOverlayBridge.java b/src/com/android/settings/applications/AppStateOverlayBridge.java index af519841d4b..838ee422521 100644 --- a/src/com/android/settings/applications/AppStateOverlayBridge.java +++ b/src/com/android/settings/applications/AppStateOverlayBridge.java @@ -23,6 +23,9 @@ import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppFilter; +import java.util.ArrayList; +import java.util.List; + /* * Connects info of apps that draw overlay to the ApplicationsState. Wraps around the generic * AppStateAppOpsBridge class to tailor to the semantics of SYSTEM_ALERT_WINDOW. Also provides app @@ -62,6 +65,13 @@ public class AppStateOverlayBridge extends AppStateAppOpsBridge { } public static class OverlayState extends AppStateAppOpsBridge.PermissionState { + public final boolean controlEnabled; + + private static final List DISABLE_PACKAGE_LIST = new ArrayList<>(); + + static { + DISABLE_PACKAGE_LIST.add("com.android.systemui"); + } public OverlayState(PermissionState permissionState) { super(permissionState.packageName, permissionState.userHandle); @@ -69,6 +79,7 @@ public class AppStateOverlayBridge extends AppStateAppOpsBridge { this.appOpMode = permissionState.appOpMode; this.permissionDeclared = permissionState.permissionDeclared; this.staticPermissionGranted = permissionState.staticPermissionGranted; + controlEnabled = !DISABLE_PACKAGE_LIST.contains(permissionState.packageName); } } diff --git a/src/com/android/settings/applications/DrawOverlayDetails.java b/src/com/android/settings/applications/DrawOverlayDetails.java index ade29238b42..335bb1651a1 100644 --- a/src/com/android/settings/applications/DrawOverlayDetails.java +++ b/src/com/android/settings/applications/DrawOverlayDetails.java @@ -144,7 +144,7 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc boolean isAllowed = mOverlayState.isPermissible(); mSwitchPref.setChecked(isAllowed); // you cannot ask a user to grant you a permission you did not have! - mSwitchPref.setEnabled(mOverlayState.permissionDeclared); + mSwitchPref.setEnabled(mOverlayState.permissionDeclared && mOverlayState.controlEnabled); mOverlayPrefs.setEnabled(isAllowed); getPreferenceScreen().removePreference(mOverlayPrefs); diff --git a/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java b/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java new file mode 100644 index 00000000000..234f8e6b151 --- /dev/null +++ b/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 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.tests; + +import android.app.Instrumentation; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.support.test.InstrumentationRegistry; +import org.junit.runner.RunWith; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import org.junit.Test; +import com.android.settings.R; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.hamcrest.core.IsNot.not; +import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class DrawOverlayDetailsTest { + private final static String PACKAGE_SYSTEM_UI = "com.android.systemui"; + + @Test + public void testSystemUiDrawOverlayDetails_Disabled() throws Exception{ + Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + instrumentation.startActivitySync(new Intent(android.provider.Settings + .ACTION_MANAGE_OVERLAY_PERMISSION)); + + final Context targetContext = instrumentation.getTargetContext(); + + final PackageManager packageManager = targetContext.getPackageManager(); + final String appName = (String) packageManager.getApplicationLabel(packageManager + .getApplicationInfo(PACKAGE_SYSTEM_UI, PackageManager.GET_META_DATA)); + + openActionBarOverflowOrOptionsMenu(targetContext); + onView(withText(targetContext.getString(R.string.menu_show_system))).perform(click()); + onView(withText(appName)).perform(click()); + onView(withText(targetContext.getString(R.string.permit_draw_overlay))).check(matches + (not(isEnabled()))); + } + +}