From ea2cc87e517f7bcf7469075ca1bc3706235837af Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Tue, 1 Jan 2019 12:39:38 +0000 Subject: [PATCH] sdm845-common: doze: Add AOD support to Ambient Display * This makes the always on display mode feature visible for those devices that explicitly set it as available via AOSP overlay. Should only be enabled on devices where the display has been tuned to be power efficient in DOZE and/or DOZE_SUSPEND states. Change-Id: If543936f9421dd7a6c0be594f7cb76afb227e34b --- doze/res/xml/doze_settings.xml | 8 +++++ .../settings/doze/DozeSettingsFragment.java | 36 +++++++++++++++++-- .../org/lineageos/settings/doze/Utils.java | 28 +++++++++++++-- 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/doze/res/xml/doze_settings.xml b/doze/res/xml/doze_settings.xml index 5738316..60d88aa 100644 --- a/doze/res/xml/doze_settings.xml +++ b/doze/res/xml/doze_settings.xml @@ -1,6 +1,7 @@ + + diff --git a/doze/src/org/lineageos/settings/doze/DozeSettingsFragment.java b/doze/src/org/lineageos/settings/doze/DozeSettingsFragment.java index a4558b9..0a03d3f 100644 --- a/doze/src/org/lineageos/settings/doze/DozeSettingsFragment.java +++ b/doze/src/org/lineageos/settings/doze/DozeSettingsFragment.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2015 The CyanogenMod Project - * 2017-2018 The LineageOS Project + * 2017-2019 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import android.os.Bundle; import android.support.v14.preference.PreferenceFragment; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.view.LayoutInflater; import android.view.MenuItem; @@ -44,6 +45,8 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer private TextView mTextView; private View mSwitchBar; + private SwitchPreference mAlwaysOnDisplayPreference; + private SwitchPreference mPickUpPreference; private SwitchPreference mPocketPreference; @@ -61,6 +64,16 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer boolean dozeEnabled = Utils.isDozeEnabled(getActivity()); + mAlwaysOnDisplayPreference = (SwitchPreference) findPreference(Utils.ALWAYS_ON_DISPLAY); + mAlwaysOnDisplayPreference.setEnabled(dozeEnabled); + mAlwaysOnDisplayPreference.setChecked(Utils.isAlwaysOnEnabled(getActivity())); + mAlwaysOnDisplayPreference.setOnPreferenceChangeListener(this); + + PreferenceCategory pickupSensorCategory = (PreferenceCategory) getPreferenceScreen(). + findPreference(Utils.CATEG_PICKUP_SENSOR); + PreferenceCategory proximitySensorCategory = (PreferenceCategory) getPreferenceScreen(). + findPreference(Utils.CATEG_PROX_SENSOR); + mPickUpPreference = (SwitchPreference) findPreference(Utils.GESTURE_PICK_UP_KEY); mPickUpPreference.setEnabled(dozeEnabled); mPickUpPreference.setOnPreferenceChangeListener(this); @@ -68,6 +81,14 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer mPocketPreference = (SwitchPreference) findPreference(Utils.GESTURE_POCKET_KEY); mPocketPreference.setEnabled(dozeEnabled); mPocketPreference.setOnPreferenceChangeListener(this); + + // Hide AOD if not supported and set all its dependents otherwise + if (!Utils.alwaysOnDisplayAvailable(getActivity())) { + getPreferenceScreen().removePreference(mAlwaysOnDisplayPreference); + } else { + pickupSensorCategory.setDependency(Utils.ALWAYS_ON_DISPLAY); + proximitySensorCategory.setDependency(Utils.ALWAYS_ON_DISPLAY); + } } @Override @@ -101,8 +122,13 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.enableGesture(getActivity(), preference.getKey(), (Boolean) newValue); + if (Utils.ALWAYS_ON_DISPLAY.equals(preference.getKey())) { + Utils.enableAlwaysOn(getActivity(), (Boolean) newValue); + } else { + Utils.enableGesture(getActivity(), preference.getKey(), (Boolean) newValue); + } Utils.checkDozeService(getActivity()); + return true; } @@ -114,6 +140,12 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer mTextView.setText(getString(isChecked ? R.string.switch_bar_on : R.string.switch_bar_off)); mSwitchBar.setActivated(isChecked); + if (!isChecked) { + Utils.enableAlwaysOn(getActivity(), false); + mAlwaysOnDisplayPreference.setChecked(false); + } + mAlwaysOnDisplayPreference.setEnabled(isChecked); + mPickUpPreference.setEnabled(isChecked); mPocketPreference.setEnabled(isChecked); } diff --git a/doze/src/org/lineageos/settings/doze/Utils.java b/doze/src/org/lineageos/settings/doze/Utils.java index e8bb642..10f6c45 100644 --- a/doze/src/org/lineageos/settings/doze/Utils.java +++ b/doze/src/org/lineageos/settings/doze/Utils.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2015 The CyanogenMod Project - * 2017-2018 The LineageOS Project + * Copyright (C) 2015 The CyanogenMod Project + * 2017-2019 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,9 @@ import android.support.v7.preference.PreferenceManager; import android.provider.Settings; import android.util.Log; +import com.android.internal.hardware.AmbientDisplayConfiguration; + +import static android.provider.Settings.Secure.DOZE_ALWAYS_ON; import static android.provider.Settings.Secure.DOZE_ENABLED; public final class Utils { @@ -35,6 +38,11 @@ public final class Utils { private static final String DOZE_INTENT = "com.android.systemui.doze.pulse"; + protected static final String ALWAYS_ON_DISPLAY = "always_on_display"; + + protected static final String CATEG_PICKUP_SENSOR = "pickup_sensor"; + protected static final String CATEG_PROX_SENSOR = "proximity_sensor"; + protected static final String GESTURE_PICK_UP_KEY = "gesture_pick_up"; protected static final String GESTURE_POCKET_KEY = "gesture_pocket"; @@ -51,7 +59,7 @@ public final class Utils { } protected static void checkDozeService(Context context) { - if (isDozeEnabled(context) && areGesturesEnabled(context)) { + if (isDozeEnabled(context) && !isAlwaysOnEnabled(context) && areGesturesEnabled(context)) { startService(context); } else { stopService(context); @@ -74,6 +82,20 @@ public final class Utils { new UserHandle(UserHandle.USER_CURRENT)); } + protected static boolean enableAlwaysOn(Context context, boolean enable) { + return Settings.Secure.putIntForUser(context.getContentResolver(), + DOZE_ALWAYS_ON, enable ? 1 : 0, UserHandle.USER_CURRENT); + } + + protected static boolean isAlwaysOnEnabled(Context context) { + return Settings.Secure.getIntForUser(context.getContentResolver(), + DOZE_ALWAYS_ON, 1, UserHandle.USER_CURRENT) != 0; + } + + protected static boolean alwaysOnDisplayAvailable(Context context) { + return new AmbientDisplayConfiguration(context).alwaysOnAvailable(); + } + protected static void enableGesture(Context context, String gesture, boolean enable) { PreferenceManager.getDefaultSharedPreferences(context).edit() .putBoolean(gesture, enable).apply();