From e31747e44b68ffbb839013d32ec3d303254e6b1c Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Sun, 29 Dec 2013 19:31:42 +0100 Subject: [PATCH] Added shuffle and repeat functionality. --- README.md | 4 + res/drawable-hdpi/ic_action_next.png | Bin 0 -> 455 bytes res/drawable-hdpi/ic_action_pause.png | Bin 0 -> 185 bytes res/drawable-hdpi/ic_action_play.png | Bin 0 -> 440 bytes res/drawable-hdpi/ic_action_previous.png | Bin 0 -> 473 bytes res/drawable-hdpi/ic_action_repeat.png | Bin 0 -> 608 bytes res/drawable-hdpi/ic_action_shuffle.png | Bin 0 -> 651 bytes res/drawable-hdpi/ic_media_next.png | Bin 1073 -> 0 bytes res/drawable-hdpi/ic_media_pause.png | Bin 599 -> 0 bytes res/drawable-hdpi/ic_media_play.png | Bin 1163 -> 0 bytes res/drawable-hdpi/ic_media_previous.png | Bin 1067 -> 0 bytes res/drawable-mdpi/ic_action_next.png | Bin 0 -> 334 bytes res/drawable-mdpi/ic_action_pause.png | Bin 0 -> 181 bytes res/drawable-mdpi/ic_action_play.png | Bin 0 -> 339 bytes res/drawable-mdpi/ic_action_previous.png | Bin 0 -> 337 bytes res/drawable-mdpi/ic_action_repeat.png | Bin 0 -> 470 bytes res/drawable-mdpi/ic_action_shuffle.png | Bin 0 -> 482 bytes res/drawable-mdpi/ic_media_next.png | Bin 843 -> 0 bytes res/drawable-mdpi/ic_media_pause.png | Bin 540 -> 0 bytes res/drawable-mdpi/ic_media_play.png | Bin 897 -> 0 bytes res/drawable-mdpi/ic_media_previous.png | Bin 837 -> 0 bytes res/drawable-xhdpi/ic_action_next.png | Bin 0 -> 510 bytes res/drawable-xhdpi/ic_action_pause.png | Bin 0 -> 232 bytes res/drawable-xhdpi/ic_action_play.png | Bin 0 -> 522 bytes res/drawable-xhdpi/ic_action_previous.png | Bin 0 -> 528 bytes res/drawable-xhdpi/ic_action_repeat.png | Bin 0 -> 774 bytes res/drawable-xhdpi/ic_action_shuffle.png | Bin 0 -> 853 bytes res/drawable-xhdpi/ic_media_next.png | Bin 1364 -> 0 bytes res/drawable-xhdpi/ic_media_pause.png | Bin 685 -> 0 bytes res/drawable-xhdpi/ic_media_play.png | Bin 1617 -> 0 bytes res/drawable-xhdpi/ic_media_previous.png | Bin 1372 -> 0 bytes res/drawable-xxhdpi/ic_action_next.png | Bin 0 -> 692 bytes res/drawable-xxhdpi/ic_action_pause.png | Bin 0 -> 297 bytes res/drawable-xxhdpi/ic_action_play.png | Bin 0 -> 669 bytes res/drawable-xxhdpi/ic_action_previous.png | Bin 0 -> 714 bytes res/drawable-xxhdpi/ic_action_repeat.png | Bin 0 -> 1104 bytes res/drawable-xxhdpi/ic_action_shuffle.png | Bin 0 -> 1260 bytes res/layout/route_fragment.xml | 14 ++++ res/values/colors.xml | 1 + res/values/strings.xml | 2 + .../controldlna/gui/RouteFragment.java | 59 ++++++++++++--- .../mediarouter/MediaRouterPlayService.java | 71 +++++++++++++++--- 42 files changed, 129 insertions(+), 22 deletions(-) create mode 100644 res/drawable-hdpi/ic_action_next.png create mode 100644 res/drawable-hdpi/ic_action_pause.png create mode 100644 res/drawable-hdpi/ic_action_play.png create mode 100644 res/drawable-hdpi/ic_action_previous.png create mode 100644 res/drawable-hdpi/ic_action_repeat.png create mode 100644 res/drawable-hdpi/ic_action_shuffle.png delete mode 100644 res/drawable-hdpi/ic_media_next.png delete mode 100644 res/drawable-hdpi/ic_media_pause.png delete mode 100644 res/drawable-hdpi/ic_media_play.png delete mode 100644 res/drawable-hdpi/ic_media_previous.png create mode 100644 res/drawable-mdpi/ic_action_next.png create mode 100644 res/drawable-mdpi/ic_action_pause.png create mode 100644 res/drawable-mdpi/ic_action_play.png create mode 100644 res/drawable-mdpi/ic_action_previous.png create mode 100644 res/drawable-mdpi/ic_action_repeat.png create mode 100644 res/drawable-mdpi/ic_action_shuffle.png delete mode 100644 res/drawable-mdpi/ic_media_next.png delete mode 100644 res/drawable-mdpi/ic_media_pause.png delete mode 100644 res/drawable-mdpi/ic_media_play.png delete mode 100644 res/drawable-mdpi/ic_media_previous.png create mode 100644 res/drawable-xhdpi/ic_action_next.png create mode 100644 res/drawable-xhdpi/ic_action_pause.png create mode 100644 res/drawable-xhdpi/ic_action_play.png create mode 100644 res/drawable-xhdpi/ic_action_previous.png create mode 100644 res/drawable-xhdpi/ic_action_repeat.png create mode 100644 res/drawable-xhdpi/ic_action_shuffle.png delete mode 100644 res/drawable-xhdpi/ic_media_next.png delete mode 100644 res/drawable-xhdpi/ic_media_pause.png delete mode 100644 res/drawable-xhdpi/ic_media_play.png delete mode 100644 res/drawable-xhdpi/ic_media_previous.png create mode 100644 res/drawable-xxhdpi/ic_action_next.png create mode 100644 res/drawable-xxhdpi/ic_action_pause.png create mode 100644 res/drawable-xxhdpi/ic_action_play.png create mode 100644 res/drawable-xxhdpi/ic_action_previous.png create mode 100644 res/drawable-xxhdpi/ic_action_repeat.png create mode 100644 res/drawable-xxhdpi/ic_action_shuffle.png diff --git a/README.md b/README.md index 3232646..751db3c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ Android Support Library and [Cling](http://4thline.org/projects/cling/) are requ Binaries for Cling are included in the libs folder. +## Icons + +All icons are taken from the Android project. + ## License [BSD 3-Clause License](LICENSE.md) \ No newline at end of file diff --git a/res/drawable-hdpi/ic_action_next.png b/res/drawable-hdpi/ic_action_next.png new file mode 100644 index 0000000000000000000000000000000000000000..71076e4678319b56373cac84ef932f904da236ce GIT binary patch literal 455 zcmV;&0XY7NP)`EqH|-AC ztzZol{F*gVa0n-Gw}LhBw;yH=~lS-SI}x%>AOG(A%qY@$QSYwU;wP5tOr>;c*Ot!002ovPDHLkV1hw>#n=D< literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_action_pause.png b/res/drawable-hdpi/ic_action_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..535ad58b3892212f211d4884d486ed02d52a0d98 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G(Vi}jAr-gYT-?apV8G*guqLc&?u^d432M&1sah>Nt}ofR zc#ctFVdQ&MBb@0Go(DMF0Q* literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_action_play.png b/res/drawable-hdpi/ic_action_play.png new file mode 100644 index 0000000000000000000000000000000000000000..e22b0997f42a16ccfa74471eb9c7a4903a29adb0 GIT binary patch literal 440 zcmV;p0Z0CcP){7H<5%H`K_$>Kg1$g8G5EmJ}i~wOi_L`3cBS4rBnO57r@=*-bsvFJ6h84i)W2^aC zG6ID8IL5k`qyPx7CFggqB`E>CN(EW70{DE$wdB+_A7cUVS_IdUIU_)4O-5GF4gSjW zykP@y@BxKi7{5RT*C^hxwa``H`X5^c?(nWlpN|DVTBJhZHRBYjwRji%;JyJG9g8=% zJ#g2;uWXCV=}4>?H}Q|YbvNK(hyu`PK$|RqCU5q6^~(BB4d8Sv)e{j+N i;4qm?Cet(h3orn6;h&n$Xvly700004ifKoGQ%zb+sYkOtC# z3&8vx{`NoSPbeS-kOoo!6p#k4ffPUrZ~Tc75bPnvqtQN5(sQn%%uDBM5>Z z2!bGpKZ$W1dxMeeooRU9?9Y=4dEp z`21oQ55KkeJZb^(>c;8w3b($9)pwQxbSC#0tyU~`mw0_1tAKV!p6a)j?cINWEm#WB zZF+L%IbPeSwFCHI;%Bs30rVO(kUcD0<5vKS_9k;y>(7fz(mXe);KtOYi;e1=z9Rx z*g;Hi_SO?d@9a%Ho%>d6D7VA=r?mE#j$Ayoqdz|gf*=TjAP6E3z62Nm$a#uLels^K P00000NkvXXu0mjfzrw|? literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_action_repeat.png b/res/drawable-hdpi/ic_action_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..773e2de174ae03376650762fcb218a12034d7e28 GIT binary patch literal 608 zcmV-m0-ybfP)Vzyb_F zdT$2^y@z|@UV4Y#VSq9K86XUh1u_5~fC1=x)r%A?$FW^w6Um=s1tCbj_y4^_Q9wXI zKtOGiI<7{hhT7`upmz%+@!!X>jzUIjIr6&P_gGJuL|?SXh37=bt5h***Qj`Gqc4%!ir zkVkKv;G8Xy!#sbHc>WW}mnKEL6p-J;&Gxn@afbnz`)hb!t=)yFV5i*I=!v7Fl&Pq2 zFQ#)~Ch+{xVZJXK^3+PT=RnHk;lWX-`D!}~$S*0qo|O%toV*EVUnni$2Wzg$cN&%r z`M-uDss+_aTst5?=bV&rg`L=z5{alUo8Uk98A)=nLD9~CnhoD@o*bysUc?<9sevdO zQNZUd*IM82J(VfKQ;t)mn?g6bgStWHsEuZvlS=J2+K?x2Yy?B?Uf#zj^LxO_XdiH` zLTQ1?1ueXDfHKL=aFBgS^1ZMu=4KtDaUs(}Ov4jC^uLt6u#J-L$UKv;RmjUCFs8!w zu{s`fL?i3z#Y@Sev9&BQY7@Q13_C+aA+CJCf9ZWMMBCSjlNS#Ir59VYk1iaj()$?D u=p!&SH0f;HsLANd@lEw5b zTq?jSuoCRd7%MG`c%pT&1HYfL0n9*v2o&=LwuhJg+*o-qMP@YHk!Cph+xHO1Dl#B1t>v}qcWKJ^y9p44E_9B3Zy zNNMFzuV|yoF@v6*M~?!SC= z?#wMllXsf0Eit}-bnbD>?=|Nhv+rk)ExkH*%dg@sACEFD&~VteRrG+H{86!uJlQ9c zHfBsY_9E-WvaJ%8Dr*Tza{^+^x^g zH+!ADd#-)c{19c*arZX}->u=Do1=(+$6!>I@7Wj935k zEj}#In|k->req(T2I=D~BRN(bySw-Q)!6Ck$KU4_JQkS5AjLELb^Y(Xv6t`12j2eK z+rr@B5|Vg)-(+jwRhz4e975Pvy^N8$f5SO${WaErP|--u+YeG1Le_Sic>Hp`-S(~L z-f^Zc;7U5R8EoQN&z>)n7(xU&v-#K67QcL16mRx8t7m!=^P*#C?C1UXc3eHqZ2szy z+&Mo!G6W`Poi<;7ERQ8|zxcYA&pD6wGk8qd-58%Y|M$Cp@~yo$=Oy$RZf;dfnzPW4 zp|dD{-fknyLiOxldlxJdj#+-lY)j?CKimynfq!4Vx-MQ9t(9}h=R?QmU#l(7ep>P~ zhTS0~*7&>1t}pSLEc@N3*Zs}tYG@06+!h*gZO8RnOmCWA>rAu%{iyQB`^cuuW06h* zI&5#6l22XTobD2GI#fMZd=jIMfpRtT{lv{}y+==9*`3!Y`E6Bvm)Lp}{+W%}w4eOn zVfF9w>bkHl{fKV;KVC*D8JqY0ziYMY)}?j3UaeaDkI8pq;7i3bZLPqpBwFGcQQ};b znpl#VpQjL#nVZUBu5VRWe9bDua=Mp`k7i8JLF{8d{l} zS{WMX8dz8v7-;pr`HP| kC#5R5WfrBD=NDxcD>w(67H)lP22{u3>FVdQ&MBb@0Eiagk^lez diff --git a/res/drawable-hdpi/ic_media_pause.png b/res/drawable-hdpi/ic_media_pause.png deleted file mode 100644 index 1d465a41e4b087624ae5a4cb096aab184e9ca385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+(IDCccpZxz@0!tqFuMgM}_ z3T@4f=>}I?mz~|CC#BkH?AbCcY(~A|*n{@108Jgrt52XwcnW~7`1kbX8xPocPfn&*aV9GC*8iq>C(n~{y_8fTE*<$ zO3kTWO79;xcFgk=47@8_;>6^mQo4&XIL>gn-_NQ9H~BJ~ikervUqiH>74MJ9$^FkJ zb!Vcj_1UW_p%XOveogi5Ua?@oqr#P6m+lbSzQtr(c$3KvzMl-o?}a}1zT?**AHcxk z072Fc*`HPO6yrBdz7!Fcx%jrA0@JMYq*Dh~&IbgtxY(`}e#CIY#Ax^7qC&Z~ix%E( zyxyC8i*Lh$E^FUy&mS73on?!tzQe1%VA|e)Du2YXI^N$Bxxf0{`u`0qtg(&z7$n=* ztWtXNWH~UvMN3>GN}P*Q6H7Al^Atidb5j}2^^MH*4GrJc3$6z$Pz5PSNi0dVN(QM) zWiT=@G}Hwm1M?6=Ln~8LD?qT!m(~I_>aQuV3Dnn@*AuuA^Q6f5RWe~6kX8Dp3jgVyD zJ-yfvWeMzuT(zF7-FJ4*Z=dIxvvU^sT>tqZ^TDkHkK8^^z^%Pg1^@`KapfMO?7toO zaP9-30}#gf0LG6=0WnhwHe)W2DTVFbvc(b;+?i0S#oB|{Nv03&YhXStM5FViQL@Lu0Sjwwgevfj2 zlK|G8L5>6vn1v_N^W~*BeJ)=t1)`MXBz9QcOT;?%qZJSl!0Zj2x{x{NeK(u0?gpYr zB7p)I$yOp376Bk4FvA}{`^Dvx?>Fbx6uqg7Q)tH$${;IC}0Li z$ja>0(B#XlM2IWA0GKmy319|@SbsG$GM-zB_&eHU1%p^V7_u7xGl+oA#fj00xhByO zl~tL;J**sT?*hO&5m9OVQFeHyDq|t`Y4aH56+)x-4gstak*JpboE&_xS!xXiTjVMp zAcr#57lYew0Y;>{wm3bMeX$V<#A326hcSf;=)=1o+&b(5YOb$7AG!NzDds@-cqJ+oL0O03h+^pYf527seoI zHY2qKV4a}rV|T{>+O5Vy?9~?PgJc=0HGlzLP_(yV=vk!M-y&5!#I!TltpLQ!bVuBb zhILi$t?!Opx3Y){c!For0}axR>y{Y+Ajo=i$F7@Ond-QI0zcRPp#B9Qt-zj>-YtFr z000$qMObu0a%Ew3X>V>IRB3Hx05>l(HZL(T?SB!k0000bbVXQnWMOn=I%9HWVRU5x zGB7bQEio}IFgH{&F*-FhIx#RUFgQ9eFe;7g{Qv*}C3HntbYx+4WjbwdWNBu305UK! zF)cAMEigA!F)=zbH99poEigDbFfatb-k$&f0338hSaefwW^{L9a%BKPWN%_+AVz6& dWp{6KYjYq&Q#En5<2C>Q002ovPDHLkV1lj6{CEHW diff --git a/res/drawable-hdpi/ic_media_previous.png b/res/drawable-hdpi/ic_media_previous.png deleted file mode 100644 index 85b3766904187d57668e88fb7a762f8d97e1b80b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1067 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+(IDCcA^&>@vId_vc*i+4qCtC?lp ze^Pt?rt73*X}+KK-MtYyZ??+)$;Ea*=M~?Z!@T8cSai(mf-S$?!uq!SG1~S^dd-jP zk@3@Si>yBo!5iMM&a-WubVyT4!t^grinETJOgp{5V9T@g7YFo~>4a}~^9+=cR~BB; zSioZZL+Yrg{Gl^5jxJa-l`U+|!(f$wH*Rg-D_JtbKIk;x-NE13#2|84CM|5j`BJOG zkH%}F4qtbu@}A{2$5y<0@t33|o8=qhSUDP%8ozJ2fA@**(>;f+`DzP(zKWUf;woFA zl=w}a1(OAidp5KcS^Dl|J)Ua4H~sVM-RF7U+AL6we`%&y_E}G>+;eSslFWfX^KVAm z*C^j?T)3|8z?Q(pEsRrUHz;tpvZ*h*zh~ziYiavmAJ*z5cqz`_o~7*|`uWtiO~*U! z>)%-|XaB}?Y}XkEt|&W>M8;QNM7uxltc~vP{gT@}Gsvm3jhRC>QX}WZuaYNk|N5Qj z;gGfyY54Hx=+lSg{CujH)6!D1=X)?*F8RLlVeWh8WhzRo{Hzmh%=CYBGAnSg7SDlR z^~Gw>Oy7Uq`FA)WBr)hd~{st&ASc9>3m^YJ*}7aMLF$;k2?HCan2hK0y4io< z99nNbEiUkon61u&$>nbs?Vs?*bBB2S%s(|{tAf5v<1f>8D19KoVm#x*{GOLr-aPvG zzHZ-_qIpa+{?2YZJhd@6>}1~OiS>JutCyE2zxwxhvU{1_0u%kp$I=rTSm&`dvL~yG zi~MO_|D|ffj)nhQ%|9OAdh(}zOlDbkoB4%3%B=ZGd-iOzC_Kw-pwXf9?m>C|jkC+F z-`mXmWvrJM^!XwK*8|3H5o+Oadmha=*nDbdqkza8E;+Vl+svi>*VbgGRQmpvU!Cll zTsr^NwELl5`(jUfS;WewiA+t|c<)wNbnf5adS=5denELF*s6e;NVLQ?qQtoR0bmhLqlC4GB6J@G_*1`wK6o& zHL$QUFwp9K^A|-!ZhlH;S|yqWV^b?r3y21m1NY_wHOPQ$2+mI{DNig)WpGT%PfAsA g%PdMQ&o9a@R&WkBE!_Ip45*I5)78&qol`;+0OLH|`2YX_ diff --git a/res/drawable-mdpi/ic_action_next.png b/res/drawable-mdpi/ic_action_next.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6699670e654e09a232669003c4489ad1bddab4 GIT binary patch literal 334 zcmV-U0kQsxP)&QF$`VF!XnlRwGa-u|7PWrO3WR4Uc4sqgy` zj!AY)a*1)sz!6--8N9Zz0~Zlo{f_fS)(Ko-Q3?kZE;C#>wQ-MNHgJXEdxE=|s)Hp1 zh-BaqgRhplg-c9x@sa@stxVmSrEcL)%y;C?d@RyJMRLU_0xYJv0UCHma)&X%pSbZ8 zPF>e+%=;eW&fxAAjtPE_~v^%!((M8-M6XW(6`_c5pwqg4s>h;8jB)dyiGZ6~@JU5~T+k%ul)<)R16h bU}R(XtSiC4^_RL7&wy3N|ML!X z2=o9Q(Lig55Q+jHAl?LYMA|^60Z<5}0Ufa!h>Zs_5lRB_OrRq`SZW}1fiW~%im8!4 zD9MJAP=`bgWH|r|0Z>RRBR73es~}Q?rjH&{(+9OnLI+s3B{qG~swf7P8=z?M9mu)> zlx^#w+17Z_Rz@r|H2XOa&tha`+&mBtm<7bkftG)!cL*E+;y$3o&*&Wmw}7}8Xz^Kk zr-9GVcwRmbiEug8^3U|n1)yMVBqg4yF6XU=)mk!3O^S|1Sl^ zX&_9bdS4>dIe^S2Mxikfp8;Va)XgM9of=FXNDsO^3ppVKq(GtLLqHubkSZpmj)eq^ zK?X)bF)snNkx)nS5;B*C*!Y9`Mv_pp0I3E->WFp#DE^=p8xs*N^@P-s69UVKG-ngJ zxsGX|vppdPL;>+xBFyn4QXOdyU}R*x1;pt}5Eozypa5q^dX`q3HH()uh{z*7t^Cox@x1qD-D)*x z@L!SV`6HrZdoQe!Lxfm^M06_x1Ql3<#Nbv03cQ0vYiB?#?74P55J?f!APA0D z0!aRf<+%nmQVy=(8IhFgwJ_$(lux6!Gz!zkGiEmHIr;?n_{H2?dK89+|emr#ikRL%;q3=NeJb?K5s5HoDeXJD{(Bn6U}T7)i%$6sg&Z$acx06e%N}>P^@- zNSFCCAsOMha%*+cilsy6V!e7lWDWw)0`+Ps2JDW{5 z*r&wEk_48(9?1LF&3}MP4ia17%Jnf3jA=nCzP%Y^nn)y8zydKW_B_fDMy3pp zQaQH3E3kv(VL2^FB!`~xBmy+Tn zfN}6;gf%-_8*mvlz7mYSjvX1Lo;bOV6Dhkcxs7BspS&G31(B@c`{bYfDV=PxPk4UOiAAEE)4(M`_JqL@;D1TB8wRq zxP?HN@zUM8KR^{Oo-U3d9>?EKIh`#WC~|Cnak|>%EtyF?DiW?CQ5zQR&~R}P7o0se zYN59Iq6f(jlV67YlHXCN&atjVC@{nI*8#1hfO4&EtSdDpU1*qPw&iTevwM$|g667B zZn>1Z|LB1^me0%2?@a&EkUR1F(|7+hm=Ac=^5k9V&G-23y6Jb0);EV5Yle3RT|!?Q zJ<~mUF-pErBO+=&XU$e0&4S%$IaFo{ecK?*Ctm3^Ma7e$Y2t*#^*#z|nU+&TdMkEa z*wfGxk!~sB_x@cR2P+#-EJ z>(|t~g~}W3AL|@6bkZ`OBFUv0z1}1yl9@qZjY7}io7UI;-$eC<=s!Kbq;#6VnKJ@M zdVl&xCopw1c)a>^b@BV+;MOf~jCF40846pKe&Aoyz*^&P>@(hLtcyz><9gq9h!6qahr2p*PBL1%Icxwg`PL1E6pFB1XofvcM#>f1{ z9a#Y`3?ZM_-(h&cXgTfMi-*UHdLB>S|2a0xt>0?bUbVD&jM;|@s%|meV0juI^t52p z3E`No2`VQPCTtJ(-_LC5eg5@3oqMU3TSL8XcN8?&n$5_n4lfgaox8VHIsf$4c-48I ze+Dk!T>(sFq9v{oCC){ui6xo&c?uz!xv321`bK8@hK6tJ1=j-=sDc!vB$lLFC4*F@ zG8h>c8tMX(fq96bp_Qqrm7#&IfrXWUfmZLEzbG1V^HVa@D$z6;n_8J#Ks2x%xHliD zK?Y<)aDG}zd16s2gJVj5QmTSmW>IQ+eo=O@f^)EG;nv4yKy?hBu6{1-oD!Mk4UOiAAEE)4(M`_JqL@;D1TB8wRq zxP?HN@zUM8KMV|vqMj~}As)xyPI2^Oaui@#U46h~$AZ_zA2^Sx|6sbm;Un*!h9CU; zMPD@aJ~AiWzAC%;W~Xd|&6J$d#w+$Is-hZo zX^;C)DKqV8sat$L;kxAPle_2jaY?XKs;7i_<3m6-KG0(Q8eV{r(~v8qG>QTwKBDUXka;TZ$40i49JGy v{Irtt#G+IN$CUh}R0X%pqSW&IqU>S?=U~&qt&h!s>KHs-{an^LB{Ts5uHw)V diff --git a/res/drawable-mdpi/ic_media_play.png b/res/drawable-mdpi/ic_media_play.png deleted file mode 100644 index 7966bbc5161a898264720bd6f5a6861ed4fc7ba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8wRq zxP?HN@zUM8KR^{#o-U3d9>?!q_4OAH6k&Vtea_6x?Ac9DTP61S^ej8o?(o`u(M2`2 zcRlt8_Ev}MG{!&BH#D3$fkV;5X^Y;y-0iysBSR7u{QaRAa%lnq^9f9DE904SOo|*k-LO+o&#)*FW!bU1TI@^`bZ1 zr<-!CJgMswdJxsa8@Qx(R;s3GmbB6v4iey7aG+`1cv z(aq^L(!G+GpSr~`a&&MAd}KQx_bTUx@3~DbXWh0gOP`w-z*g|Axx=NwA=mqjlfl$K zG6q(>`)4LiUitllSRKEF;6#lJoxjelQ=1v>YszA!(l|GIOFfgG^=bt*p{2iXy(_Wb zb3g0q1>V&eP1+26`g{L~1u7(I|Id7L^2n|$&r*EaJz5($9CWfWvl6~M{#N+=OGsVJ zZM9cxIRpfg9=yKu;lhtBht<&&93#z7s7;&~e}9FwgMgsYqnxay39SHqHF&n&-BeOGTr1rqF?xQE$)sf9uzMckRvGs=eRu=t(T` zhlG} zUEq=Y_bbni#Q~G1Xo+h?iE~kEVo7Fxok4UOiAAEE)4(M`_JqL@;D1TB8wRq zxP?HN@zUM8KR^|Bo-U3d9>?EKIh`#WC~|Cn@pC^l&Mls+R8$@;im1_fv#wQBY2#6) zeOg`73#HAKe#lSBd+ipr`@_b9rQDh(ul$ZET}#+57IQ;ONkZq?B=^fc>CfcEGv6#Z ztHO5Y<;^o^%Fq2R+-E$U`49i6I-iQrb$k8Zy?Aog&|P)Hd{cxOZe1zTzX$-rZ)+ug{jOE|Hb%WagjmM%bZ6V z2fA2JtY2r@Fk}533!^3N5rPvP{tEq-Y&fuvM_$^o`&ey#^7D%<2Nce3ytjYLYL$pa zYc__2Me6J2&(!^QU^>F}L4MKt*1r$09$M?ZUM`$lWkzHvS3-14y_@;Gb!YDU{KEG^ z{@FYh!vj35chAYr=+qazd;9#e_u~5*&uq<+W)Kz;6cowy?)z!;!yqu`jPKppx`jE6 zSKn!sI~JQAbz-|Aa;Y!D@ze8DZ|pW()x7upze#oJ<*Pym*d}ZZ{v6*hLv^#zDb-hL zaaZis+`=bU-8^9w(%id$&!tyg=_{*V)#+co7F~J$;oGfo!ME?6syD4;jL-k%GNpdb zEMW2yEpd$~aV|a>QWe}Xi&D$;i?WLqoP$jZw>~xls$=kU^>bP0l+XkK1+ZX| diff --git a/res/drawable-xhdpi/ic_action_next.png b/res/drawable-xhdpi/ic_action_next.png new file mode 100644 index 0000000000000000000000000000000000000000..5c030cb15dfa6d9e274c754ad872758c81736e1b GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7#DcDIEGZ*dNb{8?x6sImfok@tP_|r4)E?^2x8!!z@(vY zZtj!5_XocNnGEI*jDC!I2X6LWoAlJ%$>z0urd?(~&*RG7zvBc1oH!I)pv0~#rLx|# zORqVc-TaE_>y`UkL+dZ`z5l^4YSZ~4E{pTSo=HKM*;lr2zYufW3_g>lk zypBWGWVV@I~)xwVnEK|#PF&>-)KAKy{GGcA{HW)!N4e5y+> zWv}d%)%2XC;(4j*>4|{%dt>Gc*=&9~=k}Ss`EL&%KBn6LAV+rk+&$kn=6;O_nn)NN sxZk}`P%6LhRr}4G)v6$qzxy$=F-STK?MTz(HUk;p>FVdQ&MBb@0HdZ#7XSbN literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_action_play.png b/res/drawable-xhdpi/ic_action_play.png new file mode 100644 index 0000000000000000000000000000000000000000..e01a8445e46def02cebb461969284f628f6d2af2 GIT binary patch literal 522 zcmV+l0`>igP)j!c zl}e>j{ZC!jl~c;c^mt|t5Ka&asQ{ebAoc*^2r-ig;GqiQ8z5}BwuTAxo)v;vNd@5K zD!^4j15rr?@H9yX=M8%f{$L`$dx34SrtA-9gfrF%Vks5C!ymSIZB`Ni_}8X`u%qG+ zCegX?5MLDh!6ZDpM1N>fj@5=h75ZcKTp|G99~$(BQX&A~AO7YCsQ{k-fNOUp5rFRx z$Czt3bpX-VZY}^`*Y2fM0RC7VWbNh%An4l789Z&-u=tCgB(^{cQA6@png_Tt|LEK2oB`Y+c0>D|BLIt~-b%a%&*<)UjKd0IeeM#! zN*jdknD|B7BxvzkYsV^gN&wDia<|mwS0w23I_9-T6+qDOl^cLMb)TmKFlbHX3?Rsw z$`Qb5<10k~!PitS0HUp_WaYlaPwB6+eE^i1N~Kb%R4SEh#SwXP^Qmm*QA>O*6wo$pHJECP8R^hmJU8IS@!W1 zU~JFV5z#_xmVHtP;Bi99Hy^qC?;m=X3UIJsQuj%K{ct#p18aq77=<8Th2_;jSU(G( z=na+v@j((H4%QjsjU}x63_#HhVrhlfqcd z_Nw>@VfR_QeVjXAnK;b(vtY;7+twaDyI%8V4 z7A8NiW*|aRssKQK2rn-d6Tbv{zzRgziarbs$m5wiax85eO7Q>($tRQtqyhvQ++!;A~9vQ)0%7|i?18{E&E%3i7-AS1to3q_VCJhb{= z^#_5X^#>A_Bg^7_o^|AzmcpXaGEsH0nt&FcUXv%|6%K)Wk@YPi|EKJwA`R=5TZsYH z1fcHfy4Xo|Vyx~0hsdv~EI+-^ItlVZpeu zhA!RAs!0&s(^z8t_}X}7%mYG;i1#S@%EGXmc33CgRho|y(4+2jlrs;ARW|b#R9@H= z?+Va*R_NzgbK$u$`86V+7Xm$ph-*)RR6_t=AA9W^i-|`x6G%-q$Q_GQ5?pxdkE7}! zov0pjg$2+ld*O!eJjbB>U?j8gaZv!Rc9mMmuxtyw-;9QX1=jaz|FmK- z5C{YUfj}S-2yO=F^Z7RpAHOxcQ4L}kYab#EZ`cq}gf9>w?yCR@w15mmcxpRPP_~&8)BYJV6#RT;kJ1h#n{|O@O z9EjsP(waN2V@GS?y8vU6WAepkrWoiJt14@t{EenQ@o0@`fg9%_=yEEf1y2}4p#P;N zKcoPcl67%*^k9imY|D#01u7*(!f=V1E`o!vBN@!?M{<+3tI&;Af@s=gYExQ3RWv?b zkY8BHpGdShBeU!-1#YzzrWeo1=S@2^Q*nR}FAGNOm@+HREs5lmb-brRT0jZ}_ZmSH z`4@|;uu56Sxy=ip36WFD{7ydULY`~Jr3DUqooyEIn$OoFPeCxLDsh7oz!!Oyb?Opt zwI4t`w(w;3UNLNeJQg=g&*WqH-SE4@WcHaQ&(9TkoDbtKv!jDnl?B@sX88Po%GLda zo2ZTsr_=lBFt?o`NM`wANp*^RuDQwDU@68!R7okkwRL|Qw*ZZZ5Av$FkP%@UCNOW= zNmrQe>Jswz*b?xj7ggI6)69{aZSI)n#;v$OZ;!)w-w^42ORQ#B_Q*#wZ9cnO&mQH4PCYwkaVU!sTeecz*rm zC=m?#2G~Y^)@oNcARy_t&bq=K0|W51^R945_zbQq9HPJ9n+rJm``y6jUu6XXfj}S- f2n2n_j{pMz`dGRViTX~T00000NkvXXu0mjfDSUXG literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_media_next.png b/res/drawable-xhdpi/ic_media_next.png deleted file mode 100644 index 4def965cec244cc3cca5544d730bebc85d8ad6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364 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 P00000NkvXXu0mjfU69h3 diff --git a/res/drawable-xhdpi/ic_media_previous.png b/res/drawable-xhdpi/ic_media_previous.png deleted file mode 100644 index c4472ae2d9cb029fbadff34240298e090c0f33e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1372 zcmV-i1*7_jP){q+AT?i3c z0|YMM0#YPtn*iE2wOAu0Mq=WX##{ddFPdKX7l@h|Vl5_qC5ongE5RCqN$~?BiIoIM zNCCx=7TRrhXJ^jq#q2`auG{YH3SR7QvYFjEzuEJ=@A;TH2O4Uqp@tfIz>>*4l66l zUOGt?e$8`^)8xy58Z64gbhC{ZbIW~U00d=-UNVjeGU~-SL<{3VtV<#nEK!EoLtOGk z{Mb@oSO7uU$ZqD;UdyV2$ohoLv74W`eot#F%69tLj2p@2btcyuE8`0V&_=VJOD0}^ z);M6jW1lW&%^KRcjtuLa%2V{vi;=7`Gr5OShxdPbW_H0T_`(AO6h?7O$F9N+8^v07{ex zI_YK;ek7k~Hru&z=)i^@peid)Z?yslmNbXhhiCF4x7@YKXZG#ti^Nm~siN}m09hU< z$zp_@UC8%ue{8U|1Juf@6JHwuC^6%y%w)H;9qixQg{Tes$o&Ekhj~xr&?7wqP3u54 zT;(AFB1ZM^?4FLn{`Q?g;;U`OB@SPE6b#~u=3W^wPI6|GfHL~o@v)gJ^~*!mO^{BWzI5d6U%qnZMbO$Iss`|FOWe0(-@i9{?K~o)_C5oE zZ$;K8fB);%4^Do#a8nG_l811^P(7NQgfsr@(W93p(OU8l4nT0NqneK2$Q(I7K6dM> z7zhUu20%&h9g`&eXw0M&6Bk~4>+CnaD<;g~4D&*w7-pE{3f*=Serqi2jh*bA3inbP zb}Ehn=NRP+)Q?73o0z(B*9aTzy8VR$8KMX#EWSdu3W)t`hZ%& zvsZr$7N?#S?#YATF~QIDXs>5tZX$MK>iqOjw~^J2i^>2B%#txq)_vuj;_}=$WS9kX zgyAB@JSUi@PdEE+I-YSyPqfCIJHA=~gzKE8S2FD_g$)WzGZQ6?ZbcCO;1WaZ@#B&F zx@KR?_{u0!sjx3NU1pIMYpiEI>v4-8I2m-ZiNetrKp1>3a1kM;FuT-OQy(DD1gFYv zQWaI$oU?#1&2;G|RV6*}ZMs#=10$sqtd5jz)sf(%EBP8~sG)`$`k(0^btcbVVZvvR z0000LbVXQnLvm$dbZKvHAXI5>WdJuXGBz(UG3|d5uK)l5C3HntbYx+4WjbSWWnpw> z05UK!F)cAMEigA!F)=zdH99dcEigDbFfb~O?EL@$03~!qSaf7zbY(hiZ)9m^c>ppn zF)=MMF)c7RR539+Gc`IjI4v+ZIxsKc#^ZV*;r zc+mHK-@eB?o0$t3EEt%dp`zpkn>b$Y|S zz7c=-{de*2f?FnMv)^`ayA`~8x7d~3x6Z#0E)OfSz5Pl&`T5avy>mC8+FE?~z8#C{ z>vMa){k~lHt$Lo!gI(+1+T3)F370!@?RA)ZgR_<8h3_YMPxMy&J7vO?!{Edk@Mpv1 z@Wakezb=qz2w)Tmo_{J5$d+m-U=%Utf3)h;>mXi-9So|A@V9)ccRc^r z{AhU=W&yp1e^o!Ke_KpqxF$gmM$grK$&9(rf{Of{>SCMkrHLn?b zE)_gkK6m=Hp4JS8T^rd0t{v_zU~t>n)F;I#z`)3J^4z(-E6SdyZ()2Q{(p1ktmmgn z&Ev}7F&pgKz2Hv6?^pHZlP}GlYrT5+&vQx>nO9tD_`han>(#eeBHa=Wc@F8k5gb|T z-<(FMg{vd$@?2>^W>E6M-> literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_action_pause.png b/res/drawable-xxhdpi/ic_action_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..293f7127ddb0f2106f659aaf48a4b4d13df4d7b5 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGok|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XPJ6mIhE&{ob7v!Ovw?s^pv*=Wu@g*@%*zt{e4MX+V2W!n z?76(0;beHjz3e*?%bWEBjd+0CK;Ta3E87j%c5Qhqy5Y6?(k*g#67!CWY;exBuBqaa zVV?G9@1ODmcWNHJGtOv#CuhgR#L>XOq|m^?p};^1^F#cRcwz4g>u#Ui{nP0@$h$yr cfcGsE4@0f2fN4>R+-;DEr>mdKI;Vst06F1WW&i*H literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_action_play.png b/res/drawable-xxhdpi/ic_action_play.png new file mode 100644 index 0000000000000000000000000000000000000000..97ff9b07714e300ce171cb01cc093b9f96d04d81 GIT binary patch literal 669 zcmV;O0%HA%P))JiLX{;0~P=U z&;SkCfEFO{(!jop?`{Fo00l?^6o4~vCIMwxP1wCZb51hx&5${{_paX#V^skF00000 z00000z&|-04!7)rtbmuW9uOfb;3KT}u;%PYKa+ueZ>)e=3G1-#*ye8PYga({ac;xg zu$FaQf3oE=0y3+xnjm7&)(_i)x>$tu8br<5dYKA1W*gRXsD=#!WCUd1VrwdOK4=gS zi8G-oaXx4fklCebSR+72KxUKX!xjND0*>dyv*)%nQU3X+>9KWz06Ai;vG5veXm3GX z^Wn+MW2;30nI=6knVt_5!=HVg=EIx{kf{I{v4$4`nYJ<(dwUa*F%x@Ro&lFI6MK8D zfS-@8E3NaP1OXY9v3E%VBKtHOR?GnTSmT}w&@mrGWAD-h9M1=l*t@hA)WuXP)H*SA1&zed>B0TMnFG<#@@7`esb(RqXOi)dhAUF2y??0{E68AmqQ#FLxAuQMu6~R zC<1;H&!;|)_5J_>r+q%QnuZ}fK4M{9=>o*#=u!pj(#E&^9WZ{MSM^G=BmpX4%9kKO z^|2Js0tSl@5YUgAqlw-Gw3V^Lxn2aAJ)Uk|fJl6RfNxxUMaiN7S6|YzBw*B-7y*jo zgOUWezp6m1fMPD|&?Z1lOkA3PVlQmcAfV_g%OnMGX`he)6EU$@0bJZFB%rOhx>!Vj z%lN>80P``iN%#j2@&ed+00000000000020{mjD9*W49%z7TW9&00000NkvXXu0mjf Du!k6> literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_action_previous.png b/res/drawable-xxhdpi/ic_action_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..99d6a79fb70db8ba0bfa092ce70588357f51a55e GIT binary patch literal 714 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 W@0rE_wif~b0000 + + + + #BB99CC00 + #ff33b5e5 diff --git a/res/values/strings.xml b/res/values/strings.xml index 3dad884..6a359ea 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9,6 +9,8 @@ Do you really want to exit the renderer? Playback will be stopped. Previous Next + Shuffle + Repeat Please select a route Album Art DLNA Playback diff --git a/src/com/github/nutomic/controldlna/gui/RouteFragment.java b/src/com/github/nutomic/controldlna/gui/RouteFragment.java index aaa2db6..5ac8277 100644 --- a/src/com/github/nutomic/controldlna/gui/RouteFragment.java +++ b/src/com/github/nutomic/controldlna/gui/RouteFragment.java @@ -86,6 +86,8 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements private View mControls; private SeekBar mProgressBar; private ImageButton mPlayPause; + private ImageButton mShuffle; + private ImageButton mRepeat; private View mCurrentTrackView; @@ -111,6 +113,7 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements mMediaRouterPlayService.getService().setRouterFragment(RouteFragment.this); mPlaylistAdapter.addAll(mMediaRouterPlayService.getService().getPlaylist()); receiveIsPlaying(mMediaRouterPlayService.getService().getCurrentTrack()); + applyColors(); } public void onServiceDisconnected(ComponentName className) { @@ -157,17 +160,25 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements mProgressBar = (SeekBar) getView().findViewById(R.id.progressBar); mProgressBar.setOnSeekBarChangeListener(this); + mShuffle = (ImageButton) getView().findViewById(R.id.shuffle); + mShuffle.setImageResource(R.drawable.ic_action_shuffle); + mShuffle.setOnClickListener(this); + ImageButton previous = (ImageButton) getView().findViewById(R.id.previous); - previous.setImageResource(R.drawable.ic_media_previous); - getView().findViewById(R.id.previous).setOnClickListener(this); + previous.setImageResource(R.drawable.ic_action_previous); + previous.setOnClickListener(this); ImageButton next = (ImageButton) getView().findViewById(R.id.next); - next.setImageResource(R.drawable.ic_media_next); - getView().findViewById(R.id.next).setOnClickListener(this); + next.setImageResource(R.drawable.ic_action_next); + next.setOnClickListener(this); + + mRepeat = (ImageButton) getView().findViewById(R.id.repeat); + mRepeat.setImageResource(R.drawable.ic_action_repeat); + mRepeat.setOnClickListener(this); mPlayPause = (ImageButton) getView().findViewById(R.id.playpause); mPlayPause.setOnClickListener(this); - mPlayPause.setImageResource(R.drawable.ic_media_play); + mPlayPause.setImageResource(R.drawable.ic_action_play); getActivity().getApplicationContext().startService( new Intent(getActivity(), MediaRouterPlayService.class)); @@ -361,21 +372,47 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements */ @Override public void onClick(View v) { + MediaRouterPlayService s = mMediaRouterPlayService.getService(); switch (v.getId()) { case R.id.playpause: if (mPlaying) - mMediaRouterPlayService.getService().pause(); + s.pause(); else - mMediaRouterPlayService.getService().resume(); + s.resume(); + break; + case R.id.shuffle: + s.toggleShuffleEnabled(); + applyColors(); break; case R.id.previous: - mMediaRouterPlayService.getService().playPrevious(); + s.playPrevious(); break; case R.id.next: - mMediaRouterPlayService.getService().playNext(); + s.playNext(); + break; + case R.id.repeat: + s.toggleRepeatEnabled(); + applyColors(); break; } } + + /** + * Enables or disables highlighting on shuffle/repeat buttons (depending + * if they are enabled or disabled). + */ + private void applyColors() { + MediaRouterPlayService s = mMediaRouterPlayService.getService(); + int highlight = getResources().getColor(R.color.button_highlight); + int transparent = getResources().getColor(android.R.color.transparent); + + mShuffle.setColorFilter((s.getShuffleEnabled()) + ? highlight + : transparent); + mRepeat.setColorFilter((s.getRepeatEnabled()) + ? highlight + : transparent); + } /** * Sends manual seek on progress bar to renderer. @@ -484,11 +521,11 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements status.getPlaybackState() == MediaItemStatus.PLAYBACK_STATE_BUFFERING || status.getPlaybackState() == MediaItemStatus.PLAYBACK_STATE_PENDING) { mPlaying = true; - mPlayPause.setImageResource(R.drawable.ic_media_pause); + mPlayPause.setImageResource(R.drawable.ic_action_pause); } else { mPlaying = false; - mPlayPause.setImageResource(R.drawable.ic_media_play); + mPlayPause.setImageResource(R.drawable.ic_action_play); } if (mListView.getAdapter() == mPlaylistAdapter) diff --git a/src/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java b/src/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java index ee39d52..b05ffcc 100644 --- a/src/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java +++ b/src/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java @@ -30,6 +30,7 @@ package com.github.nutomic.controldlna.mediarouter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import java.util.Random; import org.teleal.cling.support.contentdirectory.DIDLParser; import org.teleal.cling.support.model.DIDLContent; @@ -86,6 +87,10 @@ public class MediaRouterPlayService extends Service { */ private int mCurrentTrack = -1; + private boolean mShuffle = false; + + private boolean mRepeat = false; + private String mItemId; private String mSessionId; @@ -243,6 +248,9 @@ public class MediaRouterPlayService extends Service { * Sends 'pause' signal to current renderer. */ public void pause() { + if (mPlaylist.isEmpty()) + return; + Intent intent = new Intent(MediaControlIntent.ACTION_PAUSE); intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, mSessionId); @@ -253,6 +261,9 @@ public class MediaRouterPlayService extends Service { * Sends 'resume' signal to current renderer. */ public void resume() { + if (mPlaylist.isEmpty()) + return; + Intent intent = new Intent(MediaControlIntent.ACTION_RESUME); intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, mSessionId); @@ -267,6 +278,9 @@ public class MediaRouterPlayService extends Service { * Sends 'stop' signal to current renderer. */ public void stop() { + if (mPlaylist.isEmpty()) + return; + Intent intent = new Intent(MediaControlIntent.ACTION_STOP); intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, mSessionId); @@ -274,6 +288,9 @@ public class MediaRouterPlayService extends Service { } public void seek(int seconds) { + if (mPlaylist.isEmpty()) + return; + Intent intent = new Intent(MediaControlIntent.ACTION_SEEK); intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, mSessionId); @@ -296,7 +313,23 @@ public class MediaRouterPlayService extends Service { * Plays the track after current in the playlist. */ public void playNext() { - play(mCurrentTrack + 1); + if (mCurrentTrack == -1) + return; + + if (mShuffle) + // Play random item. + play(new Random().nextInt(mPlaylist.size())); + else if (mCurrentTrack + 1 < mPlaylist.size()) + // Playlist not over, play next item. + play(mCurrentTrack + 1); + else if (mRepeat) + // Playlist over, repeat it. + play(0); + else if (!mBound) { + // Playlist over, stop playback. + stopSelf(); + mPollingStatus = false; + } } @@ -304,7 +337,14 @@ public class MediaRouterPlayService extends Service { * Plays the track before current in the playlist. */ public void playPrevious() { - play(mCurrentTrack - 1); + if (mCurrentTrack == -1) + return; + + if (mShuffle) + // Play random item. + play(new Random().nextInt(mPlaylist.size())); + else + play(mCurrentTrack - 1); } /** @@ -339,15 +379,8 @@ public class MediaRouterPlayService extends Service { status.getPlaybackState() != MediaItemStatus.PLAYBACK_STATE_PLAYING) stopForeground(true); - if (status.getPlaybackState() == MediaItemStatus.PLAYBACK_STATE_FINISHED) { - if (mCurrentTrack + 1 < mPlaylist.size()) - playNext(); - else { - if (!mBound) - stopSelf(); - mPollingStatus = false; - } - } + if (status.getPlaybackState() == MediaItemStatus.PLAYBACK_STATE_FINISHED) + playNext(); } }); } @@ -372,5 +405,21 @@ public class MediaRouterPlayService extends Service { public List getPlaylist() { return mPlaylist; } + + public void toggleShuffleEnabled() { + mShuffle = !mShuffle; + } + + public boolean getShuffleEnabled() { + return mShuffle; + } + + public void toggleRepeatEnabled() { + mRepeat = !mRepeat; + } + + public boolean getRepeatEnabled() { + return mRepeat; + } }