summaryrefslogtreecommitdiff
path: root/MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java
diff options
context:
space:
mode:
authorRenato Mangini <mangini@google.com>2014-11-17 15:14:58 -0800
committerRenato Mangini <mangini@google.com>2014-11-17 15:14:58 -0800
commit95d49d216223e3431647abd79f5e376958353c95 (patch)
treeecc6497c401befd1e82845564a0111d06fdaac00 /MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java
parentd025a0272babbd56c301d773fd16c4b00f5f6428 (diff)
downloaddemos-nougat-dev.tar.gz
Remove gearhead samples from the old location.android-wear-o-preview-4android-wear-o-preview-3android-wear-n-preview-3android-wear-n-preview-2android-wear-n-preview-1android-wear-7.1.1_r1android-wear-5.1.1_r1android-wear-5.1.0_r1android-o-preview-4android-o-preview-3android-o-preview-2android-o-preview-1android-o-iot-preview-5android-n-preview-5android-n-preview-4android-n-preview-3android-n-preview-2android-n-preview-1android-n-mr2-preview-2android-n-mr2-preview-1android-n-mr1-preview-2android-n-mr1-preview-1android-n-iot-preview-4android-n-iot-preview-2android-m-preview-2android-m-preview-1android-m-previewandroid-cts_7.1_r1android-cts-7.1_r9android-cts-7.1_r8android-cts-7.1_r7android-cts-7.1_r6android-cts-7.1_r5android-cts-7.1_r4android-cts-7.1_r3android-cts-7.1_r29android-cts-7.1_r28android-cts-7.1_r27android-cts-7.1_r26android-cts-7.1_r25android-cts-7.1_r24android-cts-7.1_r23android-cts-7.1_r22android-cts-7.1_r21android-cts-7.1_r20android-cts-7.1_r2android-cts-7.1_r19android-cts-7.1_r18android-cts-7.1_r17android-cts-7.1_r16android-cts-7.1_r15android-cts-7.1_r14android-cts-7.1_r13android-cts-7.1_r12android-cts-7.1_r11android-cts-7.1_r10android-cts-7.1_r1android-cts-7.0_r9android-cts-7.0_r8android-cts-7.0_r7android-cts-7.0_r6android-cts-7.0_r5android-cts-7.0_r4android-cts-7.0_r33android-cts-7.0_r32android-cts-7.0_r31android-cts-7.0_r30android-cts-7.0_r3android-cts-7.0_r29android-cts-7.0_r28android-cts-7.0_r27android-cts-7.0_r26android-cts-7.0_r25android-cts-7.0_r24android-cts-7.0_r23android-cts-7.0_r22android-cts-7.0_r21android-cts-7.0_r20android-cts-7.0_r2android-cts-7.0_r19android-cts-7.0_r18android-cts-7.0_r17android-cts-7.0_r16android-cts-7.0_r15android-cts-7.0_r14android-cts-7.0_r13android-cts-7.0_r12android-cts-7.0_r11android-cts-7.0_r10android-cts-7.0_r1android-cts-6.0_r9android-cts-6.0_r8android-cts-6.0_r7android-cts-6.0_r6android-cts-6.0_r5android-cts-6.0_r4android-cts-6.0_r32android-cts-6.0_r31android-cts-6.0_r30android-cts-6.0_r3android-cts-6.0_r29android-cts-6.0_r28android-cts-6.0_r27android-cts-6.0_r26android-cts-6.0_r25android-cts-6.0_r24android-cts-6.0_r23android-cts-6.0_r22android-cts-6.0_r21android-cts-6.0_r20android-cts-6.0_r2android-cts-6.0_r19android-cts-6.0_r18android-cts-6.0_r17android-cts-6.0_r16android-cts-6.0_r15android-cts-6.0_r14android-cts-6.0_r13android-cts-6.0_r12android-cts-6.0_r1android-7.1.2_r9android-7.1.2_r8android-7.1.2_r6android-7.1.2_r5android-7.1.2_r4android-7.1.2_r39android-7.1.2_r38android-7.1.2_r37android-7.1.2_r36android-7.1.2_r33android-7.1.2_r32android-7.1.2_r30android-7.1.2_r3android-7.1.2_r29android-7.1.2_r28android-7.1.2_r27android-7.1.2_r25android-7.1.2_r24android-7.1.2_r23android-7.1.2_r2android-7.1.2_r19android-7.1.2_r18android-7.1.2_r17android-7.1.2_r16android-7.1.2_r15android-7.1.2_r14android-7.1.2_r13android-7.1.2_r12android-7.1.2_r11android-7.1.2_r10android-7.1.2_r1android-7.1.1_r9android-7.1.1_r8android-7.1.1_r7android-7.1.1_r61android-7.1.1_r60android-7.1.1_r6android-7.1.1_r59android-7.1.1_r58android-7.1.1_r57android-7.1.1_r56android-7.1.1_r55android-7.1.1_r54android-7.1.1_r53android-7.1.1_r52android-7.1.1_r51android-7.1.1_r50android-7.1.1_r49android-7.1.1_r48android-7.1.1_r47android-7.1.1_r46android-7.1.1_r45android-7.1.1_r44android-7.1.1_r43android-7.1.1_r42android-7.1.1_r41android-7.1.1_r40android-7.1.1_r4android-7.1.1_r39android-7.1.1_r38android-7.1.1_r35android-7.1.1_r33android-7.1.1_r32android-7.1.1_r31android-7.1.1_r3android-7.1.1_r28android-7.1.1_r27android-7.1.1_r26android-7.1.1_r25android-7.1.1_r24android-7.1.1_r23android-7.1.1_r22android-7.1.1_r21android-7.1.1_r20android-7.1.1_r2android-7.1.1_r17android-7.1.1_r16android-7.1.1_r15android-7.1.1_r14android-7.1.1_r13android-7.1.1_r12android-7.1.1_r11android-7.1.1_r10android-7.1.1_r1android-7.1.0_r7android-7.1.0_r6android-7.1.0_r5android-7.1.0_r4android-7.1.0_r3android-7.1.0_r2android-7.1.0_r1android-7.0.0_r9android-7.0.0_r8android-7.0.0_r7android-7.0.0_r6android-7.0.0_r5android-7.0.0_r4android-7.0.0_r36android-7.0.0_r35android-7.0.0_r34android-7.0.0_r33android-7.0.0_r32android-7.0.0_r31android-7.0.0_r30android-7.0.0_r3android-7.0.0_r29android-7.0.0_r28android-7.0.0_r27android-7.0.0_r24android-7.0.0_r21android-7.0.0_r19android-7.0.0_r17android-7.0.0_r15android-7.0.0_r14android-7.0.0_r13android-7.0.0_r12android-7.0.0_r11android-7.0.0_r10android-7.0.0_r1android-6.0.1_r9android-6.0.1_r81android-6.0.1_r80android-6.0.1_r8android-6.0.1_r79android-6.0.1_r78android-6.0.1_r77android-6.0.1_r74android-6.0.1_r73android-6.0.1_r72android-6.0.1_r70android-6.0.1_r7android-6.0.1_r69android-6.0.1_r68android-6.0.1_r67android-6.0.1_r66android-6.0.1_r65android-6.0.1_r63android-6.0.1_r62android-6.0.1_r61android-6.0.1_r60android-6.0.1_r59android-6.0.1_r58android-6.0.1_r57android-6.0.1_r56android-6.0.1_r55android-6.0.1_r54android-6.0.1_r53android-6.0.1_r52android-6.0.1_r51android-6.0.1_r50android-6.0.1_r5android-6.0.1_r49android-6.0.1_r48android-6.0.1_r47android-6.0.1_r46android-6.0.1_r45android-6.0.1_r43android-6.0.1_r42android-6.0.1_r41android-6.0.1_r40android-6.0.1_r4android-6.0.1_r33android-6.0.1_r32android-6.0.1_r31android-6.0.1_r30android-6.0.1_r3android-6.0.1_r28android-6.0.1_r27android-6.0.1_r26android-6.0.1_r25android-6.0.1_r24android-6.0.1_r22android-6.0.1_r21android-6.0.1_r20android-6.0.1_r18android-6.0.1_r17android-6.0.1_r16android-6.0.1_r13android-6.0.1_r12android-6.0.1_r11android-6.0.1_r10android-6.0.1_r1android-6.0.0_r7android-6.0.0_r6android-6.0.0_r5android-6.0.0_r41android-6.0.0_r4android-6.0.0_r3android-6.0.0_r26android-6.0.0_r25android-6.0.0_r24android-6.0.0_r23android-6.0.0_r2android-6.0.0_r13android-6.0.0_r12android-6.0.0_r11android-6.0.0_r1android-5.1.1_r5android-5.1.1_r28android-5.1.1_r22android-5.1.1_r17android-5.1.1_r12o-previewo-iot-preview-5nougat-releasenougat-mr2.3-releasenougat-mr2.2-releasenougat-mr2.1-releasenougat-mr2-security-releasenougat-mr2-releasenougat-mr2-pixel-releasenougat-mr2-devnougat-mr1.8-releasenougat-mr1.7-releasenougat-mr1.6-releasenougat-mr1.5-releasenougat-mr1.4-releasenougat-mr1.3-releasenougat-mr1.2-releasenougat-mr1.1-releasenougat-mr1-wear-releasenougat-mr1-volantis-releasenougat-mr1-security-releasenougat-mr1-releasenougat-mr1-flounder-releasenougat-mr1-devnougat-mr1-cts-releasenougat-mr0.5-releasenougat-dr1-releasenougat-devnougat-cts-releasenougat-bugfix-releasen-iot-preview-4n-iot-preview-2master-soongmarshmallow-releasemarshmallow-mr3-releasemarshmallow-mr2-releasemarshmallow-mr1-releasemarshmallow-mr1-devmarshmallow-dr1.6-releasemarshmallow-dr1.5-releasemarshmallow-dr1.5-devmarshmallow-dr-releasemarshmallow-dr-dragon-releasemarshmallow-dr-devmarshmallow-devmarshmallow-cts-releaselollipop-mr1-wfc-releaselollipop-mr1-dev
Gearhead samples were moved from /developers/demo to developers/samples. This CL is to remove them from the old location. Change-Id: I1b8ee3f761d75767c471c11962e429c96fff4100
Diffstat (limited to 'MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java')
-rw-r--r--MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java296
1 files changed, 0 insertions, 296 deletions
diff --git a/MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java b/MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java
deleted file mode 100644
index dd89c2d..0000000
--- a/MusicDemo/src/main/java/com/example/android/musicservicedemo/model/MusicProvider.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo.model;
-
-import android.media.MediaMetadata;
-import android.os.AsyncTask;
-
-import com.example.android.musicservicedemo.utils.LogHelper;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * Utility class to get a list of MusicTrack's based on a server-side JSON
- * configuration.
- */
-public class MusicProvider {
-
- private static final String TAG = "MusicProvider";
-
- private static final String CATALOG_URL = "http://storage.googleapis.com/automotive-media/music.json";
-
- public static final String CUSTOM_METADATA_TRACK_SOURCE = "__SOURCE__";
-
- private static String JSON_MUSIC = "music";
- private static String JSON_TITLE = "title";
- private static String JSON_ALBUM = "album";
- private static String JSON_ARTIST = "artist";
- private static String JSON_GENRE = "genre";
- private static String JSON_SOURCE = "source";
- private static String JSON_IMAGE = "image";
- private static String JSON_TRACK_NUMBER = "trackNumber";
- private static String JSON_TOTAL_TRACK_COUNT = "totalTrackCount";
- private static String JSON_DURATION = "duration";
-
- private final ReentrantLock initializationLock = new ReentrantLock();
-
- // Categorized caches for music track data:
- private final HashMap<String, List<MediaMetadata>> mMusicListByGenre;
- private final HashMap<String, MediaMetadata> mMusicListById;
-
- private final HashSet<String> mFavoriteTracks;
-
- enum State {
- NON_INITIALIZED, INITIALIZING, INITIALIZED;
- }
-
- private State mCurrentState = State.NON_INITIALIZED;
-
-
- public interface Callback {
- void onMusicCatalogReady(boolean success);
- }
-
- public MusicProvider() {
- mMusicListByGenre = new HashMap<>();
- mMusicListById = new HashMap<>();
- mFavoriteTracks = new HashSet<>();
- }
-
- /**
- * Get an iterator over the list of genres
- *
- * @return
- */
- public Iterable<String> getGenres() {
- if (mCurrentState != State.INITIALIZED) {
- return new ArrayList<String>(0);
- }
- return mMusicListByGenre.keySet();
- }
-
- /**
- * Get music tracks of the given genre
- *
- * @return
- */
- public Iterable<MediaMetadata> getMusicsByGenre(String genre) {
- if (mCurrentState != State.INITIALIZED || !mMusicListByGenre.containsKey(genre)) {
- return new ArrayList<MediaMetadata>();
- }
- return mMusicListByGenre.get(genre);
- }
-
- /**
- * Very basic implementation of a search that filter music tracks which title containing
- * the given query.
- *
- * @return
- */
- public Iterable<MediaMetadata> searchMusics(String titleQuery) {
- ArrayList<MediaMetadata> result = new ArrayList<>();
- if (mCurrentState != State.INITIALIZED) {
- return result;
- }
- titleQuery = titleQuery.toLowerCase();
- for (MediaMetadata track: mMusicListById.values()) {
- if (track.getString(MediaMetadata.METADATA_KEY_TITLE).toLowerCase()
- .contains(titleQuery)) {
- result.add(track);
- }
- }
- return result;
- }
-
- public MediaMetadata getMusic(String mediaId) {
- return mMusicListById.get(mediaId);
- }
-
- public void setFavorite(String mediaId, boolean favorite) {
- if (favorite) {
- mFavoriteTracks.add(mediaId);
- } else {
- mFavoriteTracks.remove(mediaId);
- }
- }
-
- public boolean isFavorite(String musicId) {
- return mFavoriteTracks.contains(musicId);
- }
-
- public boolean isInitialized() {
- return mCurrentState == State.INITIALIZED;
- }
-
- /**
- * Get the list of music tracks from a server and caches the track information
- * for future reference, keying tracks by mediaId and grouping by genre.
- *
- * @return
- */
- public void retrieveMedia(final Callback callback) {
-
- if (mCurrentState == State.INITIALIZED) {
- // Nothing to do, execute callback immediately
- callback.onMusicCatalogReady(true);
- return;
- }
-
- // Asynchronously load the music catalog in a separate thread
- new AsyncTask() {
- @Override
- protected Object doInBackground(Object[] objects) {
- retrieveMediaAsync(callback);
- return null;
- }
- }.execute();
- }
-
- private void retrieveMediaAsync(Callback callback) {
- initializationLock.lock();
-
- try {
- if (mCurrentState == State.NON_INITIALIZED) {
- mCurrentState = State.INITIALIZING;
-
- int slashPos = CATALOG_URL.lastIndexOf('/');
- String path = CATALOG_URL.substring(0, slashPos + 1);
- JSONObject jsonObj = parseUrl(CATALOG_URL);
-
- JSONArray tracks = jsonObj.getJSONArray(JSON_MUSIC);
- if (tracks != null) {
- for (int j = 0; j < tracks.length(); j++) {
- MediaMetadata item = buildFromJSON(tracks.getJSONObject(j), path);
- String genre = item.getString(MediaMetadata.METADATA_KEY_GENRE);
- List<MediaMetadata> list = mMusicListByGenre.get(genre);
- if (list == null) {
- list = new ArrayList<>();
- }
- list.add(item);
- mMusicListByGenre.put(genre, list);
- mMusicListById.put(item.getString(MediaMetadata.METADATA_KEY_MEDIA_ID),
- item);
- }
- }
- mCurrentState = State.INITIALIZED;
- }
- } catch (RuntimeException | JSONException e) {
- LogHelper.e(TAG, e, "Could not retrieve music list");
- } finally {
- if (mCurrentState != State.INITIALIZED) {
- // Something bad happened, so we reset state to NON_INITIALIZED to allow
- // retries (eg if the network connection is temporary unavailable)
- mCurrentState = State.NON_INITIALIZED;
- }
- initializationLock.unlock();
- if (callback != null) {
- callback.onMusicCatalogReady(mCurrentState == State.INITIALIZED);
- }
- }
- }
-
- private MediaMetadata buildFromJSON(JSONObject json, String basePath) throws JSONException {
- String title = json.getString(JSON_TITLE);
- String album = json.getString(JSON_ALBUM);
- String artist = json.getString(JSON_ARTIST);
- String genre = json.getString(JSON_GENRE);
- String source = json.getString(JSON_SOURCE);
- String iconUrl = json.getString(JSON_IMAGE);
- int trackNumber = json.getInt(JSON_TRACK_NUMBER);
- int totalTrackCount = json.getInt(JSON_TOTAL_TRACK_COUNT);
- int duration = json.getInt(JSON_DURATION) * 1000; // ms
-
- LogHelper.d(TAG, "Found music track: ", json);
-
- // Media is stored relative to JSON file
- if (!source.startsWith("http")) {
- source = basePath + source;
- }
- if (!iconUrl.startsWith("http")) {
- iconUrl = basePath + iconUrl;
- }
- // Since we don't have a unique ID in the server, we fake one using the hashcode of
- // the music source. In a real world app, this could come from the server.
- String id = String.valueOf(source.hashCode());
-
- // Adding the music source to the MediaMetadata (and consequently using it in the
- // mediaSession.setMetadata) is not a good idea for a real world music app, because
- // the session metadata can be accessed by notification listeners. This is done in this
- // sample for convenience only.
- return new MediaMetadata.Builder()
- .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, id)
- .putString(CUSTOM_METADATA_TRACK_SOURCE, source)
- .putString(MediaMetadata.METADATA_KEY_ALBUM, album)
- .putString(MediaMetadata.METADATA_KEY_ARTIST, artist)
- .putLong(MediaMetadata.METADATA_KEY_DURATION, duration)
- .putString(MediaMetadata.METADATA_KEY_GENRE, genre)
- .putString(MediaMetadata.METADATA_KEY_ALBUM_ART_URI, iconUrl)
- .putString(MediaMetadata.METADATA_KEY_TITLE, title)
- .putLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER, trackNumber)
- .putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS, totalTrackCount)
- .build();
- }
-
- /**
- * Download a JSON file from a server, parse the content and return the JSON
- * object.
- *
- * @param urlString
- * @return
- */
- private JSONObject parseUrl(String urlString) {
- InputStream is = null;
- try {
- java.net.URL url = new java.net.URL(urlString);
- URLConnection urlConnection = url.openConnection();
- is = new BufferedInputStream(urlConnection.getInputStream());
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- urlConnection.getInputStream(), "iso-8859-1"), 8);
- StringBuilder sb = new StringBuilder();
- String line = null;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
- return new JSONObject(sb.toString());
- } catch (Exception e) {
- LogHelper.e(TAG, "Failed to parse the json for media list", e);
- return null;
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
- }
-} \ No newline at end of file