From 6f43cd72cddcd16b4d57f4965f87eb73e25016c9 Mon Sep 17 00:00:00 2001 From: Ido Ben-Hur Date: Tue, 11 Apr 2023 20:53:45 +0200 Subject: [PATCH] Settings: Allow showing Ambient instead of fully waking [2/2] * [joeyhuab] Adapt to A16; Remove MainSwitchPreference.updateStatus like 041bc113eb1c1a4001930eb6c762b897f98cc87e Separate configs for st2w and lift to wake Follow our convention in the rest of the switches in that page Change-Id: Ibd82d808aca2caf3f9c4518eb0c2e5f60669759e Signed-off-by: Cyber Knight Signed-off-by: Edwiin Kusuma Jaya --- res/values/evolution_strings.xml | 6 + res/xml/gestures.xml | 6 +- res/xml/pick_up_gesture_settings.xml | 17 ++- res/xml/security_lockscreen_settings.xml | 6 +- res/xml/tap_screen_gesture_settings.xml | 16 ++- ...ckupGestureInsidePreferenceController.java | 105 ++++++++++++++++ .../PickupGesturePreferenceController.java | 113 +++++++++++++++--- .../gestures/PickupGestureSettings.java | 18 ++- .../gestures/TapPreferenceController.java | 104 ++++++++++++++++ .../TapScreenGesturePreferenceController.java | 110 +++++++++++++++-- .../gestures/TapScreenGestureSettings.java | 18 ++- 11 files changed, 472 insertions(+), 47 deletions(-) create mode 100644 src/com/android/settings/gestures/PickupGestureInsidePreferenceController.java create mode 100644 src/com/android/settings/gestures/TapPreferenceController.java diff --git a/res/values/evolution_strings.xml b/res/values/evolution_strings.xml index bc2423ddebb..1d46105a86b 100644 --- a/res/values/evolution_strings.xml +++ b/res/values/evolution_strings.xml @@ -331,4 +331,10 @@ HDR Display Enable peak brightness for HDR content. This will increase battery usage + + + Show Ambient + Show Ambient Display instead of fully waking the screen up + Show Ambient + Fully wake diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml index 1519832a27a..a9e8da410fd 100644 --- a/res/xml/gestures.xml +++ b/res/xml/gestures.xml @@ -67,8 +67,8 @@ android:fragment="com.android.settings.gestures.OneHandedSettings" settings:controller="com.android.settings.gestures.OneHandedEnablePreferenceController" /> - - - - + app:keywords="@string/keywords_gesture" /> + + + + diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml index c7911249c8e..59ae15bc9d9 100644 --- a/res/xml/security_lockscreen_settings.xml +++ b/res/xml/security_lockscreen_settings.xml @@ -117,8 +117,8 @@ android:fragment="com.android.settings.display.AODSchedule" settings:controller="com.android.settings.display.AODSchedulePreferenceController" /> - - - + app:keywords="@string/keywords_gesture" /> + + + + diff --git a/src/com/android/settings/gestures/PickupGestureInsidePreferenceController.java b/src/com/android/settings/gestures/PickupGestureInsidePreferenceController.java new file mode 100644 index 00000000000..dfd2ef42a7f --- /dev/null +++ b/src/com/android/settings/gestures/PickupGestureInsidePreferenceController.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2023 Yet Another AOSP 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.gestures; + +import android.content.Context; +import android.provider.Settings; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; + +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.widget.MainSwitchPreference; + +import org.evolution.settings.preferences.SecureSettingSwitchPreference; + +public class PickupGestureInsidePreferenceController extends AbstractPreferenceController + implements PreferenceControllerMixin, OnCheckedChangeListener { + + private static final String KEY = "gesture_pick_up"; + private static final String AMBIENT_KEY = "doze_pick_up_gesture_ambient"; + + private final boolean mDefault; + private final Context mContext; + private MainSwitchPreference mSwitch; + private SecureSettingSwitchPreference mAmbientPref; + + public PickupGestureInsidePreferenceController(Context context) { + super(context); + mContext = context; + mDefault = context.getResources().getBoolean( + com.android.internal.R.bool.config_dozePickupGestureEnabled); + } + + @Override + public String getPreferenceKey() { + return KEY; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mAmbientPref = screen.findPreference(AMBIENT_KEY); + mSwitch = screen.findPreference(getPreferenceKey()); + mSwitch.setOnPreferenceClickListener(preference -> { + final boolean enabled = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.DOZE_PICK_UP_GESTURE, mDefault ? 1 : 0) == 1; + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.DOZE_PICK_UP_GESTURE, + enabled ? 0 : 1); + updateAmbientEnablement(!enabled); + return true; + }); + mSwitch.addOnSwitchChangeListener(this); + updateState(mSwitch); + } + + public void setChecked(boolean isChecked) { + if (mSwitch != null) { + mSwitch.setChecked(isChecked); + } + updateAmbientEnablement(isChecked); + } + + @Override + public void updateState(Preference preference) { + final boolean enabled = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.DOZE_PICK_UP_GESTURE, mDefault ? 1 : 0) == 1; + setChecked(enabled); + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.DOZE_PICK_UP_GESTURE, isChecked ? 1 : 0); + updateAmbientEnablement(isChecked); + } + + private void updateAmbientEnablement(boolean enabled) { + if (mAmbientPref == null) return; + mAmbientPref.setEnabled(enabled); + } +} diff --git a/src/com/android/settings/gestures/PickupGesturePreferenceController.java b/src/com/android/settings/gestures/PickupGesturePreferenceController.java index c1590bfd606..a5dcb46b48a 100644 --- a/src/com/android/settings/gestures/PickupGesturePreferenceController.java +++ b/src/com/android/settings/gestures/PickupGesturePreferenceController.java @@ -19,31 +19,49 @@ package com.android.settings.gestures; import static android.provider.Settings.Secure.DOZE_PICK_UP_GESTURE; import android.annotation.UserIdInt; +import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; +import android.database.ContentObserver; import android.hardware.display.AmbientDisplayConfiguration; +import android.net.Uri; +import android.os.Handler; import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; -public class PickupGesturePreferenceController extends GesturePreferenceController { +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; +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.PrimarySwitchPreference; + +public class PickupGesturePreferenceController extends TogglePreferenceController + implements LifecycleObserver, OnStart, OnStop { private static final int ON = 1; private static final int OFF = 0; - private static final String PREF_KEY_VIDEO = "gesture_pick_up_video"; - private final String mPickUpPrefKey; - private final String SECURE_KEY = DOZE_PICK_UP_GESTURE; + private static final String AMBIENT_SECURE_KEY = "doze_pick_up_gesture_ambient"; private AmbientDisplayConfiguration mAmbientConfig; @UserIdInt private final int mUserId; + private final boolean mDefault; + + private PrimarySwitchPreference mPreference; + private SettingObserver mSettingObserver; public PickupGesturePreferenceController(Context context, String key) { super(context, key); mUserId = UserHandle.myUserId(); - mPickUpPrefKey = key; + mDefault = context.getResources().getBoolean( + com.android.internal.R.bool.config_dozePickupGestureEnabled); } public PickupGesturePreferenceController setConfig(AmbientDisplayConfiguration config) { @@ -67,6 +85,32 @@ public class PickupGesturePreferenceController extends GesturePreferenceControll return AVAILABLE; } + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + mSettingObserver = new SettingObserver(mPreference); + updateState(mPreference); + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + final ContentResolver resolver = mContext.getContentResolver(); + final boolean enabled = + Settings.Secure.getInt(resolver, SECURE_KEY, mDefault ? ON : OFF) == ON; + String summary; + if (enabled) { + summary = mContext.getString(R.string.gesture_setting_on) + " (" + + (Settings.Secure.getInt(resolver, AMBIENT_SECURE_KEY, OFF) == ON + ? mContext.getString(R.string.gesture_wake_ambient) + : mContext.getString(R.string.gesture_wake)) + ")"; + } else { + summary = mContext.getString(R.string.gesture_setting_off); + } + preference.setSummary(summary); + } + @Override public boolean isSliceable() { return TextUtils.equals(getPreferenceKey(), "gesture_pick_up"); @@ -77,21 +121,11 @@ public class PickupGesturePreferenceController extends GesturePreferenceControll return true; } - @Override - protected String getVideoPrefKey() { - return PREF_KEY_VIDEO; - } - @Override public boolean isChecked() { return getAmbientConfig().pickupGestureEnabled(mUserId); } - @Override - public String getPreferenceKey() { - return mPickUpPrefKey; - } - @Override public boolean setChecked(boolean isChecked) { return Settings.Secure.putInt(mContext.getContentResolver(), SECURE_KEY, @@ -105,4 +139,53 @@ public class PickupGesturePreferenceController extends GesturePreferenceControll return mAmbientConfig; } + + @Override + public int getSliceHighlightMenuRes() { + return NO_RES; + } + + @Override + public void onStart() { + if (mSettingObserver != null) { + mSettingObserver.register(mContext.getContentResolver()); + mSettingObserver.onChange(false, null); + } + } + + @Override + public void onStop() { + if (mSettingObserver != null) { + mSettingObserver.unregister(mContext.getContentResolver()); + } + } + + private class SettingObserver extends ContentObserver { + private final Uri mUri = Settings.Secure.getUriFor(SECURE_KEY); + private final Uri mAmbientUri = Settings.Secure.getUriFor(AMBIENT_SECURE_KEY); + + private final Preference mPreference; + + SettingObserver(Preference preference) { + super(Handler.getMain()); + mPreference = preference; + } + + public void register(ContentResolver cr) { + cr.registerContentObserver(mUri, false, this); + cr.registerContentObserver(mAmbientUri, false, this); + } + + public void unregister(ContentResolver cr) { + cr.unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + if (uri == null || mUri.equals(uri) || mAmbientUri.equals(uri)) { + updateState(mPreference); + } + } + } } diff --git a/src/com/android/settings/gestures/PickupGestureSettings.java b/src/com/android/settings/gestures/PickupGestureSettings.java index bfda405b463..b3d5cfcd93c 100644 --- a/src/com/android/settings/gestures/PickupGestureSettings.java +++ b/src/com/android/settings/gestures/PickupGestureSettings.java @@ -26,8 +26,13 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; +import java.util.ArrayList; +import java.util.List; + @SearchIndexable public class PickupGestureSettings extends DashboardFragment { @@ -43,9 +48,18 @@ public class PickupGestureSettings extends DashboardFragment { FeatureFactory.getFeatureFactory().getSuggestionFeatureProvider(); SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } - use(PickupGesturePreferenceController.class) - .setConfig(new AmbientDisplayConfiguration(context)); + @Override + protected List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context, getSettingsLifecycle()); + } + + private static List buildPreferenceControllers(Context context, + Lifecycle lifecycle) { + List controllers = new ArrayList<>(); + controllers.add(new PickupGestureInsidePreferenceController(context)); + return controllers; } @Override diff --git a/src/com/android/settings/gestures/TapPreferenceController.java b/src/com/android/settings/gestures/TapPreferenceController.java new file mode 100644 index 00000000000..572f2ce7c45 --- /dev/null +++ b/src/com/android/settings/gestures/TapPreferenceController.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2023 Yet Another AOSP 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.gestures; + +import android.content.Context; +import android.os.SystemProperties; +import android.provider.Settings; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; + +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.widget.MainSwitchPreference; + +import org.evolution.settings.preferences.SecureSettingSwitchPreference; + +public class TapPreferenceController extends AbstractPreferenceController + implements PreferenceControllerMixin, OnCheckedChangeListener { + + private static final String KEY = "gesture_tap"; + private static final String AMBIENT_KEY = "doze_tap_gesture_ambient"; + + private final Context mContext; + private MainSwitchPreference mSwitch; + private SecureSettingSwitchPreference mAmbientPref; + + public TapPreferenceController(Context context) { + super(context); + mContext = context; + } + + @Override + public String getPreferenceKey() { + return KEY; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mAmbientPref = screen.findPreference(AMBIENT_KEY); + mSwitch = screen.findPreference(getPreferenceKey()); + mSwitch.setOnPreferenceClickListener(preference -> { + final boolean enabled = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.DOZE_TAP_SCREEN_GESTURE, 1) == 1; + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.DOZE_TAP_SCREEN_GESTURE, + enabled ? 0 : 1); + updateAmbientEnablement(!enabled); + return true; + }); + mSwitch.addOnSwitchChangeListener(this); + updateState(mSwitch); + } + + public void setChecked(boolean isChecked) { + if (mSwitch != null) { + mSwitch.setChecked(isChecked); + } + updateAmbientEnablement(isChecked); + } + + @Override + public void updateState(Preference preference) { + final boolean enabled = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.DOZE_TAP_SCREEN_GESTURE, 1) == 1; + setChecked(enabled); + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.DOZE_TAP_SCREEN_GESTURE, isChecked ? 1 : 0); + SystemProperties.set("persist.sys.tap_gesture", isChecked ? "1" : "0"); + updateAmbientEnablement(isChecked); + } + + private void updateAmbientEnablement(boolean enabled) { + if (mAmbientPref == null) return; + mAmbientPref.setEnabled(enabled); + } +} diff --git a/src/com/android/settings/gestures/TapScreenGesturePreferenceController.java b/src/com/android/settings/gestures/TapScreenGesturePreferenceController.java index 86ac713194f..fd3b955c0a9 100644 --- a/src/com/android/settings/gestures/TapScreenGesturePreferenceController.java +++ b/src/com/android/settings/gestures/TapScreenGesturePreferenceController.java @@ -19,28 +19,43 @@ package com.android.settings.gestures; import static android.provider.Settings.Secure.DOZE_TAP_SCREEN_GESTURE; import android.annotation.UserIdInt; +import android.content.ContentResolver; import android.content.Context; +import android.database.ContentObserver; import android.hardware.display.AmbientDisplayConfiguration; +import android.net.Uri; +import android.os.Handler; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; -public class TapScreenGesturePreferenceController extends GesturePreferenceController { +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; - private static final String PREF_KEY_VIDEO = "gesture_tap_screen_video"; +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; +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.PrimarySwitchPreference; + +public class TapScreenGesturePreferenceController extends TogglePreferenceController + implements LifecycleObserver, OnStart, OnStop { + + private static final String SECURE_KEY = DOZE_TAP_SCREEN_GESTURE; + private static final String AMBIENT_SECURE_KEY = "doze_tap_gesture_ambient"; private AmbientDisplayConfiguration mAmbientConfig; @UserIdInt private final int mUserId; + private PrimarySwitchPreference mPreference; + private SettingObserver mSettingObserver; + public TapScreenGesturePreferenceController(Context context, String key) { super(context, key); mUserId = UserHandle.myUserId(); - } - - public TapScreenGesturePreferenceController setConfig(AmbientDisplayConfiguration config) { - mAmbientConfig = config; - return this; + mAmbientConfig = new AmbientDisplayConfiguration(context); } @Override @@ -54,13 +69,33 @@ public class TapScreenGesturePreferenceController extends GesturePreferenceContr } @Override - public boolean isPublicSlice() { - return true; + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + mSettingObserver = new SettingObserver(mPreference); } @Override - protected String getVideoPrefKey() { - return PREF_KEY_VIDEO; + public void updateState(Preference preference) { + super.updateState(preference); + final ContentResolver resolver = mContext.getContentResolver(); + final boolean enabled = + Settings.Secure.getInt(resolver, SECURE_KEY, 1) == 1; + String summary; + if (enabled) { + summary = mContext.getString(R.string.gesture_setting_on) + " (" + + (Settings.Secure.getInt(resolver, AMBIENT_SECURE_KEY, 0) == 1 + ? mContext.getString(R.string.gesture_wake_ambient) + : mContext.getString(R.string.gesture_wake)) + ")"; + } else { + summary = mContext.getString(R.string.gesture_setting_off); + } + preference.setSummary(summary); + } + + @Override + public boolean isPublicSlice() { + return true; } @Override @@ -76,7 +111,7 @@ public class TapScreenGesturePreferenceController extends GesturePreferenceContr @Override public boolean setChecked(boolean isChecked) { boolean success = Settings.Secure.putInt(mContext.getContentResolver(), - DOZE_TAP_SCREEN_GESTURE, isChecked ? 1 : 0); + SECURE_KEY, isChecked ? 1 : 0); SystemProperties.set("persist.sys.tap_gesture", isChecked ? "1" : "0"); return success; } @@ -87,4 +122,53 @@ public class TapScreenGesturePreferenceController extends GesturePreferenceContr } return mAmbientConfig; } -} \ No newline at end of file + + @Override + public int getSliceHighlightMenuRes() { + return NO_RES; + } + + @Override + public void onStart() { + if (mSettingObserver != null) { + mSettingObserver.register(mContext.getContentResolver()); + mSettingObserver.onChange(false, null); + } + } + + @Override + public void onStop() { + if (mSettingObserver != null) { + mSettingObserver.unregister(mContext.getContentResolver()); + } + } + + private class SettingObserver extends ContentObserver { + private final Uri mUri = Settings.Secure.getUriFor(SECURE_KEY); + private final Uri mAmbientUri = Settings.Secure.getUriFor(AMBIENT_SECURE_KEY); + + private final Preference mPreference; + + SettingObserver(Preference preference) { + super(Handler.getMain()); + mPreference = preference; + } + + public void register(ContentResolver cr) { + cr.registerContentObserver(mUri, false, this); + cr.registerContentObserver(mAmbientUri, false, this); + } + + public void unregister(ContentResolver cr) { + cr.unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + if (uri == null || mUri.equals(uri) || mAmbientUri.equals(uri)) { + updateState(mPreference); + } + } + } +} diff --git a/src/com/android/settings/gestures/TapScreenGestureSettings.java b/src/com/android/settings/gestures/TapScreenGestureSettings.java index 773ef0ef68d..3fa8bb1f7d9 100644 --- a/src/com/android/settings/gestures/TapScreenGestureSettings.java +++ b/src/com/android/settings/gestures/TapScreenGestureSettings.java @@ -26,8 +26,13 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; +import java.util.ArrayList; +import java.util.List; + @SearchIndexable public class TapScreenGestureSettings extends DashboardFragment { private static final String TAG = "TapScreenGestureSettings"; @@ -42,9 +47,18 @@ public class TapScreenGestureSettings extends DashboardFragment { FeatureFactory.getFeatureFactory().getSuggestionFeatureProvider(); SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } - use(TapScreenGesturePreferenceController.class) - .setConfig(new AmbientDisplayConfiguration(context)); + @Override + protected List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context, getSettingsLifecycle()); + } + + private static List buildPreferenceControllers(Context context, + Lifecycle lifecycle) { + List controllers = new ArrayList<>(); + controllers.add(new TapPreferenceController(context)); + return controllers; } @Override