From 9df7a5ca8deb4e01e40753bbb3a007f263826968 Mon Sep 17 00:00:00 2001 From: Austin Wang Date: Thu, 25 May 2023 11:07:40 -0700 Subject: [PATCH 1/3] Add more search terms for WPP Bug: 275728495 Test: flash and search settings Change-Id: I59b7b95c7f105cf1577b5649ddb8a0844ab93f01 --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index ed2b77d5871..9edaa0187f4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7070,7 +7070,7 @@ background, theme, grid, customize, personalize - icon, accent, color + icon, accent, color, home screen, lock screen, shortcut, clock size default, assistant From 086d062cb28593a6bcbd54925a00dbd682280c8e Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 31 May 2023 20:34:30 +0800 Subject: [PATCH 2/3] Fix TetherSettings crash issue - When the user is a guest user, the UI will remove all preferences to restrict setting changes. If the ViewModel updates the UI in this situation, it will cause Settings to crash. - Avoid to setup ViewModel when UI is restricted Bug: 284435378 Test: Manual test atest -c TetherSettingsTest Change-Id: I52d4ea717c34eacc9cc2321e3950dc89408049f8 --- .../network/tether/TetherSettings.java | 35 ++++++++++--------- .../network/tether/TetherSettingsTest.java | 34 ++++++++++++++++-- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/com/android/settings/network/tether/TetherSettings.java b/src/com/android/settings/network/tether/TetherSettings.java index 9fa8730cf10..6f6ba8efa71 100644 --- a/src/com/android/settings/network/tether/TetherSettings.java +++ b/src/com/android/settings/network/tether/TetherSettings.java @@ -145,19 +145,13 @@ public class TetherSettings extends RestrictedSettingsFragment super(UserManager.DISALLOW_CONFIG_TETHERING); } - @Override - public void onAttach(Context context) { - super.onAttach(context); - TetheringManagerModel model = new ViewModelProvider(this).get(TetheringManagerModel.class); - mWifiTetherPreferenceController = - new WifiTetherPreferenceController(context, getSettingsLifecycle(), model); - mTm = model.getTetheringManager(); - model.getTetheredInterfaces().observe(this, this::onTetheredInterfacesChanged); - } - @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + setIfOnlyAvailableForAdmins(true); + if (isUiRestricted()) { + return; + } addPreferencesFromResource(R.xml.tether_prefs); mContext = getContext(); @@ -165,13 +159,8 @@ public class TetherSettings extends RestrictedSettingsFragment mDataSaverEnabled = mDataSaverBackend.isDataSaverEnabled(); mDataSaverFooter = findPreference(KEY_DATA_SAVER_FOOTER); - setIfOnlyAvailableForAdmins(true); - if (isUiRestricted()) { - getPreferenceScreen().removeAll(); - return; - } - setupTetherPreference(); + setupViewModel(); final Activity activity = getActivity(); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); @@ -223,8 +212,22 @@ public class TetherSettings extends RestrictedSettingsFragment onDataSaverChanged(mDataSaverBackend.isDataSaverEnabled()); } + @VisibleForTesting + void setupViewModel() { + TetheringManagerModel model = new ViewModelProvider(this).get(TetheringManagerModel.class); + mWifiTetherPreferenceController = + new WifiTetherPreferenceController(getContext(), getSettingsLifecycle(), model); + mTm = model.getTetheringManager(); + model.getTetheredInterfaces().observe(this, this::onTetheredInterfacesChanged); + } + @Override public void onDestroy() { + if (isUiRestricted()) { + super.onDestroy(); + return; + } + mDataSaverBackend.remListener(this); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); diff --git a/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java b/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java index 23d9b825ad6..bf03e82657a 100644 --- a/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java @@ -45,6 +45,7 @@ import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; import android.net.TetheringManager; import android.net.wifi.WifiManager; +import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.util.FeatureFlagUtils; @@ -54,6 +55,7 @@ import androidx.preference.Preference; import androidx.preference.SwitchPreference; import com.android.settings.R; +import com.android.settings.RestrictedSettingsFragment; import com.android.settings.core.FeatureFlags; import com.android.settings.wifi.tether.WifiTetherPreferenceController; import com.android.settingslib.RestrictedSwitchPreference; @@ -66,6 +68,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; import java.util.ArrayList; import java.util.List; @@ -92,7 +97,7 @@ public class TetherSettingsTest { @Mock private Preference mDataSaverFooter; - TetherSettings mTetherSettings; + private MockTetherSettings mTetherSettings; @Before public void setUp() throws Exception { @@ -114,7 +119,7 @@ public class TetherSettingsTest { when(mTetheringManager.getTetherableUsbRegexs()).thenReturn(new String[0]); when(mTetheringManager.getTetherableBluetoothRegexs()).thenReturn(new String[0]); - mTetherSettings = spy(new TetherSettings()); + mTetherSettings = spy(new MockTetherSettings()); mTetherSettings.mContext = mContext; mTetherSettings.mWifiTetherPreferenceController = mWifiTetherPreferenceController; mTetherSettings.mUsbTether = mUsbTether; @@ -123,6 +128,16 @@ public class TetherSettingsTest { mTetherSettings.mDataSaverFooter = mDataSaverFooter; } + @Test + @Config(shadows = ShadowRestrictedSettingsFragment.class) + public void onCreate_isUiRestricted_doNotSetupViewModel() { + when(mTetherSettings.isUiRestricted()).thenReturn(true); + + mTetherSettings.onCreate(null); + + verify(mTetherSettings, never()).setupViewModel(); + } + @Test public void testTetherNonIndexableKeys_tetherAvailable_keysNotReturned() { FeatureFlagUtils.setEnabled(mContext, FeatureFlags.TETHER_ALL_IN_ONE, false); @@ -431,4 +446,19 @@ public class TetherSettingsTest { mTetherSettings.registerReceiver(); updateOnlyBluetoothState(mTetherSettings); } + + private static class MockTetherSettings extends TetherSettings { + @Override + public boolean isUiRestricted() { + return false; + } + } + + @Implements(RestrictedSettingsFragment.class) + public static final class ShadowRestrictedSettingsFragment { + @Implementation + public void onCreate(Bundle icicle) { + // do nothing + } + } } From 8112fb3828181e60594c2dc98b476d3f73513e89 Mon Sep 17 00:00:00 2001 From: Pavel Grafov Date: Wed, 31 May 2023 12:51:32 +0100 Subject: [PATCH 3/3] 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); }