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