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