Settings: Update DND access dialog to new user flow.
- Only list apps in the DND access list that have included the corresponding permission in their manifest. - Show a scary user warning before enabling access per app. - Update manifest to follow framework intent action rename. Bug: 21621663 Change-Id: I76c6893928092bdbb58d62bc3aba31ec8a609fc6
This commit is contained in:
@@ -2268,7 +2268,7 @@
|
|||||||
android:label="@string/manage_zen_access_title"
|
android:label="@string/manage_zen_access_title"
|
||||||
android:taskAffinity="">
|
android:taskAffinity="">
|
||||||
<intent-filter android:priority="1">
|
<intent-filter android:priority="1">
|
||||||
<action android:name="android.settings.ZEN_ACCESS_SETTINGS" />
|
<action android:name="android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
@@ -6722,4 +6722,10 @@
|
|||||||
|
|
||||||
<!-- Summary of data item when no data usage [CHAR LIMIT=40] -->
|
<!-- Summary of data item when no data usage [CHAR LIMIT=40] -->
|
||||||
<string name="no_data_usage">No data used</string>
|
<string name="no_data_usage">No data used</string>
|
||||||
|
|
||||||
|
<!-- Zen mode access settings - title for warning dialog when enabling access [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="zen_access_warning_dialog_title">Allow access to Do Not Disturb for <xliff:g id="app" example="Tasker">%1$s</xliff:g>?</string>
|
||||||
|
|
||||||
|
<!-- Zen mode access settings - summary for warning dialog when enabling access [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="zen_access_warning_dialog_summary">The app will be able to turn on/off Do Not Disturb and make changes to related settings.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -16,17 +16,27 @@
|
|||||||
|
|
||||||
package com.android.settings.notification;
|
package com.android.settings.notification;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.DialogFragment;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageItemInfo;
|
import android.content.pm.PackageItemInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.database.ContentObserver;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceScreen;
|
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
import android.preference.PreferenceScreen;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
|
import android.provider.Settings.Secure;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -42,6 +52,9 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ZenAccessSettings extends SettingsPreferenceFragment {
|
public class ZenAccessSettings extends SettingsPreferenceFragment {
|
||||||
|
|
||||||
|
private final SettingObserver mObserver = new SettingObserver();
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private PackageManager mPkgMan;
|
private PackageManager mPkgMan;
|
||||||
private NotificationManager mNoMan;
|
private NotificationManager mNoMan;
|
||||||
@@ -75,6 +88,15 @@ public class ZenAccessSettings extends SettingsPreferenceFragment {
|
|||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
reloadList();
|
reloadList();
|
||||||
|
getContentResolver().registerContentObserver(
|
||||||
|
Secure.getUriFor(Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES), false,
|
||||||
|
mObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
getContentResolver().unregisterContentObserver(mObserver);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reloadList() {
|
private void reloadList() {
|
||||||
@@ -95,23 +117,27 @@ public class ZenAccessSettings extends SettingsPreferenceFragment {
|
|||||||
Collections.sort(apps, new PackageItemInfo.DisplayNameComparator(mPkgMan));
|
Collections.sort(apps, new PackageItemInfo.DisplayNameComparator(mPkgMan));
|
||||||
for (ApplicationInfo app : apps) {
|
for (ApplicationInfo app : apps) {
|
||||||
final String pkg = app.packageName;
|
final String pkg = app.packageName;
|
||||||
|
final CharSequence label = app.loadLabel(mPkgMan);
|
||||||
final SwitchPreference pref = new SwitchPreference(mContext);
|
final SwitchPreference pref = new SwitchPreference(mContext);
|
||||||
pref.setPersistent(false);
|
pref.setPersistent(false);
|
||||||
pref.setIcon(app.loadIcon(mPkgMan));
|
pref.setIcon(app.loadIcon(mPkgMan));
|
||||||
pref.setTitle(app.packageName);
|
pref.setTitle(label);
|
||||||
pref.setChecked(hasAccess(pkg));
|
pref.setChecked(hasAccess(pkg));
|
||||||
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
final boolean access = (Boolean) newValue;
|
final boolean access = (Boolean) newValue;
|
||||||
AsyncTask.execute(new Runnable() {
|
if (!access) {
|
||||||
@Override
|
// disabling access
|
||||||
public void run() {
|
setAccess(mContext, pkg, access);
|
||||||
setAccess(pkg, access);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// enabling access: show a scary dialog first
|
||||||
|
new ScaryWarningDialogFragment()
|
||||||
|
.setPkgInfo(pkg, label)
|
||||||
|
.show(getFragmentManager(), "dialog");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
screen.addPreference(pref);
|
screen.addPreference(pref);
|
||||||
}
|
}
|
||||||
@@ -122,8 +148,67 @@ public class ZenAccessSettings extends SettingsPreferenceFragment {
|
|||||||
return mNoMan.isNotificationPolicyAccessGrantedForPackage(pkg);
|
return mNoMan.isNotificationPolicyAccessGrantedForPackage(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setAccess(String pkg, boolean access) {
|
private static void setAccess(final Context context, final String pkg, final boolean access) {
|
||||||
mNoMan.setNotificationPolicyAccessGranted(pkg, access);
|
AsyncTask.execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final NotificationManager mgr = context.getSystemService(NotificationManager.class);
|
||||||
|
mgr.setNotificationPolicyAccessGranted(pkg, access);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final class SettingObserver extends ContentObserver {
|
||||||
|
public SettingObserver() {
|
||||||
|
super(new Handler(Looper.getMainLooper()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
|
reloadList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ScaryWarningDialogFragment extends DialogFragment {
|
||||||
|
static final String KEY_PKG = "p";
|
||||||
|
static final String KEY_LABEL = "l";
|
||||||
|
|
||||||
|
public ScaryWarningDialogFragment setPkgInfo(String pkg, CharSequence label) {
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(KEY_PKG, pkg);
|
||||||
|
args.putString(KEY_LABEL, TextUtils.isEmpty(label) ? pkg : label.toString());
|
||||||
|
setArguments(args);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
final Bundle args = getArguments();
|
||||||
|
final String pkg = args.getString(KEY_PKG);
|
||||||
|
final String label = args.getString(KEY_LABEL);
|
||||||
|
|
||||||
|
final String title = getResources().getString(R.string.zen_access_warning_dialog_title,
|
||||||
|
label);
|
||||||
|
final String summary = getResources()
|
||||||
|
.getString(R.string.zen_access_warning_dialog_summary);
|
||||||
|
return new AlertDialog.Builder(getContext())
|
||||||
|
.setMessage(summary)
|
||||||
|
.setTitle(title)
|
||||||
|
.setCancelable(true)
|
||||||
|
.setPositiveButton(R.string.allow,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
setAccess(getContext(), pkg, true);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(R.string.deny,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
// pass
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.create();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user