com.scooter1556.sms.lib.android.service.MediaService.java Source code

Java tutorial

Introduction

Here is the source code for com.scooter1556.sms.lib.android.service.MediaService.java

Source

/*
 * 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;
        }
    }
}