1 /*
2  * Copyright (C) 2016 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.permissioncontroller.permission.ui.handheld;
17 
18 import static com.android.permissioncontroller.Constants.EXTRA_SESSION_ID;
19 import static com.android.permissioncontroller.Constants.INVALID_SESSION_ID;
20 import static com.android.permissioncontroller.permission.ui.handheld.UtilsKt.pressBack;
21 
22 import android.os.Bundle;
23 import android.util.Log;
24 import android.view.MenuItem;
25 
26 import androidx.lifecycle.ViewModelProvider;
27 import androidx.preference.Preference;
28 import androidx.preference.PreferenceScreen;
29 
30 import com.android.permissioncontroller.R;
31 import com.android.permissioncontroller.permission.ui.model.ManageStandardPermissionsViewModel;
32 import com.android.permissioncontroller.permission.ui.model.ManageStandardPermissionsViewModelFactory;
33 import com.android.permissioncontroller.permission.utils.Utils;
34 
35 /**
36  * Fragment that allows the user to manage standard permissions.
37  */
38 public final class ManageStandardPermissionsFragment extends ManagePermissionsFragment {
39     private static final String EXTRA_PREFS_KEY = "extra_prefs_key";
40     private static final String AUTO_REVOKE_KEY = "auto_revoke_key";
41     private static final String LOG_TAG = ManageStandardPermissionsFragment.class.getSimpleName();
42 
43     private ManageStandardPermissionsViewModel mViewModel;
44 
45     /**
46      * Create a bundle with the arguments needed by this fragment
47      *
48      * @param sessionId The current session ID
49      * @return A bundle with all of the args placed
50      */
createArgs(long sessionId)51     public static Bundle createArgs(long sessionId) {
52         Bundle arguments = new Bundle();
53         arguments.putLong(EXTRA_SESSION_ID, sessionId);
54         return arguments;
55     }
56 
57     @Override
onCreate(Bundle icicle)58     public void onCreate(Bundle icicle) {
59         super.onCreate(icicle);
60 
61         ManageStandardPermissionsViewModelFactory factory =
62                 new ManageStandardPermissionsViewModelFactory(getActivity().getApplication());
63         mViewModel = new ViewModelProvider(this, factory)
64                 .get(ManageStandardPermissionsViewModel.class);
65         mPermissionGroups = mViewModel.getUiDataLiveData().getValue();
66 
67         mViewModel.getUiDataLiveData().observe(this, permissionGroups -> {
68             if (permissionGroups != null) {
69                 mPermissionGroups = permissionGroups;
70                 updatePermissionsUi();
71             } else {
72                 Log.e(LOG_TAG, "ViewModel returned null data, exiting");
73                 getActivity().finish();
74             }
75         });
76 
77         mViewModel.getNumCustomPermGroups().observe(this, permNames -> updatePermissionsUi());
78         mViewModel.getNumAutoRevoked().observe(this, show -> updatePermissionsUi());
79     }
80 
81     @Override
onStart()82     public void onStart() {
83         super.onStart();
84 
85         getActivity().setTitle(com.android.permissioncontroller.R.string.app_permission_manager);
86     }
87 
88     @Override
onOptionsItemSelected(MenuItem item)89     public boolean onOptionsItemSelected(MenuItem item) {
90         if (item.getItemId() == android.R.id.home) {
91             pressBack(this);
92             return true;
93         }
94         return super.onOptionsItemSelected(item);
95     }
96 
97     @Override
updatePermissionsUi()98     protected PreferenceScreen updatePermissionsUi() {
99         PreferenceScreen screen = super.updatePermissionsUi();
100         if (screen == null) {
101             return null;
102         }
103 
104         // Check if we need an additional permissions preference
105         int numExtraPermissions = 0;
106         if (mViewModel.getNumCustomPermGroups().getValue() != null) {
107             numExtraPermissions = mViewModel.getNumCustomPermGroups().getValue();
108         }
109 
110         Preference additionalPermissionsPreference = screen.findPreference(EXTRA_PREFS_KEY);
111         if (numExtraPermissions == 0) {
112             if (additionalPermissionsPreference != null) {
113                 screen.removePreference(additionalPermissionsPreference);
114             }
115         } else {
116             if (additionalPermissionsPreference == null) {
117                 additionalPermissionsPreference = new FixedSizeIconPreference(
118                         getPreferenceManager().getContext());
119                 additionalPermissionsPreference.setKey(EXTRA_PREFS_KEY);
120                 additionalPermissionsPreference.setIcon(Utils.applyTint(getActivity(),
121                         R.drawable.ic_more_items,
122                         android.R.attr.colorControlNormal));
123                 additionalPermissionsPreference.setTitle(R.string.additional_permissions);
124                 additionalPermissionsPreference.setOnPreferenceClickListener(preference -> {
125                     mViewModel.showCustomPermissions(this,
126                             ManageCustomPermissionsFragment.createArgs(
127                                     getArguments().getLong(EXTRA_SESSION_ID)));
128                     return true;
129                 });
130 
131                 screen.addPreference(additionalPermissionsPreference);
132             }
133 
134             additionalPermissionsPreference.setSummary(getResources().getQuantityString(
135                     R.plurals.additional_permissions_more, numExtraPermissions,
136                     numExtraPermissions));
137         }
138 
139         Integer numAutoRevoked = mViewModel.getNumAutoRevoked().getValue();
140 
141         Preference autoRevokePreference = screen.findPreference(AUTO_REVOKE_KEY);
142         if (numAutoRevoked != null && numAutoRevoked != 0) {
143             if (autoRevokePreference == null) {
144                 autoRevokePreference = new FixedSizeIconPreference(
145                         getPreferenceManager().getContext(), true, true);
146                 autoRevokePreference.setOrder(-1);
147                 autoRevokePreference.setKey(AUTO_REVOKE_KEY);
148                 autoRevokePreference.setSingleLineTitle(false);
149                 autoRevokePreference.setIcon(R.drawable.ic_info_outline_accent);
150                 autoRevokePreference.setTitle(
151                             R.string.auto_revoke_permission_notification_title);
152                 autoRevokePreference.setSummary(
153                         R.string.auto_revoke_setting_subtitle);
154                 autoRevokePreference.setOnPreferenceClickListener(preference -> {
155                     mViewModel.showAutoRevoke(this, AutoRevokeFragment.createArgs(
156                             getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID)));
157                     return true;
158                 });
159 
160                 screen.addPreference(autoRevokePreference);
161             }
162         } else if (numAutoRevoked != null && autoRevokePreference != null) {
163             screen.removePreference(autoRevokePreference);
164         }
165 
166         return screen;
167     }
168 
169     @Override
showPermissionApps(String permissionGroupName)170     public void showPermissionApps(String permissionGroupName) {
171         mViewModel.showPermissionApps(this, PermissionAppsFragment.createArgs(
172                 permissionGroupName, getArguments().getLong(EXTRA_SESSION_ID)));
173     }
174 }
175