diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e80856d6647..3b9916834a1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2537,6 +2537,8 @@
+
%1$d of %2$d characters used
-
- Apps that can draw overlay
+
+ Apps that can draw over other apps
Draw over other apps
@@ -6858,9 +6858,9 @@
Apps
- Can draw overlays
+ Draw over other apps
- Permit drawing overlays
+ Permit drawing over other apps
App draw on top permission
@@ -6868,8 +6868,8 @@
system alert window dialog draw on top other apps
-
- Overlay settings
+
+ Draw over other apps
%d of %d apps allowed to draw on top of other apps
@@ -6894,9 +6894,9 @@
Can write system settings
Can write system settings
-
+
Write system settings
-
+
App write system settings permission
Allow write system settings
diff --git a/src/com/android/settings/applications/AppStateOverlayBridge.java b/src/com/android/settings/applications/AppStateOverlayBridge.java
index 21586bcee45..75900a43a30 100644
--- a/src/com/android/settings/applications/AppStateOverlayBridge.java
+++ b/src/com/android/settings/applications/AppStateOverlayBridge.java
@@ -59,15 +59,13 @@ public class AppStateOverlayBridge extends AppStateAppOpsBridge {
return super.getNumPackagesAllowedByAppOps();
}
- public static class OverlayState {
- PermissionState mPermissionState;
+ public static class OverlayState extends AppStateAppOpsBridge.PermissionState {
public OverlayState(PermissionState permissionState) {
- mPermissionState = permissionState;
- }
-
- public boolean isAllowed() {
- return mPermissionState.isPermissible();
+ super(permissionState.packageName, permissionState.userHandle);
+ this.packageInfo = permissionState.packageInfo;
+ this.appOpMode = permissionState.appOpMode;
+ this.permissionDeclared = permissionState.permissionDeclared;
}
}
diff --git a/src/com/android/settings/applications/DrawOverlayDetails.java b/src/com/android/settings/applications/DrawOverlayDetails.java
index 078c2c5f0a6..4ea45b1dce7 100644
--- a/src/com/android/settings/applications/DrawOverlayDetails.java
+++ b/src/com/android/settings/applications/DrawOverlayDetails.java
@@ -22,8 +22,8 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.preference.Preference;
@@ -36,6 +36,7 @@ import android.util.Log;
import com.android.internal.logging.MetricsLogger;
import com.android.settings.InstrumentedFragment;
import com.android.settings.R;
+import com.android.settings.applications.AppStateAppOpsBridge.PermissionState;
import com.android.settings.applications.AppStateOverlayBridge.OverlayState;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -99,7 +100,7 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
try {
getActivity().startActivityAsUser(mSettingsIntent, new UserHandle(mUserId));
} catch (ActivityNotFoundException e) {
- Log.w(TAG, "Unable to launch app draw overlay settings " + mSettingsIntent, e);
+ Log.w(LOG_TAG, "Unable to launch app draw overlay settings " + mSettingsIntent, e);
}
}
return true;
@@ -110,8 +111,8 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == mSwitchPref) {
- if (mOverlayState != null && (Boolean) newValue != mOverlayState.isAllowed()) {
- setCanDrawOverlay(!mOverlayState.isAllowed());
+ if (mOverlayState != null && (Boolean) newValue != mOverlayState.isPermissible()) {
+ setCanDrawOverlay(!mOverlayState.isPermissible());
refreshUi();
}
return true;
@@ -123,7 +124,6 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
mAppOpsManager.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
mPackageInfo.applicationInfo.uid, mPackageName, newState
? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
- canDrawOverlay(mPackageName);
}
private boolean canDrawOverlay(String pkgName) {
@@ -141,17 +141,10 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
mOverlayState = mOverlayBridge.getOverlayInfo(mPackageName,
mPackageInfo.applicationInfo.uid);
- boolean isAllowed = mOverlayState.isAllowed();
+ boolean isAllowed = mOverlayState.isPermissible();
mSwitchPref.setChecked(isAllowed);
mOverlayPrefs.setEnabled(isAllowed);
-
- ResolveInfo resolveInfo = mPm.resolveActivityAsUser(mSettingsIntent,
- PackageManager.GET_META_DATA, mUserId);
- if (resolveInfo == null) {
- if (findPreference(KEY_APP_OPS_SETTINGS_PREFS) != null) {
- getPreferenceScreen().removePreference(mOverlayPrefs);
- }
- }
+ getPreferenceScreen().removePreference(mOverlayPrefs);
return true;
}
@@ -167,40 +160,38 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
}
public static CharSequence getSummary(Context context, AppEntry entry) {
+ if (entry.extraInfo != null) {
+ return getSummary(context, new OverlayState((PermissionState)entry.extraInfo));
+ }
+
+ // fallback if for whatever reason entry.extrainfo is null - the result
+ // may be less accurate
return getSummary(context, entry.info.packageName);
}
+ public static CharSequence getSummary(Context context, OverlayState overlayState) {
+ return context.getString(overlayState.isPermissible() ?
+ R.string.system_alert_window_on : R.string.system_alert_window_off);
+ }
+
public static CharSequence getSummary(Context context, String pkg) {
// first check if pkg is a system pkg
- boolean isSystem = false;
PackageManager packageManager = context.getPackageManager();
+ int uid = -1;
try {
ApplicationInfo appInfo = packageManager.getApplicationInfo(pkg, 0);
+ uid = appInfo.uid;
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
- isSystem = true;
+ return context.getString(R.string.system_alert_window_on);
}
} catch (PackageManager.NameNotFoundException e) {
// pkg doesn't even exist?
- Log.w(TAG, "Package " + pkg + " not found", e);
+ Log.w(LOG_TAG, "Package " + pkg + " not found", e);
return context.getString(R.string.system_alert_window_off);
}
AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context
.APP_OPS_SERVICE);
- List packageOps = appOpsManager.getPackagesForOps(
- APP_OPS_OP_CODE);
- if (packageOps == null) {
- return context.getString(R.string.system_alert_window_off);
- }
-
- int uid = isSystem ? 0 : -1;
- for (AppOpsManager.PackageOps packageOp : packageOps) {
- if (pkg.equals(packageOp.getPackageName())) {
- uid = packageOp.getUid();
- break;
- }
- }
-
if (uid == -1) {
return context.getString(R.string.system_alert_window_off);
}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index e4b404fbda0..3820123c9ca 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -1086,8 +1086,7 @@ public class ManageApplications extends InstrumentedFragment
break;
case LIST_TYPE_OVERLAY:
- holder.summary.setText(DrawOverlayDetails.getSummary(mContext,
- holder.entry));
+ holder.summary.setText(DrawOverlayDetails.getSummary(mContext, holder.entry));
break;
case LIST_TYPE_WRITE_SETTINGS: