• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
16 package com.android.packageinstaller.permission.ui.handheld;
17 
18 import android.app.ActionBar;
19 import android.app.FragmentTransaction;
20 import android.content.ActivityNotFoundException;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.graphics.drawable.Drawable;
24 import android.os.Bundle;
25 import android.preference.Preference;
26 import android.preference.Preference.OnPreferenceClickListener;
27 import android.preference.PreferenceScreen;
28 import android.util.ArraySet;
29 import android.util.Log;
30 import android.view.MenuItem;
31 import android.view.View;
32 import android.widget.ImageView;
33 import android.widget.TextView;
34 import com.android.packageinstaller.R;
35 import com.android.packageinstaller.permission.model.PermissionApps;
36 import com.android.packageinstaller.permission.model.PermissionApps.PmCache;
37 import com.android.packageinstaller.permission.model.PermissionGroup;
38 import com.android.packageinstaller.permission.model.PermissionGroups;
39 import com.android.packageinstaller.permission.utils.Utils;
40 
41 import java.util.List;
42 
43 public final class ManagePermissionsFragment extends PermissionsFrameFragment
44         implements PermissionGroups.PermissionsGroupsChangeCallback,
45         Preference.OnPreferenceClickListener {
46     private static final String LOG_TAG = "ManagePermissionsFragment";
47 
48     private static final String OS_PKG = "android";
49 
50     private static final String EXTRA_PREFS_KEY = "extra_prefs_key";
51 
52     private ArraySet<String> mLauncherPkgs;
53 
54     private PermissionGroups mPermissions;
55 
56     private PreferenceScreen mExtraScreen;
57 
newInstance()58     public static ManagePermissionsFragment newInstance() {
59         return new ManagePermissionsFragment();
60     }
61 
62     @Override
onCreate(Bundle icicle)63     public void onCreate(Bundle icicle) {
64         super.onCreate(icicle);
65         setLoading(true /* loading */, false /* animate */);
66         setHasOptionsMenu(true);
67         final ActionBar ab = getActivity().getActionBar();
68         if (ab != null) {
69             ab.setDisplayHomeAsUpEnabled(true);
70         }
71         mLauncherPkgs = Utils.getLauncherPackages(getContext());
72         mPermissions = new PermissionGroups(getActivity(), getLoaderManager(), this);
73     }
74 
75     @Override
onResume()76     public void onResume() {
77         super.onResume();
78         mPermissions.refresh();
79         updatePermissionsUi();
80     }
81 
82     @Override
onOptionsItemSelected(MenuItem item)83     public boolean onOptionsItemSelected(MenuItem item) {
84         if (item.getItemId() == android.R.id.home) {
85             getActivity().finish();
86             return true;
87         }
88         return super.onOptionsItemSelected(item);
89     }
90 
91     @Override
onPreferenceClick(Preference preference)92     public boolean onPreferenceClick(Preference preference) {
93         String key = preference.getKey();
94 
95         PermissionGroup group = mPermissions.getGroup(key);
96         if (group == null) {
97             return false;
98         }
99 
100         Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS)
101                 .putExtra(Intent.EXTRA_PERMISSION_NAME, key);
102         try {
103             getActivity().startActivity(intent);
104         } catch (ActivityNotFoundException e) {
105             Log.w(LOG_TAG, "No app to handle " + intent);
106         }
107 
108         return true;
109     }
110 
111     @Override
onPermissionGroupsChanged()112     public void onPermissionGroupsChanged() {
113         updatePermissionsUi();
114     }
115 
116     @Override
onViewCreated(View view, Bundle savedInstanceState)117     public void onViewCreated(View view, Bundle savedInstanceState) {
118         super.onViewCreated(view, savedInstanceState);
119         bindPermissionUi(getActivity(), getView());
120     }
121 
bindPermissionUi(Context context, View rootView)122     private static void bindPermissionUi(Context context, View rootView) {
123         if (context == null || rootView == null) {
124             return;
125         }
126     }
127 
updatePermissionsUi()128     private void updatePermissionsUi() {
129         Context context = getActivity();
130         if (context == null) {
131             return;
132         }
133 
134         List<PermissionGroup> groups = mPermissions.getGroups();
135         PreferenceScreen screen = getPreferenceScreen();
136         if (screen == null) {
137             screen = getPreferenceManager().createPreferenceScreen(getActivity());
138             setPreferenceScreen(screen);
139         }
140 
141         // Use this to speed up getting the info for all of the PermissionApps below.
142         // Create a new one for each refresh to make sure it has fresh data.
143         PmCache cache = new PmCache(getContext().getPackageManager());
144         for (PermissionGroup group : groups) {
145             boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG);
146 
147             Preference preference = findPreference(group.getName());
148             if (preference == null && mExtraScreen != null) {
149                 preference = mExtraScreen.findPreference(group.getName());
150             }
151             if (preference == null) {
152                 preference = new Preference(context);
153                 preference.setOnPreferenceClickListener(this);
154                 preference.setKey(group.getName());
155                 preference.setIcon(Utils.applyTint(context, group.getIcon(),
156                         android.R.attr.colorControlNormal));
157                 preference.setTitle(group.getLabel());
158                 // Set blank summary so that no resizing/jumping happens when the summary is loaded.
159                 preference.setSummary(" ");
160                 preference.setPersistent(false);
161                 if (isSystemPermission) {
162                     screen.addPreference(preference);
163                 } else {
164                     if (mExtraScreen == null) {
165                         mExtraScreen = getPreferenceManager().createPreferenceScreen(context);
166                     }
167                     mExtraScreen.addPreference(preference);
168                 }
169             }
170             final Preference finalPref = preference;
171 
172             new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() {
173                 @Override
174                 public void onPermissionsLoaded(PermissionApps permissionApps) {
175                     if (getActivity() == null) {
176                         return;
177                     }
178                     int granted = permissionApps.getGrantedCount(mLauncherPkgs);
179                     int total = permissionApps.getTotalCount(mLauncherPkgs);
180                     finalPref.setSummary(getString(R.string.app_permissions_group_summary,
181                             granted, total));
182                 }
183             }, cache).refresh(false);
184         }
185 
186         if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0
187                 && screen.findPreference(EXTRA_PREFS_KEY) == null) {
188             Preference extraScreenPreference = new Preference(context);
189             extraScreenPreference.setKey(EXTRA_PREFS_KEY);
190             extraScreenPreference.setIcon(Utils.applyTint(context,
191                     R.drawable.ic_more_items,
192                     android.R.attr.colorControlNormal));
193             extraScreenPreference.setTitle(R.string.additional_permissions);
194             extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
195                 @Override
196                 public boolean onPreferenceClick(Preference preference) {
197                     AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment();
198                     frag.setTargetFragment(ManagePermissionsFragment.this, 0);
199                     FragmentTransaction ft = getFragmentManager().beginTransaction();
200                     ft.replace(android.R.id.content, frag);
201                     ft.addToBackStack(null);
202                     ft.commit();
203                     return true;
204                 }
205             });
206             int count = mExtraScreen.getPreferenceCount();
207             extraScreenPreference.setSummary(getResources().getQuantityString(
208                     R.plurals.additional_permissions_more, count, count));
209             screen.addPreference(extraScreenPreference);
210         }
211         if (screen.getPreferenceCount() != 0) {
212             setLoading(false /* loading */, true /* animate */);
213         }
214     }
215 
216     public static class AdditionalPermissionsFragment extends PermissionsFrameFragment {
217         @Override
onCreate(Bundle icicle)218         public void onCreate(Bundle icicle) {
219             setLoading(true /* loading */, false /* animate */);
220             super.onCreate(icicle);
221             getActivity().setTitle(R.string.additional_permissions);
222             setHasOptionsMenu(true);
223 
224             setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen);
225             setLoading(false /* loading */, true /* animate */);
226         }
227 
228         @Override
onDestroy()229         public void onDestroy() {
230             getActivity().setTitle(R.string.app_permissions);
231             super.onDestroy();
232         }
233 
234         @Override
onOptionsItemSelected(MenuItem item)235         public boolean onOptionsItemSelected(MenuItem item) {
236             switch (item.getItemId()) {
237                 case android.R.id.home:
238                     getFragmentManager().popBackStack();
239                     return true;
240             }
241             return super.onOptionsItemSelected(item);
242         }
243 
244         @Override
onViewCreated(View view, Bundle savedInstanceState)245         public void onViewCreated(View view,  Bundle savedInstanceState) {
246             super.onViewCreated(view, savedInstanceState);
247             bindPermissionUi(getActivity(), getView());
248         }
249     }
250 }
251