Java tutorial
/* * Author: Scott Ware <scoot.software@gmail.com> * Copyright (c) 2015 Scott Ware * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.scooter1556.sms.lib.android.service; import android.app.ProgressDialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.media.MediaBrowserCompat; import android.support.v4.media.MediaBrowserServiceCompat; import android.support.v4.media.MediaDescriptionCompat; import android.support.v4.media.MediaMetadataCompat; import android.util.Log; import android.widget.Toast; import com.google.gson.Gson; import com.loopj.android.http.JsonHttpResponseHandler; import com.scooter1556.sms.lib.android.R; import com.scooter1556.sms.lib.android.domain.MediaElement; import com.scooter1556.sms.lib.android.domain.MediaFolder; import com.scooter1556.sms.lib.android.utils.MediaUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class MediaService extends MediaBrowserServiceCompat { private static final String TAG = "MediaService"; // Media IDs used on MediaBrowser items public static final String MEDIA_ID_ROOT = "__ROOT__"; public static final String MEDIA_ID_FOLDER = "__FOLDER__"; public static final String MEDIA_ID_DIRECTORY = "__DIRECTORY__"; public static final String MEDIA_ID_VIDEO = "__VIDEO__"; public static final String MEDIA_ID_AUDIO = "__AUDIO__"; // REST Client RESTService restService = null; @Override public void onCreate() { super.onCreate(); restService = RESTService.getInstance(); } @Nullable @Override public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) { return new BrowserRoot(MEDIA_ID_FOLDER, null); } @Override public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) { List<MediaBrowserCompat.MediaItem> mediaItems = new ArrayList<>(); if (MEDIA_ID_ROOT.equals(parentId)) { getMediaFolders(result); } else if (parentId.startsWith(MEDIA_ID_FOLDER)) { Long id = MediaUtils.getID(parentId); if (id != null) { getMediaFolderContents(id, result); } } else if (parentId.startsWith(MEDIA_ID_DIRECTORY)) { } else if (parentId.startsWith(MEDIA_ID_VIDEO)) { } else if (parentId.startsWith(MEDIA_ID_AUDIO)) { } else { Log.w(TAG, "Media ID not recognised: " + parentId); } } // // Media Fetchers // private void getMediaFolders(@NonNull final Result<List<MediaBrowserCompat.MediaItem>> result) { restService.getMediaFolders(getApplicationContext(), new JsonHttpResponseHandler() { @Override public void onStart() { result.detach(); } @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONObject response) { Gson parser = new Gson(); List<MediaBrowserCompat.MediaItem> folders = new ArrayList<>(); MediaFolder folder = parser.fromJson(response.toString(), MediaFolder.class); folders.add(createMediaItemFromMediaFolder(folder)); result.sendResult(folders); } @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONArray response) { Gson parser = new Gson(); List<MediaBrowserCompat.MediaItem> folders = new ArrayList<>(); for (int i = 0; i < response.length(); i++) { try { MediaFolder folder = parser.fromJson(response.getJSONObject(i).toString(), MediaFolder.class); folders.add(createMediaItemFromMediaFolder(folder)); } catch (JSONException e) { Log.e(TAG, "Failed to process JSON", e); } } result.sendResult(folders); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, Throwable throwable, JSONObject response) { Log.w(TAG, "Failed to retrieve media folder list"); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, Throwable throwable, JSONArray response) { Log.w(TAG, "Failed to retrieve media folder list"); } }); } private void getMediaFolderContents(long id, @NonNull final Result<List<MediaBrowserCompat.MediaItem>> result) { restService.getMediaFolderContents(getApplicationContext(), id, new JsonHttpResponseHandler() { @Override public void onStart() { result.detach(); } @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONObject response) { Gson parser = new Gson(); List<MediaBrowserCompat.MediaItem> elements = new ArrayList<>(); MediaElement element = parser.fromJson(response.toString(), MediaElement.class); elements.add(createMediaItemFromMediaElement(element)); result.sendResult(elements); } @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONArray response) { Gson parser = new Gson(); List<MediaBrowserCompat.MediaItem> elements = new ArrayList<>(); for (int i = 0; i < response.length(); i++) { MediaElement element = parser.fromJson(response.toString(), MediaElement.class); elements.add(createMediaItemFromMediaElement(element)); } result.sendResult(elements); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, Throwable throwable, JSONObject response) { Log.w(TAG, "Failed to retrieve media folder contents"); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, Throwable throwable, JSONArray response) { Log.w(TAG, "Failed to retrieve media folder contents"); } }); } // // Helper Functions // private MediaBrowserCompat.MediaItem createMediaItemFromMediaFolder(@NonNull MediaFolder folder) { MediaDescriptionCompat description = new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_FOLDER + MediaUtils.SEPARATOR + String.valueOf(folder.getID())) .setTitle(folder.getName()).setSubtitle(String.format(getString(R.string.media_folder_subtitle), folder.getFiles(), folder.getFolders())) .build(); return new MediaBrowserCompat.MediaItem(description, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE); } private MediaBrowserCompat.MediaItem createMediaItemFromMediaElement(@NonNull MediaElement element) { switch (element.getType()) { case MediaElement.MediaElementType.DIRECTORY: MediaDescriptionCompat dirDescription = new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_DIRECTORY + MediaUtils.SEPARATOR + String.valueOf(element.getID())) .setTitle(element.getTitle()).build(); return new MediaBrowserCompat.MediaItem(dirDescription, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE); case MediaElement.MediaElementType.AUDIO: MediaDescriptionCompat audDescription = new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_AUDIO + MediaUtils.SEPARATOR + String.valueOf(element.getID())) .setTitle(element.getTitle()).build(); return new MediaBrowserCompat.MediaItem(audDescription, MediaBrowserCompat.MediaItem.FLAG_PLAYABLE); case MediaElement.MediaElementType.VIDEO: MediaDescriptionCompat vidDescription = new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_VIDEO + MediaUtils.SEPARATOR + String.valueOf(element.getID())) .setTitle(element.getTitle()).build(); return new MediaBrowserCompat.MediaItem(vidDescription, MediaBrowserCompat.MediaItem.FLAG_PLAYABLE); default: Log.i(TAG, "Unknown media type for media element with id " + element.getID()); return null; } } }