108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock/*
208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * Copyright (C) 2015 The Android Open Source Project
308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock *
408531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
508531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * you may not use this file except in compliance with the License.
608531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * You may obtain a copy of the License at
708531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock *
808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
908531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock *
1008531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * Unless required by applicable law or agreed to in writing, software
1108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
1208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * See the License for the specific language governing permissions and
1408531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock * limitations under the License.
1508531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock */
1608531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
1708531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockpackage com.android.settings.notification;
1808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
19afa3a1a0cbebbab40663aedbd60d721df1f161e9Jason Monkimport android.annotation.Nullable;
20a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.app.AlertDialog;
21a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.app.Dialog;
22a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.app.DialogFragment;
2308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.app.NotificationManager;
2483f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynoldsimport android.content.ComponentName;
2508531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.content.Context;
26a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.content.DialogInterface;
2708531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.content.pm.ApplicationInfo;
2808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.content.pm.PackageItemInfo;
2908531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.content.pm.PackageManager;
30a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.database.ContentObserver;
31a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.net.Uri;
32b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlockimport android.os.AsyncTask;
3308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.os.Bundle;
34a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.os.Handler;
35a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.os.Looper;
3683f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynoldsimport android.provider.Settings;
37a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.provider.Settings.Secure;
3839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v14.preference.SwitchPreference;
3939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
4039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceChangeListener;
4139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
42a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlockimport android.text.TextUtils;
4308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.util.ArraySet;
4408531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport android.view.View;
4583f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynoldsimport android.widget.Toast;
4683f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds
479d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
4808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport com.android.settings.R;
4908531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
50b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlockimport java.util.ArrayList;
51b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlockimport java.util.Collections;
5208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlockimport java.util.List;
5308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
54afa3a1a0cbebbab40663aedbd60d721df1f161e9Jason Monkpublic class ZenAccessSettings extends EmptyTextSettings {
55a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
56a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    private final SettingObserver mObserver = new SettingObserver();
5783f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds    private static final String ENABLED_SERVICES_SEPARATOR = ":";
58a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
5908531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    private Context mContext;
6008531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    private PackageManager mPkgMan;
6108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    private NotificationManager mNoMan;
62b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock
63b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock    @Override
64b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock    protected int getMetricsCategory() {
659d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.NOTIFICATION_ZEN_MODE_ACCESS;
66b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock    }
6708531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
6808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    @Override
6908531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    public void onCreate(Bundle icicle) {
7008531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        super.onCreate(icicle);
7108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
7208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        mContext = getActivity();
7308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        mPkgMan = mContext.getPackageManager();
7408531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        mNoMan = mContext.getSystemService(NotificationManager.class);
75b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
7608531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    }
7708531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
7808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    @Override
79afa3a1a0cbebbab40663aedbd60d721df1f161e9Jason Monk    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
80afa3a1a0cbebbab40663aedbd60d721df1f161e9Jason Monk        super.onViewCreated(view, savedInstanceState);
81afa3a1a0cbebbab40663aedbd60d721df1f161e9Jason Monk        setEmptyText(R.string.zen_access_empty_text);
8208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    }
8308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
8408531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    @Override
8508531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    public void onResume() {
8608531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        super.onResume();
8708531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        reloadList();
88a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        getContentResolver().registerContentObserver(
89a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                Secure.getUriFor(Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES), false,
90a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                mObserver);
9183f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        getContentResolver().registerContentObserver(
9283f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                Secure.getUriFor(Secure.ENABLED_NOTIFICATION_LISTENERS), false,
9383f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                mObserver);
94a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    }
95a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
96a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    @Override
97a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    public void onPause() {
98a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        super.onPause();
99a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        getContentResolver().unregisterContentObserver(mObserver);
10008531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    }
10108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
10208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    private void reloadList() {
103b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        final PreferenceScreen screen = getPreferenceScreen();
104b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        screen.removeAll();
105b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        final ArrayList<ApplicationInfo> apps = new ArrayList<>();
10608531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        final ArraySet<String> requesting = mNoMan.getPackagesRequestingNotificationPolicyAccess();
10783f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        if (!requesting.isEmpty()) {
108b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            final List<ApplicationInfo> installed = mPkgMan.getInstalledApplications(0);
109b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            if (installed != null) {
110b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock                for (ApplicationInfo app : installed) {
11108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock                    if (requesting.contains(app.packageName)) {
112b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock                        apps.add(app);
11308531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock                    }
11408531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock                }
11508531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock            }
11608531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        }
11783f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        ArraySet<String> autoApproved = getEnabledNotificationListeners();
11883f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        requesting.addAll(autoApproved);
119b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        Collections.sort(apps, new PackageItemInfo.DisplayNameComparator(mPkgMan));
120b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        for (ApplicationInfo app : apps) {
121b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            final String pkg = app.packageName;
122a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            final CharSequence label = app.loadLabel(mPkgMan);
12339b467482d1bf256a111c757e9b7621c6f523271Jason Monk            final SwitchPreference pref = new SwitchPreference(getPrefContext());
124b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            pref.setPersistent(false);
125b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            pref.setIcon(app.loadIcon(mPkgMan));
126a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            pref.setTitle(label);
127b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            pref.setChecked(hasAccess(pkg));
12883f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds            if (autoApproved.contains(pkg)) {
12983f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                pref.setEnabled(false);
13083f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                pref.setSummary(getString(R.string.zen_access_disabled_package_warning));
13183f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds            }
132b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
133b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock                @Override
134b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock                public boolean onPreferenceChange(Preference preference, Object newValue) {
135b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock                    final boolean access = (Boolean) newValue;
136148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    if (access) {
137148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                        new ScaryWarningDialogFragment()
138148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                .setPkgInfo(pkg, label)
139148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                .show(getFragmentManager(), "dialog");
140148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    } else {
141148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                        new FriendlyWarningDialogFragment()
142148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                .setPkgInfo(pkg, label)
143148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                .show(getFragmentManager(), "dialog");
144a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    }
145a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    return false;
146b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock                }
147b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            });
148b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock            screen.addPreference(pref);
149b8099f542c21e3ac57d250837e60ec65653ab55cJohn Spurlock        }
15008531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    }
15108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
15283f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds    private ArraySet<String> getEnabledNotificationListeners() {
15383f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        ArraySet<String> packages = new ArraySet<>();
15483f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        String settingValue = Settings.Secure.getString(getContext().getContentResolver(),
15583f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
15683f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        if (!TextUtils.isEmpty(settingValue)) {
15783f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds            String[] restored = settingValue.split(ENABLED_SERVICES_SEPARATOR);
15883f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds            for (int i = 0; i < restored.length; i++) {
15983f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                ComponentName value = ComponentName.unflattenFromString(restored[i]);
16083f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                if (null != value) {
16183f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                    packages.add(value.getPackageName());
16283f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds                }
16383f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds            }
16483f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        }
16583f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds        return packages;
16683f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds    }
16783f35ba88dd80cc7e5613d11c546d989aa1ec078Julia Reynolds
16808531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    private boolean hasAccess(String pkg) {
16908531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock        return mNoMan.isNotificationPolicyAccessGrantedForPackage(pkg);
17008531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    }
17108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
172a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    private static void setAccess(final Context context, final String pkg, final boolean access) {
173a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        AsyncTask.execute(new Runnable() {
174a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            @Override
175a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            public void run() {
176a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                final NotificationManager mgr = context.getSystemService(NotificationManager.class);
177a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                mgr.setNotificationPolicyAccessGranted(pkg, access);
178a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            }
179a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        });
180a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    }
181a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
182148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds    private static void deleteRules(final Context context, final String pkg) {
183148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        AsyncTask.execute(new Runnable() {
184148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            @Override
185148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            public void run() {
186148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                final NotificationManager mgr = context.getSystemService(NotificationManager.class);
187148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                mgr.removeAutomaticZenRules(pkg);
188148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            }
189148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        });
190148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds    }
191148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds
192a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    private final class SettingObserver extends ContentObserver {
193a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        public SettingObserver() {
194a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            super(new Handler(Looper.getMainLooper()));
195a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        }
196a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
197a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        @Override
198a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        public void onChange(boolean selfChange, Uri uri) {
199a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            reloadList();
200a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        }
20108531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock    }
20208531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock
203148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds    /**
204148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds     * Warning dialog when allowing zen access warning about the privileges being granted.
205148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds     */
206a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    public static class ScaryWarningDialogFragment extends DialogFragment {
207a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        static final String KEY_PKG = "p";
208a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        static final String KEY_LABEL = "l";
209a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
210a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        public ScaryWarningDialogFragment setPkgInfo(String pkg, CharSequence label) {
211a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            Bundle args = new Bundle();
212a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            args.putString(KEY_PKG, pkg);
213a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            args.putString(KEY_LABEL, TextUtils.isEmpty(label) ? pkg : label.toString());
214a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            setArguments(args);
215a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            return this;
216a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        }
217a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
218a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        @Override
219a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        public Dialog onCreateDialog(Bundle savedInstanceState) {
220a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            super.onCreate(savedInstanceState);
221a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            final Bundle args = getArguments();
222a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            final String pkg = args.getString(KEY_PKG);
223a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            final String label = args.getString(KEY_LABEL);
224a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock
225a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            final String title = getResources().getString(R.string.zen_access_warning_dialog_title,
226a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    label);
227a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            final String summary = getResources()
228a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .getString(R.string.zen_access_warning_dialog_summary);
229a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock            return new AlertDialog.Builder(getContext())
230a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .setMessage(summary)
231a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .setTitle(title)
232a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .setCancelable(true)
233a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .setPositiveButton(R.string.allow,
234a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                            new DialogInterface.OnClickListener() {
235a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                                public void onClick(DialogInterface dialog, int id) {
236a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                                    setAccess(getContext(), pkg, true);
237a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                                }
238a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                            })
239a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .setNegativeButton(R.string.deny,
240a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                            new DialogInterface.OnClickListener() {
241a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                                public void onClick(DialogInterface dialog, int id) {
242a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                                    // pass
243a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                                }
244a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                            })
245a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock                    .create();
246a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock        }
247a00194d99852a0ce63bda50ad5134f99a423015eJohn Spurlock    }
248148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds
249148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds    /**
250148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds     * Warning dialog when revoking zen access warning that zen rule instances will be deleted.
251148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds     */
252148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds    public static class FriendlyWarningDialogFragment extends DialogFragment {
253148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        static final String KEY_PKG = "p";
254148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        static final String KEY_LABEL = "l";
255148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds
256148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        public FriendlyWarningDialogFragment setPkgInfo(String pkg, CharSequence label) {
257148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            Bundle args = new Bundle();
258148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            args.putString(KEY_PKG, pkg);
259148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            args.putString(KEY_LABEL, TextUtils.isEmpty(label) ? pkg : label.toString());
260148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            setArguments(args);
261148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            return this;
262148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        }
263148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds
264148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        @Override
265148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        public Dialog onCreateDialog(Bundle savedInstanceState) {
266148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            super.onCreate(savedInstanceState);
267148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            final Bundle args = getArguments();
268148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            final String pkg = args.getString(KEY_PKG);
269148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            final String label = args.getString(KEY_LABEL);
270148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds
271148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            final String title = getResources().getString(
272148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    R.string.zen_access_revoke_warning_dialog_title, label);
273148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            final String summary = getResources()
274148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .getString(R.string.zen_access_revoke_warning_dialog_summary);
275148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds            return new AlertDialog.Builder(getContext())
276148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .setMessage(summary)
277148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .setTitle(title)
278148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .setCancelable(true)
279148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .setPositiveButton(R.string.okay,
280148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                            new DialogInterface.OnClickListener() {
281148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                public void onClick(DialogInterface dialog, int id) {
282148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                    deleteRules(getContext(), pkg);
283148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                    setAccess(getContext(), pkg, false);
284148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                }
285148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                            })
286148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .setNegativeButton(R.string.cancel,
287148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                            new DialogInterface.OnClickListener() {
288148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                public void onClick(DialogInterface dialog, int id) {
289148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                    // pass
290148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                                }
291148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                            })
292148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds                    .create();
293148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds        }
294148ace318dde600f0b0100f373337ab534fa9ca0Julia Reynolds    }
29508531a81cb34dc45f0da4ca88e8530169831c7d2John Spurlock}
296