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

Commit d3179043 authored by Alex Salo's avatar Alex Salo Committed by Android (Google) Code Review
Browse files

Merge "Add a flag to allow extending the check post dim"

parents 2d4862d4 ce5baf60
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -2148,8 +2148,6 @@
    <integer name="config_dreamsBatteryLevelDrainCutoff">5</integer>
    <!-- Limit of how long the device can remain unlocked due to attention checking.  -->
    <integer name="config_attentionMaximumExtension">330000</integer> <!-- 5 minutes and 30 sec.-->
    <!-- How long we should wait until we give up on receiving an attention API callback.  -->
    <integer name="config_attentionApiTimeout">2000</integer> <!-- 2 seconds -->

    <!-- ComponentName of a dream to show whenever the system would otherwise have
         gone to sleep.  When the PowerManager is asked to go to sleep, it will instead
+0 −1
Original line number Diff line number Diff line
@@ -3645,7 +3645,6 @@

  <!-- For Attention Service -->
  <java-symbol type="integer" name="config_attentionMaximumExtension" />
  <java-symbol type="integer" name="config_attentionApiTimeout" />

  <java-symbol type="string" name="config_incidentReportApproverPackage" />
  <java-symbol type="array" name="config_restrictedImagesServices" />
+60 −16
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.power;

import static android.provider.DeviceConfig.NAMESPACE_ATTENTION_MANAGER_SERVICE;
import static android.provider.Settings.System.ADAPTIVE_SLEEP;

import android.Manifest;
@@ -33,6 +34,7 @@ import android.os.PowerManagerInternal;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.service.attention.AttentionService;
import android.util.Slog;
@@ -58,6 +60,22 @@ public class AttentionDetector {
    private static final String TAG = "AttentionDetector";
    private static final boolean DEBUG = false;

    /**
     * DeviceConfig flag name, describes how much in advance to start checking attention before the
     * dim event.
     */
    static final String KEY_PRE_DIM_CHECK_DURATION_MILLIS = "pre_dim_check_duration_millis";

    /** Default value in absence of {@link DeviceConfig} override. */
    static final long DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS = 2_000;

    /** DeviceConfig flag name, describes how long to run the check beyond the screen dim event. */
    static final String KEY_POST_DIM_CHECK_DURATION_MILLIS =
            "post_dim_check_duration_millis";

    /** Default value in absence of {@link DeviceConfig} override. */
    static final long DEFAULT_POST_DIM_CHECK_DURATION_MILLIS = 0;

    private Context mContext;

    private boolean mIsSettingEnabled;
@@ -89,11 +107,6 @@ public class AttentionDetector {
    @VisibleForTesting
    protected int mRequestId;

    /**
     * {@link android.service.attention.AttentionService} API timeout.
     */
    private long mMaxAttentionApiTimeoutMillis;

    /**
     * Last known user activity.
     */
@@ -124,6 +137,9 @@ public class AttentionDetector {
    @VisibleForTesting
    AttentionCallbackInternalImpl mCallback;

    /** Keep the last used post dim timeout for the dumpsys. */
    private long mLastPostDimTimeout;

    public AttentionDetector(Runnable onUserAttention, Object lock) {
        mOnUserAttention = onUserAttention;
        mLock = lock;
@@ -149,8 +165,6 @@ public class AttentionDetector {
        mWindowManager = LocalServices.getService(WindowManagerInternal.class);
        mMaximumExtensionMillis = context.getResources().getInteger(
                com.android.internal.R.integer.config_attentionMaximumExtension);
        mMaxAttentionApiTimeoutMillis = context.getResources().getInteger(
                com.android.internal.R.integer.config_attentionApiTimeout);

        try {
            final UserSwitchObserver observer = new UserSwitchObserver();
@@ -169,7 +183,8 @@ public class AttentionDetector {
                }, UserHandle.USER_ALL);
    }

    public long updateUserActivity(long nextScreenDimming) {
    /** To be called in {@link PowerManagerService#updateUserActivitySummaryLocked}. */
    public long updateUserActivity(long nextScreenDimming, long dimDurationMillis) {
        if (nextScreenDimming == mLastActedOnNextScreenDimming
                || !mIsSettingEnabled
                || mWindowManager.isKeyguardShowingAndNotOccluded()) {
@@ -184,7 +199,7 @@ public class AttentionDetector {
        }

        final long now = SystemClock.uptimeMillis();
        final long whenToCheck = nextScreenDimming - getAttentionTimeout();
        final long whenToCheck = nextScreenDimming - getPreDimCheckDurationMillis();
        final long whenToStopExtending = mLastUserActivityTime + mMaximumExtensionMillis;
        if (now < whenToCheck) {
            if (DEBUG) {
@@ -213,7 +228,9 @@ public class AttentionDetector {
        mLastActedOnNextScreenDimming = nextScreenDimming;
        mCallback = new AttentionCallbackInternalImpl(mRequestId);
        Slog.v(TAG, "Checking user attention, ID: " + mRequestId);
        final boolean sent = mAttentionManager.checkAttention(getAttentionTimeout(), mCallback);
        final boolean sent = mAttentionManager.checkAttention(
                getPreDimCheckDurationMillis() + getPostDimCheckDurationMillis(dimDurationMillis),
                mCallback);
        if (!sent) {
            mRequested.set(false);
        }
@@ -272,11 +289,6 @@ public class AttentionDetector {
        }
    }

    @VisibleForTesting
    long getAttentionTimeout() {
        return mMaxAttentionApiTimeoutMillis;
    }

    /**
     * {@see AttentionManagerInternal#isAttentionServiceSupported}
     */
@@ -301,12 +313,44 @@ public class AttentionDetector {
        pw.println("AttentionDetector:");
        pw.println(" mIsSettingEnabled=" + mIsSettingEnabled);
        pw.println(" mMaximumExtensionMillis=" + mMaximumExtensionMillis);
        pw.println(" mMaxAttentionApiTimeoutMillis=" + mMaxAttentionApiTimeoutMillis);
        pw.println(" preDimCheckDurationMillis=" + getPreDimCheckDurationMillis());
        pw.println(" postDimCheckDurationMillis=" + mLastPostDimTimeout);
        pw.println(" mLastUserActivityTime(excludingAttention)=" + mLastUserActivityTime);
        pw.println(" mAttentionServiceSupported=" + isAttentionServiceSupported());
        pw.println(" mRequested=" + mRequested);
    }

    /** How long to check <b>before</b> the screen dims, capped at the dim duration. */
    @VisibleForTesting
    protected long getPreDimCheckDurationMillis() {
        final long millis = DeviceConfig.getLong(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS,
                DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS);

        if (millis < 0 || millis > 13_000) {
            Slog.w(TAG, "Bad flag value supplied for: " + KEY_PRE_DIM_CHECK_DURATION_MILLIS);
            return DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS;
        }

        return millis;
    }

    /** How long to check <b>after</b> the screen dims, capped at the dim duration. */
    @VisibleForTesting
    protected long getPostDimCheckDurationMillis(long dimDurationMillis) {
        final long millis = DeviceConfig.getLong(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS,
                DEFAULT_POST_DIM_CHECK_DURATION_MILLIS);

        if (millis < 0 || millis > 10_000) {
            Slog.w(TAG, "Bad flag value supplied for: " + KEY_POST_DIM_CHECK_DURATION_MILLIS);
            return DEFAULT_POST_DIM_CHECK_DURATION_MILLIS;
        }

        mLastPostDimTimeout = Math.min(millis, dimDurationMillis);
        return mLastPostDimTimeout;
    }

    @VisibleForTesting
    final class AttentionCallbackInternalImpl extends AttentionCallbackInternal {
        private final int mId;
+4 −2
Original line number Diff line number Diff line
@@ -2140,9 +2140,11 @@ public final class PowerManagerService extends SystemService
                    nextTimeout = -1;
                }

                if ((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
                if (((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
                        || (mUserActivitySummary & USER_ACTIVITY_SCREEN_DIM) != 0)
                        && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) {
                    nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout);
                    nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout,
                            screenDimDuration);
                }

                if (nextProfileTimeout > 0) {
+114 −10
Original line number Diff line number Diff line
@@ -17,6 +17,12 @@
package com.android.server.power;

import static android.os.BatteryStats.Uid.NUM_USER_ACTIVITY_TYPES;
import static android.provider.DeviceConfig.NAMESPACE_ATTENTION_MANAGER_SERVICE;

import static com.android.server.power.AttentionDetector.DEFAULT_POST_DIM_CHECK_DURATION_MILLIS;
import static com.android.server.power.AttentionDetector.DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS;
import static com.android.server.power.AttentionDetector.KEY_POST_DIM_CHECK_DURATION_MILLIS;
import static com.android.server.power.AttentionDetector.KEY_PRE_DIM_CHECK_DURATION_MILLIS;

import static com.google.common.truth.Truth.assertThat;

@@ -37,6 +43,7 @@ import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.service.attention.AttentionService;
import android.test.AndroidTestCase;
@@ -53,6 +60,7 @@ import org.mockito.MockitoAnnotations;

@SmallTest
public class AttentionDetectorTest extends AndroidTestCase {
    private static final long DEFAULT_DIM_DURATION_MILLIS = 6_000L;

    @Mock
    private PackageManager mPackageManager;
@@ -63,7 +71,8 @@ public class AttentionDetectorTest extends AndroidTestCase {
    @Mock
    private Runnable mOnUserAttention;
    private TestableAttentionDetector mAttentionDetector;
    private long mAttentionTimeout;
    private AttentionDetector mRealAttentionDetector;
    private long mPreDimCheckDuration;
    private long mNextDimming;
    private int mIsSettingEnabled;

@@ -77,6 +86,7 @@ public class AttentionDetectorTest extends AndroidTestCase {
                .thenReturn(true);
        when(mWindowManagerInternal.isKeyguardShowingAndNotOccluded()).thenReturn(false);
        mAttentionDetector = new TestableAttentionDetector();
        mRealAttentionDetector = new AttentionDetector(mOnUserAttention, new Object());
        mAttentionDetector.onWakefulnessChangeStarted(PowerManagerInternal.WAKEFULNESS_AWAKE);
        mAttentionDetector.setAttentionServiceSupported(true);
        mNextDimming = SystemClock.uptimeMillis() + 3000L;
@@ -94,6 +104,13 @@ public class AttentionDetectorTest extends AndroidTestCase {
    public void tearDown() {
        Settings.System.putIntForUser(getContext().getContentResolver(),
                Settings.System.ADAPTIVE_SLEEP, mIsSettingEnabled, UserHandle.USER_CURRENT);

        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS,
                Long.toString(DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS), false);
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS,
                Long.toString(DEFAULT_POST_DIM_CHECK_DURATION_MILLIS), false);
    }

    @Test
@@ -175,7 +192,7 @@ public class AttentionDetectorTest extends AndroidTestCase {
        long now = SystemClock.uptimeMillis();
        mNextDimming = now;
        mAttentionDetector.onUserActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH);
        mAttentionDetector.updateUserActivity(mNextDimming + 5000L);
        mAttentionDetector.updateUserActivity(mNextDimming + 5000L, DEFAULT_DIM_DURATION_MILLIS);
        verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any());
    }

@@ -184,7 +201,8 @@ public class AttentionDetectorTest extends AndroidTestCase {
        long now = SystemClock.uptimeMillis();
        mNextDimming = now;
        mAttentionDetector.onUserActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH);
        long nextTimeout = mAttentionDetector.updateUserActivity(mNextDimming + 5000L);
        long nextTimeout = mAttentionDetector.updateUserActivity(mNextDimming + 5000L,
                DEFAULT_DIM_DURATION_MILLIS);
        assertThat(nextTimeout).isEqualTo(mNextDimming + 5000L);
    }

@@ -192,7 +210,7 @@ public class AttentionDetectorTest extends AndroidTestCase {
    public void testOnUserActivity_ignoresAfterMaximumExtension() {
        long now = SystemClock.uptimeMillis();
        mAttentionDetector.onUserActivity(now - 15000L, PowerManager.USER_ACTIVITY_EVENT_TOUCH);
        mAttentionDetector.updateUserActivity(now + 2000L);
        mAttentionDetector.updateUserActivity(now + 2000L, DEFAULT_DIM_DURATION_MILLIS);
        verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any());
    }

@@ -203,7 +221,8 @@ public class AttentionDetectorTest extends AndroidTestCase {
        assertThat(when).isLessThan(mNextDimming);
        clearInvocations(mAttentionManagerInternal);

        long redundantWhen = mAttentionDetector.updateUserActivity(mNextDimming);
        long redundantWhen = mAttentionDetector.updateUserActivity(mNextDimming,
                DEFAULT_DIM_DURATION_MILLIS);
        assertThat(redundantWhen).isEqualTo(mNextDimming);
        verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any());
    }
@@ -212,7 +231,8 @@ public class AttentionDetectorTest extends AndroidTestCase {
    public void testOnUserActivity_skipsIfAlreadyScheduled() {
        registerAttention();
        reset(mAttentionManagerInternal);
        long when = mAttentionDetector.updateUserActivity(mNextDimming + 1);
        long when = mAttentionDetector.updateUserActivity(mNextDimming + 1,
                DEFAULT_DIM_DURATION_MILLIS);
        verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any());
        assertThat(when).isLessThan(mNextDimming);
    }
@@ -300,11 +320,95 @@ public class AttentionDetectorTest extends AndroidTestCase {
        verify(mOnUserAttention, never()).run();
    }

    @Test
    public void testGetPreDimCheckDurationMillis_handlesGoodFlagValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS, "555", false);
        assertThat(mRealAttentionDetector.getPreDimCheckDurationMillis()).isEqualTo(555);
    }

    @Test
    public void testGetPreDimCheckDurationMillis_rejectsNegativeValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS, "-50", false);
        assertThat(mRealAttentionDetector.getPreDimCheckDurationMillis()).isEqualTo(
                DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS);
    }

    @Test
    public void testGetPreDimCheckDurationMillis_rejectsTooBigValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS, "20000", false);
        assertThat(mRealAttentionDetector.getPreDimCheckDurationMillis()).isEqualTo(
                DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS);
    }

    @Test
    public void testGetPreDimCheckDurationMillis_handlesBadFlagValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS, "20000k", false);
        assertThat(mRealAttentionDetector.getPreDimCheckDurationMillis()).isEqualTo(
                DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS);

        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_PRE_DIM_CHECK_DURATION_MILLIS, "0.25", false);
        assertThat(mRealAttentionDetector.getPreDimCheckDurationMillis()).isEqualTo(
                DEFAULT_PRE_DIM_CHECK_DURATION_MILLIS);
    }

    @Test
    public void testGetPostDimCheckDurationMillis_handlesGoodFlagValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS, "333", false);
        assertThat(mRealAttentionDetector.getPostDimCheckDurationMillis(
                DEFAULT_DIM_DURATION_MILLIS)).isEqualTo(333);
    }

    @Test
    public void testGetPostDimCheckDurationMillis_capsGoodFlagValueByMaxDimDuration() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS, "7000", false);
        assertThat(mRealAttentionDetector.getPostDimCheckDurationMillis(6500)).isEqualTo(6500);
    }

    @Test
    public void testGetPostDimCheckDurationMillis_rejectsNegativeValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS, "-50", false);
        assertThat(mRealAttentionDetector.getPostDimCheckDurationMillis(
                DEFAULT_DIM_DURATION_MILLIS)).isEqualTo(
                DEFAULT_POST_DIM_CHECK_DURATION_MILLIS);
    }

    @Test
    public void testGetPostDimCheckDurationMillis_rejectsTooBigValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS, "20000", false);
        assertThat(mRealAttentionDetector.getPostDimCheckDurationMillis(
                DEFAULT_DIM_DURATION_MILLIS)).isEqualTo(
                DEFAULT_POST_DIM_CHECK_DURATION_MILLIS);
    }

    @Test
    public void testGetPostDimCheckDurationMillis_handlesBadFlagValue() {
        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS, "20000k", false);
        assertThat(mRealAttentionDetector.getPostDimCheckDurationMillis(
                DEFAULT_DIM_DURATION_MILLIS)).isEqualTo(
                DEFAULT_POST_DIM_CHECK_DURATION_MILLIS);

        DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
                KEY_POST_DIM_CHECK_DURATION_MILLIS, "0.25", false);
        assertThat(mRealAttentionDetector.getPostDimCheckDurationMillis(
                DEFAULT_DIM_DURATION_MILLIS)).isEqualTo(
                DEFAULT_POST_DIM_CHECK_DURATION_MILLIS);
    }

    private long registerAttention() {
        mAttentionTimeout = 4000L;
        mPreDimCheckDuration = 4000L;
        mAttentionDetector.onUserActivity(SystemClock.uptimeMillis(),
                PowerManager.USER_ACTIVITY_EVENT_TOUCH);
        return mAttentionDetector.updateUserActivity(mNextDimming);
        return mAttentionDetector.updateUserActivity(mNextDimming, DEFAULT_DIM_DURATION_MILLIS);
    }

    private class TestableAttentionDetector extends AttentionDetector {
@@ -329,8 +433,8 @@ public class AttentionDetectorTest extends AndroidTestCase {
        }

        @Override
        public long getAttentionTimeout() {
            return mAttentionTimeout;
        public long getPreDimCheckDurationMillis() {
            return mPreDimCheckDuration;
        }
    }
}