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

Commit 8112fb38 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Avoid double quiet mode requests

Currently when "Work apps" the toggle is tapped in Settings it leads to
UM.requestQuietMode() being called twice via different routes.

Bug: 284915370
Test: atest WorkModePreferenceControllerTest
Change-Id: I5eeb7ecdb10245a32d947ae2430a865bd7a5a60a
parent 1f76872d
Loading
Loading
Loading
Loading
+20 −15
Original line number Diff line number Diff line
@@ -16,31 +16,42 @@
package com.android.settings.accounts;

import android.content.Context;
import android.widget.Switch;

import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.slices.SliceData;
import com.android.settings.widget.SettingsMainSwitchPreferenceController;
import com.android.settingslib.widget.MainSwitchPreference;
import com.android.settingslib.widget.OnMainSwitchChangeListener;

import org.jetbrains.annotations.NotNull;


public class WorkModePreferenceController extends SettingsMainSwitchPreferenceController
        implements Preference.OnPreferenceChangeListener, DefaultLifecycleObserver,
/** Controller for "Work apps" toggle that allows the user to enable/disable quiet mode. */
public class WorkModePreferenceController extends BasePreferenceController
        implements OnMainSwitchChangeListener, DefaultLifecycleObserver,
        ManagedProfileQuietModeEnabler.QuietModeChangeListener {

    private final ManagedProfileQuietModeEnabler mQuietModeEnabler;
    private MainSwitchPreference mPreference;

    public WorkModePreferenceController(Context context, String key) {
        super(context, key);
        mQuietModeEnabler = new ManagedProfileQuietModeEnabler(context, this);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = screen.findPreference(getPreferenceKey());
        mPreference.addOnSwitchChangeListener(this);
    }

    @Override
    public int getAvailabilityStatus() {
        return (mQuietModeEnabler.isAvailable()) ? AVAILABLE : DISABLED_FOR_USER;
@@ -57,19 +68,18 @@ public class WorkModePreferenceController extends SettingsMainSwitchPreferenceCo
    }

    @Override
    public boolean isChecked() {
        return !mQuietModeEnabler.isQuietModeEnabled();
    public void onSwitchChanged(Switch switchView, boolean isChecked) {
        mQuietModeEnabler.setQuietModeEnabled(!isChecked);
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        mQuietModeEnabler.setQuietModeEnabled(!isChecked);
        return true;
    public final void updateState(Preference preference) {
        mPreference.updateStatus(!mQuietModeEnabler.isQuietModeEnabled());
    }

    @Override
    public void onQuietModeChanged() {
        updateState(mSwitchPreference);
        updateState(mPreference);
    }

    @Override
@@ -82,9 +92,4 @@ public class WorkModePreferenceController extends SettingsMainSwitchPreferenceCo
    public int getSliceHighlightMenuRes() {
        return R.string.menu_key_accounts;
    }

    @VisibleForTesting
    void setPreference(MainSwitchPreference preference) {
        mSwitchPreference = preference;
    }
}
+11 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -27,7 +28,9 @@ import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
import android.widget.Switch;

import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;

import com.android.settingslib.widget.MainSwitchPreference;
@@ -57,6 +60,10 @@ public class WorkModePreferenceControllerTest {
    private UserHandle mManagedUser;
    @Mock
    private UserInfo mUserInfo;
    @Mock
    private PreferenceScreen mScreen;
    @Mock
    Switch mSwitch;

    @Before
    public void setUp() {
@@ -69,7 +76,9 @@ public class WorkModePreferenceControllerTest {
        when(mUserManager.getProcessUserId()).thenReturn(0);
        when(mUserManager.getUserProfiles()).thenReturn(Collections.singletonList(mManagedUser));
        when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID);
        when(mScreen.findPreference(anyString())).thenReturn(mPreference);
        mController = new WorkModePreferenceController(mContext, PREF_KEY);
        mController.displayPreference(mScreen);
    }

    @Test
@@ -106,13 +115,11 @@ public class WorkModePreferenceControllerTest {

    @Test
    public void onPreferenceChange_shouldRequestQuietModeEnabled() {
        mController.setPreference(mPreference);

        mController.onPreferenceChange(mPreference, true);
        mController.onSwitchChanged(mSwitch, true);

        verify(mUserManager).requestQuietModeEnabled(false, mManagedUser);

        mController.onPreferenceChange(mPreference, false);
        mController.onSwitchChanged(mSwitch, false);

        verify(mUserManager).requestQuietModeEnabled(true, mManagedUser);
    }