188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi/*
288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * Copyright (C) 2013 The Android Open Source Project
388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi *
488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * you may not use this file except in compliance with the License.
688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * You may obtain a copy of the License at
788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi *
888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi *
1088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * See the License for the specific language governing permissions and
1488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * limitations under the License.
1588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi */
1688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
1788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivipackage android.media;
1888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
1988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Triviimport android.graphics.Bitmap;
20edb158f55f48a1f7b2cbf30ddec9b8917dc9a619RoboErikimport android.media.session.MediaSession;
2188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Triviimport android.os.Bundle;
2288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Triviimport android.os.Parcelable;
2388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Triviimport android.util.Log;
2488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Triviimport android.util.SparseIntArray;
2588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
2688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi/**
2788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * An abstract class for editing and storing metadata that can be published by
2888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * {@link RemoteControlClient}. See the {@link RemoteControlClient#editMetadata(boolean)}
2988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi * method to instantiate a {@link RemoteControlClient.MetadataEditor} object.
30edb158f55f48a1f7b2cbf30ddec9b8917dc9a619RoboErik *
31edb158f55f48a1f7b2cbf30ddec9b8917dc9a619RoboErik * @deprecated Use {@link MediaMetadata} instead together with {@link MediaSession}.
3288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi */
33edb158f55f48a1f7b2cbf30ddec9b8917dc9a619RoboErik@Deprecated public abstract class MediaMetadataEditor {
3488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
3588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    private final static String TAG = "MediaMetadataEditor";
3688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
3788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
3888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
3988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected MediaMetadataEditor() {
4088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
4188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
4288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    // Public keys for metadata used by RemoteControlClient and RemoteController.
4388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    // Note that these keys are defined here, and not in MediaMetadataRetriever
4488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    // because they are not supported by the MediaMetadataRetriever features.
4588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
4688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * The metadata key for the content artwork / album art.
4788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
4888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public final static int BITMAP_KEY_ARTWORK =
4988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK;
5088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
5188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
5288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * The metadata key for the content's average rating, not the user's rating.
5388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * The value associated with this key is a {@link Rating} instance.
5488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @see #RATING_KEY_BY_USER
5588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
5688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public final static int RATING_KEY_BY_OTHERS = 101;
5788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
5888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
5988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * The metadata key for the content's user rating.
6088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * The value associated with this key is a {@link Rating} instance.
6188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * This key can be flagged as "editable" (with {@link #addEditableKey(int)}) to enable
6288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * receiving user rating values through the
6388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * {@link android.media.RemoteControlClient.OnMetadataUpdateListener} interface.
6488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
6588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public final static int RATING_KEY_BY_USER = 0x10000001;
6688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
6788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
6888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
6988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Editable key mask
7088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
7188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public final static int KEY_EDITABLE_MASK = 0x1FFFFFFF;
7288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
7388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
7488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
7588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Applies all of the metadata changes that have been set since the MediaMetadataEditor instance
7688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * was created or since {@link #clear()} was called.
7788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
7888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public abstract void apply();
7988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
8088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
8188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
8288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
8388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Mask of editable keys.
8488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
8588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected long mEditableKeys;
8688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
8788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
8888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
8988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
9088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected boolean mMetadataChanged = false;
9188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
9288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
9388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
9488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
9588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected boolean mApplied = false;
9688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
9788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
9888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
9988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
10088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected boolean mArtworkChanged = false;
10188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
10288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
10388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
10488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
10588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected Bitmap mEditorArtwork;
10688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
10788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
10888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
10988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
11088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected Bundle mEditorMetadata;
11188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
112f1372428f2df781c71c71caa2f6a4db6f847cf10RoboErik    /**
113f1372428f2df781c71c71caa2f6a4db6f847cf10RoboErik     * @hide
114f1372428f2df781c71c71caa2f6a4db6f847cf10RoboErik     */
115f1372428f2df781c71c71caa2f6a4db6f847cf10RoboErik    protected MediaMetadata.Builder mMetadataBuilder;
11688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
11788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
11888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Clears all the pending metadata changes set since the MediaMetadataEditor instance was
11988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * created or since this method was last called.
12088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Note that clearing the metadata doesn't reset the editable keys
12188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * (use {@link #removeEditableKeys()} instead).
12288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
12388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized void clear() {
12488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
12588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't clear a previously applied MediaMetadataEditor");
12688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return;
12788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
12888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mEditorMetadata.clear();
12988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mEditorArtwork = null;
130f1372428f2df781c71c71caa2f6a4db6f847cf10RoboErik        mMetadataBuilder = new MediaMetadata.Builder();
13188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
13288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
13388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
13488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Flags the given key as being editable.
13588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * This should only be used by metadata publishers, such as {@link RemoteControlClient},
13688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * which will declare the metadata field as eligible to be updated, with new values
13788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * received through the {@link RemoteControlClient.OnMetadataUpdateListener} interface.
13888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key the type of metadata that can be edited. The supported key is
13988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     {@link #RATING_KEY_BY_USER}.
14088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
14188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized void addEditableKey(int key) {
14288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
14388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't change editable keys of a previously applied MetadataEditor");
14488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return;
14588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
14688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // only one editable key at the moment, so we're not wasting memory on an array
14788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // of editable keys to check the validity of the key, just hardcode the supported key.
14888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (key == RATING_KEY_BY_USER) {
14988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            mEditableKeys |= (KEY_EDITABLE_MASK & key);
15088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            mMetadataChanged = true;
15188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        } else {
15288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Metadata key " + key + " cannot be edited");
15388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
15488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
15588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
15688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
15788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Causes all metadata fields to be read-only.
15888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
15988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized void removeEditableKeys() {
16088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
16188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't remove all editable keys of a previously applied MetadataEditor");
16288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return;
16388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
16488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mEditableKeys != 0) {
16588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            mEditableKeys = 0;
16688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            mMetadataChanged = true;
16788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
16888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
16988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
17088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
17188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Retrieves the keys flagged as editable.
17288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return null if there are no editable keys, or an array containing the keys.
17388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
17488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized int[] getEditableKeys() {
17588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // only one editable key supported here
17688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mEditableKeys == RATING_KEY_BY_USER) {
17788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            int[] keys = { RATING_KEY_BY_USER };
17888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return keys;
17988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        } else {
18088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return null;
18188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
18288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
18388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
18488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
18588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Adds textual information.
18688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Note that none of the information added after {@link #apply()} has been called,
18788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * will be available to consumers of metadata stored by the MediaMetadataEditor.
18888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key The identifier of a the metadata field to set. Valid values are
18988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_ALBUM},
19088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_ALBUMARTIST},
19188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_TITLE},
19288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_ARTIST},
19388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_AUTHOR},
19488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_COMPILATION},
19588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_COMPOSER},
19688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DATE},
19788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_GENRE},
19888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_WRITER}.
19988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param value The text for the given key, or {@code null} to signify there is no valid
20088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      information for the field.
20188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return Returns a reference to the same MediaMetadataEditor object, so you can chain put
20288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      calls together.
20388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
20488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized MediaMetadataEditor putString(int key, String value)
20588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
20688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
20788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't edit a previously applied MediaMetadataEditor");
20888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return this;
20988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
21088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (METADATA_KEYS_TYPE.get(key, METADATA_TYPE_INVALID) != METADATA_TYPE_STRING) {
21188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throw(new IllegalArgumentException("Invalid type 'String' for key "+ key));
21288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
21388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mEditorMetadata.putString(String.valueOf(key), value);
21488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mMetadataChanged = true;
21588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return this;
21688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
21788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
21888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
21988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Adds numerical information.
22088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Note that none of the information added after {@link #apply()} has been called
22188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * will be available to consumers of metadata stored by the MediaMetadataEditor.
22288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key the identifier of a the metadata field to set. Valid values are
22388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_CD_TRACK_NUMBER},
22488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DISC_NUMBER},
22588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DURATION} (with a value
22688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      expressed in milliseconds),
22788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_YEAR}.
22888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param value The long value for the given key
22988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return Returns a reference to the same MediaMetadataEditor object, so you can chain put
23088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      calls together.
23188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
23288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
23388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized MediaMetadataEditor putLong(int key, long value)
23488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
23588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
23688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't edit a previously applied MediaMetadataEditor");
23788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return this;
23888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
23988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (METADATA_KEYS_TYPE.get(key, METADATA_TYPE_INVALID) != METADATA_TYPE_LONG) {
24088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throw(new IllegalArgumentException("Invalid type 'long' for key "+ key));
24188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
24288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mEditorMetadata.putLong(String.valueOf(key), value);
24388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mMetadataChanged = true;
24488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return this;
24588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
24688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
24788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
24888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Adds image.
24988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key the identifier of the bitmap to set. The only valid value is
25088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      {@link #BITMAP_KEY_ARTWORK}
25188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param bitmap The bitmap for the artwork, or null if there isn't any.
25288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return Returns a reference to the same MediaMetadataEditor object, so you can chain put
25388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      calls together.
25488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
25588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @see android.graphics.Bitmap
25688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
25788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized MediaMetadataEditor putBitmap(int key, Bitmap bitmap)
25888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
25988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
26088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't edit a previously applied MediaMetadataEditor");
26188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return this;
26288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
26388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (key != BITMAP_KEY_ARTWORK) {
26488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throw(new IllegalArgumentException("Invalid type 'Bitmap' for key "+ key));
26588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
26688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mEditorArtwork = bitmap;
26788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        mArtworkChanged = true;
26888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return this;
26988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
27088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
27188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
27288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Adds information stored as an instance.
27388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Note that none of the information added after {@link #apply()} has been called
27488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * will be available to consumers of metadata stored by the MediaMetadataEditor.
27588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key the identifier of a the metadata field to set. Valid keys for a:
27688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     <ul>
27788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     <li>{@link Bitmap} object are {@link #BITMAP_KEY_ARTWORK},</li>
27888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     <li>{@link String} object are the same as for {@link #putString(int, String)}</li>
27988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     <li>{@link Long} object are the same as for {@link #putLong(int, long)}</li>
28088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     <li>{@link Rating} object are {@link #RATING_KEY_BY_OTHERS}
28188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *         and {@link #RATING_KEY_BY_USER}.</li>
28288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     </ul>
283f841d70155c991b6cf728dd41e6d37e051be453dJean-Michel Trivi     * @param value the metadata to add.
28488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return Returns a reference to the same MediaMetadataEditor object, so you can chain put
28588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *      calls together.
28688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
28788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
28888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized MediaMetadataEditor putObject(int key, Object value)
28988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
29088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (mApplied) {
29188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            Log.e(TAG, "Can't edit a previously applied MediaMetadataEditor");
29288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            return this;
29388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
29488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        switch(METADATA_KEYS_TYPE.get(key, METADATA_TYPE_INVALID)) {
29588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_LONG:
29688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if (value instanceof Long) {
29788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return putLong(key, ((Long)value).longValue());
29888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } else {
29988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    throw(new IllegalArgumentException("Not a non-null Long for key "+ key));
30088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                }
30188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_STRING:
30288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if ((value == null) || (value instanceof String)) {
30388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return putString(key, (String) value);
30488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } else {
30588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    throw(new IllegalArgumentException("Not a String for key "+ key));
30688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                }
30788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_RATING:
30888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                mEditorMetadata.putParcelable(String.valueOf(key), (Parcelable)value);
30988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                mMetadataChanged = true;
31088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                break;
31188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_BITMAP:
31288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if ((value == null) || (value instanceof Bitmap))  {
31388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return putBitmap(key, (Bitmap) value);
31488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } else {
31588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    throw(new IllegalArgumentException("Not a Bitmap for key "+ key));
31688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                }
31788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            default:
31888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                throw(new IllegalArgumentException("Invalid key "+ key));
31988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
32088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return this;
32188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
32288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
32388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
32488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
32588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Returns the long value for the key.
32688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key one of the keys supported in {@link #putLong(int, long)}
32788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param defaultValue the value returned if the key is not present
32888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return the long value for the key, or the supplied default value if the key is not present
32988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
33088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
33188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized long getLong(int key, long defaultValue)
33288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
33388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (METADATA_KEYS_TYPE.get(key, METADATA_TYPE_INVALID) != METADATA_TYPE_LONG) {
33488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throw(new IllegalArgumentException("Invalid type 'long' for key "+ key));
33588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
33688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return mEditorMetadata.getLong(String.valueOf(key), defaultValue);
33788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
33888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
33988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
34088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Returns the {@link String} value for the key.
34188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key one of the keys supported in {@link #putString(int, String)}
34288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param defaultValue the value returned if the key is not present
34388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return the {@link String} value for the key, or the supplied default value if the key is
34488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     not present
34588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
34688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
34788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized String getString(int key, String defaultValue)
34888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
34988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (METADATA_KEYS_TYPE.get(key, METADATA_TYPE_INVALID) != METADATA_TYPE_STRING) {
35088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throw(new IllegalArgumentException("Invalid type 'String' for key "+ key));
35188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
35288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return mEditorMetadata.getString(String.valueOf(key), defaultValue);
35388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
35488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
35588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
35688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Returns the {@link Bitmap} value for the key.
35788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key the {@link #BITMAP_KEY_ARTWORK} key
35888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param defaultValue the value returned if the key is not present
35988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return the {@link Bitmap} value for the key, or the supplied default value if the key is
36088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     not present
36188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
36288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
36388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized Bitmap getBitmap(int key, Bitmap defaultValue)
36488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
36588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        if (key != BITMAP_KEY_ARTWORK) {
36688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throw(new IllegalArgumentException("Invalid type 'Bitmap' for key "+ key));
36788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
36888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        return (mEditorArtwork != null ? mEditorArtwork : defaultValue);
36988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
37088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
37188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
37288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * Returns an object representation of the value for the key
37388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param key one of the keys supported in {@link #putObject(int, Object)}
37488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @param defaultValue the value returned if the key is not present
37588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @return the object for the key, as a {@link Long}, {@link Bitmap}, {@link String}, or
37688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     {@link Rating} depending on the key value, or the supplied default value if the key is
37788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     *     not present
37888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @throws IllegalArgumentException
37988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
38088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    public synchronized Object getObject(int key, Object defaultValue)
38188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            throws IllegalArgumentException {
38288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        switch (METADATA_KEYS_TYPE.get(key, METADATA_TYPE_INVALID)) {
38388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_LONG:
38488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if (mEditorMetadata.containsKey(String.valueOf(key))) {
38588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return mEditorMetadata.getLong(String.valueOf(key));
38688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } else {
38788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return defaultValue;
38888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                }
38988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_STRING:
39088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if (mEditorMetadata.containsKey(String.valueOf(key))) {
39188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return mEditorMetadata.getString(String.valueOf(key));
39288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } else {
39388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return defaultValue;
39488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                }
39588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_RATING:
39688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if (mEditorMetadata.containsKey(String.valueOf(key))) {
39788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return mEditorMetadata.getParcelable(String.valueOf(key));
39888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } else {
39988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return defaultValue;
40088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                }
40188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            case METADATA_TYPE_BITMAP:
40288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                // only one key for Bitmap supported, value is not stored in mEditorMetadata Bundle
40388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                if (key == BITMAP_KEY_ARTWORK) {
40488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                    return (mEditorArtwork != null ? mEditorArtwork : defaultValue);
40588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                } // else: fall through to invalid key handling
40688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi            default:
40788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                throw(new IllegalArgumentException("Invalid key "+ key));
40888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        }
40988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
41088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
41188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
41288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
41388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
41488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
41588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected static final int METADATA_TYPE_INVALID = -1;
41688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
41788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
41888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
41988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected static final int METADATA_TYPE_LONG = 0;
42088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
42188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
42288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
42388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
42488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected static final int METADATA_TYPE_STRING = 1;
42588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
42688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
42788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
42888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
42988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected static final int METADATA_TYPE_BITMAP = 2;
43088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
43188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
43288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
43388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
43488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected static final int METADATA_TYPE_RATING = 3;
43588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
43688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    /**
43788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     * @hide
43888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi     */
43988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    protected static final SparseIntArray METADATA_KEYS_TYPE;
44088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi
44188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    static {
44288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE = new SparseIntArray(17);
44388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // NOTE: if adding to the list below, make sure you increment the array initialization size
44488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // keys with long values
44588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(
44688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER, METADATA_TYPE_LONG);
44788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER, METADATA_TYPE_LONG);
44888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_DURATION, METADATA_TYPE_LONG);
44988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_YEAR, METADATA_TYPE_LONG);
45088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // keys with String values
45188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_ALBUM, METADATA_TYPE_STRING);
45288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(
45388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST, METADATA_TYPE_STRING);
45488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_TITLE, METADATA_TYPE_STRING);
45588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_ARTIST, METADATA_TYPE_STRING);
45688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_AUTHOR, METADATA_TYPE_STRING);
45788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(
45888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi                MediaMetadataRetriever.METADATA_KEY_COMPILATION, METADATA_TYPE_STRING);
45988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_COMPOSER, METADATA_TYPE_STRING);
46088183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_DATE, METADATA_TYPE_STRING);
46188183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_GENRE, METADATA_TYPE_STRING);
46288183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_WRITER, METADATA_TYPE_STRING);
46388183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // keys with Bitmap values
46488183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(BITMAP_KEY_ARTWORK, METADATA_TYPE_BITMAP);
46588183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        // keys with Rating values
46688183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(RATING_KEY_BY_OTHERS, METADATA_TYPE_RATING);
46788183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi        METADATA_KEYS_TYPE.put(RATING_KEY_BY_USER, METADATA_TYPE_RATING);
46888183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi    }
46988183e67d4628e8c8a3310af0076b6f33f955cb2Jean-Michel Trivi}
470