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

Commit 84db3da9 authored by Julia Reynolds's avatar Julia Reynolds Committed by Android (Google) Code Review
Browse files

Merge "Update appearance of channel preferences"

parents f7a77d38 e88f7ab7
Loading
Loading
Loading
Loading
+115 −0
Original line number Diff line number Diff line
/*
 * 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.settings.notification;

import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.widget.CheckBox;

import com.android.settings.R;
import com.android.settingslib.TwoTargetPreference;

import androidx.preference.PreferenceViewHolder;

/**
 * A custom preference that provides inline checkbox and tappable target.
 */
public class ChannelSummaryPreference extends TwoTargetPreference {

    private Context mContext;
    private Intent mIntent;
    private CheckBox mCheckBox;
    private boolean mChecked;
    private boolean mEnableCheckBox = true;

    public ChannelSummaryPreference(Context context) {
        super(context);
        setLayoutResource(R.layout.preference_checkable_two_target);
        mContext = context;
        setWidgetLayoutResource(R.layout.zen_rule_widget);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder view) {
        super.onBindViewHolder(view);
        View settingsWidget = view.findViewById(android.R.id.widget_frame);
        View divider = view.findViewById(R.id.two_target_divider);
        if (mIntent != null) {
            divider.setVisibility(View.VISIBLE);
            settingsWidget.setVisibility(View.VISIBLE);
            settingsWidget.setOnClickListener(v -> mContext.startActivity(mIntent));
        } else {
            divider.setVisibility(View.GONE);
            settingsWidget.setVisibility(View.GONE);
            settingsWidget.setOnClickListener(null);
        }

        View checkboxContainer = view.findViewById(R.id.checkbox_container);
        if (checkboxContainer != null) {
            checkboxContainer.setOnClickListener(mOnCheckBoxClickListener);
        }
        mCheckBox = (CheckBox) view.findViewById(com.android.internal.R.id.checkbox);
        if (mCheckBox != null) {
            mCheckBox.setChecked(mChecked);
            mCheckBox.setEnabled(mEnableCheckBox);
        }
    }

    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void setIntent(Intent intent) {
        mIntent = intent;
    }

    @Override
    public void onClick() {
        mOnCheckBoxClickListener.onClick(null);
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
        if (mCheckBox != null) {
            mCheckBox.setChecked(checked);
        }
    }

    public void setCheckBoxEnabled(boolean enabled) {
        mEnableCheckBox = enabled;
        if (mCheckBox != null) {
            mCheckBox.setEnabled(enabled);
        }
    }

    private View.OnClickListener mOnCheckBoxClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mCheckBox != null && !mCheckBox.isEnabled()) {
                return;
            }
            setChecked(!mChecked);
            if (!callChangeListener(mChecked)) {
                setChecked(!mChecked);
            } else {
                persistBoolean(mChecked);
            }
        }
    };
}
+1 −2
Original line number Diff line number Diff line
@@ -273,8 +273,7 @@ abstract public class NotificationSettingsBase extends DashboardFragment {

    protected Preference populateSingleChannelPrefs(PreferenceGroup parent,
            final NotificationChannel channel, final boolean groupBlocked) {
        MasterCheckBoxPreference channelPref = new MasterCheckBoxPreference(
                getPrefContext());
        ChannelSummaryPreference channelPref = new ChannelSummaryPreference(getPrefContext());
        channelPref.setCheckBoxEnabled(mSuspendedAppsAdmin == null
                && isChannelBlockable(channel)
                && isChannelConfigurable(channel)
+169 −0
Original line number Diff line number Diff line
/*
 * 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.settings.notification;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.LinearLayout;

import com.android.settings.R;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

@RunWith(RobolectricTestRunner.class)
public class ChannelSummaryPreferenceTest {

    private Context mContext;

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
    }

    @Test
    public void createNewPreference_shouldSetLayout() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        assertThat(preference.getLayoutResource()).isEqualTo(
                R.layout.preference_checkable_two_target);
        assertThat(preference.getWidgetLayoutResource()).isEqualTo(
                R.layout.zen_rule_widget);
    }

    @Test
    public void setChecked_shouldUpdateButtonCheckedState() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_checkable_two_target, null));
        final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
        inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
        final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
        preference.onBindViewHolder(holder);

        preference.setChecked(true);
        assertThat(toggle.isChecked()).isTrue();

        preference.setChecked(false);
        assertThat(toggle.isChecked()).isFalse();
    }

    @Test
    public void setCheckboxEnabled_shouldUpdateButtonEnabledState() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_checkable_two_target, null));
        final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
        inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
        final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
        preference.onBindViewHolder(holder);

        preference.setCheckBoxEnabled(true);
        assertThat(toggle.isEnabled()).isTrue();

        preference.setCheckBoxEnabled(false);
        assertThat(toggle.isEnabled()).isFalse();
    }

    @Test
    public void setCheckBoxEnabled_shouldUpdateButtonEnabledState_beforeViewBound() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_checkable_two_target, null));
        final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
        inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
        final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);

        preference.setCheckBoxEnabled(false);
        preference.onBindViewHolder(holder);
        assertThat(toggle.isEnabled()).isFalse();
    }

    @Test
    public void clickWidgetView_shouldToggleButton() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_checkable_two_target, null));
        final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
        assertThat(widgetView).isNotNull();

        inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
        final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
        preference.onBindViewHolder(holder);

        widgetView.performClick();
        assertThat(toggle.isChecked()).isTrue();

        widgetView.performClick();
        assertThat(toggle.isChecked()).isFalse();
    }

    @Test
    public void clickWidgetView_shouldNotToggleButtonIfDisabled() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_checkable_two_target, null));
        final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
        assertThat(widgetView).isNotNull();

        inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
        final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
        preference.onBindViewHolder(holder);
        toggle.setEnabled(false);

        widgetView.performClick();
        assertThat(toggle.isChecked()).isFalse();
    }

    @Test
    public void clickWidgetView_shouldNotifyPreferenceChanged() {
        final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                LayoutInflater.from(mContext).inflate(
                        R.layout.preference_checkable_two_target, null));
        final View widgetView = holder.findViewById(R.id.checkbox_container);
        final Preference.OnPreferenceChangeListener
                listener = mock(Preference.OnPreferenceChangeListener.class);
        preference.setOnPreferenceChangeListener(listener);
        preference.onBindViewHolder(holder);

        preference.setChecked(false);
        widgetView.performClick();
        verify(listener).onPreferenceChange(preference, true);

        preference.setChecked(true);
        widgetView.performClick();
        verify(listener).onPreferenceChange(preference, false);
    }
}