samsung: doze: Add AOD support to Ambient Display
authorBruno Martins <bgcngm@gmail.com>
Tue, 1 Jan 2019 12:39:38 +0000 (12:39 +0000)
committerBruno Martins <bgcngm@gmail.com>
Wed, 13 Jan 2021 14:24:55 +0000 (15:24 +0100)
 * 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/gesture_panel.xml
doze/src/org/lineageos/settings/doze/SamsungDozeSettings.java
doze/src/org/lineageos/settings/doze/Utils.java

index 4665c3a190339d40f055b7a4d8d3526e1b60e44f..c281eb1322f15e80bc83d6855b702b39d07dd97e 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
      Copyright (C) 2015 The CyanogenMod Project
+                   2018-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.
 -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
+    <SwitchPreference
+        android:key="always_on_display"
+        android:defaultValue="false"
+        android:disableDependentsState="true"
+        android:title="@string/ambient_display_always_on_title"
+        android:summary="@string/ambient_display_always_on_summary" />
+
     <PreferenceCategory
         android:key="proximity_sensor"
         android:title="@string/proximity_sensor_title">
index 681ebd236eb6ad05b849c3283947c7247816b382..cdf6ac2e0405d3ac8cb77764da9b3c68b91f75d7 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * 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.
@@ -38,6 +39,7 @@ public class SamsungDozeSettings extends PreferenceFragment
     private TextView mTextView;
     private View mSwitchBar;
 
+    private SwitchPreference mAlwaysOnDisplayPreference;
     private SwitchPreference mHandwavePreference;
     private SwitchPreference mPocketPreference;
 
@@ -49,6 +51,10 @@ public class SamsungDozeSettings extends PreferenceFragment
 
         boolean dozeEnabled = Utils.isDozeEnabled(getActivity());
 
+        mAlwaysOnDisplayPreference = findPreference(Utils.ALWAYS_ON_DISPLAY);
+        mAlwaysOnDisplayPreference.setEnabled(dozeEnabled);
+        mAlwaysOnDisplayPreference.setOnPreferenceChangeListener(this);
+
         mHandwavePreference = findPreference(Utils.GESTURE_HAND_WAVE_KEY);
         mHandwavePreference.setEnabled(dozeEnabled);
         mHandwavePreference.setOnPreferenceChangeListener(this);
@@ -56,6 +62,14 @@ public class SamsungDozeSettings extends PreferenceFragment
         mPocketPreference = 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 {
+            mHandwavePreference.setDependency(Utils.ALWAYS_ON_DISPLAY);
+            mPocketPreference.setDependency(Utils.ALWAYS_ON_DISPLAY);
+        }
     }
 
     @Override
@@ -100,7 +114,12 @@ public class SamsungDozeSettings extends PreferenceFragment
 
     @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 +133,12 @@ public class SamsungDozeSettings extends PreferenceFragment
         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);
+
         mHandwavePreference.setEnabled(isChecked);
         mPocketPreference.setEnabled(isChecked);
     }
index ee22cc12cd4ecb1b32a68b6ed5363e07b2a0ad16..e5b7daa2356fc9924d7396ab60802d764bc34cea 100644 (file)
 
 package org.lineageos.settings.doze;
 
+import static android.provider.Settings.Secure.DOZE_ALWAYS_ON;
 import static android.provider.Settings.Secure.DOZE_ENABLED;
 
 import android.content.Context;
 import android.content.Intent;
+import android.hardware.display.AmbientDisplayConfiguration;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Log;
@@ -32,6 +34,8 @@ public final class Utils {
     private static final String TAG = "DozeUtils";
     private static final boolean DEBUG = false;
 
+    protected static final String ALWAYS_ON_DISPLAY = "always_on_display";
+
     protected static final String GESTURE_HAND_WAVE_KEY = "gesture_hand_wave";
     protected static final String GESTURE_POCKET_KEY = "gesture_pocket";
 
@@ -48,18 +52,33 @@ public final class Utils {
     }
 
     protected static void checkDozeService(Context context) {
-        if (isDozeEnabled(context) && isAnyGestureEnabled(context)) {
+        if (!isAlwaysOnEnabled(context) &&
+                isDozeEnabled(context) && isAnyGestureEnabled(context)) {
             startService(context);
         } else {
             stopService(context);
         }
     }
 
+    protected static boolean alwaysOnDisplayAvailable(Context context) {
+        return new AmbientDisplayConfiguration(context).alwaysOnAvailable();
+    }
+
+    private static boolean isAlwaysOnEnabled(Context context) {
+        return Settings.Secure.getIntForUser(context.getContentResolver(),
+                DOZE_ALWAYS_ON, 1, UserHandle.USER_CURRENT) != 0;
+    }
+
     protected static boolean isDozeEnabled(Context context) {
         return Settings.Secure.getInt(context.getContentResolver(),
                 DOZE_ENABLED, 1) != 0;
     }
 
+    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 enableDoze(Context context, boolean enable) {
         return Settings.Secure.putInt(context.getContentResolver(),
                 DOZE_ENABLED, enable ? 1 : 0);