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.content.ActivityNotFoundException;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.os.Bundle;
23 import android.preference.Preference;
24 import android.preference.PreferenceScreen;
25 import android.util.ArraySet;
26 import android.util.Log;
27 
28 import com.android.packageinstaller.R;
29 import com.android.packageinstaller.permission.model.PermissionApps.PmCache;
30 import com.android.packageinstaller.permission.model.PermissionGroup;
31 import com.android.packageinstaller.permission.model.PermissionGroups;
32 import com.android.packageinstaller.permission.utils.Utils;
33 
34 import java.util.List;
35 
36 /**
37  * Superclass for fragments allowing the user to manage permissions.
38  */
39 abstract class ManagePermissionsFragment extends PermissionsFrameFragment
40         implements PermissionGroups.PermissionsGroupsChangeCallback,
41         Preference.OnPreferenceClickListener {
42     private static final String LOG_TAG = "ManagePermissionsFragment";
43 
44     static final String OS_PKG = "android";
45 
46     private ArraySet<String> mLauncherPkgs;
47 
48     private PermissionGroups mPermissions;
49 
50     @Override
onCreate(Bundle icicle)51     public void onCreate(Bundle icicle) {
52         super.onCreate(icicle);
53         setLoading(true /* loading */, false /* animate */);
54         setHasOptionsMenu(true);
55         final ActionBar ab = getActivity().getActionBar();
56         if (ab != null) {
57             ab.setDisplayHomeAsUpEnabled(true);
58         }
59         mLauncherPkgs = Utils.getLauncherPackages(getContext());
60         mPermissions = new PermissionGroups(getContext(), getLoaderManager(), this);
61     }
62 
63     @Override
onPreferenceClick(Preference preference)64     public boolean onPreferenceClick(Preference preference) {
65         String key = preference.getKey();
66 
67         PermissionGroup group = mPermissions.getGroup(key);
68         if (group == null) {
69             return false;
70         }
71 
72         Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS)
73                 .putExtra(Intent.EXTRA_PERMISSION_NAME, key);
74         try {
75             getActivity().startActivity(intent);
76         } catch (ActivityNotFoundException e) {
77             Log.w(LOG_TAG, "No app to handle " + intent);
78         }
79 
80         return true;
81     }
82 
83     /**
84      * @return the permissions
85      */
getPermissions()86     protected PermissionGroups getPermissions() {
87         return mPermissions;
88     }
89 
90     @Override
onPermissionGroupsChanged()91     public void onPermissionGroupsChanged() {
92         updatePermissionsUi();
93     }
94 
95     /**
96      * Update the preferences to show the new {@link #getPermissions() permissions}.
97      */
updatePermissionsUi()98     protected abstract void updatePermissionsUi();
99 
100     /**
101      * Add preferences for all permissions of a type to the preference screen.
102      *
103      * @param addSystemPermissions If the permissions added should be system permissions or not
104      *
105      * @return The preference screen the permissions were added to
106      */
updatePermissionsUi(boolean addSystemPermissions)107     protected PreferenceScreen updatePermissionsUi(boolean addSystemPermissions) {
108         Context context = getActivity();
109         if (context == null) {
110             return null;
111         }
112 
113         List<PermissionGroup> groups = mPermissions.getGroups();
114         PreferenceScreen screen = getPreferenceScreen();
115         if (screen == null) {
116             screen = getPreferenceManager().createPreferenceScreen(getActivity());
117             setPreferenceScreen(screen);
118         } else {
119             screen.removeAll();
120         }
121 
122         // Use this to speed up getting the info for all of the PermissionApps below.
123         // Create a new one for each refresh to make sure it has fresh data.
124         PmCache cache = new PmCache(getContext().getPackageManager());
125         for (PermissionGroup group : groups) {
126             boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG);
127 
128             if (addSystemPermissions == isSystemPermission) {
129                 Preference preference = findPreference(group.getName());
130 
131                 if (preference == null) {
132                     preference = new Preference(context);
133                     preference.setOnPreferenceClickListener(this);
134                     preference.setKey(group.getName());
135                     preference.setIcon(Utils.applyTint(context, group.getIcon(),
136                             android.R.attr.colorControlNormal));
137                     preference.setTitle(group.getLabel());
138                     // Set blank summary so that no resizing/jumping happens when the summary is
139                     // loaded.
140                     preference.setSummary(" ");
141                     preference.setPersistent(false);
142                     screen.addPreference(preference);
143                 }
144                 preference.setSummary(getString(R.string.app_permissions_group_summary,
145                         group.getGranted(), group.getTotal()));
146             }
147         }
148         if (screen.getPreferenceCount() != 0) {
149             setLoading(false /* loading */, true /* animate */);
150         }
151 
152         return screen;
153     }
154 }
155