Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db4c1094 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Let MasterSwitchPreference be restrictable"

parents 1e00dbf4 43b882c4
Loading
Loading
Loading
Loading
+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
+11 −4
Original line number Diff line number Diff line
@@ -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;
    }
}
+50 −84
Original line number Diff line number Diff line
@@ -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();
@@ -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);
    }