diff options
| author | 2016-06-01 03:06:36 +0000 | |
|---|---|---|
| committer | 2016-06-01 03:06:38 +0000 | |
| commit | 2ab4ac38350b51c239fe564bc89727b201036205 (patch) | |
| tree | b44e35b491ebecc706ba28aa1896defe8e4ce049 | |
| parent | ae01e27755107d437bc92b1f994932c860453453 (diff) | |
| parent | 98f03f98acb4bf8020be21be0f261f3d285b7d2e (diff) | |
Merge "Trigger power hints for activity launch" into nyc-mr1-dev
3 files changed, 31 insertions, 2 deletions
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java index b3cf710094e0..9bbe8f951834 100644 --- a/core/java/android/os/PowerManagerInternal.java +++ b/core/java/android/os/PowerManagerInternal.java @@ -57,14 +57,19 @@ public abstract class PowerManagerInternal { /** * Power hint: * Interaction: The user is interacting with the device. The corresponding data field must be - * the expected duration of the fling, or 0 if unknown. + * the expected duration of the interaction, or 0 if unknown. * - * Sustained Performance Mode: Enable/Disables Sustained Performance Mode. + * Sustained Performance Mode: The corresponding data field must be Enable/Disable + * Sustained Performance Mode. + * + * Launch: This is specific for activity launching. The corresponding data field must be + * the expected duration of the required boost, or 0 if unknown. * * These must be kept in sync with the values in hardware/libhardware/include/hardware/power.h */ public static final int POWER_HINT_INTERACTION = 2; public static final int POWER_HINT_SUSTAINED_PERFORMANCE_MODE = 6; + public static final int POWER_HINT_LAUNCH = 8; public static String wakefulnessToString(int wakefulness) { switch (wakefulness) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 637061d09023..8d6b7eed3f7b 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -4416,6 +4416,7 @@ public final class ActivityStackSupervisor implements DisplayListener { // Work Challenge is present) let startActivityInPackage handle the intercepting. if (!mService.mUserController.shouldConfirmCredentials(task.userId) && task.getRootActivity() != null) { + mService.mActivityStarter.sendPowerHintForLaunchIfNeeded(true /* forceSend */); mActivityMetricsLogger.notifyActivityLaunching(); mService.moveTaskToFrontLocked(task.taskId, 0, bOptions); mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT, diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 710193776b87..b8480ea73bce 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -102,6 +102,7 @@ import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.os.PowerManagerInternal; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -172,6 +173,7 @@ class ActivityStarter { private boolean mNoAnimation; private boolean mKeepCurTransition; private boolean mAvoidMoveToFront; + private boolean mPowerHintSent; private IVoiceInteractionSession mVoiceSession; private IVoiceInteractor mVoiceInteractor; @@ -210,6 +212,8 @@ class ActivityStarter { mKeepCurTransition = false; mAvoidMoveToFront = false; + mPowerHintSent = false; + mVoiceSession = null; mVoiceInteractor = null; } @@ -942,6 +946,20 @@ class ActivityStarter { return START_SUCCESS; } + void sendPowerHintForLaunchIfNeeded(boolean forceSend) { + // Trigger launch power hint if activity is not in the current task + final ActivityStack focusStack = mSupervisor.getFocusedStack(); + final ActivityRecord curTop = (focusStack == null) + ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop); + if ((forceSend || (!mPowerHintSent && curTop != null && + curTop.task != null && mStartActivity != null && + curTop.task != mStartActivity.task )) && + mService.mLocalPowerManager != null) { + mService.mLocalPowerManager.powerHint(PowerManagerInternal.POWER_HINT_LAUNCH, 0); + mPowerHintSent = true; + } + } + private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) { @@ -1003,6 +1021,8 @@ class ActivityStarter { } } + sendPowerHintForLaunchIfNeeded(false /* forceSend */); + mReusedActivity = setTargetStackAndMoveToFrontIfNeeded(mReusedActivity); if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) { @@ -1125,6 +1145,9 @@ class ActivityStarter { ActivityStack.logStartActivity( EventLogTags.AM_CREATE_ACTIVITY, mStartActivity, mStartActivity.task); mTargetStack.mLastPausedActivity = null; + + sendPowerHintForLaunchIfNeeded(false /* forceSend */); + mTargetStack.startActivityLocked(mStartActivity, newTask, mKeepCurTransition, mOptions); if (mDoResume) { if (!mLaunchTaskBehind) { |