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

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

Merge "Use MasterSwitchPref vs subclass"

parents ecb62abb 82433b02
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ import com.android.settings.applications.AppInfoBase;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.notification.app.AppNotificationSettings;
import com.android.settings.notification.app.NotificationAppPreference;
import com.android.settings.widget.MasterSwitchPreference;
import com.android.settingslib.TwoTargetPreference;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -228,13 +228,13 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC

        // Rebind prefs/avoid adding new prefs if possible. Adding/removing prefs causes jank.
        // Build a cached preference pool
        final Map<String, NotificationAppPreference> appPreferences = new ArrayMap<>();
        final Map<String, MasterSwitchPreference> appPreferences = new ArrayMap<>();
        int prefCount = mCategory.getPreferenceCount();
        for (int i = 0; i < prefCount; i++) {
            final Preference pref = mCategory.getPreference(i);
            final String key = pref.getKey();
            if (!TextUtils.equals(key, KEY_SEE_ALL)) {
                appPreferences.put(key, (NotificationAppPreference) pref);
                appPreferences.put(key, (MasterSwitchPreference) pref);
            }
        }
        final int recentAppsCount = recentApps.size();
@@ -249,10 +249,10 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC
            }

            boolean rebindPref = true;
            NotificationAppPreference pref = appPreferences.remove(getKey(app.getUserId(),
            MasterSwitchPreference pref = appPreferences.remove(getKey(app.getUserId(),
                    pkgName));
            if (pref == null) {
                pref = new NotificationAppPreference(prefContext);
                pref = new MasterSwitchPreference(prefContext);
                rebindPref = false;
            }
            pref.setKey(getKey(app.getUserId(), pkgName));
@@ -278,9 +278,8 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC
            });
            pref.setSwitchEnabled(mNotificationBackend.isBlockable(mContext, appEntry.info));
            pref.setOnPreferenceChangeListener((preference, newValue) -> {
                boolean blocked = !(Boolean) newValue;
                mNotificationBackend.setNotificationsEnabledForPackage(
                        pkgName, appEntry.info.uid, !blocked);
                        pkgName, appEntry.info.uid, (Boolean) newValue);
                return true;
            });
            pref.setChecked(
+0 −119
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.app;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Switch;

import androidx.preference.PreferenceViewHolder;

import com.android.settings.R;
import com.android.settings.widget.MasterSwitchPreference;
import com.android.settingslib.RestrictedLockUtils;

/**
 * Shows an app icon, title and summary. Has a second switch touch target.
 */
public class NotificationAppPreference extends MasterSwitchPreference {

    private Switch mSwitch;
    private boolean mChecked;
    private boolean mEnableSwitch = true;

    public NotificationAppPreference(Context context) {
        super(context);
    }

    public NotificationAppPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NotificationAppPreference(Context context, AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public NotificationAppPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected int getSecondTargetResId() {
        return R.layout.preference_widget_master_switch;
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder view) {
        super.onBindViewHolder(view);

        final View widgetView = view.findViewById(android.R.id.widget_frame);
        if (widgetView != null) {
            widgetView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mSwitch != null && !mSwitch.isEnabled()) {
                        return;
                    }
                    setChecked(!mChecked);
                    if (!callChangeListener(mChecked)) {
                        setChecked(!mChecked);
                    } else {
                        persistBoolean(mChecked);
                    }
                }
            });
        }

        mSwitch = (Switch) view.findViewById(R.id.switchWidget);
        if (mSwitch != null) {
            mSwitch.setContentDescription(getTitle());
            mSwitch.setChecked(mChecked);
            mSwitch.setEnabled(mEnableSwitch);
        }
    }

    public boolean isChecked() {
        return mSwitch != null && mChecked;
    }

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

    public void setSwitchEnabled(boolean enabled) {
        mEnableSwitch = enabled;
        if (mSwitch != null) {
            mSwitch.setEnabled(enabled);
        }
    }

    /**
     * If admin is not null, disables the switch.
     * Otherwise, keep it enabled.
     */
    public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
        setSwitchEnabled(admin == null);
    }

    public Switch getSwitch() {
        return mSwitch;
    }
}
+0 −217
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.app;

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.LinearLayout;
import android.widget.Switch;

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

import com.android.settings.R;
import com.android.settings.notification.app.NotificationAppPreference;
import com.android.settingslib.RestrictedLockUtils;

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

@RunWith(RobolectricTestRunner.class)
public class NotificationAppPreferenceTest {

    private Context mContext;

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

    @Test
    public void createNewPreference_shouldSetLayout() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        assertThat(preference.getWidgetLayoutResource()).isEqualTo(
                R.layout.preference_widget_master_switch);
    }

    @Test
    public void setChecked_shouldUpdateButtonCheckedState() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);
        preference.onBindViewHolder(holder);

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

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

    @Test
    public void setSwitchEnabled_shouldUpdateButtonEnabledState() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);
        preference.onBindViewHolder(holder);

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

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

    @Test
    public void setSwitchEnabled_shouldUpdateButtonEnabledState_beforeViewBound() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);

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

    @Test
    public void clickWidgetView_shouldToggleButton() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);

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

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

    @Test
    public void clickWidgetView_shouldNotToggleButtonIfDisabled() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);
        toggle.setEnabled(false);

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

    @Test
    public void clickWidgetView_shouldNotifyPreferenceChanged() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                LayoutInflater.from(mContext).inflate(R.layout.preference_app, null));
        final View widgetView = holder.findViewById(android.R.id.widget_frame);
        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);
    }

    @Test
    public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);
        toggle.setEnabled(true);
        preference.onBindViewHolder(holder);

        preference.setDisabledByAdmin(mock(RestrictedLockUtils.EnforcedAdmin.class));
        assertThat(toggle.isEnabled()).isFalse();
    }

    @Test
    public void setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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);
        toggle.setEnabled(false);
        preference.onBindViewHolder(holder);

        preference.setDisabledByAdmin(null);
        assertThat(toggle.isEnabled()).isTrue();
    }

    @Test
    public void onBindViewHolder_toggleButtonShouldHaveContentDescription() {
        final NotificationAppPreference preference = new NotificationAppPreference(mContext);
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
                inflater.inflate(R.layout.preference_app, 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 String label = "TestButton";
        preference.setTitle(label);

        preference.onBindViewHolder(holder);

        assertThat(toggle.getContentDescription()).isEqualTo(label);
    }
}