summaryrefslogtreecommitdiffstats
path: root/services/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'services/core/java')
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java5
-rw-r--r--services/core/java/com/android/server/media/MediaRouteProviderProxy.java2
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java42
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java106
-rw-r--r--services/core/java/com/android/server/media/MediaSessionStack.java8
5 files changed, 132 insertions, 31 deletions
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 3d5fb57..bc264fa 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -421,6 +421,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
final boolean mustNotify;
boolean mustInitialize = false;
boolean wasDimOrDoze = false;
+ boolean autoBrightnessAdjustmentChanged = false;
synchronized (mLock) {
mPendingUpdatePowerStateLocked = false;
@@ -437,6 +438,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
} else if (mPendingRequestChangedLocked) {
wasDimOrDoze = (mPowerRequest.screenState == DisplayPowerRequest.SCREEN_STATE_DIM
|| mPowerRequest.screenState == DisplayPowerRequest.SCREEN_STATE_DOZE);
+ autoBrightnessAdjustmentChanged = (mPowerRequest.screenAutoBrightnessAdjustment
+ != mPendingRequestLocked.screenAutoBrightnessAdjustment);
mPowerRequest.copyFrom(mPendingRequestLocked);
mWaitingForNegativeProximity |= mPendingWaitForNegativeProximityLocked;
mPendingWaitForNegativeProximityLocked = false;
@@ -494,7 +497,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (screenAutoBrightness >= 0 && mPowerRequest.useAutoBrightness) {
// Use current auto-brightness value.
target = screenAutoBrightness;
- slow = mUsingScreenAutoBrightness;
+ slow = mUsingScreenAutoBrightness && !autoBrightnessAdjustmentChanged;
mUsingScreenAutoBrightness = true;
} else {
// Light sensor is disabled or not ready yet.
diff --git a/services/core/java/com/android/server/media/MediaRouteProviderProxy.java b/services/core/java/com/android/server/media/MediaRouteProviderProxy.java
index 1c5cacd..b31153b 100644
--- a/services/core/java/com/android/server/media/MediaRouteProviderProxy.java
+++ b/services/core/java/com/android/server/media/MediaRouteProviderProxy.java
@@ -26,7 +26,7 @@ import android.media.routeprovider.RouteProviderService;
import android.media.routeprovider.RouteRequest;
import android.media.session.RouteEvent;
import android.media.session.RouteInfo;
-import android.media.session.Session;
+import android.media.session.MediaSession;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 9677577..00d364b 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -24,16 +24,16 @@ import android.media.session.ISessionController;
import android.media.session.ISessionControllerCallback;
import android.media.session.ISession;
import android.media.session.ISessionCallback;
-import android.media.session.SessionController;
-import android.media.session.MediaMetadata;
+import android.media.session.MediaController;
import android.media.session.RouteCommand;
import android.media.session.RouteInfo;
import android.media.session.RouteOptions;
import android.media.session.RouteEvent;
-import android.media.session.Session;
-import android.media.session.SessionInfo;
+import android.media.session.MediaSession;
+import android.media.session.MediaSessionInfo;
import android.media.session.RouteInterface;
import android.media.session.PlaybackState;
+import android.media.MediaMetadata;
import android.media.Rating;
import android.os.Bundle;
import android.os.Handler;
@@ -85,7 +85,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
private final int mOwnerPid;
private final int mOwnerUid;
private final int mUserId;
- private final SessionInfo mSessionInfo;
+ private final MediaSessionInfo mSessionInfo;
private final String mTag;
private final ControllerStub mController;
private final SessionStub mSession;
@@ -120,7 +120,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mOwnerPid = ownerPid;
mOwnerUid = ownerUid;
mUserId = userId;
- mSessionInfo = new SessionInfo(UUID.randomUUID().toString(), ownerPackageName);
+ mSessionInfo = new MediaSessionInfo(UUID.randomUUID().toString(), ownerPackageName);
mTag = tag;
mController = new ControllerStub();
mSession = new SessionStub();
@@ -130,7 +130,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
/**
- * Get the binder for the {@link Session}.
+ * Get the binder for the {@link MediaSession}.
*
* @return The session binder apps talk to.
*/
@@ -139,7 +139,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
/**
- * Get the binder for the {@link SessionController}.
+ * Get the binder for the {@link MediaController}.
*
* @return The controller binder apps talk to.
*/
@@ -170,7 +170,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
*
* @return Info that identifies this session.
*/
- public SessionInfo getSessionInfo() {
+ public MediaSessionInfo getSessionInfo() {
return mSessionInfo;
}
@@ -209,7 +209,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
* @return True if this is a system priority session, false otherwise
*/
public boolean isSystemPriority() {
- return (mFlags & Session.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0;
+ return (mFlags & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0;
}
/**
@@ -221,7 +221,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
public void selectRoute(RouteInfo route) {
synchronized (mLock) {
if (route != mRoute) {
- disconnect(Session.DISCONNECT_REASON_ROUTE_CHANGED);
+ disconnect(MediaSession.DISCONNECT_REASON_ROUTE_CHANGED);
}
mRoute = route;
}
@@ -335,7 +335,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
public boolean isTransportControlEnabled() {
- return hasFlag(Session.FLAG_HANDLES_TRANSPORT_CONTROLS);
+ return hasFlag(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
}
@Override
@@ -353,7 +353,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return;
}
if (isConnected()) {
- disconnectLocked(Session.DISCONNECT_REASON_SESSION_DESTROYED);
+ disconnectLocked(MediaSession.DISCONNECT_REASON_SESSION_DESTROYED);
}
mRoute = null;
mRequest = null;
@@ -365,6 +365,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
return mSessionCb.mCb;
}
+ public void sendMediaButton(KeyEvent ke, ResultReceiver cb) {
+ mSessionCb.sendMediaButton(ke, cb);
+ }
+
public void dump(PrintWriter pw, String prefix) {
pw.println(prefix + mTag + " " + this);
@@ -536,7 +540,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public void disconnect() {
- MediaSessionRecord.this.disconnect(Session.DISCONNECT_REASON_PROVIDER_DISCONNECTED);
+ MediaSessionRecord.this.disconnect(MediaSession.DISCONNECT_REASON_PROVIDER_DISCONNECTED);
}
};
@@ -565,7 +569,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public void setFlags(int flags) {
- if ((flags & Session.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
+ if ((flags & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
int pid = getCallingPid();
int uid = getCallingUid();
mService.enforcePhoneStatePermission(pid, uid);
@@ -623,7 +627,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
public void disconnectFromRoute(RouteInfo route) {
if (route != null && mRoute != null
&& TextUtils.equals(route.getId(), mRoute.getId())) {
- disconnect(Session.DISCONNECT_REASON_SESSION_DISCONNECTED);
+ disconnect(MediaSession.DISCONNECT_REASON_SESSION_DISCONNECTED);
}
}
@@ -645,11 +649,11 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mCb = cb;
}
- public void sendMediaButton(KeyEvent keyEvent) {
+ public void sendMediaButton(KeyEvent keyEvent, ResultReceiver cb) {
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
try {
- mCb.onMediaButton(mediaButtonIntent);
+ mCb.onMediaButton(mediaButtonIntent, cb);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in sendMediaRequest.", e);
}
@@ -785,7 +789,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
@Override
public void sendMediaButton(KeyEvent mediaButtonIntent) {
- mSessionCb.sendMediaButton(mediaButtonIntent);
+ mSessionCb.sendMediaButton(mediaButtonIntent, null);
}
@Override
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 78f3b5f..d9e45f5ba 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -17,9 +17,12 @@
package com.android.server.media;
import android.Manifest;
+import android.app.Activity;
import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.routeprovider.RouteRequest;
import android.media.session.ISession;
@@ -27,16 +30,20 @@ import android.media.session.ISessionCallback;
import android.media.session.ISessionManager;
import android.media.session.RouteInfo;
import android.media.session.RouteOptions;
-import android.media.session.Session;
+import android.media.session.MediaSession;
import android.os.Binder;
+import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.PowerManager;
import android.os.RemoteException;
+import android.os.ResultReceiver;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
+import android.view.KeyEvent;
import com.android.server.SystemService;
import com.android.server.Watchdog;
@@ -64,6 +71,7 @@ public class MediaSessionService extends SystemService implements Monitor {
// = new ArrayList<MediaRouteProviderProxy>();
private final Object mLock = new Object();
private final Handler mHandler = new Handler();
+ private final PowerManager.WakeLock mMediaEventWakeLock;
private MediaSessionRecord mPrioritySession;
private int mCurrentUserId = -1;
@@ -79,6 +87,8 @@ public class MediaSessionService extends SystemService implements Monitor {
super(context);
mSessionManagerImpl = new SessionManagerImpl();
mPriorityStack = new MediaSessionStack();
+ PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
}
@Override
@@ -377,7 +387,7 @@ public class MediaSessionService extends SystemService implements Monitor {
/*
* When a session is created the following things need to happen.
- * 1. It's callback binder needs a link to death
+ * 1. Its callback binder needs a link to death
* 2. It needs to be added to all sessions.
* 3. It needs to be added to the priority stack.
* 4. It needs to be added to the relevant user record.
@@ -493,7 +503,7 @@ public class MediaSessionService extends SystemService implements Monitor {
MediaSessionRecord session = mSessions.get(i);
MediaSessionService.this.destroySessionLocked(session);
if (session.isConnected()) {
- session.disconnect(Session.DISCONNECT_REASON_USER_STOPPING);
+ session.disconnect(MediaSession.DISCONNECT_REASON_USER_STOPPING);
}
}
}
@@ -585,9 +595,10 @@ public class MediaSessionService extends SystemService implements Monitor {
}
class SessionManagerImpl extends ISessionManager.Stub {
- // TODO add createSessionAsUser, pass user-id to
- // ActivityManagerNative.handleIncomingUser and stash result for use
- // when starting services on that session's behalf.
+ private static final String EXTRA_WAKELOCK_ACQUIRED =
+ "android.media.AudioService.WAKELOCK_ACQUIRED";
+ private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; // magic number
+
@Override
public ISession createSession(String packageName, ISessionCallback cb, String tag,
int userId) throws RemoteException {
@@ -644,6 +655,59 @@ public class MediaSessionService extends SystemService implements Monitor {
}
}
+ /**
+ * Handles the dispatching of the media button events to one of the
+ * registered listeners, or if there was none, broadcast an
+ * ACTION_MEDIA_BUTTON intent to the rest of the system.
+ *
+ * @param keyEvent a non-null KeyEvent whose key code is one of the
+ * supported media buttons
+ * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held
+ * while this key event is dispatched.
+ */
+ @Override
+ public void dispatchMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) {
+ if (keyEvent == null || !KeyEvent.isMediaKey(keyEvent.getKeyCode())) {
+ Log.w(TAG, "Attempted to dispatch null or non-media key event.");
+ return;
+ }
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ if (needWakeLock) {
+ mMediaEventWakeLock.acquire();
+ }
+ synchronized (mLock) {
+ MediaSessionRecord mbSession = mPriorityStack
+ .getDefaultMediaButtonSession(mCurrentUserId);
+ if (mbSession != null) {
+ if (DEBUG) {
+ Log.d(TAG, "Sending media key to " + mbSession.getSessionInfo());
+ }
+ mbSession.sendMediaButton(keyEvent,
+ needWakeLock ? mKeyEventDoneReceiver : null);
+ } else {
+ if (DEBUG) {
+ Log.d(TAG, "Sending media key ordered broadcast");
+ }
+ // Fallback to legacy behavior
+ Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
+ keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
+ if (needWakeLock) {
+ keyIntent.putExtra(EXTRA_WAKELOCK_ACQUIRED,
+ WAKELOCK_RELEASE_ON_FINISHED);
+ }
+ getContext().sendOrderedBroadcastAsUser(keyIntent, UserHandle.ALL,
+ null, mKeyEventDone, mHandler, Activity.RESULT_OK, null, null);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
@Override
public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
if (getContext().checkCallingOrSelfPermission(Manifest.permission.DUMP)
@@ -678,6 +742,36 @@ public class MediaSessionService extends SystemService implements Monitor {
}
}
}
+
+ ResultReceiver mKeyEventDoneReceiver = new ResultReceiver(mHandler) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ synchronized (mLock) {
+ if (mMediaEventWakeLock.isHeld()) {
+ mMediaEventWakeLock.release();
+ }
+ }
+ }
+ };
+
+ BroadcastReceiver mKeyEventDone = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null) {
+ return;
+ }
+ Bundle extras = intent.getExtras();
+ if (extras == null) {
+ return;
+ }
+ synchronized (mLock) {
+ if (extras.containsKey(EXTRA_WAKELOCK_ACQUIRED)
+ && mMediaEventWakeLock.isHeld()) {
+ mMediaEventWakeLock.release();
+ }
+ }
+ }
+ };
}
}
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index f89b14a..7ba9212 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -17,7 +17,7 @@
package com.android.server.media;
import android.media.session.PlaybackState;
-import android.media.session.Session;
+import android.media.session.MediaSession;
import android.os.UserHandle;
import java.io.PrintWriter;
@@ -62,7 +62,7 @@ public class MediaSessionStack {
*/
public void addSession(MediaSessionRecord record) {
mSessions.add(record);
- if ((record.getFlags() & Session.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
+ if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
mGlobalPrioritySession = record;
}
clearCache();
@@ -134,7 +134,7 @@ public class MediaSessionStack {
public ArrayList<MediaSessionRecord> getTransportControlSessions(int userId) {
if (mCachedTransportControlList == null) {
mCachedTransportControlList = getPriorityListLocked(true,
- Session.FLAG_HANDLES_TRANSPORT_CONTROLS, userId);
+ MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS, userId);
}
return mCachedTransportControlList;
}
@@ -170,7 +170,7 @@ public class MediaSessionStack {
return mCachedButtonReceiver;
}
ArrayList<MediaSessionRecord> records = getPriorityListLocked(true,
- Session.FLAG_HANDLES_MEDIA_BUTTONS, userId);
+ MediaSession.FLAG_HANDLES_MEDIA_BUTTONS, userId);
if (records.size() > 0) {
mCachedButtonReceiver = records.get(0);
}