1 /*
2  * Copyright (C) 2014 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 package com.android.onemedia.playback;
17 
18 import android.content.Context;
19 import android.media.MediaPlayer;
20 import android.os.Bundle;
21 
22 import java.util.ArrayList;
23 import java.util.List;
24 
25 /**
26  * TODO: Insert description here. (generated by epastern)
27  */
28 public abstract class Renderer {
29     public static final String FEATURE_SET_CONTENT = "com.android.media.SET_CONTENT";
30     public static final String FEATURE_SET_NEXT_CONTENT = "com.android.media.SET_NEXT_CONTENT";
31     public static final String FEATURE_PLAY = "com.android.media.PLAY";
32     public static final String FEATURE_PAUSE = "com.android.media.PAUSE";
33     public static final String FEATURE_NEXT = "com.android.media.NEXT";
34     public static final String FEATURE_PREVIOUS = "com.android.media.PREVIOUS";
35     public static final String FEATURE_SEEK_TO = "com.android.media.SEEK_TO";
36     public static final String FEATURE_STOP = "com.android.media.STOP";
37     // TODO move states somewhere else
38     public static final int STATE_ERROR = 0;
39     /**
40      * The state MediaPlayerManager starts in before any action has been
41      * performed.
42      */
43     public static final int STATE_INIT = 1 << 0;
44     /**
45      * Indicates the source has been set and it is being prepared/buffered
46      * before starting playback.
47      */
48     public static final int STATE_PREPARING = 1 << 1;
49     /**
50      * The media is ready and playback can be started.
51      */
52     public static final int STATE_READY = 1 << 2;
53     /**
54      * The media is currently playing.
55      */
56     public static final int STATE_PLAYING = 1 << 3;
57     /**
58      * The media is currently paused.
59      */
60     public static final int STATE_PAUSED = 1 << 4;
61     /**
62      * The service has been stopped and cannot be started again until a new
63      * source has been set.
64      */
65     public static final int STATE_STOPPED = 1 << 5;
66     /**
67      * The playback has reached the end. It can be restarted by calling play().
68      */
69     public static final int STATE_ENDED = 1 << 6;
70 
71     // TODO decide on proper way of describing features
72     protected List<String> mFeatures = new ArrayList<String>();
73     protected List<Listener> mListeners = new ArrayList<Listener>();
74 
Renderer(Context context, Bundle params)75     public Renderer(Context context, Bundle params) {
76         onCreate(params);
77         initFeatures(params);
78     }
79 
setContent(Bundle request)80     abstract public void setContent(Bundle request);
81 
onCreate(Bundle params)82     public void onCreate(Bundle params) {
83         // Do nothing by default
84     }
85 
setNextContent(Bundle request)86     public void setNextContent(Bundle request) {
87         throw new UnsupportedOperationException("setNextContent() is not supported.");
88     }
89 
getFeatures()90     public List<String> getFeatures() {
91         return mFeatures;
92     }
93 
onPlay()94     public boolean onPlay() {
95         // TODO consider making these log warnings instead of crashes (or
96         // Log.wtf)
97         // throw new UnsupportedOperationException("play is not supported.");
98         return false;
99     }
100 
onPause()101     public boolean onPause() {
102         // throw new UnsupportedOperationException("pause is not supported.");
103         return false;
104     }
105 
onNext()106     public boolean onNext() {
107         // throw new UnsupportedOperationException("next is not supported.");
108         return false;
109     }
110 
onPrevious()111     public boolean onPrevious() {
112         // throw new
113         // UnsupportedOperationException("previous is not supported.");
114         return false;
115     }
116 
onStop()117     public boolean onStop() {
118         // throw new UnsupportedOperationException("stop is not supported.");
119         return false;
120     }
121 
onSeekTo(int time)122     public boolean onSeekTo(int time) {
123         // throw new UnsupportedOperationException("seekTo is not supported.");
124         return false;
125     }
126 
getSeekPosition()127     public long getSeekPosition() {
128         // throw new
129         // UnsupportedOperationException("getSeekPosition is not supported.");
130         return -1;
131     }
132 
getDuration()133     public long getDuration() {
134         // throw new
135         // UnsupportedOperationException("getDuration is not supported.");
136         return -1;
137     }
138 
getPlayState()139     public int getPlayState() {
140         // throw new
141         // UnsupportedOperationException("getPlayState is not supported.");
142         return 0;
143     }
144 
onDestroy()145     public void onDestroy() {
146         // Do nothing by default
147     }
148 
registerListener(Listener listener)149     public void registerListener(Listener listener) {
150         if (!mListeners.contains(listener)) {
151             mListeners.add(listener);
152         }
153     }
154 
unregisterListener(Listener listener)155     public void unregisterListener(Listener listener) {
156         mListeners.remove(listener);
157     }
158 
initFeatures(Bundle params)159     protected void initFeatures(Bundle params) {
160         mFeatures.add(FEATURE_SET_CONTENT);
161     }
162 
pushOnError(int type, int extra, Bundle extras, Throwable error)163     protected void pushOnError(int type, int extra, Bundle extras, Throwable error) {
164         for (Listener listener : mListeners) {
165             listener.onError(type, extra, extras, error);
166         }
167     }
168 
pushOnStateChanged(int newState)169     protected void pushOnStateChanged(int newState) {
170         for (Listener listener : mListeners) {
171             listener.onStateChanged(newState);
172         }
173     }
174 
pushOnBufferingUpdate(int percent)175     protected void pushOnBufferingUpdate(int percent) {
176         for (Listener listener : mListeners) {
177             listener.onBufferingUpdate(percent);
178         }
179     }
180 
pushOnFocusLost()181     protected void pushOnFocusLost() {
182         for (Listener listener : mListeners) {
183             listener.onFocusLost();
184         }
185     }
186 
pushOnNextStarted()187     protected void pushOnNextStarted() {
188         for (Listener listener : mListeners) {
189             listener.onNextStarted();
190         }
191     }
192 
193     public interface Listener {
194         public static final int ERROR_LOAD_FAILED = 1770;
195         public static final int ERROR_PREPARE_ERROR = 1771;
196         public static final int ERROR_PLAYBACK_FAILED = 1772;
197 
198         /**
199          * When an error occurs onError will be called but not onStateChanged.
200          * The Manager will remain in the error state until
201          * {@link #setContent()} is called again.
202          */
onError(int type, int extra, Bundle extras, Throwable error)203         public void onError(int type, int extra, Bundle extras,
204                 Throwable error);
205 
206         /**
207          * onStateChanged will be called whenever the state of the manager
208          * transitions except to an error state.
209          */
onStateChanged(int newState)210         public void onStateChanged(int newState);
211 
212         /**
213          * This is a passthrough of
214          * {@link MediaPlayer.OnBufferingUpdateListener}.
215          */
onBufferingUpdate(int percent)216         public void onBufferingUpdate(int percent);
217 
218         /**
219          * Called when audio focus is lost and it is not transient or ducking.
220          */
onFocusLost()221         public void onFocusLost();
222 
223         /**
224          * Called when the next item was started playing. Only called if a next
225          * item has been set and the current item has ended.
226          */
onNextStarted()227         public void onNextStarted();
228     }
229 }
230