PermissionAppsFragment.java revision a7a0406958991f7a964370295821d8e477f503e9
146c55104384a9138d51c18c24114885af842afdeJason Monk/*
246c55104384a9138d51c18c24114885af842afdeJason Monk * Copyright (C) 2015 The Android Open Source Project
346c55104384a9138d51c18c24114885af842afdeJason Monk *
446c55104384a9138d51c18c24114885af842afdeJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
546c55104384a9138d51c18c24114885af842afdeJason Monk * you may not use this file except in compliance with the License.
646c55104384a9138d51c18c24114885af842afdeJason Monk * You may obtain a copy of the License at
746c55104384a9138d51c18c24114885af842afdeJason Monk *
846c55104384a9138d51c18c24114885af842afdeJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
946c55104384a9138d51c18c24114885af842afdeJason Monk *
1046c55104384a9138d51c18c24114885af842afdeJason Monk * Unless required by applicable law or agreed to in writing, software
1146c55104384a9138d51c18c24114885af842afdeJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
1246c55104384a9138d51c18c24114885af842afdeJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1346c55104384a9138d51c18c24114885af842afdeJason Monk * See the License for the specific language governing permissions and
1446c55104384a9138d51c18c24114885af842afdeJason Monk * limitations under the License.
1546c55104384a9138d51c18c24114885af842afdeJason Monk */
16a7a0406958991f7a964370295821d8e477f503e9Svet Ganovpackage com.android.packageinstaller.permission.ui;
1746c55104384a9138d51c18c24114885af842afdeJason Monk
18bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.annotation.Nullable;
19bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.app.ActionBar;
2046c55104384a9138d51c18c24114885af842afdeJason Monkimport android.content.Context;
2146c55104384a9138d51c18c24114885af842afdeJason Monkimport android.content.Intent;
22bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.graphics.drawable.Drawable;
2346c55104384a9138d51c18c24114885af842afdeJason Monkimport android.os.Bundle;
2446c55104384a9138d51c18c24114885af842afdeJason Monkimport android.preference.Preference;
25bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.preference.Preference.OnPreferenceChangeListener;
2646c55104384a9138d51c18c24114885af842afdeJason Monkimport android.preference.PreferenceScreen;
2746c55104384a9138d51c18c24114885af842afdeJason Monkimport android.preference.SwitchPreference;
28bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.LayoutInflater;
2946c55104384a9138d51c18c24114885af842afdeJason Monkimport android.view.MenuItem;
30bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.View;
31bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.view.ViewGroup;
32bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.widget.ImageView;
33bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport android.widget.TextView;
3446c55104384a9138d51c18c24114885af842afdeJason Monk
35bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantlerimport com.android.packageinstaller.R;
36a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps;
37a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps.Callback;
38a7a0406958991f7a964370295821d8e477f503e9Svet Ganovimport com.android.packageinstaller.permission.model.PermissionApps.PermissionApp;
3946c55104384a9138d51c18c24114885af842afdeJason Monk
40a7a0406958991f7a964370295821d8e477f503e9Svet Ganovpublic final class PermissionAppsFragment extends SettingsWithHeader implements Callback,
41a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        OnPreferenceChangeListener {
4246c55104384a9138d51c18c24114885af842afdeJason Monk
43a7a0406958991f7a964370295821d8e477f503e9Svet Ganov    public static PermissionAppsFragment newInstance(String permissionName) {
44a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        PermissionAppsFragment instance = new PermissionAppsFragment();
4546c55104384a9138d51c18c24114885af842afdeJason Monk        Bundle arguments = new Bundle();
4646c55104384a9138d51c18c24114885af842afdeJason Monk        arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName);
4746c55104384a9138d51c18c24114885af842afdeJason Monk        instance.setArguments(arguments);
4846c55104384a9138d51c18c24114885af842afdeJason Monk        return instance;
4946c55104384a9138d51c18c24114885af842afdeJason Monk    }
5046c55104384a9138d51c18c24114885af842afdeJason Monk
51a7a0406958991f7a964370295821d8e477f503e9Svet Ganov    private PermissionApps mPermissionApps;
5246c55104384a9138d51c18c24114885af842afdeJason Monk
5346c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
5446c55104384a9138d51c18c24114885af842afdeJason Monk    public void onCreate(Bundle savedInstanceState) {
5546c55104384a9138d51c18c24114885af842afdeJason Monk        super.onCreate(savedInstanceState);
5646c55104384a9138d51c18c24114885af842afdeJason Monk        setHasOptionsMenu(true);
57bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final ActionBar ab = getActivity().getActionBar();
58bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (ab != null) {
59bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            ab.setDisplayHomeAsUpEnabled(true);
60bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
6146c55104384a9138d51c18c24114885af842afdeJason Monk    }
6246c55104384a9138d51c18c24114885af842afdeJason Monk
6346c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
6446c55104384a9138d51c18c24114885af842afdeJason Monk    public void onResume() {
6546c55104384a9138d51c18c24114885af842afdeJason Monk        super.onResume();
66a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        mPermissionApps.refresh();
6746c55104384a9138d51c18c24114885af842afdeJason Monk    }
6846c55104384a9138d51c18c24114885af842afdeJason Monk
6946c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
7046c55104384a9138d51c18c24114885af842afdeJason Monk    public boolean onOptionsItemSelected(MenuItem item) {
7146c55104384a9138d51c18c24114885af842afdeJason Monk        switch (item.getItemId()) {
7246c55104384a9138d51c18c24114885af842afdeJason Monk            case android.R.id.home:
7346c55104384a9138d51c18c24114885af842afdeJason Monk                getActivity().finish();
7446c55104384a9138d51c18c24114885af842afdeJason Monk                return true;
7546c55104384a9138d51c18c24114885af842afdeJason Monk        }
7646c55104384a9138d51c18c24114885af842afdeJason Monk        return super.onOptionsItemSelected(item);
7746c55104384a9138d51c18c24114885af842afdeJason Monk    }
7846c55104384a9138d51c18c24114885af842afdeJason Monk
79bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    @Override
80bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
81bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            Bundle savedInstanceState) {
82bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container,
83bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler                        false);
84bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container);
85bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (prefsContainer == null) {
86bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            prefsContainer = rootView;
87bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
88bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        prefsContainer.addView(super.onCreateView(inflater, prefsContainer, savedInstanceState));
89bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        View emptyView = rootView.findViewById(R.id.no_permissions);
90bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (emptyView != null) {
91bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            emptyView.setVisibility(View.GONE);
92bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
93bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        return rootView;
94bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    }
95bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler
96bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    @Override
97bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
98bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        super.onViewCreated(view, savedInstanceState);
99bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        bindUi();
100bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler    }
101bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler
10246c55104384a9138d51c18c24114885af842afdeJason Monk    private void bindUi() {
10346c55104384a9138d51c18c24114885af842afdeJason Monk        String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME);
104a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        mPermissionApps = new PermissionApps(getActivity(), groupName, this);
105a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        final Drawable icon = mPermissionApps.getIcon();
106a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        final CharSequence label = mPermissionApps.getLabel();
107bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        setHeader(icon, label, null);
108bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler
109bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final ViewGroup rootView = (ViewGroup) getView();
110bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon);
111bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (iconView != null) {
112bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            iconView.setImageDrawable(icon);
113bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
114bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title);
115bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (titleView != null) {
116bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            titleView.setText(label);
117bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
118bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb);
119bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        if (breadcrumbView != null) {
120bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler            breadcrumbView.setText(R.string.app_permissions);
121bbc9216d829bf95ea718d430b8b7909c5a259b9bTony Mantler        }
12246c55104384a9138d51c18c24114885af842afdeJason Monk    }
12346c55104384a9138d51c18c24114885af842afdeJason Monk
12446c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
12546c55104384a9138d51c18c24114885af842afdeJason Monk    public void onPermissionsLoaded() {
12646c55104384a9138d51c18c24114885af842afdeJason Monk        Context context = getActivity();
12746c55104384a9138d51c18c24114885af842afdeJason Monk        PreferenceScreen preferences = getPreferenceScreen();
12846c55104384a9138d51c18c24114885af842afdeJason Monk        if (preferences == null) {
12946c55104384a9138d51c18c24114885af842afdeJason Monk            preferences = getPreferenceManager().createPreferenceScreen(getActivity());
13046c55104384a9138d51c18c24114885af842afdeJason Monk            setPreferenceScreen(preferences);
13146c55104384a9138d51c18c24114885af842afdeJason Monk        }
13246c55104384a9138d51c18c24114885af842afdeJason Monk        preferences.removeAll();
133a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        for (PermissionApp app : mPermissionApps.getApps()) {
13446c55104384a9138d51c18c24114885af842afdeJason Monk            SwitchPreference pref = (SwitchPreference) findPreference(app.getKey());
13546c55104384a9138d51c18c24114885af842afdeJason Monk            if (pref == null) {
13646c55104384a9138d51c18c24114885af842afdeJason Monk                pref = new SwitchPreference(context);
13746c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setOnPreferenceChangeListener(this);
13846c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setKey(app.getKey());
13946c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setIcon(app.getIcon());
14046c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setTitle(app.getLabel());
14146c55104384a9138d51c18c24114885af842afdeJason Monk                pref.setPersistent(false);
14246c55104384a9138d51c18c24114885af842afdeJason Monk                preferences.addPreference(pref);
14346c55104384a9138d51c18c24114885af842afdeJason Monk            }
144a7a0406958991f7a964370295821d8e477f503e9Svet Ganov            pref.setChecked(app.areRuntimePermissionsGranted());
14546c55104384a9138d51c18c24114885af842afdeJason Monk        }
14646c55104384a9138d51c18c24114885af842afdeJason Monk    }
14746c55104384a9138d51c18c24114885af842afdeJason Monk
14846c55104384a9138d51c18c24114885af842afdeJason Monk    @Override
14946c55104384a9138d51c18c24114885af842afdeJason Monk    public boolean onPreferenceChange(Preference preference, Object newValue) {
15046c55104384a9138d51c18c24114885af842afdeJason Monk        String pkg = preference.getKey();
151a7a0406958991f7a964370295821d8e477f503e9Svet Ganov        PermissionApp app = mPermissionApps.getApp(pkg);
15246c55104384a9138d51c18c24114885af842afdeJason Monk
15346c55104384a9138d51c18c24114885af842afdeJason Monk        if (app == null) {
15446c55104384a9138d51c18c24114885af842afdeJason Monk            return false;
15546c55104384a9138d51c18c24114885af842afdeJason Monk        }
15646c55104384a9138d51c18c24114885af842afdeJason Monk        if (newValue == Boolean.TRUE) {
15746c55104384a9138d51c18c24114885af842afdeJason Monk            app.grantRuntimePermissions();
15846c55104384a9138d51c18c24114885af842afdeJason Monk        } else {
15946c55104384a9138d51c18c24114885af842afdeJason Monk            app.revokeRuntimePermissions();
16046c55104384a9138d51c18c24114885af842afdeJason Monk        }
16146c55104384a9138d51c18c24114885af842afdeJason Monk        return true;
16246c55104384a9138d51c18c24114885af842afdeJason Monk    }
16346c55104384a9138d51c18c24114885af842afdeJason Monk
16446c55104384a9138d51c18c24114885af842afdeJason Monk}
165