Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ebea7a7e authored by Adrian Roos's avatar Adrian Roos
Browse files

AmbientDisplay: Add always on prototype

Test: adb shell settings put secure doze_always_on 1
Change-Id: I3f293b3ef43847b7848af416b44f212fc40514d4
parent e7cd5a36
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6000,6 +6000,12 @@ public final class Settings {
         */
        public static final String DOZE_ENABLED = "doze_enabled";

        /**
         * Whether doze should be always on.
         * @hide
         */
        public static final String DOZE_ALWAYS_ON = "doze_always_on";

        /**
         * Whether the device should pulse on pick up gesture.
         * @hide
+8 −0
Original line number Diff line number Diff line
@@ -1667,6 +1667,14 @@
         not appear on production builds ever. -->
    <string name="plugins" translatable="false">Plugins</string>

    <!-- Ambient display section of the tuner. Non-translatable since it should
        not appear on production builds ever. -->
    <string name="tuner_doze" translatable="false">Ambient Display</string>

    <!-- Ambient display always-on of the tuner. Non-translatable since it should
        not appear on production builds ever. -->
    <string name="tuner_doze_always_on" translatable="false">Always on</string>

    <!-- PIP section of the tuner. Non-translatable since it should
        not appear on production builds ever. -->
    <string name="picture_in_picture" translatable="false">Picture-in-Picture</string>
+11 −0
Original line number Diff line number Diff line
@@ -139,6 +139,17 @@

    </PreferenceScreen>

    <PreferenceScreen
      android:key="doze"
      android:title="@string/tuner_doze">

        <com.android.systemui.tuner.TunerSwitch
          android:key="doze_always_on"
          android:title="@string/tuner_doze_always_on"
          sysui:defValue="false" />

    </PreferenceScreen>

    <!--
    <Preference
        android:key="nav_bar"
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ public interface DozeHost {
    void startDozing(@NonNull Runnable ready);
    void pulseWhileDozing(@NonNull PulseCallback callback, int reason);
    void stopDozing();
    void dozeTimeTick();
    boolean isPowerSaveActive();
    boolean isNotificationLightOn();
    boolean isPulsingBlocked();
+35 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.doze;

import android.app.AlarmManager;
import android.app.UiModeManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -43,7 +44,9 @@ import com.android.systemui.util.Assert;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DozeService extends DreamService implements DozeSensors.Callback {
    private static final String TAG = "DozeService";
@@ -77,6 +80,7 @@ public class DozeService extends DreamService implements DozeSensors.Callback {
    private long mNotificationPulseTime;

    private AmbientDisplayConfiguration mConfig;
    private AlarmManager mAlarmManager;

    public DozeService() {
        if (DEBUG) Log.d(mTag, "new DozeService()");
@@ -114,6 +118,7 @@ public class DozeService extends DreamService implements DozeSensors.Callback {
        setWindowless(true);

        mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
        mAlarmManager = (AlarmManager) mContext.getSystemService(AlarmManager.class);
        mConfig = new AmbientDisplayConfiguration(mContext);
        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
@@ -168,6 +173,10 @@ public class DozeService extends DreamService implements DozeSensors.Callback {
                // stopDozing because can we just keep dozing until the bitter end.
            }
        }));

        if (mDozeParameters.getAlwaysOn()) {
            mTimeTick.onAlarm();
        }
    }

    @Override
@@ -184,6 +193,7 @@ public class DozeService extends DreamService implements DozeSensors.Callback {

        // Tell the host that it's over.
        mHost.stopDozing();
        mAlarmManager.cancel(mTimeTick);
    }

    private void requestPulse(final int reason) {
@@ -264,8 +274,12 @@ public class DozeService extends DreamService implements DozeSensors.Callback {

    private void turnDisplayOff() {
        if (DEBUG) Log.d(mTag, "Display off");
        if (mDozeParameters.getAlwaysOn()) {
            turnDisplayOn();
        } else {
            setDozeScreenState(Display.STATE_OFF);
        }
    }

    private void turnDisplayOn() {
        if (DEBUG) Log.d(mTag, "Display on");
@@ -353,6 +367,26 @@ public class DozeService extends DreamService implements DozeSensors.Callback {
        }
    };

    private AlarmManager.OnAlarmListener mTimeTick = new AlarmManager.OnAlarmListener() {
        @Override
        public void onAlarm() {
            mHost.dozeTimeTick();

            // Keep wakelock until a frame has been pushed.
            mHandler.post(mWakeLock.wrap(()->{}));

            Calendar calendar = GregorianCalendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.add(Calendar.MINUTE, 1);

            long delta = calendar.getTimeInMillis() - System.currentTimeMillis();
            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime() + delta, "doze_time_tick", mTimeTick, mHandler);
        }
    };

    private final DozeHost.Callback mHostCallback = new DozeHost.Callback() {
        @Override
        public void onNewNotifications() {
Loading