ManagePermissionsFragment.java revision f589a098e175c9779aa4ba9d4c40eea6cdafde2e
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.packageinstaller.permission.ui; 17 18import android.app.ActionBar; 19import android.app.Activity; 20import android.app.FragmentTransaction; 21import android.content.ActivityNotFoundException; 22import android.content.Intent; 23import android.os.Bundle; 24import android.preference.Preference; 25import android.preference.Preference.OnPreferenceClickListener; 26import android.preference.PreferenceFragment; 27import android.preference.PreferenceScreen; 28import android.util.Log; 29import android.view.Menu; 30import android.view.MenuInflater; 31import android.view.MenuItem; 32 33import com.android.packageinstaller.R; 34import com.android.packageinstaller.permission.model.PermissionApps; 35import com.android.packageinstaller.permission.model.PermissionApps.PmCache; 36import com.android.packageinstaller.permission.model.PermissionGroup; 37import com.android.packageinstaller.permission.model.PermissionGroups; 38import com.android.packageinstaller.permission.utils.Utils; 39 40import java.util.List; 41 42public final class ManagePermissionsFragment extends PreferenceFragment 43 implements PermissionGroups.PermissionsGroupsChangeCallback, OnPreferenceClickListener { 44 private static final String LOG_TAG = "ManagePermissionsFragment"; 45 46 private static final String OS_PKG = "android"; 47 48 private static final String EXTRA_PREFS_KEY = "extra_prefs_key"; 49 50 private PermissionGroups mPermissions; 51 52 private PreferenceScreen mExtraScreen; 53 54 private boolean mShowLegacyPermissions; 55 56 public static ManagePermissionsFragment newInstance() { 57 return new ManagePermissionsFragment(); 58 } 59 60 @Override 61 public void onCreate(Bundle icicle) { 62 super.onCreate(icicle); 63 setHasOptionsMenu(true); 64 final ActionBar ab = getActivity().getActionBar(); 65 if (ab != null) { 66 ab.setDisplayHomeAsUpEnabled(true); 67 } 68 mPermissions = new PermissionGroups(getActivity(), getLoaderManager(), this); 69 } 70 71 @Override 72 public void onResume() { 73 super.onResume(); 74 mPermissions.refresh(); 75 updatePermissionsUi(); 76 } 77 78 @Override 79 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 80 super.onCreateOptionsMenu(menu, inflater); 81 inflater.inflate(R.menu.toggle_legacy_permissions, menu); 82 } 83 84 @Override 85 public void onPrepareOptionsMenu(Menu menu) { 86 MenuItem item = menu.findItem(R.id.toggle_legacy_permissions); 87 if (!mShowLegacyPermissions) { 88 item.setTitle(R.string.show_legacy_permissions); 89 } else { 90 item.setTitle(R.string.hide_legacy_permissions); 91 } 92 } 93 94 @Override 95 public boolean onOptionsItemSelected(MenuItem item) { 96 switch (item.getItemId()) { 97 case android.R.id.home: { 98 getActivity().finish(); 99 return true; 100 } 101 102 case R.id.toggle_legacy_permissions: { 103 mShowLegacyPermissions = !mShowLegacyPermissions; 104 updatePermissionsUi(); 105 return true; 106 } 107 } 108 return super.onOptionsItemSelected(item); 109 } 110 111 @Override 112 public boolean onPreferenceClick(Preference preference) { 113 String key = preference.getKey(); 114 115 PermissionGroup group = mPermissions.getGroup(key); 116 if (group == null) { 117 return false; 118 } 119 120 Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) 121 .putExtra(Intent.EXTRA_PERMISSION_NAME, key); 122 try { 123 getActivity().startActivity(intent); 124 } catch (ActivityNotFoundException e) { 125 Log.w(LOG_TAG, "No app to handle " + intent); 126 } 127 128 return true; 129 } 130 131 @Override 132 public void onPermissionGroupsChanged() { 133 updatePermissionsUi(); 134 } 135 136 private void updatePermissionsUi() { 137 Activity activity = getActivity(); 138 139 if (activity == null) { 140 return; 141 } 142 143 List<PermissionGroup> groups = mPermissions.getGroups(); 144 145 PreferenceScreen screen = getPreferenceScreen(); 146 if (screen == null) { 147 screen = getPreferenceManager().createPreferenceScreen(activity); 148 setPreferenceScreen(screen); 149 } 150 151 // Use this to speed up getting the info for all of the PermissionApps below. 152 // Create a new one for each refresh to make sure it has fresh data. 153 PmCache cache = new PmCache(getContext().getPackageManager()); 154 for (PermissionGroup group : groups) { 155 // Show legacy permissions only if the user chose that. 156 if (!mShowLegacyPermissions && group.getDeclaringPackage().equals(OS_PKG) 157 && !Utils.isModernPermissionGroup(group.getName())) { 158 continue; 159 } 160 161 Preference preference = findPreference(group.getName()); 162 if (preference == null && mExtraScreen != null) { 163 preference = mExtraScreen.findPreference(group.getName()); 164 } 165 if (preference == null) { 166 preference = new Preference(activity, null); 167 preference.setOnPreferenceClickListener(this); 168 preference.setKey(group.getName()); 169 preference.setIcon(Utils.applyTint(activity, group.getIcon(), 170 android.R.attr.colorControlNormal)); 171 preference.setTitle(group.getLabel()); 172 preference.setPersistent(false); 173 if (group.getDeclaringPackage().equals(OS_PKG)) { 174 screen.addPreference(preference); 175 } else { 176 if (mExtraScreen == null) { 177 mExtraScreen = getPreferenceManager().createPreferenceScreen(activity); 178 } 179 mExtraScreen.addPreference(preference); 180 } 181 } 182 final Preference finalPref = preference; 183 184 new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() { 185 @Override 186 public void onPermissionsLoaded(PermissionApps permissionApps) { 187 if (getActivity() == null) { 188 return; 189 } 190 int granted = permissionApps.getGrantedCount(); 191 int total = permissionApps.getTotalCount(); 192 finalPref.setSummary(getString(R.string.app_permissions_group_summary, 193 granted, total)); 194 } 195 }, cache).refresh(false); 196 } 197 198 if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0 199 && screen.findPreference(EXTRA_PREFS_KEY) == null) { 200 Preference extraScreenPreference = new Preference(activity); 201 extraScreenPreference.setKey(EXTRA_PREFS_KEY); 202 extraScreenPreference.setIcon(R.drawable.ic_toc); 203 extraScreenPreference.setTitle(R.string.additional_permissions); 204 extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { 205 @Override 206 public boolean onPreferenceClick(Preference preference) { 207 AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); 208 frag.setTargetFragment(ManagePermissionsFragment.this, 0); 209 FragmentTransaction ft = getFragmentManager().beginTransaction(); 210 ft.replace(android.R.id.content, frag); 211 ft.addToBackStack("AdditionalPerms"); 212 ft.commit(); 213 return true; 214 } 215 }); 216 extraScreenPreference.setSummary(getString(R.string.additional_permissions_more, 217 mExtraScreen.getPreferenceCount())); 218 screen.addPreference(extraScreenPreference); 219 } 220 } 221 222 public static class AdditionalPermissionsFragment extends PreferenceFragment { 223 @Override 224 public void onCreate(Bundle icicle) { 225 super.onCreate(icicle); 226 getActivity().setTitle(R.string.additional_permissions); 227 setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen); 228 setHasOptionsMenu(true); 229 } 230 231 @Override 232 public void onDestroy() { 233 getActivity().setTitle(R.string.app_permissions); 234 super.onDestroy(); 235 } 236 237 @Override 238 public boolean onOptionsItemSelected(MenuItem item) { 239 switch (item.getItemId()) { 240 case android.R.id.home: 241 getFragmentManager().popBackStack(); 242 return true; 243 } 244 return super.onOptionsItemSelected(item); 245 } 246 247 } 248} 249