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