From 9837ce4a2402b5e659802016ee16508db6506541 Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Thu, 17 Jun 2021 01:40:13 +0800 Subject: [PATCH] Fix One-handed mode Settings Main Switch does not update its state correctly Add Settings.Secure.ONE_HANDED_MODE_ENABLED key observer when its state changes. Bug: 191267388 Test: Manual verified on Settings > System > Gestures > Use One-handed mode. Test: make RunSettingsRoboTests ROBOTEST_FILTER= "com.android.settings.gestures .OneHandedMainSwitchPreferenceControllerTest" Change-Id: I264fda3a8ab0a76e6234199346b6720895b95cd6 --- ...eHandedMainSwitchPreferenceController.java | 41 ++++++++++++++++++- ...dedMainSwitchPreferenceControllerTest.java | 9 ++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceController.java b/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceController.java index 043588e8a39..2b7d7a0f307 100644 --- a/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceController.java +++ b/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceController.java @@ -17,17 +17,30 @@ package com.android.settings.gestures; import android.content.Context; +import android.net.Uri; + +import androidx.preference.PreferenceScreen; import com.android.settings.widget.SettingsMainSwitchPreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settingslib.widget.MainSwitchPreference; /** * The controller to handle one-handed mode main switch enable or disable state. **/ public class OneHandedMainSwitchPreferenceController extends - SettingsMainSwitchPreferenceController { + SettingsMainSwitchPreferenceController implements OneHandedSettingsUtils.TogglesCallback, + LifecycleObserver, OnStart, OnStop { + + private final OneHandedSettingsUtils mUtils; + + private MainSwitchPreference mPreference; public OneHandedMainSwitchPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); + mUtils = new OneHandedSettingsUtils(context); } @Override @@ -53,4 +66,30 @@ public class OneHandedMainSwitchPreferenceController extends OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, isChecked); return true; } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void onStart() { + mUtils.registerToggleAwareObserver(this); + } + + @Override + public void onStop() { + mUtils.unregisterToggleAwareObserver(); + } + + @Override + public void onChange(Uri uri) { + if (mPreference == null) { + return; + } + if (uri.equals(OneHandedSettingsUtils.ONE_HANDED_MODE_ENABLED_URI)) { + mPreference.setChecked(isChecked()); + } + } } diff --git a/tests/robotests/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceControllerTest.java index 40cf795acd4..599d4e09142 100644 --- a/tests/robotests/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/gestures/OneHandedMainSwitchPreferenceControllerTest.java @@ -56,6 +56,15 @@ public class OneHandedMainSwitchPreferenceControllerTest { assertThat(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)).isTrue(); } + @Test + public void isChecked_setOneHandedModeEnabled_shouldReturnTrue() { + SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true"); + mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */); + OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true); + + assertThat(mController.isChecked()).isTrue(); + } + @Test public void getAvailabilityStatus_setSupportOneHandedModeProperty_shouldAvailable() { SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");