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

Commit e2d4f060 authored by Sal Savage's avatar Sal Savage Committed by Automerger Merge Worker
Browse files

Merge changes from topic "avrcp-ct-cover-art-pts" into rvc-dev am: 222f0a56

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Bluetooth/+/11922317

Change-Id: Iff3aee8c9d8663a6654402b27b84525e8412cfe0
parents 75858425 222f0a56
Loading
Loading
Loading
Loading
+54 −1
Original line number Original line Diff line number Diff line
@@ -296,6 +296,8 @@ class AvrcpControllerStateMachine extends StateMachine {
    synchronized void onBrowsingDisconnected() {
    synchronized void onBrowsingDisconnected() {
        if (!mBrowsingConnected) return;
        if (!mBrowsingConnected) return;
        mAddressedPlayer.setPlayStatus(PlaybackStateCompat.STATE_ERROR);
        mAddressedPlayer.setPlayStatus(PlaybackStateCompat.STATE_ERROR);
        AvrcpItem previousTrack = mAddressedPlayer.getCurrentTrack();
        String previousTrackUuid = previousTrack != null ? previousTrack.getCoverArtUuid() : null;
        mAddressedPlayer.updateCurrentTrack(null);
        mAddressedPlayer.updateCurrentTrack(null);
        mBrowseTree.mNowPlayingNode.setCached(false);
        mBrowseTree.mNowPlayingNode.setCached(false);
        if (isActive()) {
        if (isActive()) {
@@ -305,6 +307,8 @@ class AvrcpControllerStateMachine extends StateMachine {
                mBrowseTree.mRootNode);
                mBrowseTree.mRootNode);
        BluetoothMediaBrowserService.notifyChanged(mService
        BluetoothMediaBrowserService.notifyChanged(mService
                .sBrowseTree.mRootNode);
                .sBrowseTree.mRootNode);
        removeUnusedArtwork(previousTrackUuid);
        removeUnusedArtworkFromBrowseTree();
        mBrowsingConnected = false;
        mBrowsingConnected = false;
    }
    }


@@ -333,6 +337,40 @@ class AvrcpControllerStateMachine extends StateMachine {
        }
        }
    }
    }


    /**
     * Remove an unused cover art image from storage if it's unused by the browse tree and the
     * current track.
     */
    synchronized void removeUnusedArtwork(String previousTrackUuid) {
        logD("removeUnusedArtwork(" + previousTrackUuid + ")");
        if (mCoverArtManager == null) return;
        AvrcpItem currentTrack = getCurrentTrack();
        String currentTrackUuid = currentTrack != null ? currentTrack.getCoverArtUuid() : null;
        if (previousTrackUuid != null) {
            if (!previousTrackUuid.equals(currentTrackUuid)
                    && mBrowseTree.getNodesUsingCoverArt(previousTrackUuid).isEmpty()) {
                mCoverArtManager.removeImage(mDevice, previousTrackUuid);
            }
        }
    }

    /**
     * Queries the browse tree for unused uuids and removes the associated images from storage
     * if the uuid is not used by the current track.
     */
    synchronized void removeUnusedArtworkFromBrowseTree() {
        logD("removeUnusedArtworkFromBrowseTree()");
        if (mCoverArtManager == null) return;
        AvrcpItem currentTrack = getCurrentTrack();
        String currentTrackUuid = currentTrack != null ? currentTrack.getCoverArtUuid() : null;
        ArrayList<String> unusedArtwork = mBrowseTree.getAndClearUnusedCoverArt();
        for (String uuid : unusedArtwork) {
            if (!uuid.equals(currentTrackUuid)) {
                mCoverArtManager.removeImage(mDevice, uuid);
            }
        }
    }

    private void notifyChanged(BrowseTree.BrowseNode node) {
    private void notifyChanged(BrowseTree.BrowseNode node) {
        // We should only notify now playing content updates if we're the active device. VFS
        // We should only notify now playing content updates if we're the active device. VFS
        // updates are fine at any time
        // updates are fine at any time
@@ -361,6 +399,7 @@ class AvrcpControllerStateMachine extends StateMachine {


    void nowPlayingContentChanged() {
    void nowPlayingContentChanged() {
        mBrowseTree.mNowPlayingNode.setCached(false);
        mBrowseTree.mNowPlayingNode.setCached(false);
        removeUnusedArtworkFromBrowseTree();
        sendMessage(MESSAGE_GET_FOLDER_ITEMS, mBrowseTree.mNowPlayingNode);
        sendMessage(MESSAGE_GET_FOLDER_ITEMS, mBrowseTree.mNowPlayingNode);
    }
    }


@@ -460,11 +499,16 @@ class AvrcpControllerStateMachine extends StateMachine {


                case MESSAGE_PROCESS_TRACK_CHANGED:
                case MESSAGE_PROCESS_TRACK_CHANGED:
                    AvrcpItem track = (AvrcpItem) msg.obj;
                    AvrcpItem track = (AvrcpItem) msg.obj;
                    AvrcpItem previousTrack = mAddressedPlayer.getCurrentTrack();
                    downloadImageIfNeeded(track);
                    downloadImageIfNeeded(track);
                    mAddressedPlayer.updateCurrentTrack(track);
                    mAddressedPlayer.updateCurrentTrack(track);
                    if (isActive()) {
                    if (isActive()) {
                        BluetoothMediaBrowserService.trackChanged(track);
                        BluetoothMediaBrowserService.trackChanged(track);
                    }
                    }
                    if (previousTrack != null) {
                        removeUnusedArtwork(previousTrack.getCoverArtUuid());
                        removeUnusedArtworkFromBrowseTree();
                    }
                    return true;
                    return true;


                case MESSAGE_PROCESS_PLAY_STATUS_CHANGED:
                case MESSAGE_PROCESS_PLAY_STATUS_CHANGED:
@@ -534,6 +578,7 @@ class AvrcpControllerStateMachine extends StateMachine {
                        mBrowseTree.mRootNode.setExpectedChildren(255);
                        mBrowseTree.mRootNode.setExpectedChildren(255);
                        BluetoothMediaBrowserService.notifyChanged(mBrowseTree.mRootNode);
                        BluetoothMediaBrowserService.notifyChanged(mBrowseTree.mRootNode);
                    }
                    }
                    removeUnusedArtworkFromBrowseTree();
                    return true;
                    return true;


                case MESSAGE_PROCESS_SUPPORTED_APPLICATION_SETTINGS:
                case MESSAGE_PROCESS_SUPPORTED_APPLICATION_SETTINGS:
@@ -578,6 +623,13 @@ class AvrcpControllerStateMachine extends StateMachine {
                    for (BrowseTree.BrowseNode node : nodes) {
                    for (BrowseTree.BrowseNode node : nodes) {
                        notifyChanged(node);
                        notifyChanged(node);
                    }
                    }

                    // Delete images that were downloaded and entirely unused
                    if (!addedArtwork && nodes.isEmpty()) {
                        removeUnusedArtwork(uuid);
                        removeUnusedArtworkFromBrowseTree();
                    }

                    return true;
                    return true;


                case DISCONNECT:
                case DISCONNECT:
@@ -658,6 +710,7 @@ class AvrcpControllerStateMachine extends StateMachine {
            mBrowseTree.mRootNode.setCached(false);
            mBrowseTree.mRootNode.setCached(false);
            mBrowseTree.mRootNode.setExpectedChildren(255);
            mBrowseTree.mRootNode.setExpectedChildren(255);
            BluetoothMediaBrowserService.notifyChanged(mBrowseTree.mRootNode);
            BluetoothMediaBrowserService.notifyChanged(mBrowseTree.mRootNode);
            removeUnusedArtworkFromBrowseTree();
        }
        }
    }
    }


@@ -889,7 +942,7 @@ class AvrcpControllerStateMachine extends StateMachine {
                logD("NAVIGATING UP " + mNextStep.toString());
                logD("NAVIGATING UP " + mNextStep.toString());
                mNextStep = mBrowseTree.getCurrentBrowsedFolder().getParent();
                mNextStep = mBrowseTree.getCurrentBrowsedFolder().getParent();
                mBrowseTree.getCurrentBrowsedFolder().setCached(false);
                mBrowseTree.getCurrentBrowsedFolder().setCached(false);

                removeUnusedArtworkFromBrowseTree();
                mService.changeFolderPathNative(
                mService.changeFolderPathNative(
                        mDeviceAddress,
                        mDeviceAddress,
                        AvrcpControllerService.FOLDER_NAVIGATION_DIRECTION_UP,
                        AvrcpControllerService.FOLDER_NAVIGATION_DIRECTION_UP,
+16 −3
Original line number Original line Diff line number Diff line
@@ -436,9 +436,6 @@ public class BrowseTree {
    synchronized void indicateCoverArtUnused(String nodeId, String handle) {
    synchronized void indicateCoverArtUnused(String nodeId, String handle) {
        if (mCoverArtMap.containsKey(handle) && mCoverArtMap.get(handle).contains(nodeId)) {
        if (mCoverArtMap.containsKey(handle) && mCoverArtMap.get(handle).contains(nodeId)) {
            mCoverArtMap.get(handle).remove(nodeId);
            mCoverArtMap.get(handle).remove(nodeId);
            if (mCoverArtMap.get(handle).isEmpty()) {
                mCoverArtMap.remove(handle);
            }
        }
        }
    }
    }


@@ -450,6 +447,22 @@ public class BrowseTree {
        return (ArrayList<String>) mCoverArtMap.get(handle).clone();
        return (ArrayList<String>) mCoverArtMap.get(handle).clone();
    }
    }


    /**
     * Get a list of Cover Art UUIDs that are no longer being used by the tree. Clear that list.
     */
    synchronized ArrayList<String> getAndClearUnusedCoverArt() {
        ArrayList<String> unused = new ArrayList<String>();
        for (String uuid : mCoverArtMap.keySet()) {
            if (mCoverArtMap.get(uuid).isEmpty()) {
                unused.add(uuid);
            }
        }
        for (String uuid : unused) {
            mCoverArtMap.remove(uuid);
        }
        return unused;
    }

    /**
    /**
     * Adds the Uri of a newly downloaded image to all tree nodes using that specific handle.
     * Adds the Uri of a newly downloaded image to all tree nodes using that specific handle.
     * Returns the set of parent nodes that have children impacted by the new art so clients can
     * Returns the set of parent nodes that have children impacted by the new art so clients can