/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.car.settings.users; import android.car.drivingstate.CarUxRestrictions; import android.car.userlib.CarUserManagerHelper; import android.content.Context; import android.os.UserManager; import androidx.annotation.StringRes; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceGroup; import androidx.preference.SwitchPreference; import com.android.car.settings.R; import com.android.car.settings.common.FragmentController; import java.util.ArrayList; import java.util.List; /** * Constructs and populates the permissions toggles for non admin users. * *

In order to add a new permission, it needs to be added to {@link * CarUserManagerHelper#OPTIONAL_NON_ADMIN_RESTRICTIONS} and the appropriate label needs to be added * to {@link #PERMISSIONS_LIST}. */ public class PermissionsPreferenceController extends UserDetailsBasePreferenceController { private static class UserPermission { private final String mPermissionKey; @StringRes private final int mPermissionTitle; UserPermission(String key, int title) { mPermissionKey = key; mPermissionTitle = title; } public String getPermissionKey() { return mPermissionKey; } public int getPermissionTitle() { return mPermissionTitle; } } @VisibleForTesting static final String PERMISSION_TYPE_KEY = "permission_type_key"; private static final List PERMISSIONS_LIST = new ArrayList<>(); // Add additional preferences to show here (in the order they should appear). static { PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_ADD_USER, R.string.create_user_permission_title)); PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_OUTGOING_CALLS, R.string.outgoing_calls_permission_title)); PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_SMS, R.string.sms_messaging_permission_title)); PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_INSTALL_APPS, R.string.install_apps_permission_title)); PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_UNINSTALL_APPS, R.string.uninstall_apps_permission_title)); } private final List mPermissionPreferences = new ArrayList<>(); public PermissionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); for (UserPermission permission : PERMISSIONS_LIST) { SwitchPreference preference = new SwitchPreference(context); preference.setTitle(permission.getPermissionTitle()); preference.getExtras().putString(PERMISSION_TYPE_KEY, permission.getPermissionKey()); preference.setOnPreferenceChangeListener((pref, newValue) -> { boolean granted = (boolean) newValue; UserManager.get(context).setUserRestriction( pref.getExtras().getString(PERMISSION_TYPE_KEY), !granted, getUserInfo().getUserHandle()); return true; }); mPermissionPreferences.add(preference); } } @Override protected Class getPreferenceType() { return PreferenceGroup.class; } @Override protected void onCreateInternal() { super.onCreateInternal(); for (SwitchPreference switchPreference : mPermissionPreferences) { getPreference().addPreference(switchPreference); } } @Override protected void updateState(PreferenceGroup preferenceGroup) { for (SwitchPreference switchPreference : mPermissionPreferences) { UserManager userManager = UserManager.get(getContext()); switchPreference.setChecked( !userManager.hasUserRestriction( switchPreference.getExtras().getString(PERMISSION_TYPE_KEY), getUserInfo().getUserHandle())); } } }