diff options
| -rw-r--r-- | services/core/java/com/android/server/power/FaceDownDetector.java | 28 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/power/FaceDownDetectorTest.java | 47 |
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. |