diff options
Diffstat (limited to 'services/core/java')
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); } |