Bug: 21589105 Rescoping SYSTEM_ALERT_WINDOW and WRITE_SETTINGS permission to an
explicit toggle to be enabled through Settings via Apps -> Advanced Apps. Added new and refactored an old xml to define the UX for two new Preferences in Advanced Settings. Modified the existing AdvancedAppSettings to add control flow for two new settings. Also enriched ManageApplications to handle these cases. Added additional strings in xml/values/strings.xml to support these settings. Also defined new classes to handle these the toggle of these permissions per app. Refactored codes from AppStateUsageBridge to a generic AppStateAppOpsBridge so that future usages related to AppOps can inherit from this class. Change-Id: I43b81282a063e05844c7805556a6d05cfc02bcdb
This commit is contained in:
@@ -59,8 +59,11 @@ import com.android.settings.Settings.HighPowerApplicationsActivity;
|
||||
import com.android.settings.Settings.NotificationAppListActivity;
|
||||
import com.android.settings.Settings.StorageUseActivity;
|
||||
import com.android.settings.Settings.UsageAccessSettingsActivity;
|
||||
import com.android.settings.Settings.OverlaySettingsActivity;
|
||||
import com.android.settings.Settings.WriteSettingsActivity;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.applications.AppStateAppOpsBridge.PermissionState;
|
||||
import com.android.settings.applications.AppStateUsageBridge.UsageState;
|
||||
import com.android.settings.fuelgauge.HighPowerDetail;
|
||||
import com.android.settings.notification.AppNotificationSettings;
|
||||
@@ -122,6 +125,8 @@ public class ManageApplications extends InstrumentedFragment
|
||||
public static final int FILTER_APPS_WORK = 10;
|
||||
public static final int FILTER_APPS_WITH_DOMAIN_URLS = 11;
|
||||
public static final int FILTER_APPS_USAGE_ACCESS = 12;
|
||||
public static final int FILTER_APPS_WITH_OVERLAY = 13;
|
||||
public static final int FILTER_APPS_WRITE_SETTINGS = 14;
|
||||
|
||||
// This is the string labels for the filter modes above, the order must be kept in sync.
|
||||
public static final int[] FILTER_LABELS = new int[] {
|
||||
@@ -138,6 +143,8 @@ public class ManageApplications extends InstrumentedFragment
|
||||
R.string.filter_work_apps, // Work
|
||||
R.string.filter_with_domain_urls_apps, // Domain URLs
|
||||
R.string.filter_all_apps, // Usage access screen, never displayed
|
||||
R.string.filter_overlay_apps, // Apps with overlay permission
|
||||
R.string.filter_write_settings_apps, // Apps that can write system settings
|
||||
};
|
||||
// This is the actual mapping to filters from FILTER_ constants above, the order must
|
||||
// be kept in sync.
|
||||
@@ -155,6 +162,8 @@ public class ManageApplications extends InstrumentedFragment
|
||||
ApplicationsState.FILTER_WORK, // Work
|
||||
ApplicationsState.FILTER_WITH_DOMAIN_URLS, // Apps with Domain URLs
|
||||
AppStateUsageBridge.FILTER_APP_USAGE, // Apps with Domain URLs
|
||||
AppStateOverlayBridge.FILTER_SYSTEM_ALERT_WINDOW, // Apps that can draw overlays
|
||||
AppStateWriteSettingsBridge.FILTER_WRITE_SETTINGS, // Apps that can write system settings
|
||||
};
|
||||
|
||||
// sort order
|
||||
@@ -195,6 +204,8 @@ public class ManageApplications extends InstrumentedFragment
|
||||
public static final int LIST_TYPE_STORAGE = 3;
|
||||
public static final int LIST_TYPE_USAGE_ACCESS = 4;
|
||||
public static final int LIST_TYPE_HIGH_POWER = 5;
|
||||
public static final int LIST_TYPE_OVERLAY = 6;
|
||||
public static final int LIST_TYPE_WRITE_SETTINGS = 7;
|
||||
|
||||
private View mRootView;
|
||||
|
||||
@@ -252,6 +263,12 @@ public class ManageApplications extends InstrumentedFragment
|
||||
startApplicationDetailsActivity();
|
||||
}
|
||||
}
|
||||
} else if (className.equals(OverlaySettingsActivity.class.getName())) {
|
||||
mListType = LIST_TYPE_OVERLAY;
|
||||
getActivity().getActionBar().setTitle(R.string.system_alert_window_access_title);
|
||||
} else if (className.equals(WriteSettingsActivity.class.getName())) {
|
||||
mListType = LIST_TYPE_WRITE_SETTINGS;
|
||||
getActivity().getActionBar().setTitle(R.string.write_settings_title);
|
||||
} else {
|
||||
mListType = LIST_TYPE_MAIN;
|
||||
}
|
||||
@@ -358,6 +375,10 @@ public class ManageApplications extends InstrumentedFragment
|
||||
return FILTER_APPS_USAGE_ACCESS;
|
||||
case LIST_TYPE_HIGH_POWER:
|
||||
return FILTER_APPS_POWER_WHITELIST;
|
||||
case LIST_TYPE_OVERLAY:
|
||||
return FILTER_APPS_WITH_OVERLAY;
|
||||
case LIST_TYPE_WRITE_SETTINGS:
|
||||
return FILTER_APPS_WRITE_SETTINGS;
|
||||
default:
|
||||
return FILTER_APPS_ALL;
|
||||
}
|
||||
@@ -378,6 +399,10 @@ public class ManageApplications extends InstrumentedFragment
|
||||
return MetricsLogger.USAGE_ACCESS;
|
||||
case LIST_TYPE_HIGH_POWER:
|
||||
return MetricsLogger.APPLICATIONS_HIGH_POWER_APPS;
|
||||
case LIST_TYPE_OVERLAY:
|
||||
return MetricsLogger.SYSTEM_ALERT_WINDOW_APPS;
|
||||
case LIST_TYPE_WRITE_SETTINGS:
|
||||
return MetricsLogger.SYSTEM_ALERT_WINDOW_APPS;
|
||||
default:
|
||||
return MetricsLogger.VIEW_UNKNOWN;
|
||||
}
|
||||
@@ -430,7 +455,8 @@ public class ManageApplications extends InstrumentedFragment
|
||||
if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
|
||||
if (mListType == LIST_TYPE_NOTIFICATION) {
|
||||
mApplications.mExtraInfoBridge.forceUpdate(mCurrentPkgName, mCurrentUid);
|
||||
} else if (mListType == LIST_TYPE_HIGH_POWER) {
|
||||
} else if (mListType == LIST_TYPE_HIGH_POWER || mListType == LIST_TYPE_OVERLAY
|
||||
|| mListType == LIST_TYPE_WRITE_SETTINGS) {
|
||||
if (mFinishAfterDialog) {
|
||||
getActivity().onBackPressed();
|
||||
} else {
|
||||
@@ -462,6 +488,12 @@ public class ManageApplications extends InstrumentedFragment
|
||||
HighPowerDetail.show(this, mCurrentPkgName, INSTALLED_APP_DETAILS,
|
||||
mFinishAfterDialog);
|
||||
break;
|
||||
case LIST_TYPE_OVERLAY:
|
||||
startAppInfoFragment(DrawOverlayDetails.class, R.string.overlay_settings);
|
||||
break;
|
||||
case LIST_TYPE_WRITE_SETTINGS:
|
||||
startAppInfoFragment(WriteSettingsDetails.class, R.string.write_system_settings);
|
||||
break;
|
||||
// TODO: Figure out if there is a way where we can spin up the profile's settings
|
||||
// process ahead of time, to avoid a long load of data when user clicks on a managed app.
|
||||
// Maybe when they load the list of apps that contains managed profile apps.
|
||||
@@ -719,6 +751,10 @@ public class ManageApplications extends InstrumentedFragment
|
||||
mExtraInfoBridge = new AppStateUsageBridge(mContext, mState, this);
|
||||
} else if (mManageApplications.mListType == LIST_TYPE_HIGH_POWER) {
|
||||
mExtraInfoBridge = new AppStatePowerBridge(mState, this);
|
||||
} else if (mManageApplications.mListType == LIST_TYPE_OVERLAY) {
|
||||
mExtraInfoBridge = new AppStateOverlayBridge(mContext, mState, this);
|
||||
} else if (mManageApplications.mListType == LIST_TYPE_WRITE_SETTINGS) {
|
||||
mExtraInfoBridge = new AppStateWriteSettingsBridge(mContext, mState, this);
|
||||
} else {
|
||||
mExtraInfoBridge = null;
|
||||
}
|
||||
@@ -1017,8 +1053,9 @@ public class ManageApplications extends InstrumentedFragment
|
||||
|
||||
case LIST_TYPE_USAGE_ACCESS:
|
||||
if (holder.entry.extraInfo != null) {
|
||||
holder.summary.setText(((UsageState) holder.entry.extraInfo).hasAccess() ?
|
||||
R.string.switch_on_text : R.string.switch_off_text);
|
||||
holder.summary.setText((new UsageState((PermissionState)holder.entry
|
||||
.extraInfo)).isPermissible() ? R.string.switch_on_text :
|
||||
R.string.switch_off_text);
|
||||
} else {
|
||||
holder.summary.setText(null);
|
||||
}
|
||||
@@ -1028,6 +1065,16 @@ public class ManageApplications extends InstrumentedFragment
|
||||
holder.summary.setText(HighPowerDetail.getSummary(mContext, holder.entry));
|
||||
break;
|
||||
|
||||
case LIST_TYPE_OVERLAY:
|
||||
holder.summary.setText(DrawOverlayDetails.getSummary(mContext,
|
||||
holder.entry));
|
||||
break;
|
||||
|
||||
case LIST_TYPE_WRITE_SETTINGS:
|
||||
holder.summary.setText(WriteSettingsDetails.getSummary(mContext,
|
||||
holder.entry));
|
||||
break;
|
||||
|
||||
default:
|
||||
holder.updateSizeText(mManageApplications.mInvalidSizeStr, mWhichSize);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user