Loading media/java/android/media/AudioManager.java +14 −81 Original line number Diff line number Diff line Loading @@ -67,7 +67,6 @@ public class AudioManager { private final Binder mToken = new Binder(); private static String TAG = "AudioManager"; AudioPortEventHandler mAudioPortEventHandler; private static ArrayList<MediaPlayerInfo> mMediaPlayers; /** * Broadcast intent, a hint for applications that audio is about to become * 'noisy' due to a change in audio outputs. For example, this intent may Loading Loading @@ -619,8 +618,6 @@ public class AudioManager { mAudioPortEventHandler = new AudioPortEventHandler(this); mUseFixedVolume = mContext.getResources().getBoolean( com.android.internal.R.bool.config_useFixedVolume); mMediaPlayers = new ArrayList<MediaPlayerInfo>(1); } private static IAudioService getService() Loading Loading @@ -2438,24 +2435,6 @@ public class AudioManager { //==================================================================== // Remote Control private class MediaPlayerInfo { private String mPackageName; private boolean mIsfocussed; public MediaPlayerInfo(String packageName, boolean isfocussed) { mPackageName = packageName; mIsfocussed = isfocussed; } public boolean isFocussed() { return mIsfocussed; } public void setFocus(boolean focus) { mIsfocussed = focus; } public String getPackageName() { return mPackageName; } } /** * Register a component to be the sole receiver of MEDIA_BUTTON intents. * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} Loading @@ -2466,7 +2445,6 @@ public class AudioManager { */ @Deprecated public void registerMediaButtonEventReceiver(ComponentName eventReceiver) { boolean playerToAdd = true; if (eventReceiver == null) { return; } Loading @@ -2475,42 +2453,15 @@ public class AudioManager { "receiver and context package names don't match"); return; } if (mMediaPlayers.size() > 0) { final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); if (eventReceiver.getPackageName().equals(player.getPackageName())) { Log.e(TAG, "Player entry present, no need to add"); playerToAdd = false; player.setFocus(true); } else { Log.e(TAG, "Player: " + player.getPackageName()+ "Lost Focus"); player.setFocus(false); } } } if (playerToAdd) { Log.e(TAG, "Adding Player: " + eventReceiver.getPackageName() + " to available player list"); mMediaPlayers.add(new MediaPlayerInfo(eventReceiver.getPackageName(), true)); } IAudioService service = getService(); Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, eventReceiver.getPackageName()); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, true); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); final long identity = Binder.clearCallingIdentity(); try { mContext.sendBroadcast(intent); } catch (Exception e) { Log.e(TAG, "Error while updating focussed RCC change",e); } finally { Binder.restoreCallingIdentity(identity); service.addMediaPlayerAndUpdateRemoteController( eventReceiver.getPackageName()); } catch (RemoteException e) { Log.e(TAG, "Error in calling Audioservice interface " + "addMediaPlayerAndUpdateRemoteController()" + e); } Log.v(TAG, "updating focussed RCC change to RCD: CallingPackageName:" + eventReceiver.getPackageName()); // construct a PendingIntent for the media button and register it Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.addFlags(mediaButtonIntent.FLAG_RECEIVER_FOREGROUND); Loading @@ -2521,6 +2472,7 @@ public class AudioManager { registerMediaButtonIntent(pi, eventReceiver); } /** * Register a component to be the sole receiver of MEDIA_BUTTON intents. This is like * {@link #registerMediaButtonEventReceiver(android.content.ComponentName)}, but allows Loading Loading @@ -2646,35 +2598,16 @@ public class AudioManager { */ @Deprecated public boolean registerRemoteController(RemoteController rctlr) { Log.v(TAG, "registerRemoteController: size of Media player list: " + mMediaPlayers.size()); if (rctlr == null) { return false; } rctlr.startListeningToSessions(); if (mMediaPlayers.size() > 0) { Log.v(TAG, "Inform RemoteController regarding existing RCC entry"); final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); IAudioService service = getService(); Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, player.getPackageName()); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, player.isFocussed()); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); final long identity = Binder.clearCallingIdentity(); try { mContext.sendBroadcast(intent); } catch (Exception e) { Log.e(TAG, "Error while updating RCC change", e); } finally { Binder.restoreCallingIdentity(identity); } Log.v(TAG, "updating RCC change: CallingPackageName:" + player.getPackageName()); } } else { Log.e(TAG, "No RCC entry present to update"); try { service.updateRemoteControllerOnExistingMediaPlayers(); } catch (RemoteException e) { Log.e(TAG, "Error in calling Audio service interface" + "updateRemoteControllerOnExistingMediaPlayers() due to " + e); } return true; } Loading media/java/android/media/AudioService.java +79 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,27 @@ public class AudioService extends IAudioService.Stub { // the platform type affects volume and silent mode behavior private final int mPlatformType; private static final ArrayList<MediaPlayerInfo> mMediaPlayers = new ArrayList<MediaPlayerInfo>(); private class MediaPlayerInfo { private String mPackageName; private boolean mIsfocussed; public MediaPlayerInfo(String packageName, boolean isfocussed) { mPackageName = packageName; mIsfocussed = isfocussed; } public boolean isFocussed() { return mIsfocussed; } public void setFocus(boolean focus) { mIsfocussed = focus; } public String getPackageName() { return mPackageName; } } private boolean isPlatformVoice() { return mPlatformType == PLATFORM_VOICE; } Loading Loading @@ -716,6 +737,64 @@ public class AudioService extends IAudioService.Stub { } } /** * @hide */ public void addMediaPlayerAndUpdateRemoteController (String packageName) { boolean playerToAdd = true; if (mMediaPlayers.size() > 0) { final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); if (packageName.equals(player.getPackageName())) { Log.e(TAG, "Player entry present, no need to add"); playerToAdd = false; player.setFocus(true); } else { Log.e(TAG, "Player: " + player.getPackageName()+ "Lost Focus"); player.setFocus(false); } } } if (playerToAdd) { Log.e(TAG, "Adding Player: " + packageName + " to available player list"); mMediaPlayers.add(new MediaPlayerInfo(packageName, true)); } Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, packageName); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, true); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); sendBroadcastToAll(intent); Log.v(TAG, "updating focussed RCC change to RCD: CallingPackageName:" + packageName); } /** * @hide */ public void updateRemoteControllerOnExistingMediaPlayers() { Log.v(TAG, "updateRemoteControllerOnExistingMediaPlayers: size of Player list: " + mMediaPlayers.size()); if (mMediaPlayers.size() > 0) { Log.v(TAG, "Inform RemoteController regarding existing RCC entry"); final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, player.getPackageName()); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, player.isFocussed()); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); sendBroadcastToAll(intent); Log.v(TAG, "updating RCC change: CallingPackageName:" + player.getPackageName()); } } else { Log.e(TAG, "No RCC entry present to update"); } } private void checkAllAliasStreamVolumes() { int numStreamTypes = AudioSystem.getNumStreamTypes(); for (int streamType = 0; streamType < numStreamTypes; streamType++) { Loading media/java/android/media/IAudioService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -213,4 +213,8 @@ interface IAudioService { void getRemoteControlClientNowPlayingEntries(); void setRemoteControlClientPlayItem(long uid, int scope); void updateRemoteControllerOnExistingMediaPlayers(); void addMediaPlayerAndUpdateRemoteController(String packageName); } Loading
media/java/android/media/AudioManager.java +14 −81 Original line number Diff line number Diff line Loading @@ -67,7 +67,6 @@ public class AudioManager { private final Binder mToken = new Binder(); private static String TAG = "AudioManager"; AudioPortEventHandler mAudioPortEventHandler; private static ArrayList<MediaPlayerInfo> mMediaPlayers; /** * Broadcast intent, a hint for applications that audio is about to become * 'noisy' due to a change in audio outputs. For example, this intent may Loading Loading @@ -619,8 +618,6 @@ public class AudioManager { mAudioPortEventHandler = new AudioPortEventHandler(this); mUseFixedVolume = mContext.getResources().getBoolean( com.android.internal.R.bool.config_useFixedVolume); mMediaPlayers = new ArrayList<MediaPlayerInfo>(1); } private static IAudioService getService() Loading Loading @@ -2438,24 +2435,6 @@ public class AudioManager { //==================================================================== // Remote Control private class MediaPlayerInfo { private String mPackageName; private boolean mIsfocussed; public MediaPlayerInfo(String packageName, boolean isfocussed) { mPackageName = packageName; mIsfocussed = isfocussed; } public boolean isFocussed() { return mIsfocussed; } public void setFocus(boolean focus) { mIsfocussed = focus; } public String getPackageName() { return mPackageName; } } /** * Register a component to be the sole receiver of MEDIA_BUTTON intents. * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} Loading @@ -2466,7 +2445,6 @@ public class AudioManager { */ @Deprecated public void registerMediaButtonEventReceiver(ComponentName eventReceiver) { boolean playerToAdd = true; if (eventReceiver == null) { return; } Loading @@ -2475,42 +2453,15 @@ public class AudioManager { "receiver and context package names don't match"); return; } if (mMediaPlayers.size() > 0) { final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); if (eventReceiver.getPackageName().equals(player.getPackageName())) { Log.e(TAG, "Player entry present, no need to add"); playerToAdd = false; player.setFocus(true); } else { Log.e(TAG, "Player: " + player.getPackageName()+ "Lost Focus"); player.setFocus(false); } } } if (playerToAdd) { Log.e(TAG, "Adding Player: " + eventReceiver.getPackageName() + " to available player list"); mMediaPlayers.add(new MediaPlayerInfo(eventReceiver.getPackageName(), true)); } IAudioService service = getService(); Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, eventReceiver.getPackageName()); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, true); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); final long identity = Binder.clearCallingIdentity(); try { mContext.sendBroadcast(intent); } catch (Exception e) { Log.e(TAG, "Error while updating focussed RCC change",e); } finally { Binder.restoreCallingIdentity(identity); service.addMediaPlayerAndUpdateRemoteController( eventReceiver.getPackageName()); } catch (RemoteException e) { Log.e(TAG, "Error in calling Audioservice interface " + "addMediaPlayerAndUpdateRemoteController()" + e); } Log.v(TAG, "updating focussed RCC change to RCD: CallingPackageName:" + eventReceiver.getPackageName()); // construct a PendingIntent for the media button and register it Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.addFlags(mediaButtonIntent.FLAG_RECEIVER_FOREGROUND); Loading @@ -2521,6 +2472,7 @@ public class AudioManager { registerMediaButtonIntent(pi, eventReceiver); } /** * Register a component to be the sole receiver of MEDIA_BUTTON intents. This is like * {@link #registerMediaButtonEventReceiver(android.content.ComponentName)}, but allows Loading Loading @@ -2646,35 +2598,16 @@ public class AudioManager { */ @Deprecated public boolean registerRemoteController(RemoteController rctlr) { Log.v(TAG, "registerRemoteController: size of Media player list: " + mMediaPlayers.size()); if (rctlr == null) { return false; } rctlr.startListeningToSessions(); if (mMediaPlayers.size() > 0) { Log.v(TAG, "Inform RemoteController regarding existing RCC entry"); final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); IAudioService service = getService(); Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, player.getPackageName()); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, player.isFocussed()); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); final long identity = Binder.clearCallingIdentity(); try { mContext.sendBroadcast(intent); } catch (Exception e) { Log.e(TAG, "Error while updating RCC change", e); } finally { Binder.restoreCallingIdentity(identity); } Log.v(TAG, "updating RCC change: CallingPackageName:" + player.getPackageName()); } } else { Log.e(TAG, "No RCC entry present to update"); try { service.updateRemoteControllerOnExistingMediaPlayers(); } catch (RemoteException e) { Log.e(TAG, "Error in calling Audio service interface" + "updateRemoteControllerOnExistingMediaPlayers() due to " + e); } return true; } Loading
media/java/android/media/AudioService.java +79 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,27 @@ public class AudioService extends IAudioService.Stub { // the platform type affects volume and silent mode behavior private final int mPlatformType; private static final ArrayList<MediaPlayerInfo> mMediaPlayers = new ArrayList<MediaPlayerInfo>(); private class MediaPlayerInfo { private String mPackageName; private boolean mIsfocussed; public MediaPlayerInfo(String packageName, boolean isfocussed) { mPackageName = packageName; mIsfocussed = isfocussed; } public boolean isFocussed() { return mIsfocussed; } public void setFocus(boolean focus) { mIsfocussed = focus; } public String getPackageName() { return mPackageName; } } private boolean isPlatformVoice() { return mPlatformType == PLATFORM_VOICE; } Loading Loading @@ -716,6 +737,64 @@ public class AudioService extends IAudioService.Stub { } } /** * @hide */ public void addMediaPlayerAndUpdateRemoteController (String packageName) { boolean playerToAdd = true; if (mMediaPlayers.size() > 0) { final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); if (packageName.equals(player.getPackageName())) { Log.e(TAG, "Player entry present, no need to add"); playerToAdd = false; player.setFocus(true); } else { Log.e(TAG, "Player: " + player.getPackageName()+ "Lost Focus"); player.setFocus(false); } } } if (playerToAdd) { Log.e(TAG, "Adding Player: " + packageName + " to available player list"); mMediaPlayers.add(new MediaPlayerInfo(packageName, true)); } Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, packageName); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, true); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); sendBroadcastToAll(intent); Log.v(TAG, "updating focussed RCC change to RCD: CallingPackageName:" + packageName); } /** * @hide */ public void updateRemoteControllerOnExistingMediaPlayers() { Log.v(TAG, "updateRemoteControllerOnExistingMediaPlayers: size of Player list: " + mMediaPlayers.size()); if (mMediaPlayers.size() > 0) { Log.v(TAG, "Inform RemoteController regarding existing RCC entry"); final Iterator<MediaPlayerInfo> rccIterator = mMediaPlayers.iterator(); while (rccIterator.hasNext()) { final MediaPlayerInfo player = rccIterator.next(); Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, player.getPackageName()); intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, player.isFocussed()); intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); sendBroadcastToAll(intent); Log.v(TAG, "updating RCC change: CallingPackageName:" + player.getPackageName()); } } else { Log.e(TAG, "No RCC entry present to update"); } } private void checkAllAliasStreamVolumes() { int numStreamTypes = AudioSystem.getNumStreamTypes(); for (int streamType = 0; streamType < numStreamTypes; streamType++) { Loading
media/java/android/media/IAudioService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -213,4 +213,8 @@ interface IAudioService { void getRemoteControlClientNowPlayingEntries(); void setRemoteControlClientPlayItem(long uid, int scope); void updateRemoteControllerOnExistingMediaPlayers(); void addMediaPlayerAndUpdateRemoteController(String packageName); }