summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/res/AndroidManifest.xml8
-rw-r--r--services/core/java/com/android/server/job/controllers/idle/CarIdlenessTracker.java90
2 files changed, 61 insertions, 37 deletions
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index c2ff9c9d662b..ea99afefecee 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -606,6 +606,14 @@
<protected-broadcast android:name="android.intent.action.DOCK_IDLE" />
<protected-broadcast android:name="android.intent.action.DOCK_ACTIVE" />
+ <!-- Added in Q -->
+
+ <!-- For CarIdlenessTracker -->
+ <protected-broadcast android:name="com.android.server.jobscheduler.GARAGE_MODE_ON" />
+ <protected-broadcast android:name="com.android.server.jobscheduler.GARAGE_MODE_OFF" />
+ <protected-broadcast android:name="com.android.server.jobscheduler.FORCE_IDLE" />
+ <protected-broadcast android:name="com.android.server.jobscheduler.UNFORCE_IDLE" />
+
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
<!-- ====================================================================== -->
diff --git a/services/core/java/com/android/server/job/controllers/idle/CarIdlenessTracker.java b/services/core/java/com/android/server/job/controllers/idle/CarIdlenessTracker.java
index a3949a4521c2..596a4c02e780 100644
--- a/services/core/java/com/android/server/job/controllers/idle/CarIdlenessTracker.java
+++ b/services/core/java/com/android/server/job/controllers/idle/CarIdlenessTracker.java
@@ -16,8 +16,6 @@
package com.android.server.job.controllers.idle;
-import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
-
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -35,20 +33,27 @@ public final class CarIdlenessTracker extends BroadcastReceiver implements Idlen
private static final boolean DEBUG = JobSchedulerService.DEBUG
|| Log.isLoggable(TAG, Log.DEBUG);
- public static final String ACTION_FORCE_IDLE = "com.android.server.ACTION_FORCE_IDLE";
- public static final String ACTION_UNFORCE_IDLE = "com.android.server.ACTION_UNFORCE_IDLE";
+ public static final String ACTION_GARAGE_MODE_ON =
+ "com.android.server.jobscheduler.GARAGE_MODE_ON";
+ public static final String ACTION_GARAGE_MODE_OFF =
+ "com.android.server.jobscheduler.GARAGE_MODE_OFF";
+
+ public static final String ACTION_FORCE_IDLE = "com.android.server.jobscheduler.FORCE_IDLE";
+ public static final String ACTION_UNFORCE_IDLE = "com.android.server.jobscheduler.UNFORCE_IDLE";
// After construction, mutations of idle/screen-on state will only happen
// on the main looper thread, either in onReceive() or in an alarm callback.
private boolean mIdle;
- private boolean mScreenOn;
+ private boolean mGarageModeOn;
+ private boolean mForced;
private IdlenessListener mIdleListener;
public CarIdlenessTracker() {
// At boot we presume that the user has just "interacted" with the
// device in some meaningful way.
mIdle = false;
- mScreenOn = true;
+ mGarageModeOn = false;
+ mForced = false;
}
@Override
@@ -62,9 +67,9 @@ public final class CarIdlenessTracker extends BroadcastReceiver implements Idlen
IntentFilter filter = new IntentFilter();
- // Screen state
- filter.addAction(Intent.ACTION_SCREEN_ON);
- filter.addAction(Intent.ACTION_SCREEN_OFF);
+ // State of GarageMode
+ filter.addAction(ACTION_GARAGE_MODE_ON);
+ filter.addAction(ACTION_GARAGE_MODE_OFF);
// Debugging/instrumentation
filter.addAction(ACTION_FORCE_IDLE);
@@ -77,7 +82,7 @@ public final class CarIdlenessTracker extends BroadcastReceiver implements Idlen
@Override
public void dump(PrintWriter pw) {
pw.print(" mIdle: "); pw.println(mIdle);
- pw.print(" mScreenOn: "); pw.println(mScreenOn);
+ pw.print(" mGarageModeOn: "); pw.println(mGarageModeOn);
}
@Override
@@ -88,47 +93,58 @@ public final class CarIdlenessTracker extends BroadcastReceiver implements Idlen
// Check for forced actions
if (action.equals(ACTION_FORCE_IDLE)) {
logIfDebug("Forcing idle...");
- enterIdleState(true);
+ setForceIdleState(true);
} else if (action.equals(ACTION_UNFORCE_IDLE)) {
logIfDebug("Unforcing idle...");
- exitIdleState(true);
- } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
- logIfDebug("Going idle...");
- mScreenOn = false;
- enterIdleState(false);
- } else if (action.equals(Intent.ACTION_SCREEN_ON)) {
- logIfDebug("exiting idle...");
- mScreenOn = true;
- exitIdleState(true);
+ setForceIdleState(false);
+ } else if (action.equals(ACTION_GARAGE_MODE_ON)) {
+ logIfDebug("GarageMode is on...");
+ mGarageModeOn = true;
+ updateIdlenessState();
+ } else if (action.equals(ACTION_GARAGE_MODE_OFF)) {
+ logIfDebug("GarageMode is off...");
+ mGarageModeOn = false;
+ updateIdlenessState();
} else if (action.equals(ActivityManagerService.ACTION_TRIGGER_IDLE)) {
- if (!mScreenOn) {
+ if (!mGarageModeOn) {
logIfDebug("Idle trigger fired...");
- enterIdleState(false);
+ triggerIdlenessOnce();
} else {
logIfDebug("TRIGGER_IDLE received but not changing state; idle="
- + mIdle + " screen=" + mScreenOn);
+ + mIdle + " screen=" + mGarageModeOn);
}
}
}
- private void enterIdleState(boolean forced) {
- if (!forced && mIdle) {
- // Already idle and don't need to trigger callbacks since not forced
- logIfDebug("Device is already considered idle");
- return;
+ private void setForceIdleState(boolean forced) {
+ mForced = forced;
+ updateIdlenessState();
+ }
+
+ private void updateIdlenessState() {
+ final boolean newState = (mForced || mGarageModeOn);
+ if (mIdle != newState) {
+ // State of idleness changed. Notifying idleness controller
+ logIfDebug("Device idleness changed. New idle=" + newState);
+ mIdle = newState;
+ mIdleListener.reportNewIdleState(mIdle);
+ } else {
+ // Nothing changed, device idleness is in the same state as new state
+ logIfDebug("Device idleness is the same. Current idle=" + newState);
}
- mIdle = true;
- mIdleListener.reportNewIdleState(mIdle);
}
- private void exitIdleState(boolean forced) {
- if (!forced && !mIdle) {
- // Already out of idle and don't need to trigger callbacks since not forced
- logIfDebug("Device is already considered not idle");
- return;
+ private void triggerIdlenessOnce() {
+ // This is simply triggering idleness once until some constraint will switch it back off
+ if (mIdle) {
+ // Already in idle state. Nothing to do
+ logIfDebug("Device is already idle");
+ } else {
+ // Going idle once
+ logIfDebug("Device is going idle once");
+ mIdle = true;
+ mIdleListener.reportNewIdleState(mIdle);
}
- mIdle = false;
- mIdleListener.reportNewIdleState(mIdle);
}
private void logIfDebug(String msg) {