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

Commit 5f3e1f2a authored by Yao Chen's avatar Yao Chen
Browse files

s/thumbnail/icon in the browsing api.

Change-Id: I73bf76ed9628872094db74aef48a8e68864d6b4d
parent e0b8c378
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -16186,7 +16186,7 @@ package android.media.browse {
    method public android.net.Uri getRoot();
    method public android.net.Uri getRoot();
    method public android.media.session.MediaSession.Token getSessionToken();
    method public android.media.session.MediaSession.Token getSessionToken();
    method public boolean isConnected();
    method public boolean isConnected();
    method public void loadThumbnail(android.net.Uri, int, int, android.media.browse.MediaBrowser.ThumbnailCallback);
    method public void loadIcon(android.net.Uri, int, int, android.media.browse.MediaBrowser.IconCallback);
    method public void subscribe(android.net.Uri, android.media.browse.MediaBrowser.SubscriptionCallback);
    method public void subscribe(android.net.Uri, android.media.browse.MediaBrowser.SubscriptionCallback);
    method public void unsubscribe(android.net.Uri);
    method public void unsubscribe(android.net.Uri);
  }
  }
@@ -16198,16 +16198,16 @@ package android.media.browse {
    method public void onConnectionSuspended();
    method public void onConnectionSuspended();
  }
  }
  public static abstract class MediaBrowser.SubscriptionCallback {
  public static abstract class MediaBrowser.IconCallback {
    ctor public MediaBrowser.SubscriptionCallback();
    ctor public MediaBrowser.IconCallback();
    method public void onChildrenLoaded(android.net.Uri, java.util.List<android.media.browse.MediaBrowserItem>);
    method public void onError(android.net.Uri);
    method public void onError(android.net.Uri);
    method public void onIconLoaded(android.net.Uri, android.graphics.Bitmap);
  }
  }
  public static abstract class MediaBrowser.ThumbnailCallback {
  public static abstract class MediaBrowser.SubscriptionCallback {
    ctor public MediaBrowser.ThumbnailCallback();
    ctor public MediaBrowser.SubscriptionCallback();
    method public void onChildrenLoaded(android.net.Uri, java.util.List<android.media.browse.MediaBrowserItem>);
    method public void onError(android.net.Uri);
    method public void onError(android.net.Uri);
    method public void onThumbnailLoaded(android.net.Uri, android.graphics.Bitmap);
  }
  }
  public final class MediaBrowserItem implements android.os.Parcelable {
  public final class MediaBrowserItem implements android.os.Parcelable {
@@ -16244,7 +16244,7 @@ package android.media.browse {
    method public android.os.IBinder onBind(android.content.Intent);
    method public android.os.IBinder onBind(android.content.Intent);
    method public abstract android.media.browse.MediaBrowserService.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
    method public abstract android.media.browse.MediaBrowserService.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
    method public abstract void onLoadChildren(android.net.Uri, android.media.browse.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowserItem>>);
    method public abstract void onLoadChildren(android.net.Uri, android.media.browse.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowserItem>>);
    method public abstract void onLoadThumbnail(android.net.Uri, int, int, android.media.browse.MediaBrowserService.Result<android.graphics.Bitmap>);
    method public abstract void onLoadIcon(android.net.Uri, int, int, android.media.browse.MediaBrowserService.Result<android.graphics.Bitmap>);
    method public void setSessionToken(android.media.session.MediaSession.Token);
    method public void setSessionToken(android.media.session.MediaSession.Token);
    field public static final java.lang.String SERVICE_ACTION = "android.media.browse.MediaBrowserService";
    field public static final java.lang.String SERVICE_ACTION = "android.media.browse.MediaBrowserService";
  }
  }
+1 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,6 @@ oneway interface IMediaBrowserService {


    void addSubscription(in Uri uri, IMediaBrowserServiceCallbacks callbacks);
    void addSubscription(in Uri uri, IMediaBrowserServiceCallbacks callbacks);
    void removeSubscription(in Uri uri, IMediaBrowserServiceCallbacks callbacks);
    void removeSubscription(in Uri uri, IMediaBrowserServiceCallbacks callbacks);
    void loadThumbnail(in int seqNum, in Uri uri, int width, int height,
    void loadIcon(in int seqNum, in Uri uri, int width, int height,
            IMediaBrowserServiceCallbacks callbacks);
            IMediaBrowserServiceCallbacks callbacks);
}
}
 No newline at end of file
+1 −1
Original line number Original line Diff line number Diff line
@@ -24,5 +24,5 @@ oneway interface IMediaBrowserServiceCallbacks {
    void onConnect(in Uri root, in MediaSession.Token session, in Bundle extras);
    void onConnect(in Uri root, in MediaSession.Token session, in Bundle extras);
    void onConnectFailed();
    void onConnectFailed();
    void onLoadChildren(in Uri uri, in ParceledListSlice list);
    void onLoadChildren(in Uri uri, in ParceledListSlice list);
    void onLoadThumbnail(int seqNum, in Bitmap bitmap);
    void onLoadIcon(int seqNum, in Bitmap bitmap);
}
}
+48 −48
Original line number Original line Diff line number Diff line
@@ -67,8 +67,8 @@ public final class MediaBrowser {
    private final Handler mHandler = new Handler();
    private final Handler mHandler = new Handler();
    private final ArrayMap<Uri,Subscription> mSubscriptions =
    private final ArrayMap<Uri,Subscription> mSubscriptions =
            new ArrayMap<Uri, MediaBrowser.Subscription>();
            new ArrayMap<Uri, MediaBrowser.Subscription>();
    private final SparseArray<ThumbnailRequest> mThumbnailRequests =
    private final SparseArray<IconRequest> mIconRequests =
            new SparseArray<ThumbnailRequest>();
            new SparseArray<IconRequest>();


    private int mState = CONNECT_STATE_DISCONNECTED;
    private int mState = CONNECT_STATE_DISCONNECTED;
    private MediaServiceConnection mServiceConnection;
    private MediaServiceConnection mServiceConnection;
@@ -352,42 +352,42 @@ public final class MediaBrowser {
    }
    }


    /**
    /**
     * Loads the thumbnail of a media item.
     * Loads the icon of a media item.
     *
     *
     * @param uri The uri of the thumbnail.
     * @param uri The uri of the Icon.
     * @param width The preferred width of the icon in dp.
     * @param width The preferred width of the icon in dp.
     * @param height The preferred width of the icon in dp.
     * @param height The preferred width of the icon in dp.
     * @param callback The callback to receive the thumbnail.
     * @param callback The callback to receive the icon.
     */
     */
    public void loadThumbnail(final @NonNull Uri uri, final int width, final int height,
    public void loadIcon(final @NonNull Uri uri, final int width, final int height,
            final @NonNull ThumbnailCallback callback) {
            final @NonNull IconCallback callback) {
        if (uri == null) {
        if (uri == null) {
            throw new IllegalArgumentException("thumbnail uri cannot be null");
            throw new IllegalArgumentException("Icon uri cannot be null");
        }
        }
        if (callback == null) {
        if (callback == null) {
            throw new IllegalArgumentException("thumbnail callback cannot be null");
            throw new IllegalArgumentException("Icon callback cannot be null");
        }
        }
        mHandler.post(new Runnable() {
        mHandler.post(new Runnable() {
            @Override
            @Override
            public void run() {
            public void run() {
                for (int i = 0; i < mThumbnailRequests.size(); i++) {
                for (int i = 0; i < mIconRequests.size(); i++) {
                    ThumbnailRequest existingRequest = mThumbnailRequests.valueAt(i);
                    IconRequest existingRequest = mIconRequests.valueAt(i);
                    if (existingRequest.isSameRequest(uri, width, height)) {
                    if (existingRequest.isSameRequest(uri, width, height)) {
                        existingRequest.addCallback(callback);
                        existingRequest.addCallback(callback);
                        return;
                        return;
                    }
                    }
                }
                }
                final int seq = mNextSeq++;
                final int seq = mNextSeq++;
                ThumbnailRequest request = new ThumbnailRequest(seq, uri, width, height);
                IconRequest request = new IconRequest(seq, uri, width, height);
                request.addCallback(callback);
                request.addCallback(callback);
                mThumbnailRequests.put(seq, request);
                mIconRequests.put(seq, request);
                if (mState == CONNECT_STATE_CONNECTED) {
                if (mState == CONNECT_STATE_CONNECTED) {
                    try {
                    try {
                        mServiceBinder.loadThumbnail(seq, uri, width, height, mServiceCallbacks);
                        mServiceBinder.loadIcon(seq, uri, width, height, mServiceCallbacks);
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                        // Process is crashing.  We will disconnect, and upon reconnect we will
                        // Process is crashing.  We will disconnect, and upon reconnect we will
                        // automatically reload the thumbnails. So nothing to do here.
                        // automatically reload the icons. So nothing to do here.
                        Log.d(TAG, "loadThumbnail failed with RemoteException uri=" + uri);
                        Log.d(TAG, "loadIcon failed with RemoteException uri=" + uri);
                    }
                    }
                }
                }
            }
            }
@@ -451,15 +451,15 @@ public final class MediaBrowser {
                    }
                    }
                }
                }


                for (int i = 0; i < mThumbnailRequests.size(); i++) {
                for (int i = 0; i < mIconRequests.size(); i++) {
                    ThumbnailRequest request = mThumbnailRequests.valueAt(i);
                    IconRequest request = mIconRequests.valueAt(i);
                    try {
                    try {
                        mServiceBinder.loadThumbnail(request.mSeq, request.mUri,
                        mServiceBinder.loadIcon(request.mSeq, request.mUri,
                                request.mWidth, request.mHeight, mServiceCallbacks);
                                request.mWidth, request.mHeight, mServiceCallbacks);
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                        // Process is crashing.  We will disconnect, and upon reconnect we will
                        // Process is crashing.  We will disconnect, and upon reconnect we will
                        // automatically reload. So nothing to do here.
                        // automatically reload. So nothing to do here.
                        Log.d(TAG, "loadThumbnail failed with RemoteException request=" + request);
                        Log.d(TAG, "loadIcon failed with RemoteException request=" + request);
                    }
                    }
                }
                }
            }
            }
@@ -528,26 +528,26 @@ public final class MediaBrowser {
        });
        });
    }
    }


    private final void onLoadThumbnail(final IMediaBrowserServiceCallbacks callback,
    private final void onLoadIcon(final IMediaBrowserServiceCallbacks callback,
            final int seqNum, final Bitmap bitmap) {
            final int seqNum, final Bitmap bitmap) {
        mHandler.post(new Runnable() {
        mHandler.post(new Runnable() {
            @Override
            @Override
            public void run() {
            public void run() {
                // Check that there hasn't been a disconnect or a different
                // Check that there hasn't been a disconnect or a different
                // ServiceConnection.
                // ServiceConnection.
                if (!isCurrent(callback, "onLoadThumbnail")) {
                if (!isCurrent(callback, "onLoadIcon")) {
                    return;
                    return;
                }
                }


                ThumbnailRequest request = mThumbnailRequests.get(seqNum);
                IconRequest request = mIconRequests.get(seqNum);
                if (request == null) {
                if (request == null) {
                    Log.d(TAG, "onLoadThumbnail called for seqNum=" + seqNum + " request="
                    Log.d(TAG, "onLoadIcon called for seqNum=" + seqNum + " request="
                            + request + " but the request is not registered");
                            + request + " but the request is not registered");
                    return;
                    return;
                }
                }
                mThumbnailRequests.delete(seqNum);
                mIconRequests.delete(seqNum);
                for (ThumbnailCallback thumbnailCallback : request.getCallbacks()) {
                for (IconCallback IconCallback : request.getCallbacks()) {
                    thumbnailCallback.onThumbnailLoaded(request.mUri, bitmap);
                    IconCallback.onIconLoaded(request.mUri, bitmap);
                }
                }
            }
            }
        });
        });
@@ -636,13 +636,13 @@ public final class MediaBrowser {
    }
    }


    /**
    /**
     * Callbacks for thumbnail loading.
     * Callbacks for icon loading.
     */
     */
    public static abstract class ThumbnailCallback {
    public static abstract class IconCallback {
        /**
        /**
         * Called when the thumbnail is loaded.
         * Called when the icon is loaded.
         */
         */
        public void onThumbnailLoaded(@NonNull Uri uri, @NonNull Bitmap bitmap) {
        public void onIconLoaded(@NonNull Uri uri, @NonNull Bitmap bitmap) {
        }
        }


        /**
        /**
@@ -652,38 +652,38 @@ public final class MediaBrowser {
        }
        }
    }
    }


    private static class ThumbnailRequest {
    private static class IconRequest {
        final int mSeq;
        final int mSeq;
        final Uri mUri;
        final Uri mUri;
        final int mWidth;
        final int mWidth;
        final int mHeight;
        final int mHeight;
        final List<ThumbnailCallback> mCallbacks;
        final List<IconCallback> mCallbacks;


        /**
        /**
         * Constructs a thumbnail request.
         * Constructs an icon request.
         * @param seq The unique sequence number assigned to the request by the media browser.
         * @param seq The unique sequence number assigned to the request by the media browser.
         * @param uri The Uri for the thumbnail.
         * @param uri The Uri for the icon.
         * @param width The width for the thumbnail.
         * @param width The width for the icon.
         * @param height The height for the thumbnail.
         * @param height The height for the icon.
         */
         */
        ThumbnailRequest(int seq, @NonNull Uri uri, int width, int height) {
        IconRequest(int seq, @NonNull Uri uri, int width, int height) {
            if (uri == null) {
            if (uri == null) {
                throw new IllegalArgumentException("thumbnail uri cannot be null");
                throw new IllegalArgumentException("Icon uri cannot be null");
            }
            }
            this.mSeq = seq;
            this.mSeq = seq;
            this.mUri = uri;
            this.mUri = uri;
            this.mWidth = width;
            this.mWidth = width;
            this.mHeight = height;
            this.mHeight = height;
            mCallbacks = new ArrayList<ThumbnailCallback>();
            mCallbacks = new ArrayList<IconCallback>();
        }
        }


        /**
        /**
         * Adds a callback to the thumbnail request.
         * Adds a callback to the icon request.
         * If the callback already exists, it will not be added again.
         * If the callback already exists, it will not be added again.
         */
         */
        public void addCallback(@NonNull ThumbnailCallback callback) {
        public void addCallback(@NonNull IconCallback callback) {
            if (callback == null) {
            if (callback == null) {
                throw new IllegalArgumentException("callback cannot be null in ThumbnailRequest");
                throw new IllegalArgumentException("callback cannot be null in IconRequest");
            }
            }
            if (!mCallbacks.contains(callback)) {
            if (!mCallbacks.contains(callback)) {
                mCallbacks.add(callback);
                mCallbacks.add(callback);
@@ -691,7 +691,7 @@ public final class MediaBrowser {
        }
        }


        /**
        /**
         * Checks if the thumbnail request has the same uri, width, and height as the given values.
         * Checks if the icon request has the same uri, width, and height as the given values.
         */
         */
        public boolean isSameRequest(@Nullable Uri uri, int width, int height) {
        public boolean isSameRequest(@Nullable Uri uri, int width, int height) {
            return Objects.equals(mUri, uri) && mWidth == width && mHeight == height;
            return Objects.equals(mUri, uri) && mWidth == width && mHeight == height;
@@ -699,7 +699,7 @@ public final class MediaBrowser {


        @Override
        @Override
        public String toString() {
        public String toString() {
            final StringBuilder sb = new StringBuilder("ThumbnailRequest{");
            final StringBuilder sb = new StringBuilder("IconRequest{");
            sb.append("uri=").append(mUri);
            sb.append("uri=").append(mUri);
            sb.append(", width=").append(mWidth);
            sb.append(", width=").append(mWidth);
            sb.append(", height=").append(mHeight);
            sb.append(", height=").append(mHeight);
@@ -711,7 +711,7 @@ public final class MediaBrowser {
        /**
        /**
         * Gets an unmodifiable view of the list of callbacks associated with the request.
         * Gets an unmodifiable view of the list of callbacks associated with the request.
         */
         */
        public List<ThumbnailCallback> getCallbacks() {
        public List<IconCallback> getCallbacks() {
            return Collections.unmodifiableList(mCallbacks);
            return Collections.unmodifiableList(mCallbacks);
        }
        }
    }
    }
@@ -843,10 +843,10 @@ public final class MediaBrowser {
        }
        }


        @Override
        @Override
        public void onLoadThumbnail(final int seqNum, final Bitmap bitmap) {
        public void onLoadIcon(final int seqNum, final Bitmap bitmap) {
            MediaBrowser mediaBrowser = mMediaBrowser.get();
            MediaBrowser mediaBrowser = mMediaBrowser.get();
            if (mediaBrowser != null) {
            if (mediaBrowser != null) {
                mediaBrowser.onLoadThumbnail(this, seqNum, bitmap);
                mediaBrowser.onLoadIcon(this, seqNum, bitmap);
            }
            }
        }
        }
    }
    }
+12 −12
Original line number Original line Diff line number Diff line
@@ -105,7 +105,7 @@ public abstract class MediaBrowserService extends Service {
     * be thrown.
     * be thrown.
     *
     *
     * @see MediaBrowserService#onLoadChildren
     * @see MediaBrowserService#onLoadChildren
     * @see MediaBrowserService#onLoadThumbnail
     * @see MediaBrowserService#onLoadIcon
     */
     */
    public class Result<T> {
    public class Result<T> {
        private Object mDebug;
        private Object mDebug;
@@ -266,10 +266,10 @@ public abstract class MediaBrowserService extends Service {
        }
        }


        @Override
        @Override
        public void loadThumbnail(final int seq, final Uri uri, final int width, final int height,
        public void loadIcon(final int seq, final Uri uri, final int width, final int height,
                final IMediaBrowserServiceCallbacks callbacks) {
                final IMediaBrowserServiceCallbacks callbacks) {
            if (uri == null) {
            if (uri == null) {
                throw new IllegalStateException("loadThumbnail sent null list for uri " + uri);
                throw new IllegalStateException("loadIcon sent null list for uri " + uri);
            }
            }
            mHandler.post(new Runnable() {
            mHandler.post(new Runnable() {
                @Override
                @Override
@@ -291,7 +291,7 @@ public abstract class MediaBrowserService extends Service {
                        void onResultSent(Bitmap bitmap) {
                        void onResultSent(Bitmap bitmap) {
                            if (mConnections.get(connection.callbacks.asBinder()) != connection) {
                            if (mConnections.get(connection.callbacks.asBinder()) != connection) {
                                if (DBG) {
                                if (DBG) {
                                    Log.d(TAG, "Not sending onLoadThumbnail result for connection"
                                    Log.d(TAG, "Not sending onLoadIcon result for connection"
                                            + " that has been disconnected. pkg=" + connection.pkg
                                            + " that has been disconnected. pkg=" + connection.pkg
                                            + " uri=" + uri);
                                            + " uri=" + uri);
                                }
                                }
@@ -299,18 +299,18 @@ public abstract class MediaBrowserService extends Service {
                            }
                            }


                            try {
                            try {
                                callbacks.onLoadThumbnail(seq, bitmap);
                                callbacks.onLoadIcon(seq, bitmap);
                            } catch (RemoteException e) {
                            } catch (RemoteException e) {
                                // The other side is in the process of crashing.
                                // The other side is in the process of crashing.
                                Log.w(TAG, "RemoteException in calling onLoadThumbnail", e);
                                Log.w(TAG, "RemoteException in calling onLoadIcon", e);
                            }
                            }
                        }
                        }
                    };
                    };


                    onLoadThumbnail(uri, width, height, result);
                    onLoadIcon(uri, width, height, result);


                    if (!result.isDone()) {
                    if (!result.isDone()) {
                        throw new IllegalStateException("onLoadThumbnail must call detach() or"
                        throw new IllegalStateException("onLoadIcon must call detach() or"
                                + " sendResult() before returning for package=" + connection.pkg
                                + " sendResult() before returning for package=" + connection.pkg
                                + " uri=" + uri);
                                + " uri=" + uri);
                    }
                    }
@@ -375,7 +375,7 @@ public abstract class MediaBrowserService extends Service {
            @NonNull Result<List<MediaBrowserItem>> result);
            @NonNull Result<List<MediaBrowserItem>> result);


    /**
    /**
     * Called to get the thumbnail of a particular media item.
     * Called to get the icon of a particular media item.
     * <p>
     * <p>
     * Implementations must call result.{@link Result#sendResult result.sendResult} with the bitmap.
     * Implementations must call result.{@link Result#sendResult result.sendResult} with the bitmap.
     * If loading the bitmap will be an expensive operation that should be performed
     * If loading the bitmap will be an expensive operation that should be performed
@@ -387,10 +387,10 @@ public abstract class MediaBrowserService extends Service {
     * @param width The requested width of the icon in dp.
     * @param width The requested width of the icon in dp.
     * @param height The requested height of the icon in dp.
     * @param height The requested height of the icon in dp.
     *
     *
     * @return The file descriptor of the thumbnail, which may then be loaded
     * @return The file descriptor of the icon, which may then be loaded
     *          using a bitmap factory, or null if the item does not have a thumbnail.
     *          using a bitmap factory, or null if the item does not have an icon.
     */
     */
    public abstract void onLoadThumbnail(@NonNull Uri uri, int width, int height,
    public abstract void onLoadIcon(@NonNull Uri uri, int width, int height,
            @NonNull Result<Bitmap> result);
            @NonNull Result<Bitmap> result);


    /**
    /**
Loading