From e9eac0ef6dda48adf645f27ec2be4ff40b9a4f65 Mon Sep 17 00:00:00 2001 From: Roman Kalukiewicz Date: Fri, 9 Jun 2023 13:13:09 -0700 Subject: Show the default device admin dialog when clicking on a preference blocked by policy. Test: manual Bug: 292135928 Relnote: Show information dialog if changes to default apps are blocked by user restriction. Change-Id: I96390541467b2cf7380aa49b777c6cdae7240088 (cherry picked from commit 668aa4e86b9b52df9cdf361eebfab95608972111) --- .../role/ui/DefaultAppChildFragment.java | 15 ++- .../role/ui/DefaultAppListChildFragment.java | 15 ++- .../role/ui/RoleApplicationPreference.java | 32 ++++++ .../role/ui/RolePreference.java | 29 +++++ .../role/ui/TwoTargetPreference.java | 9 +- .../role/ui/UserRestrictionAwarePreference.java | 30 +++++ .../ui/UserRestrictionAwarePreferenceMixin.java | 69 ++++++++++++ .../role/ui/auto/AutoDefaultAppFragment.java | 6 +- .../role/ui/auto/AutoDefaultAppListFragment.java | 6 +- .../role/ui/auto/AutoDefaultAppPreference.java | 50 --------- .../role/ui/auto/AutoRadioPreference.java | 69 ++++++++++++ .../role/ui/auto/AutoRolePreference.java | 78 +++++++++++++ .../role/ui/auto/AutoSettingsPreference.java | 55 --------- .../role/ui/auto/AutoSpecialAppAccessFragment.java | 7 +- .../ui/auto/AutoSpecialAppAccessListFragment.java | 6 +- .../role/ui/auto/AutoSwitchPreference.java | 76 +++++++++++++ .../HandheldDefaultAppListPreferenceFragment.java | 6 +- .../HandheldDefaultAppPreferenceFragment.java | 7 +- .../role/ui/handheld/HandheldRadioPreference.java | 75 +++++++++++++ .../role/ui/handheld/HandheldRolePreference.java | 123 +++++++++++++++++++++ .../role/ui/handheld/SettingsButtonPreference.java | 107 ------------------ .../SpecialAppAccessChildFragment.java | 16 ++- .../SpecialAppAccessListChildFragment.java | 16 ++- ...heldSpecialAppAccessListPreferenceFragment.java | 8 +- ...HandheldSpecialAppAccessPreferenceFragment.java | 7 +- .../handheld/HandheldSwitchPreference.java | 74 +++++++++++++ .../role/utils/RoleUiBehaviorUtils.java | 39 ++++--- 27 files changed, 749 insertions(+), 281 deletions(-) create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/RolePreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreferenceMixin.java delete mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java delete mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSettingsPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java delete mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/handheld/SettingsButtonPreference.java create mode 100644 PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/handheld/HandheldSwitchPreference.java diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java index 06e5ed264..a8b16c521 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java @@ -196,20 +196,25 @@ public class DefaultAppChildFragment oldPreferences, @NonNull PreferenceScreen preferenceScreen, @NonNull Context context) { - TwoStatePreference preference = (TwoStatePreference) oldPreferences.get(key); - if (preference == null) { - preference = requirePreferenceFragment().createApplicationPreference(); + RoleApplicationPreference roleApplicationPreference = + (RoleApplicationPreference) oldPreferences.get(key); + TwoStatePreference preference; + if (roleApplicationPreference == null) { + roleApplicationPreference = requirePreferenceFragment().createApplicationPreference(); + preference = roleApplicationPreference.asTwoStatePreference(); preference.setKey(key); preference.setIcon(icon); preference.setTitle(title); preference.setPersistent(false); preference.setOnPreferenceChangeListener((preference2, newValue) -> false); preference.setOnPreferenceClickListener(this); + } else { + preference = roleApplicationPreference.asTwoStatePreference(); } preference.setChecked(checked); if (applicationInfo != null) { - RoleUiBehaviorUtils.prepareApplicationPreferenceAsUser(mRole, preference, + RoleUiBehaviorUtils.prepareApplicationPreferenceAsUser(mRole, roleApplicationPreference, applicationInfo, mUser, context); } @@ -281,7 +286,7 @@ public class DefaultAppChildFragment holderApplicationInfos = roleItem.getHolderApplicationInfos(); @@ -187,8 +191,7 @@ public class DefaultAppListChildFragment holder.itemView.getContext().startActivity(intent)); + } + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppFragment.java index dbd4c7c03..dc6c03d09 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppFragment.java @@ -23,11 +23,11 @@ import android.os.UserHandle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.Preference; -import androidx.preference.TwoStatePreference; import com.android.permissioncontroller.R; import com.android.permissioncontroller.auto.AutoSettingsFrameFragment; import com.android.permissioncontroller.role.ui.DefaultAppChildFragment; +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; import com.android.role.controller.model.Role; /** Screen to pick a default app for a particular {@link Role}. */ @@ -90,8 +90,8 @@ public class AutoDefaultAppFragment extends AutoSettingsFrameFragment implements @NonNull @Override - public TwoStatePreference createApplicationPreference() { - return new AutoDefaultAppPreference(requireContext()); + public RoleApplicationPreference createApplicationPreference() { + return new AutoRadioPreference(requireContext()); } @NonNull diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppListFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppListFragment.java index b74caa7ed..081e3153b 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppListFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppListFragment.java @@ -24,7 +24,7 @@ import androidx.annotation.Nullable; import com.android.permissioncontroller.R; import com.android.permissioncontroller.auto.AutoSettingsFrameFragment; import com.android.permissioncontroller.role.ui.DefaultAppListChildFragment; -import com.android.permissioncontroller.role.ui.TwoTargetPreference; +import com.android.permissioncontroller.role.ui.RolePreference; /** Shows various roles for which a default app can be picked. */ public class AutoDefaultAppListFragment extends AutoSettingsFrameFragment implements @@ -57,8 +57,8 @@ public class AutoDefaultAppListFragment extends AutoSettingsFrameFragment implem @NonNull @Override - public TwoTargetPreference createPreference() { - return new AutoSettingsPreference(requireContext()); + public RolePreference createPreference() { + return new AutoRolePreference(requireContext()); } @Override diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppPreference.java deleted file mode 100644 index c91e40561..000000000 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoDefaultAppPreference.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2019 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.permissioncontroller.role.ui.auto; - -import android.content.Context; -import android.widget.RadioButton; - -import androidx.core.content.res.TypedArrayUtils; -import androidx.preference.PreferenceViewHolder; -import androidx.preference.TwoStatePreference; - -import com.android.permissioncontroller.R; - -/** Preference used to represent apps that can be picked as a default app. */ -public class AutoDefaultAppPreference extends TwoStatePreference { - - public AutoDefaultAppPreference(Context context) { - super(context, null, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle, - android.R.attr.preferenceStyle)); - init(); - } - - private void init() { - setLayoutResource(R.layout.car_radio_button_preference); - setWidgetLayoutResource(R.layout.radio_button_preference_widget); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - - RadioButton radioButton = (RadioButton) holder.findViewById(R.id.radio_button); - radioButton.setChecked(isChecked()); - } -} - diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java new file mode 100644 index 000000000..97a3dad26 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2019 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.permissioncontroller.role.ui.auto; + +import android.content.Context; +import android.widget.RadioButton; + +import androidx.annotation.Nullable; +import androidx.core.content.res.TypedArrayUtils; +import androidx.preference.PreferenceViewHolder; +import androidx.preference.TwoStatePreference; + +import com.android.permissioncontroller.R; +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; +import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin; + +/** Preference used to represent apps that can be picked as a default app. */ +public class AutoRadioPreference extends TwoStatePreference implements + RoleApplicationPreference { + + private final UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin = + new UserRestrictionAwarePreferenceMixin(this); + + public AutoRadioPreference(Context context) { + super(context, null, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle, + android.R.attr.preferenceStyle)); + init(); + } + + private void init() { + setLayoutResource(R.layout.car_radio_button_preference); + setWidgetLayoutResource(R.layout.radio_button_preference_widget); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + RadioButton radioButton = (RadioButton) holder.findViewById(R.id.radio_button); + radioButton.setChecked(isChecked()); + + mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder); + } + + @Override + public void setUserRestriction(@Nullable String userRestriction) { + mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction); + } + + @Override + public AutoRadioPreference asTwoStatePreference() { + return this; + } +} + diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java new file mode 100644 index 000000000..d2f1b6cde --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2019 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.permissioncontroller.role.ui.auto; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +import com.android.permissioncontroller.role.ui.RolePreference; +import com.android.permissioncontroller.role.ui.TwoTargetPreference; +import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin; + +/** + * Preference for use in auto lists. Extends {@link TwoTargetPreference} in order to make sure of + * shared logic between phone and auto settings UI. + */ +public class AutoRolePreference extends Preference implements RolePreference { + + private UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin = + new UserRestrictionAwarePreferenceMixin(this); + + public AutoRolePreference(@NonNull Context context, + @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public AutoRolePreference(@NonNull Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public AutoRolePreference(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public AutoRolePreference(@NonNull Context context) { + super(context); + } + + @Override + public void setOnSecondTargetClickListener(@Nullable OnSecondTargetClickListener listener) { + } + + @Override + public void setUserRestriction(@Nullable String userRestriction) { + mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder); + } + + @Override + public AutoRolePreference asPreference() { + return this; + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSettingsPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSettingsPreference.java deleted file mode 100644 index ba5b17be9..000000000 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSettingsPreference.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2019 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.permissioncontroller.role.ui.auto; - -import android.content.Context; -import android.util.AttributeSet; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.preference.Preference; - -import com.android.permissioncontroller.role.ui.TwoTargetPreference; - -/** - * Preference for use in auto lists. Extends {@link TwoTargetPreference} in order to make sure of - * shared logic between phone and auto settings UI. - */ -public class AutoSettingsPreference extends Preference implements TwoTargetPreference { - - public AutoSettingsPreference(@NonNull Context context, - @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public AutoSettingsPreference(@NonNull Context context, @Nullable AttributeSet attrs, - int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public AutoSettingsPreference(@NonNull Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - } - - public AutoSettingsPreference(@NonNull Context context) { - super(context); - } - - @Override - public void setOnSecondTargetClickListener(@Nullable OnSecondTargetClickListener listener) { - } -} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessFragment.java index c561420da..c37735427 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessFragment.java @@ -22,11 +22,10 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.Preference; -import androidx.preference.SwitchPreference; -import androidx.preference.TwoStatePreference; import com.android.permissioncontroller.R; import com.android.permissioncontroller.auto.AutoSettingsFrameFragment; +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; import com.android.permissioncontroller.role.ui.specialappaccess.SpecialAppAccessChildFragment; /** Automotive fragment for displaying special app access for a role. */ @@ -81,8 +80,8 @@ public class AutoSpecialAppAccessFragment extends AutoSettingsFrameFragment impl @NonNull @Override - public TwoStatePreference createApplicationPreference() { - return new SwitchPreference(requireContext()); + public RoleApplicationPreference createApplicationPreference() { + return new AutoSwitchPreference(requireContext()); } @NonNull diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessListFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessListFragment.java index e2dce4a94..59e6766cc 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessListFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSpecialAppAccessListFragment.java @@ -24,7 +24,7 @@ import androidx.annotation.Nullable; import com.android.permissioncontroller.R; import com.android.permissioncontroller.auto.AutoSettingsFrameFragment; -import com.android.permissioncontroller.role.ui.TwoTargetPreference; +import com.android.permissioncontroller.role.ui.RolePreference; import com.android.permissioncontroller.role.ui.specialappaccess.SpecialAppAccessListChildFragment; /** Automotive fragment for the list of role related special app accesses. */ @@ -59,8 +59,8 @@ public class AutoSpecialAppAccessListFragment extends AutoSettingsFrameFragment @NonNull @Override - public TwoTargetPreference createPreference(@NonNull Context context) { - return new AutoSettingsPreference(context); + public RolePreference createPreference(@NonNull Context context) { + return new AutoRolePreference(context); } @Override diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java new file mode 100644 index 000000000..900e58551 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2023 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.permissioncontroller.role.ui.auto; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StyleRes; +import androidx.preference.PreferenceViewHolder; +import androidx.preference.SwitchPreference; + +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; +import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin; + +/** + * Role application preference represented as a switch. + */ +public class AutoSwitchPreference extends SwitchPreference + implements RoleApplicationPreference { + + private UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin = + new UserRestrictionAwarePreferenceMixin(this); + + public AutoSwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs, + @AttrRes int defStyleAttr, @StyleRes int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public AutoSwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs, + @StyleRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public AutoSwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public AutoSwitchPreference(@NonNull Context context) { + super(context); + } + + @Override + public void setUserRestriction(@Nullable String userRestriction) { + mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder); + } + + @NonNull + @Override + public AutoSwitchPreference asTwoStatePreference() { + return this; + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppListPreferenceFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppListPreferenceFragment.java index b76b8c561..da920ea7f 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppListPreferenceFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppListPreferenceFragment.java @@ -23,7 +23,7 @@ import androidx.annotation.Nullable; import androidx.preference.PreferenceFragmentCompat; import com.android.permissioncontroller.role.ui.DefaultAppListChildFragment; -import com.android.permissioncontroller.role.ui.TwoTargetPreference; +import com.android.permissioncontroller.role.ui.RolePreference; /** * Handheld preference fragment for the list of default apps. @@ -62,8 +62,8 @@ public class HandheldDefaultAppListPreferenceFragment extends PreferenceFragment @NonNull @Override - public TwoTargetPreference createPreference() { - return new SettingsButtonPreference(requireContext()); + public RolePreference createPreference() { + return new HandheldRolePreference(requireContext()); } @Override diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppPreferenceFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppPreferenceFragment.java index 94c07ef67..b8156590a 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppPreferenceFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldDefaultAppPreferenceFragment.java @@ -24,11 +24,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.TwoStatePreference; import com.android.permissioncontroller.role.ui.DefaultAppChildFragment; +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; import com.android.settingslib.widget.FooterPreference; -import com.android.settingslib.widget.SelectorWithWidgetPreference; /** * Handheld preference fragment for a default app. @@ -96,8 +95,8 @@ public class HandheldDefaultAppPreferenceFragment extends PreferenceFragmentComp @NonNull @Override - public TwoStatePreference createApplicationPreference() { - return new SelectorWithWidgetPreference(requireContext()); + public RoleApplicationPreference createApplicationPreference() { + return new HandheldRadioPreference(requireContext()); } @NonNull diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java new file mode 100644 index 000000000..d9ef047d6 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2023 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.permissioncontroller.role.ui.handheld; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.PreferenceViewHolder; + +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; +import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin; +import com.android.settingslib.widget.SelectorWithWidgetPreference; + +/** + * Preference used to represent apps that can be picked as a default app. + */ +public class HandheldRadioPreference extends SelectorWithWidgetPreference implements + RoleApplicationPreference { + + private final UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin = + new UserRestrictionAwarePreferenceMixin(this); + + public HandheldRadioPreference(@NonNull Context context, + @Nullable AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public HandheldRadioPreference(@NonNull Context context, + @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public HandheldRadioPreference(@NonNull Context context, boolean isCheckbox) { + super(context, isCheckbox); + } + + public HandheldRadioPreference(@NonNull Context context) { + super(context); + } + + @Override + public void setUserRestriction( + @Nullable String userRestriction) { + mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder); + } + + @NonNull + @Override + public HandheldRadioPreference asTwoStatePreference() { + return this; + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java new file mode 100644 index 000000000..978fe7d5a --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2019 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.permissioncontroller.role.ui.handheld; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StyleRes; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +import com.android.permissioncontroller.R; +import com.android.permissioncontroller.role.ui.RolePreference; +import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin; +import com.android.settingslib.widget.TwoTargetPreference; + +/** + * {@link Preference} with a settings button. + * + * @see com.android.settings.widget.GearPreference + */ +// Made public for com.android.permissioncontroller.role.ui.specialappaccess.handheld +public class HandheldRolePreference extends TwoTargetPreference implements RolePreference { + + private final UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin = + new UserRestrictionAwarePreferenceMixin(this); + + @Nullable + private OnSecondTargetClickListener mOnSecondTargetClickListener; + + public HandheldRolePreference(@NonNull Context context, @Nullable AttributeSet attrs, + @AttrRes int defStyleAttr, @StyleRes int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + init(); + } + + public HandheldRolePreference(@NonNull Context context, @Nullable AttributeSet attrs, + @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + + init(); + } + + public HandheldRolePreference(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + + init(); + } + + public HandheldRolePreference(@NonNull Context context) { + super(context); + + init(); + } + + private void init() { + setIconSize(ICON_SIZE_MEDIUM); + } + + @Override + protected int getSecondTargetResId() { + return R.layout.settings_button_preference_widget; + } + + @Override + protected boolean shouldHideSecondTarget() { + return mOnSecondTargetClickListener == null; + } + + @Override + public void setOnSecondTargetClickListener(@Nullable OnSecondTargetClickListener listener) { + mOnSecondTargetClickListener = listener; + notifyChanged(); + } + + @Override + public void setUserRestriction(@Nullable String userRestriction) { + mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction); + } + + @Override + public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + View settingsButton = holder.findViewById(R.id.settings_button); + if (mOnSecondTargetClickListener != null) { + settingsButton.setVisibility(View.VISIBLE); + settingsButton.setOnClickListener(view -> + mOnSecondTargetClickListener.onSecondTargetClick(this)); + } else { + settingsButton.setVisibility(View.GONE); + settingsButton.setOnClickListener(null); + } + // Make the settings button enabled even if the preference itself is disabled. + settingsButton.setEnabled(true); + + mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder); + } + + @Override + public HandheldRolePreference asPreference() { + return this; + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/SettingsButtonPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/SettingsButtonPreference.java deleted file mode 100644 index f54c9d95d..000000000 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/SettingsButtonPreference.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2019 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.permissioncontroller.role.ui.handheld; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; - -import androidx.annotation.AttrRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StyleRes; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; - -import com.android.permissioncontroller.R; -import com.android.permissioncontroller.role.ui.TwoTargetPreference; - -/** - * {@link Preference} with a settings button. - * - * @see com.android.settings.widget.GearPreference - */ -// Made public for com.android.permissioncontroller.role.ui.specialappaccess.handheld -public class SettingsButtonPreference extends com.android.settingslib.widget.TwoTargetPreference - implements TwoTargetPreference { - - @Nullable - private OnSecondTargetClickListener mOnSecondTargetClickListener; - - public SettingsButtonPreference(@NonNull Context context, @Nullable AttributeSet attrs, - @AttrRes int defStyleAttr, @StyleRes int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - - init(); - } - - public SettingsButtonPreference(@NonNull Context context, @Nullable AttributeSet attrs, - @AttrRes int defStyleAttr) { - super(context, attrs, defStyleAttr); - - init(); - } - - public SettingsButtonPreference(@NonNull Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - - init(); - } - - public SettingsButtonPreference(@NonNull Context context) { - super(context); - - init(); - } - - private void init() { - setIconSize(ICON_SIZE_MEDIUM); - } - - @Override - protected int getSecondTargetResId() { - return R.layout.settings_button_preference_widget; - } - - @Override - protected boolean shouldHideSecondTarget() { - return mOnSecondTargetClickListener == null; - } - - @Override - public void setOnSecondTargetClickListener(@Nullable OnSecondTargetClickListener listener) { - mOnSecondTargetClickListener = listener; - notifyChanged(); - } - - @Override - public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - - View settingsButton = holder.findViewById(R.id.settings_button); - if (mOnSecondTargetClickListener != null) { - settingsButton.setVisibility(View.VISIBLE); - settingsButton.setOnClickListener(view -> - mOnSecondTargetClickListener.onSecondTargetClick(this)); - } else { - settingsButton.setVisibility(View.GONE); - settingsButton.setOnClickListener(null); - } - // Make the settings button enabled even if the preference itself is disabled. - settingsButton.setEnabled(true); - } -} diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java index d75747b52..b95440bbd 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java @@ -37,6 +37,7 @@ import androidx.preference.TwoStatePreference; import com.android.permissioncontroller.permission.utils.Utils; import com.android.permissioncontroller.role.ui.ManageRoleHolderStateLiveData; +import com.android.permissioncontroller.role.ui.RoleApplicationPreference; import com.android.permissioncontroller.role.utils.RoleUiBehaviorUtils; import com.android.role.controller.model.Role; import com.android.role.controller.model.Roles; @@ -143,9 +144,12 @@ public class SpecialAppAccessChildFragment