PermissionAppsFragment.java revision 724784b6b90f3d844e807dea1a95c687d592ea27
146c55104384a9138d51c18c24114885af842afdeJason Monk/*
246c55104384a9138d51c18c24114885af842afdeJason Monk * Copyright (C) 2015 The Android Open Source Project
346c55104384a9138d51c18c24114885af842afdeJason Monk *
446c55104384a9138d51c18c24114885af842afdeJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
546c55104384a9138d51c18c24114885af842afdeJason Monk * you may not use this file except in compliance with the License.
646c55104384a9138d51c18c24114885af842afdeJason Monk * You may obtain a copy of the License at
746c55104384a9138d51c18c24114885af842afdeJason Monk *
846c55104384a9138d51c18c24114885af842afdeJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
946c55104384a9138d51c18c24114885af842afdeJason Monk *
1046c55104384a9138d51c18c24114885af842afdeJason Monk * Unless required by applicable law or agreed to in writing, software
1146c55104384a9138d51c18c24114885af842afdeJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
1246c55104384a9138d51c18c24114885af842afdeJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1346c55104384a9138d51c18c24114885af842afdeJason Monk * See the License for the specific language governing permissions and
1446c55104384a9138d51c18c24114885af842afdeJason Monk * limitations under the License.
1546c55104384a9138d51c18c24114885af842afdeJason Monk */
16a7a0406958991f7a964370295821d8e477f503e9Svet Ganovpackage com.android.packageinstaller.permission.ui;
1746c55104384a9138d51c18c24114885af842afdeJason Monk
18bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.annotation.Nullable;
19bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.app.ActionBar;
20d7f8200201563ca300572e2b56100acfd010140dJason Monkimport android.app.AlertDialog;
2146c55104384a9138d51c18c24114885af842afdeJason Monkimport android.content.Context;
22d7f8200201563ca300572e2b56100acfd010140dJason Monkimport android.content.DialogInterface;
23d7f8200201563ca300572e2b56100acfd010140dJason Monkimport android.content.DialogInterface.OnClickListener;
2446c55104384a9138d51c18c24114885af842afdeJason Monkimport android.content.Intent;
25bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.graphics.drawable.Drawable;
2646c55104384a9138d51c18c24114885af842afdeJason Monkimport android.os.Bundle;
27f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkertimport android.support.v14.preference.SwitchPreference;
2808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport android.support.v4.util.ArrayMap;
29f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkertimport android.support.v7.preference.Preference;
30f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkertimport android.support.v7.preference.Preference.OnPreferenceChangeListener;
31f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkertimport android.support.v7.preference.PreferenceScreen;
329f0442cdfc055cc3aed19770f48f516b052f6e60Jason Monkimport android.util.ArraySet;
33ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monkimport android.view.Menu;
34ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monkimport android.view.MenuInflater;
3546c55104384a9138d51c18c24114885af842afdeJason Monkimport android.view.MenuItem;
36bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.View;
37bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.ViewGroup;
38bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.widget.ImageView;
39bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.widget.TextView;
4046c55104384a9138d51c18c24114885af842afdeJason Monk
41bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport com.android.packageinstaller.R;
42267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganovimport com.android.packageinstaller.permission.model.AppPermissionGroup;
43a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps;
44a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps.Callback;
45a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps.PermissionApp;
466dc9e5007de25dd9dd8fd6ebc42d9322069a9a38Jason Monkimport com.android.packageinstaller.permission.utils.LocationUtils;
4708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport com.android.packageinstaller.permission.utils.SafetyNetLogger;
4893568c580d730911a6e2734e79fbe6dc27c1bca1Jason Monkimport com.android.packageinstaller.permission.utils.Utils;
4908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov
5008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport java.util.ArrayList;
5108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport java.util.List;
5246c55104384a9138d51c18c24114885af842afdeJason Monk
53f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkertpublic final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback,
54a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        OnPreferenceChangeListener {
5546c55104384a9138d51c18c24114885af842afdeJason Monk
56ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    private static final int MENU_SHOW_SYSTEM = Menu.FIRST;
57ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 1;
58ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk
59a7a0406958991f7a964370295821d8e477f503e9Svet Ganov    public static PermissionAppsFragment newInstance(String permissionName) {
60a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        PermissionAppsFragment instance = new PermissionAppsFragment();
6146c55104384a9138d51c18c24114885af842afdeJason Monk        Bundle arguments = new Bundle();
6246c55104384a9138d51c18c24114885af842afdeJason Monk        arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName);
6346c55104384a9138d51c18c24114885af842afdeJason Monk        instance.setArguments(arguments);
6446c55104384a9138d51c18c24114885af842afdeJason Monk        return instance;
6546c55104384a9138d51c18c24114885af842afdeJason Monk    }
6646c55104384a9138d51c18c24114885af842afdeJason Monk
67a7a0406958991f7a964370295821d8e477f503e9Svet Ganov    private PermissionApps mPermissionApps;
6846c55104384a9138d51c18c24114885af842afdeJason Monk
69267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov    private ArrayMap<String, AppPermissionGroup> mToggledGroups;
709f0442cdfc055cc3aed19770f48f516b052f6e60Jason Monk    private ArraySet<String> mLauncherPkgs;
71d7f8200201563ca300572e2b56100acfd010140dJason Monk    private boolean mHasConfirmedRevoke;
7208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov
73ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    private boolean mShowSystem;
74ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    private MenuItem mShowSystemMenu;
75ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    private MenuItem mHideSystemMenu;
76ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk
7746c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
7846c55104384a9138d51c18c24114885af842afdeJason Monk    public void onCreate(Bundle savedInstanceState) {
7946c55104384a9138d51c18c24114885af842afdeJason Monk        super.onCreate(savedInstanceState);
8046c55104384a9138d51c18c24114885af842afdeJason Monk        setHasOptionsMenu(true);
81bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final ActionBar ab = getActivity().getActionBar();
82bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (ab != null) {
83bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            ab.setDisplayHomeAsUpEnabled(true);
84bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
859f0442cdfc055cc3aed19770f48f516b052f6e60Jason Monk        mLauncherPkgs = Utils.getLauncherPackages(getContext());
8646c55104384a9138d51c18c24114885af842afdeJason Monk    }
8746c55104384a9138d51c18c24114885af842afdeJason Monk
8846c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
8946c55104384a9138d51c18c24114885af842afdeJason Monk    public void onResume() {
9046c55104384a9138d51c18c24114885af842afdeJason Monk        super.onResume();
9193568c580d730911a6e2734e79fbe6dc27c1bca1Jason Monk        mPermissionApps.refresh(true);
9246c55104384a9138d51c18c24114885af842afdeJason Monk    }
9346c55104384a9138d51c18c24114885af842afdeJason Monk
9446c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
95ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
96ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk        mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE,
97ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                R.string.menu_show_system);
98ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk        mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE,
99ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                R.string.menu_hide_system);
100ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk        updateMenu();
101ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    }
102ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk
103ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    @Override
10446c55104384a9138d51c18c24114885af842afdeJason Monk    public boolean onOptionsItemSelected(MenuItem item) {
10546c55104384a9138d51c18c24114885af842afdeJason Monk        switch (item.getItemId()) {
10646c55104384a9138d51c18c24114885af842afdeJason Monk            case android.R.id.home:
10746c55104384a9138d51c18c24114885af842afdeJason Monk                getActivity().finish();
10846c55104384a9138d51c18c24114885af842afdeJason Monk                return true;
109ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk            case MENU_SHOW_SYSTEM:
110ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk            case MENU_HIDE_SYSTEM:
111ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                mShowSystem = item.getItemId() == MENU_SHOW_SYSTEM;
1125cce11574dc8bd5068b9cc85303c5ab1c1bf38ceJason Monk                if (mPermissionApps.getApps() != null) {
1135cce11574dc8bd5068b9cc85303c5ab1c1bf38ceJason Monk                    onPermissionsLoaded(mPermissionApps);
1145cce11574dc8bd5068b9cc85303c5ab1c1bf38ceJason Monk                }
115ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                updateMenu();
116ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                break;
11746c55104384a9138d51c18c24114885af842afdeJason Monk        }
11846c55104384a9138d51c18c24114885af842afdeJason Monk        return super.onOptionsItemSelected(item);
11946c55104384a9138d51c18c24114885af842afdeJason Monk    }
12046c55104384a9138d51c18c24114885af842afdeJason Monk
121ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    private void updateMenu() {
122ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk        mShowSystemMenu.setVisible(!mShowSystem);
123ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk        mHideSystemMenu.setVisible(mShowSystem);
124ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk    }
125ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk
126bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    @Override
127f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkert    protected void onSetEmptyText(TextView textView) {
128f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkert        textView.setText(R.string.no_apps);
129bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    }
130bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler
131bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    @Override
132bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
133bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        super.onViewCreated(view, savedInstanceState);
134bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        bindUi();
135bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    }
136bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler
13746c55104384a9138d51c18c24114885af842afdeJason Monk    private void bindUi() {
13846c55104384a9138d51c18c24114885af842afdeJason Monk        String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME);
139a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        mPermissionApps = new PermissionApps(getActivity(), groupName, this);
140a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        final Drawable icon = mPermissionApps.getIcon();
141a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        final CharSequence label = mPermissionApps.getLabel();
142f98edbc4f1ced3a9f3394ee5ef881d1cec852bbaJason Monk        final ActionBar ab = getActivity().getActionBar();
143f98edbc4f1ced3a9f3394ee5ef881d1cec852bbaJason Monk        if (ab != null) {
144f98edbc4f1ced3a9f3394ee5ef881d1cec852bbaJason Monk            ab.setTitle(getString(R.string.permission_title, label));
145f98edbc4f1ced3a9f3394ee5ef881d1cec852bbaJason Monk        }
146bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler
147bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final ViewGroup rootView = (ViewGroup) getView();
148bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon);
149bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (iconView != null) {
150e685b3d2c867f8a7c1eac5bf9249bd3983244cf5Todd Volkert            // Set the icon as the background instead of the image because ImageView
151e685b3d2c867f8a7c1eac5bf9249bd3983244cf5Todd Volkert            // doesn't properly scale vector drawables beyond their intrinsic size
152e685b3d2c867f8a7c1eac5bf9249bd3983244cf5Todd Volkert            iconView.setBackground(icon);
153bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
154bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title);
155bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (titleView != null) {
156bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            titleView.setText(label);
157bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
158bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb);
159bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (breadcrumbView != null) {
160bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            breadcrumbView.setText(R.string.app_permissions);
161bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
16246c55104384a9138d51c18c24114885af842afdeJason Monk    }
16346c55104384a9138d51c18c24114885af842afdeJason Monk
16446c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
16593568c580d730911a6e2734e79fbe6dc27c1bca1Jason Monk    public void onPermissionsLoaded(PermissionApps permissionApps) {
166f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61Todd Volkert        Context context = getPreferenceManager().getContext();
167267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov
168267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov        if (context == null) {
169267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov            return;
170267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov        }
171267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov
17246c55104384a9138d51c18c24114885af842afdeJason Monk        PreferenceScreen preferences = getPreferenceScreen();
17346c55104384a9138d51c18c24114885af842afdeJason Monk        preferences.removeAll();
1745cce11574dc8bd5068b9cc85303c5ab1c1bf38ceJason Monk        for (PermissionApp app : permissionApps.getApps()) {
17593568c580d730911a6e2734e79fbe6dc27c1bca1Jason Monk            if (!Utils.shouldShowPermission(app)) {
1764ef4881c8625437083c4fee36a68b235c5c36b2bSvet Ganov                continue;
1774ef4881c8625437083c4fee36a68b235c5c36b2bSvet Ganov            }
1784ef4881c8625437083c4fee36a68b235c5c36b2bSvet Ganov
17946c55104384a9138d51c18c24114885af842afdeJason Monk            SwitchPreference pref = (SwitchPreference) findPreference(app.getKey());
1809f0442cdfc055cc3aed19770f48f516b052f6e60Jason Monk            if (!mShowSystem && Utils.isSystem(app, mLauncherPkgs)) {
181ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                if (pref != null) {
182ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                    preferences.removePreference(pref);
183ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                }
184ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk                continue;
185ae2ceca3c7ac2c3420541f552a2dc47f261ec199Jason Monk            }
18646c55104384a9138d51c18c24114885af842afdeJason Monk            if (pref == null) {
18746c55104384a9138d51c18c24114885af842afdeJason Monk                pref = new SwitchPreference(context);
18846c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setOnPreferenceChangeListener(this);
18946c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setKey(app.getKey());
19046c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setIcon(app.getIcon());
19146c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setTitle(app.getLabel());
19246c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setPersistent(false);
193785a9b6369db4c46a389a43ae30e1f6e8003366bSvet Ganov                pref.setEnabled(!app.isPolicyFixed());
19446c55104384a9138d51c18c24114885af842afdeJason Monk                preferences.addPreference(pref);
19546c55104384a9138d51c18c24114885af842afdeJason Monk            }
196a7a0406958991f7a964370295821d8e477f503e9Svet Ganov            pref.setChecked(app.areRuntimePermissionsGranted());
19746c55104384a9138d51c18c24114885af842afdeJason Monk        }
19846c55104384a9138d51c18c24114885af842afdeJason Monk    }
19946c55104384a9138d51c18c24114885af842afdeJason Monk
20046c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
201d7f8200201563ca300572e2b56100acfd010140dJason Monk    public boolean onPreferenceChange(final Preference preference, Object newValue) {
20246c55104384a9138d51c18c24114885af842afdeJason Monk        String pkg = preference.getKey();
203d7f8200201563ca300572e2b56100acfd010140dJason Monk        final PermissionApp app = mPermissionApps.getApp(pkg);
20446c55104384a9138d51c18c24114885af842afdeJason Monk
2056dc9e5007de25dd9dd8fd6ebc42d9322069a9a38Jason Monk        if (app == null) {
2066dc9e5007de25dd9dd8fd6ebc42d9322069a9a38Jason Monk            return false;
2076dc9e5007de25dd9dd8fd6ebc42d9322069a9a38Jason Monk        }
20808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        addToggledGroup(app.getPackageName(), app.getPermissionGroup());
20908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov
2106dc9e5007de25dd9dd8fd6ebc42d9322069a9a38Jason Monk        if (LocationUtils.isLocked(mPermissionApps.getGroupName(), app.getPackageName())) {
2116dc9e5007de25dd9dd8fd6ebc42d9322069a9a38Jason Monk            LocationUtils.showLocationDialog(getContext(), app.getLabel());
21246c55104384a9138d51c18c24114885af842afdeJason Monk            return false;
21346c55104384a9138d51c18c24114885af842afdeJason Monk        }
21446c55104384a9138d51c18c24114885af842afdeJason Monk        if (newValue == Boolean.TRUE) {
21546c55104384a9138d51c18c24114885af842afdeJason Monk            app.grantRuntimePermissions();
21646c55104384a9138d51c18c24114885af842afdeJason Monk        } else {
217724784b6b90f3d844e807dea1a95c687d592ea27Svet Ganov            final boolean grantedByDefault = app.hasGrantedByDefaultPermissions();
218724784b6b90f3d844e807dea1a95c687d592ea27Svet Ganov            if (grantedByDefault || (!app.hasRuntimePermissions() && !mHasConfirmedRevoke)) {
219d7f8200201563ca300572e2b56100acfd010140dJason Monk                new AlertDialog.Builder(getContext())
220724784b6b90f3d844e807dea1a95c687d592ea27Svet Ganov                        .setMessage(grantedByDefault ? R.string.system_warning
221f193d204d523e400011b0742f3aa8bc5388a4935Jason Monk                                : R.string.old_sdk_deny_warning)
222d7f8200201563ca300572e2b56100acfd010140dJason Monk                        .setNegativeButton(R.string.cancel, null)
223d7f8200201563ca300572e2b56100acfd010140dJason Monk                        .setPositiveButton(R.string.grant_dialog_button_deny,
224d7f8200201563ca300572e2b56100acfd010140dJason Monk                                new OnClickListener() {
225d7f8200201563ca300572e2b56100acfd010140dJason Monk                            @Override
226d7f8200201563ca300572e2b56100acfd010140dJason Monk                            public void onClick(DialogInterface dialog, int which) {
227d7f8200201563ca300572e2b56100acfd010140dJason Monk                                ((SwitchPreference) preference).setChecked(false);
228d7f8200201563ca300572e2b56100acfd010140dJason Monk                                app.revokeRuntimePermissions();
229724784b6b90f3d844e807dea1a95c687d592ea27Svet Ganov                                if (!grantedByDefault) {
230f193d204d523e400011b0742f3aa8bc5388a4935Jason Monk                                    mHasConfirmedRevoke = true;
231f193d204d523e400011b0742f3aa8bc5388a4935Jason Monk                                }
232d7f8200201563ca300572e2b56100acfd010140dJason Monk                            }
233d7f8200201563ca300572e2b56100acfd010140dJason Monk                        })
234d7f8200201563ca300572e2b56100acfd010140dJason Monk                        .show();
235d7f8200201563ca300572e2b56100acfd010140dJason Monk                return false;
236d7f8200201563ca300572e2b56100acfd010140dJason Monk            } else {
237d7f8200201563ca300572e2b56100acfd010140dJason Monk                app.revokeRuntimePermissions();
238d7f8200201563ca300572e2b56100acfd010140dJason Monk            }
23946c55104384a9138d51c18c24114885af842afdeJason Monk        }
24046c55104384a9138d51c18c24114885af842afdeJason Monk        return true;
24146c55104384a9138d51c18c24114885af842afdeJason Monk    }
24246c55104384a9138d51c18c24114885af842afdeJason Monk
24308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov    @Override
24408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov    public void onPause() {
24508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        super.onPause();
24608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        logToggledGroups();
24708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov    }
24808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov
249267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov    private void addToggledGroup(String packageName, AppPermissionGroup group) {
25008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        if (mToggledGroups == null) {
25108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            mToggledGroups = new ArrayMap<>();
25208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        }
25308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        // Double toggle is back to initial state.
25408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        if (mToggledGroups.containsKey(packageName)) {
25508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            mToggledGroups.remove(packageName);
25608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        } else {
25708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            mToggledGroups.put(packageName, group);
25808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        }
25908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov    }
26008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov
26108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov    private void logToggledGroups() {
26208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        if (mToggledGroups != null) {
26308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            final int groupCount = mToggledGroups.size();
26408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            for (int i = 0; i < groupCount; i++) {
26508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov                String packageName = mToggledGroups.keyAt(i);
266267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov                List<AppPermissionGroup> groups = new ArrayList<>();
26708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov                groups.add(mToggledGroups.valueAt(i));
26808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov                SafetyNetLogger.logPermissionsToggled(packageName, groups);
26908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            }
27008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov            mToggledGroups = null;
27108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov        }
27208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov    }
27346c55104384a9138d51c18c24114885af842afdeJason Monk}
274