summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/power/FaceDownDetector.java28
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java47
2 files changed, 60 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/power/FaceDownDetector.java b/services/core/java/com/android/server/power/FaceDownDetector.java
index 676181dcfb67..474ce59212ff 100644
--- a/services/core/java/com/android/server/power/FaceDownDetector.java
+++ b/services/core/java/com/android/server/power/FaceDownDetector.java
@@ -35,6 +35,7 @@ import android.os.SystemClock;
import android.provider.DeviceConfig;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import java.io.PrintWriter;
@@ -59,6 +60,8 @@ public class FaceDownDetector implements SensorEventListener {
FrameworkStatsLog.FACE_DOWN_REPORTED__FACE_DOWN_RESPONSE__USER_INTERACTION;
private static final int UNFLIP =
FrameworkStatsLog.FACE_DOWN_REPORTED__FACE_DOWN_RESPONSE__UNFLIP;
+ private static final int UNKNOWN =
+ FrameworkStatsLog.FACE_DOWN_REPORTED__FACE_DOWN_RESPONSE__UNKNOWN;
/**
* Used by the ExponentialMovingAverage accelerations, this determines how quickly the
@@ -130,7 +133,7 @@ public class FaceDownDetector implements SensorEventListener {
/** Values we store for logging purposes. */
private long mLastFlipTime = 0L;
- public int mPreviousResultType = 0;
+ public int mPreviousResultType = UNKNOWN;
public long mPreviousResultTime = 0L;
private long mMillisSaved = 0L;
@@ -151,7 +154,8 @@ public class FaceDownDetector implements SensorEventListener {
private final Handler mHandler;
private final Runnable mUserActivityRunnable;
- private final BroadcastReceiver mScreenReceiver;
+ @VisibleForTesting
+ final BroadcastReceiver mScreenReceiver;
private Context mContext;
@@ -203,6 +207,10 @@ public class FaceDownDetector implements SensorEventListener {
logScreenOff();
}
} else {
+ if (mFaceDown && !mInteractive) {
+ mPreviousResultType = SCREEN_OFF_RESULT;
+ mPreviousResultTime = currentTime;
+ }
mSensorManager.unregisterListener(this);
mFaceDown = false;
mOnFlip.accept(false);
@@ -311,15 +319,13 @@ public class FaceDownDetector implements SensorEventListener {
}
private void logScreenOff() {
- if (mPreviousResultType == SCREEN_OFF_RESULT) {
- final long currentTime = SystemClock.uptimeMillis();
- FrameworkStatsLog.write(FrameworkStatsLog.FACE_DOWN_REPORTED,
- mPreviousResultType,
- /* millis_since_flip= */ mPreviousResultTime - mLastFlipTime,
- mMillisSaved,
- /* millis_until_next_screen_on= */ currentTime - mPreviousResultTime);
- mPreviousResultType = -1;
- }
+ final long currentTime = SystemClock.uptimeMillis();
+ FrameworkStatsLog.write(FrameworkStatsLog.FACE_DOWN_REPORTED,
+ SCREEN_OFF_RESULT,
+ /* millis_since_flip= */ mPreviousResultTime - mLastFlipTime,
+ mMillisSaved,
+ /* millis_until_next_screen_on= */ currentTime - mPreviousResultTime);
+ mPreviousResultType = UNKNOWN;
}
private boolean isEnabled() {
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java b/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java
index 8ecb07158564..e093f1396385 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java
@@ -24,6 +24,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
+import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorManager;
@@ -129,10 +130,7 @@ public class FaceDownDetectorTest {
triggerFaceDown();
// Phone flips
- for (int i = 0; i < 10; i++) {
- advanceTime(Duration.ofMillis(5));
- mFaceDownDetector.onSensorChanged(createTestEvent(0.5f, 1.0f, 0.0f));
- }
+ triggerUnflip();
assertThat(mOnFaceDownCalls).isEqualTo(1);
assertThat(mOnFaceDownExitCalls).isEqualTo(1);
@@ -184,6 +182,47 @@ public class FaceDownDetectorTest {
assertThat(mOnFaceDownCalls).isEqualTo(1);
}
+ @Test
+ public void faceDownToScreenOff_followedByScreenOnAndUserInteraction_doesNotDisable()
+ throws Exception {
+ mFaceDownDetector.systemReady(sContext);
+ // Face down to screen off
+ triggerFaceDown();
+ mFaceDownDetector.mScreenReceiver.onReceive(sContext, new Intent(Intent.ACTION_SCREEN_OFF));
+
+ // Screen on
+ mFaceDownDetector.mScreenReceiver.onReceive(sContext, new Intent(Intent.ACTION_SCREEN_ON));
+
+ // User interaction
+ mFaceDownDetector.userActivity(PowerManager.USER_ACTIVITY_EVENT_TOUCH);
+ waitForListenerToHandle();
+
+ // Attempt another face down to see if disabled
+ triggerFaceDown();
+
+ assertThat(mOnFaceDownCalls).isEqualTo(2);
+ }
+
+ @Test
+ public void faceDownUserInteraction_disablesDetector() throws Exception {
+ mFaceDownDetector.systemReady(sContext);
+ triggerFaceDown();
+ mFaceDownDetector.userActivity(PowerManager.USER_ACTIVITY_EVENT_TOUCH);
+ waitForListenerToHandle();
+
+ triggerUnflip();
+ triggerFaceDown();
+
+ assertThat(mOnFaceDownCalls).isEqualTo(1);
+ }
+
+ private void triggerUnflip() throws Exception {
+ for (int i = 0; i < 10; i++) {
+ advanceTime(Duration.ofMillis(5));
+ mFaceDownDetector.onSensorChanged(createTestEvent(0.5f, 1.0f, 0.0f));
+ }
+ }
+
private void triggerFaceDown() throws Exception {
// Face up
// Using 0.5 on x to simulate constant acceleration, such as a sloped surface.