ManagePermissionsFragment.java revision f9bf4f795615bac03d1b35a0138318473b1ef6bf
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.handheld;
17
18import android.app.ActionBar;
19import android.app.FragmentTransaction;
20import android.content.ActivityNotFoundException;
21import android.content.Context;
22import android.content.Intent;
23import android.graphics.drawable.Drawable;
24import android.os.Bundle;
25import android.preference.Preference;
26import android.preference.Preference.OnPreferenceClickListener;
27import android.preference.PreferenceScreen;
28import android.util.ArraySet;
29import android.util.Log;
30import android.view.MenuItem;
31import android.view.View;
32import android.widget.ImageView;
33import android.widget.TextView;
34import com.android.packageinstaller.R;
35import com.android.packageinstaller.permission.model.PermissionApps;
36import com.android.packageinstaller.permission.model.PermissionApps.PmCache;
37import com.android.packageinstaller.permission.model.PermissionGroup;
38import com.android.packageinstaller.permission.model.PermissionGroups;
39import com.android.packageinstaller.permission.utils.Utils;
40
41import java.util.List;
42
43public 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
58    public static ManagePermissionsFragment newInstance() {
59        return new ManagePermissionsFragment();
60    }
61
62    @Override
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
76    public void onResume() {
77        super.onResume();
78        mPermissions.refresh();
79        updatePermissionsUi();
80    }
81
82    @Override
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
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
112    public void onPermissionGroupsChanged() {
113        updatePermissionsUi();
114    }
115
116    @Override
117    public void onViewCreated(View view, Bundle savedInstanceState) {
118        super.onViewCreated(view, savedInstanceState);
119        bindPermissionUi(getActivity(), getView());
120    }
121
122    private static void bindPermissionUi(Context context, View rootView) {
123        if (context == null || rootView == null) {
124            return;
125        }
126    }
127
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
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
229        public void onDestroy() {
230            getActivity().setTitle(R.string.app_permissions);
231            super.onDestroy();
232        }
233
234        @Override
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
245        public void onViewCreated(View view,  Bundle savedInstanceState) {
246            super.onViewCreated(view, savedInstanceState);
247            bindPermissionUi(getActivity(), getView());
248        }
249    }
250}
251