Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31ec08d1 authored by Ayan Ghosh's avatar Ayan Ghosh Committed by Gerrit - the friendly Code Review server
Browse files

Move media player list management to Audioservice

Move media player list management to Audioservice so that
list is retained even after BT restart.

Change-Id: Ia2455e6def1900b4af2225c50e1b5325a7ce1a98
parent e174a94c
Loading
Loading
Loading
Loading
+14 −81
Original line number Diff line number Diff line
@@ -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
@@ -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()
@@ -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}
@@ -2466,7 +2445,6 @@ public class AudioManager {
     */
    @Deprecated
    public void registerMediaButtonEventReceiver(ComponentName eventReceiver) {
        boolean playerToAdd = true;
        if (eventReceiver == null) {
            return;
        }
@@ -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);
@@ -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
@@ -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;
    }
+79 −0
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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++) {
+4 −0
Original line number Diff line number Diff line
@@ -213,4 +213,8 @@ interface IAudioService {
    void getRemoteControlClientNowPlayingEntries();

    void setRemoteControlClientPlayItem(long uid, int scope);

    void updateRemoteControllerOnExistingMediaPlayers();

    void addMediaPlayerAndUpdateRemoteController(String packageName);
}