From 8112fb3828181e60594c2dc98b476d3f73513e89 Mon Sep 17 00:00:00 2001 From: Pavel Grafov Date: Wed, 31 May 2023 12:51:32 +0100 Subject: [PATCH] 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 --- .../WorkModePreferenceController.java | 35 +++++++++++-------- .../WorkModePreferenceControllerTest.java | 15 +++++--- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java index a261afccaa6..46440f6690f 100644 --- a/src/com/android/settings/accounts/WorkModePreferenceController.java +++ b/src/com/android/settings/accounts/WorkModePreferenceController.java @@ -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; - } } diff --git a/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java index e862d108c7c..d6be73d5481 100644 --- a/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java @@ -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); }