Settings - disable notification settings for suspended apps

When we suspend an app we disable notifications for the app
(via notification manager as in Settings). While an app is
suspended do not allow the user to reach the
NotificationSettings screen.

Bug: 22776761
Change-Id: Ia0dbad6adce64b7d9238e1215a37c73e192dbc45
This commit is contained in:
Andrei Stingaceanu
2016-01-27 15:29:03 +00:00
parent 79706ea0ea
commit 33e9656a53
3 changed files with 47 additions and 11 deletions

View File

@@ -38,6 +38,10 @@ import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settings.notification.NotificationBackend.AppRow; import com.android.settings.notification.NotificationBackend.AppRow;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.RestrictedPreference;
import java.util.List; import java.util.List;
@@ -54,7 +58,7 @@ public class AppNotificationSettings extends NotificationSettingsBase {
= new Intent(Intent.ACTION_MAIN) = new Intent(Intent.ACTION_MAIN)
.addCategory(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES); .addCategory(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES);
private SwitchPreference mBlock; private RestrictedSwitchPreference mBlock;
private PreferenceCategory mCategories; private PreferenceCategory mCategories;
private AppRow mAppRow; private AppRow mAppRow;
@@ -97,7 +101,9 @@ public class AppNotificationSettings extends NotificationSettingsBase {
mCategories.setOrderingAsAdded(true); mCategories.setOrderingAsAdded(true);
getPreferenceScreen().addPreference(mCategories); getPreferenceScreen().addPreference(mCategories);
for (Notification.Topic topic : topics) { for (Notification.Topic topic : topics) {
Preference topicPreference = new Preference(getPrefContext()); RestrictedPreference topicPreference = new RestrictedPreference(getPrefContext());
topicPreference.setDisabledByAdmin(
RestrictedLockUtils.checkIfApplicationIsSuspended(mContext, mPkg, mUserId));
topicPreference.setKey(topic.getId()); topicPreference.setKey(topic.getId());
topicPreference.setTitle(topic.getLabel()); topicPreference.setTitle(topic.getLabel());
// Create intent for this preference. // Create intent for this preference.
@@ -138,6 +144,8 @@ public class AppNotificationSettings extends NotificationSettingsBase {
private void updateDependents(boolean banned) { private void updateDependents(boolean banned) {
if (mBlock != null) { if (mBlock != null) {
mBlock.setEnabled(!mAppRow.systemApp); mBlock.setEnabled(!mAppRow.systemApp);
mBlock.setDisabledByAdmin(
RestrictedLockUtils.checkIfApplicationIsSuspended(mContext, mPkg, mUserId));
} }
if (mCategories != null) { if (mCategories != null) {
setVisible(mCategories, !banned); setVisible(mCategories, !banned);
@@ -145,7 +153,9 @@ public class AppNotificationSettings extends NotificationSettingsBase {
} }
private void setupBlockSwitch() { private void setupBlockSwitch() {
mBlock = new SwitchPreference(getPrefContext()); mBlock = new RestrictedSwitchPreference(getPrefContext());
mBlock.setDisabledByAdmin(
RestrictedLockUtils.checkIfApplicationIsSuspended(mContext, mPkg, mUserId));
mBlock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { mBlock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -153,7 +163,7 @@ public class AppNotificationSettings extends NotificationSettingsBase {
if (banned) { if (banned) {
MetricsLogger.action(getActivity(), MetricsEvent.ACTION_BAN_APP_NOTES, mPkg); MetricsLogger.action(getActivity(), MetricsEvent.ACTION_BAN_APP_NOTES, mPkg);
} }
final boolean success = mBackend.setNotificationsBanned(mPkg, mUid, banned); final boolean success = mBackend.setNotificationsBanned(mPkg, mUid, banned);
if (success) { if (success) {
updateDependents(banned); updateDependents(banned);
} }

View File

@@ -19,6 +19,8 @@ package com.android.settings.notification;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedSwitchPreference;
import android.app.Notification; import android.app.Notification;
import android.content.Context; import android.content.Context;
@@ -27,6 +29,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.service.notification.NotificationListenerService.Ranking; import android.service.notification.NotificationListenerService.Ranking;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
@@ -35,6 +38,8 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
abstract public class NotificationSettingsBase extends SettingsPreferenceFragment { abstract public class NotificationSettingsBase extends SettingsPreferenceFragment {
private static final String TAG = "NotifiSettingsBase"; private static final String TAG = "NotifiSettingsBase";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -50,11 +55,12 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen
protected Context mContext; protected Context mContext;
protected boolean mCreated; protected boolean mCreated;
protected int mUid; protected int mUid;
protected int mUserId;
protected String mPkg; protected String mPkg;
protected PackageInfo mPkgInfo; protected PackageInfo mPkgInfo;
protected ImportanceSeekBarPreference mImportance; protected ImportanceSeekBarPreference mImportance;
protected SwitchPreference mPriority; protected RestrictedSwitchPreference mPriority;
protected SwitchPreference mSensitive; protected RestrictedSwitchPreference mSensitive;
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
@@ -94,6 +100,7 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen
toastAndFinish(); toastAndFinish();
return; return;
} }
mUserId = UserHandle.getUserId(mUid);
if (DEBUG) Log.d(TAG, "Load details for pkg=" + mPkg + " uid=" + mUid); if (DEBUG) Log.d(TAG, "Load details for pkg=" + mPkg + " uid=" + mUid);
mPkgInfo = args != null && args.containsKey(ARG_PACKAGE_INFO) mPkgInfo = args != null && args.containsKey(ARG_PACKAGE_INFO)
@@ -112,9 +119,21 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
if (mUid != -1 && getPackageManager().getPackagesForUid(mUid) == null) { if ((mUid != -1 && getPackageManager().getPackagesForUid(mUid) == null)) {
// App isn't around anymore, must have been removed. // App isn't around anymore, must have been removed.
finish(); finish();
return;
}
EnforcedAdmin admin = RestrictedLockUtils.checkIfApplicationIsSuspended(
mContext, mPkg, mUserId);
if (mImportance != null) {
mImportance.setDisabledByAdmin(admin);
}
if (mPriority != null) {
mPriority.setDisabledByAdmin(admin);
}
if (mSensitive != null) {
mSensitive.setDisabledByAdmin(admin);
} }
} }
@@ -122,6 +141,8 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen
final Notification.Topic topic, int importance) { final Notification.Topic topic, int importance) {
if (mImportance == null) { if (mImportance == null) {
mImportance = new ImportanceSeekBarPreference(getPrefContext()); mImportance = new ImportanceSeekBarPreference(getPrefContext());
mImportance.setDisabledByAdmin(
RestrictedLockUtils.checkIfApplicationIsSuspended(mContext, mPkg, mUserId));
mImportance.setTitle(R.string.notification_importance_title); mImportance.setTitle(R.string.notification_importance_title);
mImportance.setKey(KEY_IMPORTANCE); mImportance.setKey(KEY_IMPORTANCE);
getPreferenceScreen().addPreference(mImportance); getPreferenceScreen().addPreference(mImportance);
@@ -146,7 +167,9 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen
protected void setupPriorityPref(final Notification.Topic topic, boolean priority) { protected void setupPriorityPref(final Notification.Topic topic, boolean priority) {
if (mPriority == null) { if (mPriority == null) {
mPriority = new SwitchPreference(getPrefContext()); mPriority = new RestrictedSwitchPreference(getPrefContext());
mPriority.setDisabledByAdmin(
RestrictedLockUtils.checkIfApplicationIsSuspended(mContext, mPkg, mUserId));
mPriority.setTitle(R.string.app_notification_override_dnd_title); mPriority.setTitle(R.string.app_notification_override_dnd_title);
mPriority.setSummary(R.string.app_notification_override_dnd_summary); mPriority.setSummary(R.string.app_notification_override_dnd_summary);
mPriority.setKey(KEY_BYPASS_DND); mPriority.setKey(KEY_BYPASS_DND);
@@ -164,7 +187,9 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen
protected void setupSensitivePref(final Notification.Topic topic, boolean sensitive) { protected void setupSensitivePref(final Notification.Topic topic, boolean sensitive) {
if (mSensitive == null) { if (mSensitive == null) {
mSensitive = new SwitchPreference(getPrefContext()); mSensitive = new RestrictedSwitchPreference(getPrefContext());
mSensitive.setDisabledByAdmin(
RestrictedLockUtils.checkIfApplicationIsSuspended(mContext, mPkg, mUserId));
mSensitive.setTitle(R.string.app_notification_sensitive_title); mSensitive.setTitle(R.string.app_notification_sensitive_title);
mSensitive.setSummary(R.string.app_notification_sensitive_summary); mSensitive.setSummary(R.string.app_notification_sensitive_summary);
mSensitive.setKey(KEY_SENSITIVE); mSensitive.setKey(KEY_SENSITIVE);

View File

@@ -23,6 +23,7 @@ import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settings.notification.NotificationBackend.TopicRow; import com.android.settings.notification.NotificationBackend.TopicRow;
import com.android.settingslib.RestrictedSwitchPreference;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager; import android.app.NotificationManager;
@@ -85,10 +86,10 @@ public class TopicNotificationSettings extends NotificationSettingsBase {
mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE); mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE);
setupImportancePref(mTopicRow, mTopicRow.topic, mTopicRow.importance); setupImportancePref(mTopicRow, mTopicRow.topic, mTopicRow.importance);
mPriority = (SwitchPreference) findPreference(KEY_BYPASS_DND); mPriority = (RestrictedSwitchPreference) findPreference(KEY_BYPASS_DND);
setupPriorityPref(mTopicRow.topic, mTopicRow.priority); setupPriorityPref(mTopicRow.topic, mTopicRow.priority);
mSensitive = (SwitchPreference) findPreference(KEY_SENSITIVE); mSensitive = (RestrictedSwitchPreference) findPreference(KEY_SENSITIVE);
setupSensitivePref(mTopicRow.topic, mTopicRow.sensitive); setupSensitivePref(mTopicRow.topic, mTopicRow.sensitive);
updateDependents(mTopicRow.importance); updateDependents(mTopicRow.importance);