diff --git a/res/layout/restricted_preference_widget_master_switch.xml b/res/layout/restricted_preference_widget_master_switch.xml new file mode 100644 index 00000000000..60abeb22616 --- /dev/null +++ b/res/layout/restricted_preference_widget_master_switch.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/src/com/android/settings/widget/MasterSwitchPreference.java b/src/com/android/settings/widget/MasterSwitchPreference.java index ad35cb0b7de..b34b162a230 100644 --- a/src/com/android/settings/widget/MasterSwitchPreference.java +++ b/src/com/android/settings/widget/MasterSwitchPreference.java @@ -26,13 +26,13 @@ import androidx.preference.PreferenceViewHolder; import com.android.settings.R; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -import com.android.settingslib.TwoTargetPreference; +import com.android.settingslib.RestrictedPreference; /** * A custom preference that provides inline switch toggle. It has a mandatory field for title, and - * optional fields for icon and sub-text. + * optional fields for icon and sub-text. And it can be restricted by admin state. */ -public class MasterSwitchPreference extends TwoTargetPreference { +public class MasterSwitchPreference extends RestrictedPreference { private Switch mSwitch; private boolean mChecked; @@ -58,7 +58,7 @@ public class MasterSwitchPreference extends TwoTargetPreference { @Override protected int getSecondTargetResId() { - return R.layout.preference_widget_master_switch; + return R.layout.restricted_preference_widget_master_switch; } @Override @@ -66,6 +66,7 @@ public class MasterSwitchPreference extends TwoTargetPreference { super.onBindViewHolder(holder); final View switchWidget = holder.findViewById(R.id.switchWidget); if (switchWidget != null) { + switchWidget.setVisibility(isDisabledByAdmin() ? View.GONE : View.VISIBLE); switchWidget.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -118,10 +119,16 @@ public class MasterSwitchPreference extends TwoTargetPreference { * Otherwise, keep it enabled. */ public void setDisabledByAdmin(EnforcedAdmin admin) { + super.setDisabledByAdmin(admin); setSwitchEnabled(admin == null); } public Switch getSwitch() { return mSwitch; } + + @Override + protected boolean shouldHideSecondTarget() { + return getSecondTargetResId() == 0; + } } diff --git a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java index 4cd53e9493b..8115a02c16e 100644 --- a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java @@ -42,77 +42,66 @@ import org.robolectric.RuntimeEnvironment; public class MasterSwitchPreferenceTest { private Context mContext; + private MasterSwitchPreference mPreference; + private PreferenceViewHolder mHolder; + private LinearLayout mWidgetView; @Before public void setUp() { mContext = RuntimeEnvironment.application; + mPreference = new MasterSwitchPreference(mContext); + LayoutInflater inflater = LayoutInflater.from(mContext); + mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate( + com.android.settingslib.R.layout.preference_two_target, null)); + mWidgetView = mHolder.itemView.findViewById(android.R.id.widget_frame); + inflater.inflate(R.layout.restricted_preference_widget_master_switch, mWidgetView, true); } @Test public void createNewPreference_shouldSetLayout() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - - assertThat(preference.getWidgetLayoutResource()) - .isEqualTo(R.layout.preference_widget_master_switch); + assertThat(mPreference.getWidgetLayoutResource()) + .isEqualTo(R.layout.restricted_preference_widget_master_switch); } @Test public void setChecked_shouldUpdateButtonCheckedState() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext).inflate( - R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); - preference.onBindViewHolder(holder); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); + mPreference.onBindViewHolder(mHolder); - preference.setChecked(true); + mPreference.setChecked(true); assertThat(toggle.isChecked()).isTrue(); - preference.setChecked(false); + mPreference.setChecked(false); assertThat(toggle.isChecked()).isFalse(); } @Test public void setSwitchEnabled_shouldUpdateButtonEnabledState() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext).inflate( - R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); - preference.onBindViewHolder(holder); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); + mPreference.onBindViewHolder(mHolder); - preference.setSwitchEnabled(true); + mPreference.setSwitchEnabled(true); assertThat(toggle.isEnabled()).isTrue(); - preference.setSwitchEnabled(false); + mPreference.setSwitchEnabled(false); assertThat(toggle.isEnabled()).isFalse(); } @Test public void setSwitchEnabled_shouldUpdateButtonEnabledState_beforeViewBound() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext).inflate( - R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); - preference.setSwitchEnabled(false); - preference.onBindViewHolder(holder); + mPreference.setSwitchEnabled(false); + mPreference.onBindViewHolder(mHolder); assertThat(toggle.isEnabled()).isFalse(); } @Test public void clickWidgetView_shouldToggleButton() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final LayoutInflater inflater = LayoutInflater.from(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - inflater.inflate(R.layout.preference_two_target, null)); - final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame); - assertThat(widgetView).isNotNull(); + assertThat(mWidgetView).isNotNull(); - inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); - preference.onBindViewHolder(holder); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); + mPreference.onBindViewHolder(mHolder); toggle.performClick(); assertThat(toggle.isChecked()).isTrue(); @@ -123,84 +112,61 @@ public class MasterSwitchPreferenceTest { @Test public void clickWidgetView_shouldNotToggleButtonIfDisabled() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final LayoutInflater inflater = LayoutInflater.from(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - inflater.inflate(R.layout.preference_two_target, null)); - final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame); - assertThat(widgetView).isNotNull(); + assertThat(mWidgetView).isNotNull(); - inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); - preference.onBindViewHolder(holder); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); + mPreference.onBindViewHolder(mHolder); toggle.setEnabled(false); - widgetView.performClick(); + mWidgetView.performClick(); assertThat(toggle.isChecked()).isFalse(); } @Test public void clickWidgetView_shouldNotifyPreferenceChanged() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final LayoutInflater inflater = LayoutInflater.from(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext).inflate(R.layout.preference_two_target, null)); - final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame); - inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class); - preference.setOnPreferenceChangeListener(listener); - preference.onBindViewHolder(holder); + mPreference.setOnPreferenceChangeListener(listener); + mPreference.onBindViewHolder(mHolder); - preference.setChecked(false); + mPreference.setChecked(false); toggle.performClick(); - verify(listener).onPreferenceChange(preference, true); + verify(listener).onPreferenceChange(mPreference, true); - preference.setChecked(true); + mPreference.setChecked(true); toggle.performClick(); - verify(listener).onPreferenceChange(preference, false); + verify(listener).onPreferenceChange(mPreference, false); } @Test public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext) - .inflate(R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); toggle.setEnabled(true); - preference.onBindViewHolder(holder); + mPreference.onBindViewHolder(mHolder); - preference.setDisabledByAdmin(mock(EnforcedAdmin.class)); + mPreference.setDisabledByAdmin(mock(EnforcedAdmin.class)); assertThat(toggle.isEnabled()).isFalse(); } @Test public void setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext) - .inflate(R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); toggle.setEnabled(false); - preference.onBindViewHolder(holder); + mPreference.onBindViewHolder(mHolder); - preference.setDisabledByAdmin(null); + mPreference.setDisabledByAdmin(null); assertThat(toggle.isEnabled()).isTrue(); } @Test public void onBindViewHolder_toggleButtonShouldHaveContentDescription() { - final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); - final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext) - .inflate(R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); final String label = "TestButton"; - preference.setTitle(label); + mPreference.setTitle(label); - preference.onBindViewHolder(holder); + mPreference.onBindViewHolder(mHolder); assertThat(toggle.getContentDescription()).isEqualTo(label); }