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