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

Commit 1c4708d6 authored by Ajay Panicker's avatar Ajay Panicker Committed by android-build-merger
Browse files

Merge "Prevent floating mMediaBrowser reference" am: f2e7cb40

am: 8ea5072f

Change-Id: I22998cf2e161957dbada10d5604878fad7f2888f
parents b37e0e6e 8ea5072f
Loading
Loading
Loading
Loading
+62 −23
Original line number Original line Diff line number Diff line
@@ -53,6 +53,7 @@ class BrowsedMediaPlayer {


    /*  package and service name of target Media Player which is set for browsing */
    /*  package and service name of target Media Player which is set for browsing */
    private String mPackageName;
    private String mPackageName;
    private String mConnectingPackageName;
    private String mClassName;
    private String mClassName;
    private Context mContext;
    private Context mContext;
    private AvrcpMediaRspInterface mMediaInterface;
    private AvrcpMediaRspInterface mMediaInterface;
@@ -83,20 +84,34 @@ class BrowsedMediaPlayer {
    private List<MediaBrowser.MediaItem> mFolderItems = null;
    private List<MediaBrowser.MediaItem> mFolderItems = null;


    /* Connection state callback handler */
    /* Connection state callback handler */
    private MediaBrowser.ConnectionCallback browseMediaConnectionCallback =
    class MediaConnectionCallback extends MediaBrowser.ConnectionCallback {
            new MediaBrowser.ConnectionCallback() {
        private String mCallbackPackageName;
        private MediaBrowser mBrowser;

        public MediaConnectionCallback(String packageName) {
            this.mCallbackPackageName = packageName;
        }

        public void setBrowser(MediaBrowser b) {
            mBrowser = b;
        }


        @Override
        @Override
        public void onConnected() {
        public void onConnected() {
            mConnState = CONNECTED;
            mConnState = CONNECTED;
            if (DEBUG) Log.d(TAG, "mediaBrowser CONNECTED to " + mPackageName);
            if (DEBUG) Log.d(TAG, "mediaBrowser CONNECTED to " + mPackageName);
            /* perform init tasks and set player as browsed player on successful connection */
            /* perform init tasks and set player as browsed player on successful connection */
            onBrowseConnect();
            onBrowseConnect(mCallbackPackageName, mBrowser);

            // Remove what could be a circular dependency causing GC to never happen on this object
            mBrowser = null;
        }
        }


        @Override
        @Override
        public void onConnectionFailed() {
        public void onConnectionFailed() {
            mConnState = DISCONNECTED;
            mConnState = DISCONNECTED;
            // Remove what could be a circular dependency causing GC to never happen on this object
            mBrowser = null;
            Log.e(TAG, "mediaBrowser Connection failed with " + mPackageName
            Log.e(TAG, "mediaBrowser Connection failed with " + mPackageName
                    + ", Sending fail response!");
                    + ", Sending fail response!");
            mMediaInterface.setBrowsedPlayerRsp(mBDAddr, AvrcpConstants.RSP_INTERNAL_ERR,
            mMediaInterface.setBrowsedPlayerRsp(mBDAddr, AvrcpConstants.RSP_INTERNAL_ERR,
@@ -105,10 +120,11 @@ class BrowsedMediaPlayer {


        @Override
        @Override
        public void onConnectionSuspended() {
        public void onConnectionSuspended() {
            mBrowser = null;
            mConnState = SUSPENDED;
            mConnState = SUSPENDED;
            Log.e(TAG, "mediaBrowser SUSPENDED connection with " + mPackageName);
            Log.e(TAG, "mediaBrowser SUSPENDED connection with " + mPackageName);
        }
        }
    };
    }


    /* Subscription callback handler. Subscribe to a folder to get its contents */
    /* Subscription callback handler. Subscribe to a folder to get its contents */
    private MediaBrowser.SubscriptionCallback folderItemsCb =
    private MediaBrowser.SubscriptionCallback folderItemsCb =
@@ -251,10 +267,34 @@ class BrowsedMediaPlayer {
    }
    }


    /* initialize mediacontroller in order to communicate with media player. */
    /* initialize mediacontroller in order to communicate with media player. */
    private void onBrowseConnect() {
    private void onBrowseConnect(String connectedPackage, MediaBrowser browser) {
        boolean isError = false;
        if (!connectedPackage.equals(mConnectingPackageName)) {
            Log.w(TAG,
                    "onBrowseConnect: recieved callback for package we aren't connecting to "
                            + connectedPackage);
            return;
        }
        mConnectingPackageName = null;

        if (browser == null) {
            Log.e(TAG, "onBrowseConnect: received a null browser for " + connectedPackage);
            mMediaInterface.setBrowsedPlayerRsp(
                    mBDAddr, AvrcpConstants.RSP_INTERNAL_ERR, (byte) 0x00, 0, null);
            return;
        }

        MediaSession.Token token = null;
        MediaSession.Token token = null;
        try {
        try {
            if (!browser.isConnected()) {
                Log.e(TAG, "setBrowsedPlayer: " + mPackageName + "not connected");
            } else if ((token = browser.getSessionToken()) == null) {
                Log.e(TAG, "setBrowsedPlayer: " + mPackageName + "no Session token");
            } else {
                /* update to the new MediaBrowser */
                if (mMediaBrowser != null) mMediaBrowser.disconnect();
                mMediaBrowser = browser;
                mPackageName = connectedPackage;

                /* get rootfolder uid from media player */
                /* get rootfolder uid from media player */
                if (mMediaId == null) {
                if (mMediaId == null) {
                    mMediaId = mMediaBrowser.getRoot();
                    mMediaId = mMediaBrowser.getRoot();
@@ -266,11 +306,6 @@ class BrowsedMediaPlayer {
                    mPathStack.push(mMediaId);
                    mPathStack.push(mMediaId);
                }
                }


            if (!mMediaBrowser.isConnected()) {
                Log.e(TAG, "setBrowsedPlayer: " + mPackageName + "not connected");
            } else if ((token = mMediaBrowser.getSessionToken()) == null) {
                Log.e(TAG, "setBrowsedPlayer: " + mPackageName + "no Session token");
            } else {
                mMediaController = MediaController.wrap(
                mMediaController = MediaController.wrap(
                    new android.media.session.MediaController(mContext, token));
                    new android.media.session.MediaController(mContext, token));
                /* get root folder items */
                /* get root folder items */
@@ -287,7 +322,7 @@ class BrowsedMediaPlayer {
    }
    }


    public void setBrowsed(String packageName, String cls) {
    public void setBrowsed(String packageName, String cls) {
        mPackageName = packageName;
        mConnectingPackageName = packageName;
        mClassName = cls;
        mClassName = cls;
        /* cleanup variables from previous browsed calls */
        /* cleanup variables from previous browsed calls */
        mFolderItems = null;
        mFolderItems = null;
@@ -298,10 +333,14 @@ class BrowsedMediaPlayer {
         * will be required while navigating up the folder
         * will be required while navigating up the folder
         */
         */
        mPathStack = new Stack<String>();
        mPathStack = new Stack<String>();

        /* Bind to MediaBrowseService of MediaPlayer */
        /* Bind to MediaBrowseService of MediaPlayer */
        mMediaBrowser = new MediaBrowser(mContext, new ComponentName(mPackageName, mClassName),
        MediaConnectionCallback callback = new MediaConnectionCallback(packageName);
                browseMediaConnectionCallback, null);
        MediaBrowser tempBrowser = new MediaBrowser(
        mMediaBrowser.connect();
                mContext, new ComponentName(packageName, mClassName), callback, null);
        callback.setBrowser(tempBrowser);

        tempBrowser.connect();
    }
    }


    /* called when connection to media player is closed */
    /* called when connection to media player is closed */