Loading res/layout/restricted_preference_widget_master_switch.xml 0 → 100644 +22 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ 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. --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <include layout="@layout/restricted_icon"/> <include layout="@layout/preference_widget_master_switch"/> </merge> No newline at end of file src/com/android/settings/widget/MasterSwitchPreference.java +11 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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; } } tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java +50 −84 Original line number Diff line number Diff line Loading @@ -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); preference.setChecked(true); final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); mPreference.onBindViewHolder(mHolder); 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); preference.setSwitchEnabled(true); final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); mPreference.onBindViewHolder(mHolder); 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); preference.setSwitchEnabled(false); preference.onBindViewHolder(holder); final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); 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(); Loading @@ -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(); inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true); final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); preference.onBindViewHolder(holder); assertThat(mWidgetView).isNotNull(); 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); } Loading Loading
res/layout/restricted_preference_widget_master_switch.xml 0 → 100644 +22 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ 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. --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <include layout="@layout/restricted_icon"/> <include layout="@layout/preference_widget_master_switch"/> </merge> No newline at end of file
src/com/android/settings/widget/MasterSwitchPreference.java +11 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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; } }
tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java +50 −84 Original line number Diff line number Diff line Loading @@ -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); preference.setChecked(true); final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); mPreference.onBindViewHolder(mHolder); 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); preference.setSwitchEnabled(true); final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); mPreference.onBindViewHolder(mHolder); 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); preference.setSwitchEnabled(false); preference.onBindViewHolder(holder); final Switch toggle = (Switch) mHolder.findViewById(R.id.switchWidget); 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(); Loading @@ -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(); inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true); final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); preference.onBindViewHolder(holder); assertThat(mWidgetView).isNotNull(); 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); } Loading