diff options
| author | 2014-06-17 16:56:27 -0700 | |
|---|---|---|
| committer | 2014-06-20 11:35:20 -0700 | |
| commit | 6f0e4ddd66fcdcc13944d8970d0b560e2626508b (patch) | |
| tree | 2078b16249399599c79c3fcf24eea04c79128361 | |
| parent | f44d49995673dedfd67bd0171066525db8bbf9f4 (diff) | |
Remove more dead audio service code
Hit a snag in remote volume changes. Trying off this round of
removal so I can work on fixing remote volume handling in a
separate CL.
Change-Id: I49b1ba4b75d770ba7c77da081755f3210a9e9483
| -rw-r--r-- | media/java/android/media/AudioManager.java | 106 | ||||
| -rw-r--r-- | media/java/android/media/AudioService.java | 56 | ||||
| -rw-r--r-- | media/java/android/media/IAudioService.aidl | 41 | ||||
| -rw-r--r-- | media/java/android/media/MediaFocusControl.java | 232 | ||||
| -rw-r--r-- | media/java/android/media/RemoteController.java | 43 | ||||
| -rw-r--r-- | media/java/android/media/session/ISession.aidl | 2 | ||||
| -rw-r--r-- | media/java/android/media/session/MediaSession.java | 16 | ||||
| -rw-r--r-- | media/java/android/media/session/MediaSessionLegacyHelper.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionRecord.java | 11 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionService.java | 19 |
10 files changed, 64 insertions, 466 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 47b6024c113e..fb19242dc983 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -2194,48 +2194,8 @@ public class AudioManager { Log.e(TAG, "Cannot call registerMediaButtonIntent() with a null parameter"); return; } - IAudioService service = getService(); - try { - // pi != null, this is currently still needed to support across - // reboot launching of the last app. - service.registerMediaButtonIntent(pi, eventReceiver, - eventReceiver == null ? mToken : null); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in registerMediaButtonIntent"+e); - } MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); - helper.addMediaButtonListener(pi, mContext); - } - - /** - * @hide - * Used internally by telephony package to register an intent receiver for ACTION_MEDIA_BUTTON. - * @param eventReceiver the component that will receive the media button key events, - * no-op if eventReceiver is null - */ - public void registerMediaButtonEventReceiverForCalls(ComponentName eventReceiver) { - if (eventReceiver == null) { - return; - } - IAudioService service = getService(); - try { - // eventReceiver != null - service.registerMediaButtonEventReceiverForCalls(eventReceiver); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in registerMediaButtonEventReceiverForCalls", e); - } - } - - /** - * @hide - */ - public void unregisterMediaButtonEventReceiverForCalls() { - IAudioService service = getService(); - try { - service.unregisterMediaButtonEventReceiverForCalls(); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in unregisterMediaButtonEventReceiverForCalls", e); - } + helper.addMediaButtonListener(pi, eventReceiver, mContext); } /** @@ -2272,12 +2232,6 @@ public class AudioManager { * @hide */ public void unregisterMediaButtonIntent(PendingIntent pi) { - IAudioService service = getService(); - try { - service.unregisterMediaButtonIntent(pi); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in unregisterMediaButtonIntent"+e); - } MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext); helper.removeMediaButtonListener(pi); } @@ -2443,46 +2397,6 @@ public class AudioManager { } /** - * @hide - * Request the user of a RemoteControlClient to seek to the given playback position. - * @param generationId the RemoteControlClient generation counter for which this request is - * issued. Requests for an older generation than current one will be ignored. - * @param timeMs the time in ms to seek to, must be positive. - */ - public void setRemoteControlClientPlaybackPosition(int generationId, long timeMs) { - if (timeMs < 0) { - return; - } - IAudioService service = getService(); - try { - service.setRemoteControlClientPlaybackPosition(generationId, timeMs); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in setRccPlaybackPosition("+ generationId + ", " - + timeMs + ")", e); - } - } - - /** - * @hide - * Notify the user of a RemoteControlClient that it should update its metadata with the - * new value for the given key. - * @param generationId the RemoteControlClient generation counter for which this request is - * issued. Requests for an older generation than current one will be ignored. - * @param key the metadata key for which a new value exists - * @param value the new metadata value - */ - public void updateRemoteControlClientMetadata(int generationId, int key, - Rating value) { - IAudioService service = getService(); - try { - service.updateRemoteControlClientMetadata(generationId, key, value); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in updateRemoteControlClientMetadata("+ generationId + ", " - + key +", " + value + ")", e); - } - } - - /** * @hide * Reload audio settings. This method is called by Settings backup * agent when audio settings are restored and causes the AudioService @@ -2898,12 +2812,9 @@ public class AudioManager { * @hide */ public int getRemoteStreamVolume() { - try { - return getService().getRemoteStreamVolume(); - } catch (RemoteException e) { - Log.w(TAG, "Error getting remote stream volume", e); - return 0; - } + // TODO STOPSHIP switch callers to use media sessions instead + Log.e(TAG, "Need to implement new Remote Volume!"); + return 0; } /** @@ -2911,12 +2822,9 @@ public class AudioManager { * @hide */ public int getRemoteStreamMaxVolume() { - try { - return getService().getRemoteStreamMaxVolume(); - } catch (RemoteException e) { - Log.w(TAG, "Error getting remote stream max volume", e); - return 0; - } + // TODO STOPSHIP switch callers to use media sessions instead + Log.e(TAG, "Need to implement new Remote Volume!"); + return 0; } /** diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 6b7d7a9b101e..0c224a64c9ab 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -4412,68 +4412,12 @@ public class AudioService extends IAudioService.Stub { mMediaFocusControl.remoteControlDisplayWantsPlaybackPositionSync(rcd, wantsSync); } - public void registerMediaButtonEventReceiverForCalls(ComponentName c) { - mMediaFocusControl.registerMediaButtonEventReceiverForCalls(c); - } - - public void unregisterMediaButtonEventReceiverForCalls() { - mMediaFocusControl.unregisterMediaButtonEventReceiverForCalls(); - } - - public void registerMediaButtonIntent(PendingIntent pi, ComponentName c, IBinder token) { - mMediaFocusControl.registerMediaButtonIntent(pi, c, token); - } - - public void unregisterMediaButtonIntent(PendingIntent pi) { - mMediaFocusControl.unregisterMediaButtonIntent(pi); - } - - public int registerRemoteControlClient(PendingIntent mediaIntent, - IRemoteControlClient rcClient, String callingPckg) { - return mMediaFocusControl.registerRemoteControlClient(mediaIntent, rcClient, callingPckg); - } - - public void unregisterRemoteControlClient(PendingIntent mediaIntent, - IRemoteControlClient rcClient) { - mMediaFocusControl.unregisterRemoteControlClient(mediaIntent, rcClient); - } - - public void setRemoteControlClientPlaybackPosition(int generationId, long timeMs) { - mMediaFocusControl.setRemoteControlClientPlaybackPosition(generationId, timeMs); - } - - public void updateRemoteControlClientMetadata(int generationId, int key, Rating value) { - mMediaFocusControl.updateRemoteControlClientMetadata(generationId, key, value); - } - - public void registerRemoteVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { - mMediaFocusControl.registerRemoteVolumeObserverForRcc(rccId, rvo); - } - - @Override - public int getRemoteStreamVolume() { - return mMediaFocusControl.getRemoteStreamVolume(); - } - - @Override - public int getRemoteStreamMaxVolume() { - return mMediaFocusControl.getRemoteStreamMaxVolume(); - } - @Override public void setRemoteStreamVolume(int index) { enforceSelfOrSystemUI("set the remote stream volume"); mMediaFocusControl.setRemoteStreamVolume(index); } - public void setPlaybackStateForRcc(int rccId, int state, long timeMs, float speed) { - mMediaFocusControl.setPlaybackStateForRcc(rccId, state, timeMs, speed); - } - - public void setPlaybackInfoForRcc(int rccId, int what, int value) { - mMediaFocusControl.setPlaybackInfoForRcc(rccId, what, value); - } - //========================================================================================== // Audio Focus //========================================================================================== diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 41e691d55303..4dcdd1962795 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -122,12 +122,6 @@ interface IAudioService { int getCurrentAudioFocus(); - void registerMediaButtonIntent(in PendingIntent pi, in ComponentName c, IBinder token); - oneway void unregisterMediaButtonIntent(in PendingIntent pi); - - oneway void registerMediaButtonEventReceiverForCalls(in ComponentName c); - oneway void unregisterMediaButtonEventReceiverForCalls(); - /** * Register an IRemoteControlDisplay. * Success of registration is subject to a check on @@ -180,41 +174,6 @@ interface IAudioService { */ oneway void remoteControlDisplayWantsPlaybackPositionSync(in IRemoteControlDisplay rcd, boolean wantsSync); - /** - * Request the user of a RemoteControlClient to seek to the given playback position. - * @param generationId the RemoteControlClient generation counter for which this request is - * issued. Requests for an older generation than current one will be ignored. - * @param timeMs the time in ms to seek to, must be positive. - */ - void setRemoteControlClientPlaybackPosition(int generationId, long timeMs); - /** - * Notify the user of a RemoteControlClient that it should update its metadata with the - * new value for the given key. - * @param generationId the RemoteControlClient generation counter for which this request is - * issued. Requests for an older generation than current one will be ignored. - * @param key the metadata key for which a new value exists - * @param value the new metadata value - */ - void updateRemoteControlClientMetadata(int generationId, int key, in Rating value); - - /** - * Do not use directly, use instead - * {@link android.media.AudioManager#registerRemoteControlClient(RemoteControlClient)} - */ - int registerRemoteControlClient(in PendingIntent mediaIntent, - in IRemoteControlClient rcClient, in String callingPackageName); - /** - * Do not use directly, use instead - * {@link android.media.AudioManager#unregisterRemoteControlClient(RemoteControlClient)} - */ - oneway void unregisterRemoteControlClient(in PendingIntent mediaIntent, - in IRemoteControlClient rcClient); - - oneway void setPlaybackInfoForRcc(int rccId, int what, int value); - void setPlaybackStateForRcc(int rccId, int state, long timeMs, float speed); - int getRemoteStreamMaxVolume(); - int getRemoteStreamVolume(); - oneway void registerRemoteVolumeObserverForRcc(int rccId, in IRemoteVolumeObserver rvo); void startBluetoothSco(IBinder cb, int targetSdkVersion); void startBluetoothScoVirtualCall(IBinder cb); diff --git a/media/java/android/media/MediaFocusControl.java b/media/java/android/media/MediaFocusControl.java index 1c73c05f5f58..a4a7c4ee9166 100644 --- a/media/java/android/media/MediaFocusControl.java +++ b/media/java/android/media/MediaFocusControl.java @@ -379,32 +379,11 @@ public class MediaFocusControl implements OnFinished { onReevaluateRemote(); break; - case MSG_RCC_NEW_PLAYBACK_INFO: - onNewPlaybackInfoForRcc(msg.arg1 /* rccId */, msg.arg2 /* key */, - ((Integer)msg.obj).intValue() /* value */); - break; - case MSG_RCC_NEW_VOLUME_OBS: onRegisterVolumeObserverForRcc(msg.arg1 /* rccId */, (IRemoteVolumeObserver)msg.obj /* rvo */); break; - case MSG_RCC_NEW_PLAYBACK_STATE: - onNewPlaybackStateForRcc(msg.arg1 /* rccId */, - msg.arg2 /* state */, - (PlayerRecord.RccPlaybackState)msg.obj /* newState */); - break; - - case MSG_RCC_SEEK_REQUEST: - onSetRemoteControlClientPlaybackPosition( - msg.arg1 /* generationId */, ((Long)msg.obj).longValue() /* timeMs */); - break; - - case MSG_RCC_UPDATE_METADATA: - onUpdateRemoteControlClientMetadata(msg.arg1 /*genId*/, msg.arg2 /*key*/, - (Rating) msg.obj /* value */); - break; - case MSG_RCDISPLAY_INIT_INFO: // msg.obj is guaranteed to be non null onRcDisplayInitInfo((IRemoteControlDisplay)msg.obj /*newRcd*/, @@ -2003,217 +1982,6 @@ public class MediaFocusControl implements OnFinished { } } - protected void setRemoteControlClientPlaybackPosition(int generationId, long timeMs) { - // ignore position change requests if invalid generation ID - synchronized(mPRStack) { - synchronized(mCurrentRcLock) { - if (mCurrentRcClientGen != generationId) { - return; - } - } - } - // discard any unprocessed seek request in the message queue, and replace with latest - sendMsg(mEventHandler, MSG_RCC_SEEK_REQUEST, SENDMSG_REPLACE, generationId /* arg1 */, - 0 /* arg2 ignored*/, new Long(timeMs) /* obj */, 0 /* delay */); - } - - private void onSetRemoteControlClientPlaybackPosition(int generationId, long timeMs) { - if(DEBUG_RC) Log.d(TAG, "onSetRemoteControlClientPlaybackPosition(genId=" + generationId + - ", timeMs=" + timeMs + ")"); - synchronized(mPRStack) { - synchronized(mCurrentRcLock) { - if ((mCurrentRcClient != null) && (mCurrentRcClientGen == generationId)) { - // tell the current client to seek to the requested location - try { - mCurrentRcClient.seekTo(generationId, timeMs); - } catch (RemoteException e) { - Log.e(TAG, "Current valid remote client is dead: "+e); - mCurrentRcClient = null; - } - } - } - } - } - - protected void updateRemoteControlClientMetadata(int genId, int key, Rating value) { - sendMsg(mEventHandler, MSG_RCC_UPDATE_METADATA, SENDMSG_QUEUE, - genId /* arg1 */, key /* arg2 */, value /* obj */, 0 /* delay */); - } - - private void onUpdateRemoteControlClientMetadata(int genId, int key, Rating value) { - if(DEBUG_RC) Log.d(TAG, "onUpdateRemoteControlClientMetadata(genId=" + genId + - ", what=" + key + ",rating=" + value + ")"); - synchronized(mPRStack) { - synchronized(mCurrentRcLock) { - if ((mCurrentRcClient != null) && (mCurrentRcClientGen == genId)) { - try { - switch (key) { - case MediaMetadataEditor.RATING_KEY_BY_USER: - mCurrentRcClient.updateMetadata(genId, key, value); - break; - default: - Log.e(TAG, "unhandled metadata key " + key + " update for RCC " - + genId); - break; - } - } catch (RemoteException e) { - Log.e(TAG, "Current valid remote client is dead", e); - mCurrentRcClient = null; - } - } - } - } - } - - protected void setPlaybackInfoForRcc(int rccId, int what, int value) { - sendMsg(mEventHandler, MSG_RCC_NEW_PLAYBACK_INFO, SENDMSG_QUEUE, - rccId /* arg1 */, what /* arg2 */, Integer.valueOf(value) /* obj */, 0 /* delay */); - } - - // handler for MSG_RCC_NEW_PLAYBACK_INFO - private void onNewPlaybackInfoForRcc(int rccId, int key, int value) { - if(DEBUG_RC) Log.d(TAG, "onNewPlaybackInfoForRcc(id=" + rccId + - ", what=" + key + ",val=" + value + ")"); - synchronized(mPRStack) { - // iterating from top of stack as playback information changes are more likely - // on entries at the top of the remote control stack - try { - for (int index = mPRStack.size()-1; index >= 0; index--) { - final PlayerRecord prse = mPRStack.elementAt(index); - if (prse.getRccId() == rccId) { - switch (key) { - case RemoteControlClient.PLAYBACKINFO_PLAYBACK_TYPE: - prse.mPlaybackType = value; - postReevaluateRemote(); - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME: - prse.mPlaybackVolume = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolume = value; - mVolumeController.postHasNewRemotePlaybackInfo(); - } - } - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME_MAX: - prse.mPlaybackVolumeMax = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolumeMax = value; - mVolumeController.postHasNewRemotePlaybackInfo(); - } - } - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME_HANDLING: - prse.mPlaybackVolumeHandling = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolumeHandling = value; - mVolumeController.postHasNewRemotePlaybackInfo(); - } - } - break; - case RemoteControlClient.PLAYBACKINFO_USES_STREAM: - prse.mPlaybackStream = value; - break; - default: - Log.e(TAG, "unhandled key " + key + " for RCC " + rccId); - break; - } - return; - } - }//for - } catch (ArrayIndexOutOfBoundsException e) { - // not expected to happen, indicates improper concurrent modification - Log.e(TAG, "Wrong index mPRStack on onNewPlaybackInfoForRcc, lock error? ", e); - } - } - } - - protected void setPlaybackStateForRcc(int rccId, int state, long timeMs, float speed) { - sendMsg(mEventHandler, MSG_RCC_NEW_PLAYBACK_STATE, SENDMSG_QUEUE, - rccId /* arg1 */, state /* arg2 */, - new PlayerRecord.RccPlaybackState(state, timeMs, speed) /* obj */, 0 /* delay */); - } - - private void onNewPlaybackStateForRcc(int rccId, int state, - PlayerRecord.RccPlaybackState newState) { - if(DEBUG_RC) Log.d(TAG, "onNewPlaybackStateForRcc(id=" + rccId + ", state=" + state - + ", time=" + newState.mPositionMs + ", speed=" + newState.mSpeed + ")"); - synchronized(mPRStack) { - if (mPRStack.empty()) { - return; - } - PlayerRecord oldTopPrse = mPRStack.lastElement(); // top of the stack before any changes - PlayerRecord prse = null; - int lastPlayingIndex = mPRStack.size(); - int inStackIndex = -1; - try { - // go through the stack from the top to figure out who's playing, and the position - // of this RemoteControlClient (note that it may not be in the stack) - for (int index = mPRStack.size()-1; index >= 0; index--) { - prse = mPRStack.elementAt(index); - if (prse.getRccId() == rccId) { - inStackIndex = index; - prse.mPlaybackState = newState; - } - if (prse.isPlaybackActive()) { - lastPlayingIndex = index; - } - } - - if (inStackIndex != -1) { - // is in the stack - prse = mPRStack.elementAt(inStackIndex); - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemoteIsActive = isPlaystateActive(state); - postReevaluateRemote(); - } - } - if (mPRStack.size() > 1) { // no need to remove and add if stack contains only 1 - // remove it from its old location in the stack - mPRStack.removeElementAt(inStackIndex); - if (prse.isPlaybackActive()) { - // and put it at the top - mPRStack.push(prse); - } else { - // and put it after the ones with active playback - if (inStackIndex > lastPlayingIndex) { - mPRStack.add(lastPlayingIndex, prse); - } else { - mPRStack.add(lastPlayingIndex - 1, prse); - } - } - } - - if (oldTopPrse != mPRStack.lastElement()) { - // the top of the stack changed: - final ComponentName target = - mPRStack.lastElement().getMediaButtonReceiver(); - if (target != null) { - // post message to persist the default media button receiver - mEventHandler.sendMessage( mEventHandler.obtainMessage( - MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, target/*obj*/) ); - } - // reevaluate the display - checkUpdateRemoteControlDisplay_syncPrs(RC_INFO_ALL); - } - } - } catch (ArrayIndexOutOfBoundsException e) { - // not expected to happen, indicates improper concurrent modification or bad index - Log.e(TAG, "Wrong index (inStack=" + inStackIndex + " lastPlaying=" + lastPlayingIndex - + " size=" + mPRStack.size() - + "accessing PlayerRecord stack in onNewPlaybackStateForRcc", e); - } - } - } - - protected void registerRemoteVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { - sendMsg(mEventHandler, MSG_RCC_NEW_VOLUME_OBS, SENDMSG_QUEUE, - rccId /* arg1 */, 0, rvo /* obj */, 0 /* delay */); - } - // handler for MSG_RCC_NEW_VOLUME_OBS private void onRegisterVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { synchronized(mPRStack) { diff --git a/media/java/android/media/RemoteController.java b/media/java/android/media/RemoteController.java index 76c72999e24f..be9639814346 100644 --- a/media/java/android/media/RemoteController.java +++ b/media/java/android/media/RemoteController.java @@ -361,18 +361,10 @@ public final class RemoteController if (timeMs < 0) { throw new IllegalArgumentException("illegal negative time value"); } - if (USE_SESSIONS) { - synchronized (mInfoLock) { - if (mCurrentSession != null) { - mCurrentSession.getTransportControls().seekTo(timeMs); - } - } - } else { - final int genId; - synchronized (mGenLock) { - genId = mClientGenerationIdCurrent; + synchronized (mInfoLock) { + if (mCurrentSession != null) { + mCurrentSession.getTransportControls().seekTo(timeMs); } - mAudioManager.setRemoteControlClientPlaybackPosition(genId, timeMs); } return true; } @@ -534,34 +526,15 @@ public final class RemoteController if (!mMetadataChanged) { return; } - if (USE_SESSIONS) { - synchronized (mInfoLock) { - if (mCurrentSession != null) { - if (mEditorMetadata.containsKey( - String.valueOf(MediaMetadataEditor.RATING_KEY_BY_USER))) { - Rating rating = (Rating) getObject( - MediaMetadataEditor.RATING_KEY_BY_USER, null); - if (rating != null) { - mCurrentSession.getTransportControls().setRating(rating); - } - } - } - } - } else { - final int genId; - synchronized(mGenLock) { - genId = mClientGenerationIdCurrent; - } - synchronized(mInfoLock) { + synchronized (mInfoLock) { + if (mCurrentSession != null) { if (mEditorMetadata.containsKey( String.valueOf(MediaMetadataEditor.RATING_KEY_BY_USER))) { Rating rating = (Rating) getObject( MediaMetadataEditor.RATING_KEY_BY_USER, null); - mAudioManager.updateRemoteControlClientMetadata(genId, - MediaMetadataEditor.RATING_KEY_BY_USER, - rating); - } else { - Log.e(TAG, "no metadata to apply"); + if (rating != null) { + mCurrentSession.getTransportControls().setRating(rating); + } } } } diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index 1cfc5bc3f14a..5bc0de4212ef 100644 --- a/media/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl @@ -15,6 +15,7 @@ package android.media.session; +import android.content.ComponentName; import android.media.MediaMetadata; import android.media.session.ISessionController; import android.media.session.RouteOptions; @@ -33,6 +34,7 @@ interface ISession { ISessionController getController(); void setFlags(int flags); void setActive(boolean active); + void setMediaButtonReceiver(in ComponentName mbr); void destroy(); // These commands are for setting up and communicating with routes diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 4ba1351749a6..4ba2b6840992 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -19,6 +19,7 @@ package android.media.session; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Intent; import android.media.AudioManager; import android.media.MediaMetadata; @@ -232,6 +233,21 @@ public final class MediaSession { } /** + * Set a media button event receiver component to use to restart playback + * after an app has been stopped. + * + * @param mbr The receiver component to send the media button event to. + * @hide + */ + public void setMediaButtonReceiver(ComponentName mbr) { + try { + mBinder.setMediaButtonReceiver(mbr); + } catch (RemoteException e) { + Log.wtf(TAG, "Failure in setMediaButtonReceiver.", e); + } + } + + /** * Set any flags for the session. * * @param flags The flags to set for this session. diff --git a/media/java/android/media/session/MediaSessionLegacyHelper.java b/media/java/android/media/session/MediaSessionLegacyHelper.java index 801844fd9b01..838b8572f020 100644 --- a/media/java/android/media/session/MediaSessionLegacyHelper.java +++ b/media/java/android/media/session/MediaSessionLegacyHelper.java @@ -18,6 +18,7 @@ package android.media.session; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.media.MediaMetadata; @@ -214,7 +215,7 @@ public class MediaSessionLegacyHelper { } } - public void addMediaButtonListener(PendingIntent pi, + public void addMediaButtonListener(PendingIntent pi, ComponentName mbrComponent, Context context) { if (pi == null) { Log.w(TAG, "Pending intent was null, can't addMediaButtonListener."); @@ -238,6 +239,7 @@ public class MediaSessionLegacyHelper { holder.mMediaButtonReceiver = new MediaButtonReceiver(pi, context); holder.mSession.addCallback(holder.mMediaButtonReceiver, mHandler); + holder.mSession.setMediaButtonReceiver(mbrComponent); if (DEBUG) { Log.d(TAG, "addMediaButtonListener added " + pi); } diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 9d614939df68..95e7f2f88155 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -17,6 +17,7 @@ package com.android.server.media; import android.app.ActivityManager; +import android.content.ComponentName; import android.content.Intent; import android.content.pm.PackageManager; import android.media.routeprovider.RouteRequest; @@ -107,6 +108,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { // TODO define a RouteState class with relevant info private int mRouteState; private long mFlags; + private ComponentName mMediaButtonReceiver; // TransportPerformer fields @@ -187,6 +189,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return mSessionInfo; } + public ComponentName getMediaButtonReceiver() { + return mMediaButtonReceiver; + } + /** * Get this session's flags. * @@ -683,6 +689,11 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override + public void setMediaButtonReceiver(ComponentName mbr) { + mMediaButtonReceiver = mbr; + } + + @Override public void setMetadata(MediaMetadata metadata) { mMetadata = metadata; mHandler.post(MessageHandler.MSG_UPDATE_METADATA); diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 67065ba33a86..ecdbb5e08fd7 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -23,6 +23,7 @@ import android.app.KeyguardManager; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -88,6 +89,7 @@ public class MediaSessionService extends SystemService implements Monitor { private KeyguardManager mKeyguardManager; private IAudioService mAudioService; + private ContentResolver mContentResolver; private MediaSessionRecord mPrioritySession; private int mCurrentUserId = -1; @@ -115,6 +117,7 @@ public class MediaSessionService extends SystemService implements Monitor { mKeyguardManager = (KeyguardManager) getContext().getSystemService(Context.KEYGUARD_SERVICE); mAudioService = getAudioService(); + mContentResolver = getContext().getContentResolver(); } private IAudioService getAudioService() { @@ -381,8 +384,7 @@ public class MediaSessionService extends SystemService implements Monitor { return false; } if (compName != null) { - final String enabledNotifListeners = Settings.Secure.getStringForUser( - getContext().getContentResolver(), + final String enabledNotifListeners = Settings.Secure.getStringForUser(mContentResolver, Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, userId); if (enabledNotifListeners != null) { @@ -485,6 +487,9 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { List<MediaSessionRecord> records = mPriorityStack.getActiveSessions(userId); int size = records.size(); + if (size > 0) { + persistMediaButtonReceiverLocked(records.get(0)); + } ArrayList<MediaSessionToken> tokens = new ArrayList<MediaSessionToken>(); for (int i = 0; i < size; i++) { tokens.add(new MediaSessionToken(records.get(i).getControllerBinder())); @@ -504,6 +509,16 @@ public class MediaSessionService extends SystemService implements Monitor { } } + private void persistMediaButtonReceiverLocked(MediaSessionRecord record) { + ComponentName receiver = record.getMediaButtonReceiver(); + if (receiver != null) { + Settings.System.putStringForUser(mContentResolver, + Settings.System.MEDIA_BUTTON_RECEIVER, + receiver == null ? "" : receiver.flattenToString(), + UserHandle.USER_CURRENT); + } + } + private MediaRouteProviderProxy.RoutesListener mRoutesCallback = new MediaRouteProviderProxy.RoutesListener() { @Override |