Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / player / service / AudiobookLibrary.java
1 /*
2  * Copyright 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.moiseum.wolnelektury.view.player.service;
18
19 import android.content.Context;
20 import android.support.v4.media.MediaBrowserCompat;
21 import android.support.v4.media.MediaMetadataCompat;
22
23 import com.moiseum.wolnelektury.connection.models.BookDetailsModel;
24 import com.moiseum.wolnelektury.connection.models.MediaModel;
25 import com.moiseum.wolnelektury.utils.StringUtils;
26
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.TreeMap;
31
32
33 public class AudiobookLibrary {
34
35     private static final TreeMap<String, MediaMetadataCompat> music = new TreeMap<>();
36 //    private static final HashMap<String, Integer> albumRes = new HashMap<>();
37     private static final HashMap<String, String> musicFileName = new HashMap<>();
38
39     public static String getRoot() {
40         return "root";
41     }
42
43 //    private static String getAlbumArtUri(String albumArtResName) {
44 //        return ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
45 //                BuildConfig.APPLICATION_ID + "/drawable/" + albumArtResName;
46 //    }
47
48     public static String getMusicFilename(String mediaId) {
49         return musicFileName.containsKey(mediaId) ? musicFileName.get(mediaId) : null;
50     }
51
52 //    private static int getAlbumRes(String mediaId) {
53 //        return albumRes.containsKey(mediaId) ? albumRes.get(mediaId) : 0;
54 //    }
55
56 //    public static Bitmap getAlbumBitmap(Context context, String mediaId) {
57 //        return BitmapFactory.decodeResource(context.getResources(),
58 //                AudiobookLibrary.getAlbumRes(mediaId));
59 //    }
60
61     public static List<MediaBrowserCompat.MediaItem> getMediaItems() {
62         List<MediaBrowserCompat.MediaItem> result = new ArrayList<>();
63         for (MediaMetadataCompat metadata : music.values()) {
64             result.add(
65                     new MediaBrowserCompat.MediaItem(
66                             metadata.getDescription(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE));
67         }
68         return result;
69     }
70
71     public static MediaMetadataCompat getMetadata(Context context, String mediaId) {
72         MediaMetadataCompat metadataWithoutBitmap = music.get(mediaId);
73 //        Bitmap albumArt = getAlbumBitmap(context, mediaId);
74
75         // Since MediaMetadataCompat is immutable, we need to create a copy to set the album art.
76         // We don't set it initially on all items so that they don't take unnecessary memory.
77         MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
78         for (String key :
79                 new String[]{
80                         MediaMetadataCompat.METADATA_KEY_MEDIA_ID,
81                                 MediaMetadataCompat.METADATA_KEY_TITLE,
82                                 MediaMetadataCompat.METADATA_KEY_ARTIST,
83                         MediaMetadataCompat.METADATA_KEY_ALBUM,
84                                 MediaMetadataCompat.METADATA_KEY_AUTHOR,
85                                 MediaMetadataCompat.METADATA_KEY_GENRE,
86                                 MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI
87                 }) {
88             builder.putString(key, metadataWithoutBitmap.getString(key));
89         }
90         builder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, metadataWithoutBitmap.getLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER));
91             builder.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, metadataWithoutBitmap.getLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS));
92 //        builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt);
93         return builder.build();
94     }
95
96         public static void createAudiobookMetadata(BookDetailsModel book) {
97         music.clear();
98         int index = 0;
99                 List<MediaModel> medias = book.getAudiobookMediaModels();
100
101                 for (MediaModel model : medias) {
102                         createMediaMetadataCompat(
103                                         model.getUrl(),
104                                         model.getName(),
105                                         model.getArtist(),
106                                         book.getTitle(),
107                                         StringUtils.joinCategory(book.getAuthors(), ", "),
108                                         StringUtils.joinCategory(book.getGenres(), ", "),
109                                         book.getCoverThumb(),
110                                         model.getUrl(),
111                                         index++,
112                                         medias.size()
113                         );
114                 }
115         }
116
117     private static void createMediaMetadataCompat(
118             String mediaId,
119             String title,
120             String artist,
121             String album,
122                         String author,
123             String genre,
124                         String artUrl,
125             String musicFilename,
126             int trackNumber,
127             int tracksCount
128     ) {
129         music.put(
130                 mediaId,
131                 new MediaMetadataCompat.Builder()
132                         .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, mediaId)
133                                 .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
134                         .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
135                                 .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album)
136                                 .putString(MediaMetadataCompat.METADATA_KEY_AUTHOR, author)
137                         .putString(MediaMetadataCompat.METADATA_KEY_GENRE, genre)
138                                 .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, artUrl)
139 //                        .putString(
140 //                                MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI,
141 //                                getAlbumArtUri(albumArtResName))
142                                 .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, trackNumber)
143                                 .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, tracksCount)
144                         .build());
145 //        albumRes.put(mediaId, albumArtResId);
146         musicFileName.put(mediaId, musicFilename);
147     }
148 }