PermissionAppsFragment.java revision a7a0406958991f7a964370295821d8e477f503e9
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; 2046c55104384a9138d51c18c24114885af842afdeJason Monkimport android.content.Context; 2146c55104384a9138d51c18c24114885af842afdeJason Monkimport android.content.Intent; 22bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.graphics.drawable.Drawable; 2346c55104384a9138d51c18c24114885af842afdeJason Monkimport android.os.Bundle; 2446c55104384a9138d51c18c24114885af842afdeJason Monkimport android.preference.Preference; 25bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.preference.Preference.OnPreferenceChangeListener; 2646c55104384a9138d51c18c24114885af842afdeJason Monkimport android.preference.PreferenceScreen; 2746c55104384a9138d51c18c24114885af842afdeJason Monkimport android.preference.SwitchPreference; 28bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.LayoutInflater; 2946c55104384a9138d51c18c24114885af842afdeJason Monkimport android.view.MenuItem; 30bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.View; 31bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.ViewGroup; 32bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.widget.ImageView; 33bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.widget.TextView; 3446c55104384a9138d51c18c24114885af842afdeJason Monk 35bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport com.android.packageinstaller.R; 36a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps; 37a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps.Callback; 38a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; 3946c55104384a9138d51c18c24114885af842afdeJason Monk 40a7a0406958991f7a964370295821d8e477f503e9Svet Ganovpublic final class PermissionAppsFragment extends SettingsWithHeader implements Callback, 41a7a0406958991f7a964370295821d8e477f503e9Svet Ganov OnPreferenceChangeListener { 4246c55104384a9138d51c18c24114885af842afdeJason Monk 43a7a0406958991f7a964370295821d8e477f503e9Svet Ganov public static PermissionAppsFragment newInstance(String permissionName) { 44a7a0406958991f7a964370295821d8e477f503e9Svet Ganov PermissionAppsFragment instance = new PermissionAppsFragment(); 4546c55104384a9138d51c18c24114885af842afdeJason Monk Bundle arguments = new Bundle(); 4646c55104384a9138d51c18c24114885af842afdeJason Monk arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName); 4746c55104384a9138d51c18c24114885af842afdeJason Monk instance.setArguments(arguments); 4846c55104384a9138d51c18c24114885af842afdeJason Monk return instance; 4946c55104384a9138d51c18c24114885af842afdeJason Monk } 5046c55104384a9138d51c18c24114885af842afdeJason Monk 51a7a0406958991f7a964370295821d8e477f503e9Svet Ganov private PermissionApps mPermissionApps; 5246c55104384a9138d51c18c24114885af842afdeJason Monk 5346c55104384a9138d51c18c24114885af842afdeJason Monk @Override 5446c55104384a9138d51c18c24114885af842afdeJason Monk public void onCreate(Bundle savedInstanceState) { 5546c55104384a9138d51c18c24114885af842afdeJason Monk super.onCreate(savedInstanceState); 5646c55104384a9138d51c18c24114885af842afdeJason Monk setHasOptionsMenu(true); 57bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler final ActionBar ab = getActivity().getActionBar(); 58bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler if (ab != null) { 59bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler ab.setDisplayHomeAsUpEnabled(true); 60bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 6146c55104384a9138d51c18c24114885af842afdeJason Monk } 6246c55104384a9138d51c18c24114885af842afdeJason Monk 6346c55104384a9138d51c18c24114885af842afdeJason Monk @Override 6446c55104384a9138d51c18c24114885af842afdeJason Monk public void onResume() { 6546c55104384a9138d51c18c24114885af842afdeJason Monk super.onResume(); 66a7a0406958991f7a964370295821d8e477f503e9Svet Ganov mPermissionApps.refresh(); 6746c55104384a9138d51c18c24114885af842afdeJason Monk } 6846c55104384a9138d51c18c24114885af842afdeJason Monk 6946c55104384a9138d51c18c24114885af842afdeJason Monk @Override 7046c55104384a9138d51c18c24114885af842afdeJason Monk public boolean onOptionsItemSelected(MenuItem item) { 7146c55104384a9138d51c18c24114885af842afdeJason Monk switch (item.getItemId()) { 7246c55104384a9138d51c18c24114885af842afdeJason Monk case android.R.id.home: 7346c55104384a9138d51c18c24114885af842afdeJason Monk getActivity().finish(); 7446c55104384a9138d51c18c24114885af842afdeJason Monk return true; 7546c55104384a9138d51c18c24114885af842afdeJason Monk } 7646c55104384a9138d51c18c24114885af842afdeJason Monk return super.onOptionsItemSelected(item); 7746c55104384a9138d51c18c24114885af842afdeJason Monk } 7846c55104384a9138d51c18c24114885af842afdeJason Monk 79bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler @Override 80bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler public View onCreateView(LayoutInflater inflater, ViewGroup container, 81bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler Bundle savedInstanceState) { 82bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container, 83bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler false); 84bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container); 85bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler if (prefsContainer == null) { 86bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler prefsContainer = rootView; 87bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 88bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler prefsContainer.addView(super.onCreateView(inflater, prefsContainer, savedInstanceState)); 89bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler View emptyView = rootView.findViewById(R.id.no_permissions); 90bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler if (emptyView != null) { 91bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler emptyView.setVisibility(View.GONE); 92bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 93bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler return rootView; 94bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 95bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler 96bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler @Override 97bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 98bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler super.onViewCreated(view, savedInstanceState); 99bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler bindUi(); 100bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 101bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler 10246c55104384a9138d51c18c24114885af842afdeJason Monk private void bindUi() { 10346c55104384a9138d51c18c24114885af842afdeJason Monk String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); 104a7a0406958991f7a964370295821d8e477f503e9Svet Ganov mPermissionApps = new PermissionApps(getActivity(), groupName, this); 105a7a0406958991f7a964370295821d8e477f503e9Svet Ganov final Drawable icon = mPermissionApps.getIcon(); 106a7a0406958991f7a964370295821d8e477f503e9Svet Ganov final CharSequence label = mPermissionApps.getLabel(); 107bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler setHeader(icon, label, null); 108bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler 109bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler final ViewGroup rootView = (ViewGroup) getView(); 110bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); 111bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler if (iconView != null) { 112bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler iconView.setImageDrawable(icon); 113bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 114bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); 115bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler if (titleView != null) { 116bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler titleView.setText(label); 117bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 118bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); 119bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler if (breadcrumbView != null) { 120bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler breadcrumbView.setText(R.string.app_permissions); 121bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler } 12246c55104384a9138d51c18c24114885af842afdeJason Monk } 12346c55104384a9138d51c18c24114885af842afdeJason Monk 12446c55104384a9138d51c18c24114885af842afdeJason Monk @Override 12546c55104384a9138d51c18c24114885af842afdeJason Monk public void onPermissionsLoaded() { 12646c55104384a9138d51c18c24114885af842afdeJason Monk Context context = getActivity(); 12746c55104384a9138d51c18c24114885af842afdeJason Monk PreferenceScreen preferences = getPreferenceScreen(); 12846c55104384a9138d51c18c24114885af842afdeJason Monk if (preferences == null) { 12946c55104384a9138d51c18c24114885af842afdeJason Monk preferences = getPreferenceManager().createPreferenceScreen(getActivity()); 13046c55104384a9138d51c18c24114885af842afdeJason Monk setPreferenceScreen(preferences); 13146c55104384a9138d51c18c24114885af842afdeJason Monk } 13246c55104384a9138d51c18c24114885af842afdeJason Monk preferences.removeAll(); 133a7a0406958991f7a964370295821d8e477f503e9Svet Ganov for (PermissionApp app : mPermissionApps.getApps()) { 13446c55104384a9138d51c18c24114885af842afdeJason Monk SwitchPreference pref = (SwitchPreference) findPreference(app.getKey()); 13546c55104384a9138d51c18c24114885af842afdeJason Monk if (pref == null) { 13646c55104384a9138d51c18c24114885af842afdeJason Monk pref = new SwitchPreference(context); 13746c55104384a9138d51c18c24114885af842afdeJason Monk pref.setOnPreferenceChangeListener(this); 13846c55104384a9138d51c18c24114885af842afdeJason Monk pref.setKey(app.getKey()); 13946c55104384a9138d51c18c24114885af842afdeJason Monk pref.setIcon(app.getIcon()); 14046c55104384a9138d51c18c24114885af842afdeJason Monk pref.setTitle(app.getLabel()); 14146c55104384a9138d51c18c24114885af842afdeJason Monk pref.setPersistent(false); 14246c55104384a9138d51c18c24114885af842afdeJason Monk preferences.addPreference(pref); 14346c55104384a9138d51c18c24114885af842afdeJason Monk } 144a7a0406958991f7a964370295821d8e477f503e9Svet Ganov pref.setChecked(app.areRuntimePermissionsGranted()); 14546c55104384a9138d51c18c24114885af842afdeJason Monk } 14646c55104384a9138d51c18c24114885af842afdeJason Monk } 14746c55104384a9138d51c18c24114885af842afdeJason Monk 14846c55104384a9138d51c18c24114885af842afdeJason Monk @Override 14946c55104384a9138d51c18c24114885af842afdeJason Monk public boolean onPreferenceChange(Preference preference, Object newValue) { 15046c55104384a9138d51c18c24114885af842afdeJason Monk String pkg = preference.getKey(); 151a7a0406958991f7a964370295821d8e477f503e9Svet Ganov PermissionApp app = mPermissionApps.getApp(pkg); 15246c55104384a9138d51c18c24114885af842afdeJason Monk 15346c55104384a9138d51c18c24114885af842afdeJason Monk if (app == null) { 15446c55104384a9138d51c18c24114885af842afdeJason Monk return false; 15546c55104384a9138d51c18c24114885af842afdeJason Monk } 15646c55104384a9138d51c18c24114885af842afdeJason Monk if (newValue == Boolean.TRUE) { 15746c55104384a9138d51c18c24114885af842afdeJason Monk app.grantRuntimePermissions(); 15846c55104384a9138d51c18c24114885af842afdeJason Monk } else { 15946c55104384a9138d51c18c24114885af842afdeJason Monk app.revokeRuntimePermissions(); 16046c55104384a9138d51c18c24114885af842afdeJason Monk } 16146c55104384a9138d51c18c24114885af842afdeJason Monk return true; 16246c55104384a9138d51c18c24114885af842afdeJason Monk } 16346c55104384a9138d51c18c24114885af842afdeJason Monk 16446c55104384a9138d51c18c24114885af842afdeJason Monk} 165