diff options
author | Dianne Hackborn <hackbod@google.com> | 2015-03-13 18:02:54 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2015-03-16 11:29:12 -0700 |
commit | 3d07c94c393831091958fe6a98811843db8973bd (patch) | |
tree | 0cd5c4ea3dc580772b28ef76e9b5b76fe23de081 /services | |
parent | 872d191e6134b429f833013b8706c7b54ebd0d2a (diff) | |
download | frameworks_base-3d07c94c393831091958fe6a98811843db8973bd.zip frameworks_base-3d07c94c393831091958fe6a98811843db8973bd.tar.gz frameworks_base-3d07c94c393831091958fe6a98811843db8973bd.tar.bz2 |
Add new voice request for picking from a list.
Also add API for voice interaction service to control
whether the system should hold a wake lock while it is
working with an activity (and actually *do* hold a wake
lock while doing so, duh!).
And while in there, clean up the launching wake lock to
correctly give blame to the app that is launching.
Change-Id: I7cc4d566b80f59fe0a9ac51ae9bbb7188a01f433
Diffstat (limited to 'services')
5 files changed, 82 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e7952c1..a366c7b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -51,6 +51,8 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.BatteryStats; import android.os.PersistableBundle; +import android.os.PowerManager; +import android.os.WorkSource; import android.os.storage.IMountService; import android.os.storage.StorageManager; import android.service.voice.IVoiceInteractionSession; @@ -991,7 +993,14 @@ public final class ActivityManagerService extends ActivityManagerNative * Set while we are running a voice interaction. This overrides * sleeping while it is active. */ - private boolean mRunningVoice = false; + private IVoiceInteractionSession mRunningVoice; + + /** + * We want to hold a wake lock while running a voice interaction session, since + * this may happen with the screen off and we need to keep the CPU running to + * be able to continue to interact with the user. + */ + PowerManager.WakeLock mVoiceWakeLock; /** * State of external calls telling us if the device is awake or asleep. @@ -2269,6 +2278,9 @@ public final class ActivityManagerService extends ActivityManagerNative public void initPowerManagement() { mStackSupervisor.initPowerManagement(); mBatteryStatsService.initPowerManagement(); + PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); + mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*"); + mVoiceWakeLock.setReferenceCounted(false); } @Override @@ -2472,7 +2484,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (DEBUG_FOCUS) Slog.d(TAG, "setFocusedActivityLocked: r=" + r); mFocusedActivity = r; if (r.task != null && r.task.voiceInteractor != null) { - startRunningVoiceLocked(); + startRunningVoiceLocked(r.task.voiceSession, r.info.applicationInfo.uid); } else { finishRunningVoiceLocked(); } @@ -3628,6 +3640,19 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override + public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) { + synchronized (this) { + if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) { + if (keepAwake) { + mVoiceWakeLock.acquire(); + } else { + mVoiceWakeLock.release(); + } + } + } + } + + @Override public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent, Bundle options) { // Refuse possible leaked file descriptors @@ -9685,8 +9710,8 @@ public final class ActivityManagerService extends ActivityManagerNative } void finishRunningVoiceLocked() { - if (mRunningVoice) { - mRunningVoice = false; + if (mRunningVoice != null) { + mRunningVoice = null; updateSleepIfNeededLocked(); } } @@ -9709,7 +9734,7 @@ public final class ActivityManagerService extends ActivityManagerNative private boolean shouldSleepLocked() { // Resume applications while running a voice interactor. - if (mRunningVoice) { + if (mRunningVoice != null) { return false; } @@ -9810,10 +9835,14 @@ public final class ActivityManagerService extends ActivityManagerNative + " mSleeping=" + mSleeping); } - void startRunningVoiceLocked() { - if (!mRunningVoice) { - mRunningVoice = true; - updateSleepIfNeededLocked(); + void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) { + mVoiceWakeLock.setWorkSource(new WorkSource(targetUid)); + if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) { + if (mRunningVoice == null) { + mVoiceWakeLock.acquire(); + updateSleepIfNeededLocked(); + } + mRunningVoice = session; } } @@ -12813,8 +12842,11 @@ public final class ActivityManagerService extends ActivityManagerNative + PowerManagerInternal.wakefulnessToString(mWakefulness)); pw.println(" mSleeping=" + mSleeping + " mLockScreenShown=" + lockScreenShownToString()); - pw.println(" mShuttingDown=" + mShuttingDown + " mRunningVoice=" + mRunningVoice - + " mTestPssMode=" + mTestPssMode); + pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + mTestPssMode); + if (mRunningVoice != null) { + pw.println(" mRunningVoice=" + mRunningVoice); + pw.println(" mVoiceWakeLock" + mVoiceWakeLock); + } } if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient || mOrigWaitForDebugger) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index be95268..456ed33 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -869,7 +869,7 @@ final class ActivityStack { // If we are not going to sleep, we want to ensure the device is // awake until the next activity is started. - if (!mService.isSleepingOrShuttingDown()) { + if (!uiSleeping && !mService.isSleepingOrShuttingDown()) { mStackSupervisor.acquireLaunchWakelock(); } @@ -1671,6 +1671,8 @@ final class ActivityStack { } } + mStackSupervisor.setLaunchSource(next.info.applicationInfo.uid); + // We need to start pausing the current activity so the top one // can be resumed... boolean dontWaitForPause = (next.info.flags&ActivityInfo.FLAG_RESUME_WHILE_PAUSING) != 0; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index cbbb11a8..f56f65f 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -84,6 +84,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; +import android.os.WorkSource; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.service.voice.IVoiceInteractionSession; @@ -316,8 +317,7 @@ public final class ActivityStackSupervisor implements DisplayListener { void initPowerManagement() { PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); - mLaunchingActivity = - pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); + mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*"); mLaunchingActivity.setReferenceCounted(false); } @@ -2273,6 +2273,10 @@ public final class ActivityStackSupervisor implements DisplayListener { } } + void setLaunchSource(int uid) { + mLaunchingActivity.setWorkSource(new WorkSource(uid)); + } + void acquireLaunchWakelock() { if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { throw new IllegalStateException("Calling must be system uid"); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 6b8c49c..f032ccf 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -479,6 +479,24 @@ public class VoiceInteractionManagerService extends SystemService { } @Override + public void setKeepAwake(IBinder token, boolean keepAwake) { + synchronized (this) { + if (mImpl == null) { + Slog.w(TAG, "setKeepAwake without running voice interaction service"); + return; + } + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); + final long caller = Binder.clearCallingIdentity(); + try { + mImpl.setKeepAwakeLocked(callingPid, callingUid, token, keepAwake); + } finally { + Binder.restoreCallingIdentity(caller); + } + } + } + + @Override public void finish(IBinder token) { synchronized (this) { if (mImpl == null) { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 9e92867..5a91b88 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -174,6 +174,18 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne } } + public void setKeepAwakeLocked(int callingPid, int callingUid, IBinder token, + boolean keepAwake) { + try { + if (mActiveSession == null || token != mActiveSession.mToken) { + Slog.w(TAG, "setKeepAwake does not match active session"); + return; + } + mAm.setVoiceKeepAwake(mActiveSession.mSession, keepAwake); + } catch (RemoteException e) { + throw new IllegalStateException("Unexpected remote error", e); + } + } public void finishLocked(int callingPid, int callingUid, IBinder token) { if (mActiveSession == null || token != mActiveSession.mToken) { |