18
18
19
19
import android .content .Context ;
20
20
import android .graphics .Bitmap ;
21
+ import android .graphics .PorterDuff ;
21
22
import android .os .Handler ;
22
23
import android .os .Message ;
24
+ import android .support .v4 .content .ContextCompat ;
23
25
import android .util .AttributeSet ;
24
26
import android .util .Log ;
25
27
import android .view .Gravity ;
30
32
import android .view .ViewGroup ;
31
33
import android .view .accessibility .AccessibilityEvent ;
32
34
import android .view .accessibility .AccessibilityNodeInfo ;
35
+ import android .widget .AdapterView ;
36
+ import android .widget .ArrayAdapter ;
33
37
import android .widget .FrameLayout ;
34
38
import android .widget .ImageButton ;
35
39
import android .widget .ImageView ;
38
42
import android .widget .SeekBar .OnSeekBarChangeListener ;
39
43
import android .widget .TextView ;
40
44
45
+ import com .atomjack .shared .Logger ;
46
+
41
47
import java .lang .ref .WeakReference ;
48
+ import java .util .ArrayList ;
42
49
import java .util .Formatter ;
43
50
import java .util .Locale ;
44
51
@@ -104,6 +111,11 @@ public class VideoControllerView extends FrameLayout {
104
111
private ImageView mPoster ;
105
112
private Bitmap mPosterBitmap ;
106
113
private ViewGroup mMediaControllerPosterContainer ;
114
+ private CustomSpinner mBitrateSpinner ;
115
+ private boolean mBitrateSpinnerIsOpen = false ;
116
+ private String mCurrentVideoQuality ;
117
+
118
+ private BitrateChangeListener mBitrateChangeListener ;
107
119
108
120
public VideoControllerView (Context context , AttributeSet attrs ) {
109
121
super (context , attrs );
@@ -125,7 +137,6 @@ public VideoControllerView(Context context, boolean useFastForward) {
125
137
126
138
public VideoControllerView (Context context ) {
127
139
this (context , true );
128
-
129
140
Log .i (TAG , TAG );
130
141
}
131
142
@@ -242,6 +253,69 @@ public boolean onTouch(View v, MotionEvent event) {
242
253
if (mPosterBitmap != null )
243
254
mPoster .setImageBitmap (mPosterBitmap );
244
255
256
+ mBitrateSpinner = (CustomSpinner ) v .findViewById (R .id .bitrateSpinner );
257
+ if (mBitrateSpinner != null ) {
258
+
259
+ mBitrateSpinner .getBackground ().setColorFilter (ContextCompat .getColor (mContext , R .color .white ), PorterDuff .Mode .SRC_ATOP );
260
+
261
+ final ArrayList <String > list = new ArrayList <>(VoiceControlForPlexApplication .localVideoQualityOptions .keySet ());
262
+ ArrayAdapter <String > adapter = new ArrayAdapter <String >(mContext , R .layout .bitrate_dropdown_item , list ) {
263
+ @ Override
264
+ public View getView (int position , View convertView , ViewGroup parent ) {
265
+ TextView textView = (TextView )super .getView (position , convertView , parent );
266
+ textView .setTextColor (ContextCompat .getColor (mContext , R .color .white ));
267
+ return textView ;
268
+ }
269
+
270
+ @ Override
271
+ public View getDropDownView (int position , View convertView , ViewGroup parent ) {
272
+ TextView textView = (TextView )super .getDropDownView (position , convertView , parent );
273
+ textView .setTextColor (ContextCompat .getColor (mContext , textView .getText ().equals (mCurrentVideoQuality ) ? R .color .black : R .color .white ));
274
+ textView .setBackgroundColor (ContextCompat .getColor (mContext , textView .getText ().equals (mCurrentVideoQuality ) ? R .color .white : R .color .mediaControllerBackground ));
275
+ return textView ;
276
+ }
277
+ };
278
+ mBitrateSpinner .setAdapter (adapter );
279
+
280
+ mBitrateSpinner .setSelection (list .indexOf (mCurrentVideoQuality ), false );
281
+
282
+ mBitrateSpinner .setOnItemSelectedListener (new AdapterView .OnItemSelectedListener () {
283
+ @ Override
284
+ public void onItemSelected (AdapterView <?> parent , View view , int position , long id ) {
285
+ String item = list .get (position );
286
+ // Only notify the activity if the bitrate clicked on is not the current one
287
+ if (mBitrateChangeListener != null && !item .equals (mCurrentVideoQuality )) {
288
+ hide ();
289
+ mBitrateChangeListener .onBitrateChange (item );
290
+ }
291
+ }
292
+
293
+ @ Override
294
+ public void onNothingSelected (AdapterView <?> parent ) {
295
+
296
+ }
297
+ });
298
+
299
+
300
+ mBitrateSpinner .setSpinnerEventsListener (new CustomSpinner .OnSpinnerEventsListener () {
301
+ @ Override
302
+ public void onSpinnerOpened () {
303
+ mBitrateSpinnerIsOpen = true ;
304
+ }
305
+
306
+ @ Override
307
+ public void onSpinnerClosed () {
308
+ mBitrateSpinnerIsOpen = false ;
309
+ // hide the controller after 3 seconds
310
+ Message msg = mHandler .obtainMessage (FADE_OUT );
311
+ mHandler .removeMessages (FADE_OUT );
312
+ mHandler .sendMessageDelayed (msg , sDefaultTimeout );
313
+ }
314
+ });
315
+
316
+
317
+ }
318
+
245
319
mProgress = (SeekBar ) v .findViewById (R .id .mediacontroller_progress );
246
320
if (mProgress != null ) {
247
321
if (mProgress instanceof SeekBar ) {
@@ -326,7 +400,7 @@ public void show(int timeout) {
326
400
mHandler .sendEmptyMessage (SHOW_PROGRESS );
327
401
328
402
Message msg = mHandler .obtainMessage (FADE_OUT );
329
- if (timeout != 0 ) {
403
+ if (timeout != 0 ) {
330
404
mHandler .removeMessages (FADE_OUT );
331
405
mHandler .sendMessageDelayed (msg , timeout );
332
406
}
@@ -738,7 +812,8 @@ public void handleMessage(Message msg) {
738
812
int pos ;
739
813
switch (msg .what ) {
740
814
case FADE_OUT :
741
- view .hide ();
815
+ if (!view .mBitrateSpinnerIsOpen )
816
+ view .hide ();
742
817
break ;
743
818
case SHOW_PROGRESS :
744
819
pos = view .setProgress ();
@@ -756,4 +831,16 @@ public void setPoster(Bitmap bitmap) {
756
831
if (mPoster != null )
757
832
mPoster .setImageBitmap (bitmap );
758
833
}
834
+
835
+ public void setCurrentVideoQuality (String videoQuality ) {
836
+ mCurrentVideoQuality = videoQuality ;
837
+ }
838
+
839
+ public void setBitrateChangeListener (BitrateChangeListener listener ) {
840
+ mBitrateChangeListener = listener ;
841
+ }
842
+
843
+ public interface BitrateChangeListener {
844
+ void onBitrateChange (String bitrate );
845
+ }
759
846
}
0 commit comments