Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8099f54 authored by John Spurlock's avatar John Spurlock
Browse files

Settings: Migrate notification access screens to switch prefs.

Bug: 20916418
Change-Id: I729bc3a6f853f15780f12e7d7c9f337447e399c4
parent 46c8f759
Loading
Loading
Loading
Loading
+0 −77
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2013, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:orientation="horizontal"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:gravity="center_vertical"
    >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="@android:dimen/app_icon_size"
        android:layout_height="@android:dimen/app_icon_size"
        android:layout_gravity="center_vertical"
        android:scaleType="centerInside"
        android:contentDescription="@null"
        />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dip"
        android:layout_marginBottom="8dip"
        android:orientation="vertical"
        android:gravity="left|center_vertical"
        android:layout_weight="1">

        <TextView android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView android:id="@+id/description"
            android:visibility="gone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dip"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4" />

    </LinearLayout>

    <CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginStart="16dip"
        android:focusable="false"
        android:clickable="false" />

</LinearLayout>
+48 −92
Original line number Diff line number Diff line
@@ -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<ServiceInfo> 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<ServiceInfo> 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())
                    .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<ServiceInfo> {
        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;
+6 −0
Original line number Diff line number Diff line
@@ -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;
+50 −90
Original line number Diff line number Diff line
@@ -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,99 +78,52 @@ public class ZenAccessSettings extends ListFragment {
    }

    private void reloadList() {
        mAdapter.clear();
        final PreferenceScreen screen = getPreferenceScreen();
        screen.removeAll();
        final ArrayList<ApplicationInfo> apps = new ArrayList<>();
        final ArraySet<String> requesting = mNoMan.getPackagesRequestingNotificationPolicyAccess();
        if (requesting != null && !requesting.isEmpty()) {
            final List<ApplicationInfo> apps = mPkgMan.getInstalledApplications(0);
            if (apps != null) {
                for (ApplicationInfo app : apps) {
            final List<ApplicationInfo> 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);
    }

        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 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();
    }

    private boolean hasAccess(String pkg) {
        return mNoMan.isNotificationPolicyAccessGrantedForPackage(pkg);
    }

    private void setAccess(String pkg, boolean access) {
        mNoMan.setNotificationPolicyAccessGranted(pkg, access);
    }

    private static class ViewHolder {
        ImageView icon;
        TextView name;
        CheckBox checkbox;
        TextView description;
    }

    private final class Adapter extends ArrayAdapter<ApplicationInfo> {
        final LayoutInflater mInflater;

        Adapter(Context context) {
            super(context, 0, 0);
            mInflater = (LayoutInflater)
                    getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    final boolean access = (Boolean) newValue;
                    AsyncTask.execute(new Runnable() {
                        @Override
                        public void run() {
                            setAccess(pkg, access);
                        }

        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;
            });
            screen.addPreference(pref);
        }

        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;
        mEmpty.setVisibility(apps.isEmpty() ? View.VISIBLE : View.GONE);
    }

        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));
    private boolean hasAccess(String pkg) {
        return mNoMan.isNotificationPolicyAccessGrantedForPackage(pkg);
    }

    private void setAccess(String pkg, boolean access) {
        mNoMan.setNotificationPolicyAccessGranted(pkg, access);
    }

}