From b8099f542c21e3ac57d250837e60ec65653ab55c Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Mon, 11 May 2015 11:16:37 -0400 Subject: [PATCH] Settings: Migrate notification access screens to switch prefs. Bug: 20916418 Change-Id: I729bc3a6f853f15780f12e7d7c9f337447e399c4 --- res/layout/managed_service_item.xml | 77 ---------- .../notification/ManagedServiceSettings.java | 140 ++++++------------ .../NotificationAccessSettings.java | 6 + .../notification/ZenAccessSettings.java | 140 +++++++----------- 4 files changed, 104 insertions(+), 259 deletions(-) delete mode 100644 res/layout/managed_service_item.xml diff --git a/res/layout/managed_service_item.xml b/res/layout/managed_service_item.xml deleted file mode 100644 index f05c77f0264..00000000000 --- a/res/layout/managed_service_item.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/com/android/settings/notification/ManagedServiceSettings.java b/src/com/android/settings/notification/ManagedServiceSettings.java index cc9e734c6ed..660ea5a1f34 100644 --- a/src/com/android/settings/notification/ManagedServiceSettings.java +++ b/src/com/android/settings/notification/ManagedServiceSettings.java @@ -19,7 +19,6 @@ package com.android.settings.notification; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; -import android.app.ListFragment; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -27,27 +26,28 @@ import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceScreen; +import android.preference.SwitchPreference; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.ListView; import android.widget.TextView; import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import java.util.Collections; import java.util.List; -public abstract class ManagedServiceSettings extends ListFragment { - private static final boolean SHOW_PACKAGE_NAME = false; - +public abstract class ManagedServiceSettings extends SettingsPreferenceFragment { private final Config mConfig; + private Context mContext; private PackageManager mPM; private ServiceListing mServiceListing; - private ServiceListAdapter mListAdapter; + private TextView mEmpty; abstract protected Config getConfig(); @@ -59,23 +59,24 @@ public abstract class ManagedServiceSettings extends ListFragment { public void onCreate(Bundle icicle) { super.onCreate(icicle); - mPM = getActivity().getPackageManager(); - mServiceListing = new ServiceListing(getActivity(), mConfig); + mContext = getActivity(); + mPM = mContext.getPackageManager(); + mServiceListing = new ServiceListing(mContext, mConfig); mServiceListing.addCallback(new ServiceListing.Callback() { @Override public void onServicesReloaded(List services) { updateList(services); } }); - mListAdapter = new ServiceListAdapter(getActivity()); + setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext)); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.managed_service_settings, container, false); - TextView empty = (TextView) v.findViewById(android.R.id.empty); - empty.setText(mConfig.emptyText); + final View v = inflater.inflate(R.layout.managed_service_settings, container, false); + mEmpty = (TextView) v.findViewById(android.R.id.empty); + mEmpty.setText(mConfig.emptyText); return v; } @@ -93,25 +94,43 @@ public abstract class ManagedServiceSettings extends ListFragment { } private void updateList(List services) { - mListAdapter.clear(); - mListAdapter.addAll(services); - mListAdapter.sort(new PackageItemInfo.DisplayNameComparator(mPM)); - - getListView().setAdapter(mListAdapter); + final PreferenceScreen screen = getPreferenceScreen(); + screen.removeAll(); + Collections.sort(services, new PackageItemInfo.DisplayNameComparator(mPM)); + for (ServiceInfo service : services) { + final ComponentName cn = new ComponentName(service.packageName, service.name); + final String title = service.loadLabel(mPM).toString(); + final SwitchPreference pref = new SwitchPreference(mContext); + pref.setPersistent(false); + pref.setIcon(service.loadIcon(mPM)); + pref.setTitle(title); + pref.setChecked(mServiceListing.isEnabled(cn)); + pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean enable = (boolean) newValue; + return setEnabled(cn, title, enable); + } + }); + screen.addPreference(pref); + } + mEmpty.setVisibility(services.isEmpty() ? View.VISIBLE : View.GONE); } - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - ServiceInfo info = mListAdapter.getItem(position); - final ComponentName cn = new ComponentName(info.packageName, info.name); - if (mServiceListing.isEnabled(cn)) { + private boolean setEnabled(ComponentName service, String title, boolean enable) { + if (!enable) { // the simple version: disabling - mServiceListing.setEnabled(cn, false); + mServiceListing.setEnabled(service, false); + return true; } else { + if (mServiceListing.isEnabled(service)) { + return true; // already enabled + } // show a scary dialog new ScaryWarningDialogFragment() - .setServiceInfo(cn, info.loadLabel(mPM).toString()) - .show(getFragmentManager(), "dialog"); + .setServiceInfo(service, title) + .show(getFragmentManager(), "dialog"); + return false; } } @@ -137,7 +156,7 @@ public abstract class ManagedServiceSettings extends ListFragment { final String title = getResources().getString(mConfig.warningDialogTitle, label); final String summary = getResources().getString(mConfig.warningDialogSummary, label); - return new AlertDialog.Builder(getActivity()) + return new AlertDialog.Builder(mContext) .setMessage(summary) .setTitle(title) .setCancelable(true) @@ -157,69 +176,6 @@ public abstract class ManagedServiceSettings extends ListFragment { } } - private static class ViewHolder { - ImageView icon; - TextView name; - CheckBox checkbox; - TextView description; - } - - private class ServiceListAdapter extends ArrayAdapter { - final LayoutInflater mInflater; - - ServiceListAdapter(Context context) { - super(context, 0, 0); - mInflater = (LayoutInflater) - getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - public boolean hasStableIds() { - return true; - } - - public long getItemId(int position) { - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - View v; - if (convertView == null) { - v = newView(parent); - } else { - v = convertView; - } - bindView(v, position); - return v; - } - - public View newView(ViewGroup parent) { - View v = mInflater.inflate(R.layout.managed_service_item, parent, false); - ViewHolder h = new ViewHolder(); - h.icon = (ImageView) v.findViewById(R.id.icon); - h.name = (TextView) v.findViewById(R.id.name); - h.checkbox = (CheckBox) v.findViewById(R.id.checkbox); - h.description = (TextView) v.findViewById(R.id.description); - v.setTag(h); - return v; - } - - public void bindView(View view, int position) { - ViewHolder vh = (ViewHolder) view.getTag(); - ServiceInfo info = getItem(position); - - vh.icon.setImageDrawable(info.loadIcon(mPM)); - vh.name.setText(info.loadLabel(mPM)); - if (SHOW_PACKAGE_NAME) { - vh.description.setText(info.packageName); - vh.description.setVisibility(View.VISIBLE); - } else { - vh.description.setVisibility(View.GONE); - } - final ComponentName cn = new ComponentName(info.packageName, info.name); - vh.checkbox.setChecked(mServiceListing.isEnabled(cn)); - } - } - protected static class Config { String tag; String setting; diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java index 5104d4aafcb..a5502081190 100644 --- a/src/com/android/settings/notification/NotificationAccessSettings.java +++ b/src/com/android/settings/notification/NotificationAccessSettings.java @@ -21,6 +21,7 @@ import android.content.pm.PackageManager; import android.provider.Settings; import android.service.notification.NotificationListenerService; +import com.android.internal.logging.MetricsLogger; import com.android.settings.R; public class NotificationAccessSettings extends ManagedServiceSettings { @@ -40,6 +41,11 @@ public class NotificationAccessSettings extends ManagedServiceSettings { return c; } + @Override + protected int getMetricsCategory() { + return MetricsLogger.NOTIFICATION_ACCESS; + } + @Override protected Config getConfig() { return CONFIG; diff --git a/src/com/android/settings/notification/ZenAccessSettings.java b/src/com/android/settings/notification/ZenAccessSettings.java index a9f02a9d7c9..99cfe74a513 100644 --- a/src/com/android/settings/notification/ZenAccessSettings.java +++ b/src/com/android/settings/notification/ZenAccessSettings.java @@ -16,34 +16,41 @@ package com.android.settings.notification; -import android.app.ListFragment; import android.app.NotificationManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; +import android.os.AsyncTask; import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.SwitchPreference; import android.util.ArraySet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.ListView; import android.widget.TextView; +import com.android.internal.logging.MetricsLogger; import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -public class ZenAccessSettings extends ListFragment { - private static final boolean SHOW_PACKAGE_NAME = false; - +public class ZenAccessSettings extends SettingsPreferenceFragment { private Context mContext; private PackageManager mPkgMan; private NotificationManager mNoMan; - private Adapter mAdapter; + private TextView mEmpty; + + @Override + protected int getMetricsCategory() { + return MetricsLogger.NOTIFICATION_ZEN_MODE_ACCESS; + } @Override public void onCreate(Bundle icicle) { @@ -52,15 +59,15 @@ public class ZenAccessSettings extends ListFragment { mContext = getActivity(); mPkgMan = mContext.getPackageManager(); mNoMan = mContext.getSystemService(NotificationManager.class); - mAdapter = new Adapter(mContext); + setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext)); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View v = inflater.inflate(R.layout.managed_service_settings, container, false); - final TextView empty = (TextView) v.findViewById(android.R.id.empty); - empty.setText(R.string.zen_access_empty_text); + mEmpty = (TextView) v.findViewById(android.R.id.empty); + mEmpty.setText(R.string.zen_access_empty_text); return v; } @@ -71,28 +78,44 @@ public class ZenAccessSettings extends ListFragment { } private void reloadList() { - mAdapter.clear(); + final PreferenceScreen screen = getPreferenceScreen(); + screen.removeAll(); + final ArrayList apps = new ArrayList<>(); final ArraySet requesting = mNoMan.getPackagesRequestingNotificationPolicyAccess(); if (requesting != null && !requesting.isEmpty()) { - final List apps = mPkgMan.getInstalledApplications(0); - if (apps != null) { - for (ApplicationInfo app : apps) { + final List installed = mPkgMan.getInstalledApplications(0); + if (installed != null) { + for (ApplicationInfo app : installed) { if (requesting.contains(app.packageName)) { - mAdapter.add(app); + apps.add(app); } } } } - mAdapter.sort(new PackageItemInfo.DisplayNameComparator(mPkgMan)); - getListView().setAdapter(mAdapter); - } - - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - final ApplicationInfo info = mAdapter.getItem(position); - final boolean hasAccess = hasAccess(info.packageName); - setAccess(info.packageName, !hasAccess); - mAdapter.notifyDataSetChanged(); + Collections.sort(apps, new PackageItemInfo.DisplayNameComparator(mPkgMan)); + for (ApplicationInfo app : apps) { + final String pkg = app.packageName; + final SwitchPreference pref = new SwitchPreference(mContext); + pref.setPersistent(false); + pref.setIcon(app.loadIcon(mPkgMan)); + pref.setTitle(app.packageName); + pref.setChecked(hasAccess(pkg)); + pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean access = (Boolean) newValue; + AsyncTask.execute(new Runnable() { + @Override + public void run() { + setAccess(pkg, access); + } + }); + return true; + } + }); + screen.addPreference(pref); + } + mEmpty.setVisibility(apps.isEmpty() ? View.VISIBLE : View.GONE); } private boolean hasAccess(String pkg) { @@ -103,67 +126,4 @@ public class ZenAccessSettings extends ListFragment { mNoMan.setNotificationPolicyAccessGranted(pkg, access); } - private static class ViewHolder { - ImageView icon; - TextView name; - CheckBox checkbox; - TextView description; - } - - private final class Adapter extends ArrayAdapter { - final LayoutInflater mInflater; - - Adapter(Context context) { - super(context, 0, 0); - mInflater = (LayoutInflater) - getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - public boolean hasStableIds() { - return true; - } - - public long getItemId(int position) { - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - View v; - if (convertView == null) { - v = newView(parent); - } else { - v = convertView; - } - bindView(v, position); - return v; - } - - public View newView(ViewGroup parent) { - View v = mInflater.inflate(R.layout.managed_service_item, parent, false); - ViewHolder h = new ViewHolder(); - h.icon = (ImageView) v.findViewById(R.id.icon); - h.name = (TextView) v.findViewById(R.id.name); - h.checkbox = (CheckBox) v.findViewById(R.id.checkbox); - h.description = (TextView) v.findViewById(R.id.description); - v.setTag(h); - return v; - } - - public void bindView(View view, int position) { - ViewHolder vh = (ViewHolder) view.getTag(); - ApplicationInfo info = getItem(position); - - vh.icon.setImageDrawable(info.loadIcon(mPkgMan)); - vh.name.setText(info.loadLabel(mPkgMan)); - if (SHOW_PACKAGE_NAME) { - vh.description.setText(info.packageName); - vh.description.setVisibility(View.VISIBLE); - } else { - vh.description.setVisibility(View.GONE); - } - vh.checkbox.setChecked(hasAccess(info.packageName)); - } - - } - }