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