From b4032e2cd8c4a14c6869565ee175e109ed001c76 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Fri, 5 Jun 2020 13:26:26 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=88=B1=E8=B6=A3?= =?UTF-8?q?=E5=90=ACsdk=E6=8E=A5=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/mogo-module-media/build.gradle | 2 +- .../OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar | Bin 0 -> 30287 bytes .../src/main/AndroidManifest.xml | 1 + .../module/media/MediaCardViewProvider.java | 9 +- .../com/mogo/module/media/MediaWindow.java | 28 ++- .../module/media/constants/MusicConstant.java | 13 + .../media/presenter/BaseMediaPresenter.java | 53 ++++ .../media/presenter/WeCarFlowPresenter.java | 135 ++++++++++ .../media/utils/MusicControlBroadCast.java | 32 +-- .../mogo/module/media/view/IMusicView.java | 19 ++ .../module/media/widget/MediaWindow2.java | 234 ++++++++++++++++++ 11 files changed, 497 insertions(+), 29 deletions(-) create mode 100644 modules/mogo-module-media/libs/OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java diff --git a/modules/mogo-module-media/build.gradle b/modules/mogo-module-media/build.gradle index eccfa5b7fd..d028e927fd 100644 --- a/modules/mogo-module-media/build.gradle +++ b/modules/mogo-module-media/build.gradle @@ -35,7 +35,7 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.aar']) annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.arouter diff --git a/modules/mogo-module-media/libs/OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar b/modules/mogo-module-media/libs/OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar new file mode 100644 index 0000000000000000000000000000000000000000..72f411cce237b1d9a17b7e86ae9d65a6a4bac2cc GIT binary patch literal 30287 zcmZs?Q*bU!6D=Iu$&PK?*|BZgwr$(CZQIU{ZTpFh|NXB1bE;0&)ast@>aJNeH+`{M zK^hbc1_%fW3J3^D5U5cOlxX-rPZ$^o2=#vvI};~+OA}c`J4-WDXBT=8TN~R1LHl7s zxKP0RpNZEY?q>y2Nw0O^bje=r{Sr!W;_I5v_fooCYFj?S_xoOR8TU76^Jm#i-zZ+2 zXB^5Xb}oW)d^Ic%Z%#N_491T{4V6KXc1&Hl-Dd|BO)cZ~JW9f=D(mc^K~wh3brpDQ zRVzWBBN1LSA?ZvJ#ivl()B7Cy54RH4b)LoR)9`YLmgiK0$v?j@d)@MID(#qAJoB|O zJye>nw<{<#76 z$fhN91&%+uGnPA_Z%Y8eJ*i4>g&lUZTpU#iN?C4&4W3nYueu`h?ck>z zYyS!OtDUQ4hqDUoo3VZ&yW(>c>%r5Go{h53P$Y|=w;rjfBesA0=?^L*M?^pF*Oi|a z52UWZiJ^p&5MDJlKnMS%z=Qof;P+v=r7Y1-ObznTYEQ6n3~UY7<9Nj7%~b^9%Y%^K zK8#4P_R$f)(u`aU#7J-#nQMReM_-@52D{oBROw1+zx#kwLt2U*ilZflu^22f2WS^B zoThk}TTsn>-+ug3TveF1>2D++{Xfho83iGGR54-_vcSs0xvwpp_X16CVl#2f*%9j#;(2CI#DyPfV}TJ#=H|hK>1mB zd7$>dQ? zpX`<#ICAL4*_jSvBhW2$TF!&`RQXG3!h01rQ96EN9N~`oVy>r1;d<=C9bZwqzvl3+ zZZu-It>D zK_rY28IHdwr882fDA%X)^?NEWQPrA*>;_`-urkEwi5!C=d=lEsy`kX zAKIEIPYXw)V~6is&wHw%Dfs~w$Dcp<7Zbns(wa6FCF!n-9u0dP%I&U-CA&uq#{N}e z)^DO>pu1{E9I#Wo^WX7)R(be&cIBH4h%FTdE|(PLD=-$~2dfNiP%j5FJOO(FJoIjY zGi!ccUUZNcZS9mVtY0Ko0;TG#=ko2AR@kFEUr-9OAW|uJEbf9s_Cv3Bx(N36MkX4Z zr(@q<{&i)BDnZV!+5+C)y6++zrmeRmOI#2;kBL8*~jeqU+ zItQ$#>4XZMZjp}d`BtxRGT<5-)#7_|3uQGsf!O=fj2X*kr?7*TXC96H$$FeNIwsUe zWKCiDzw)@ov_VjfZTX@7<<~VP8E0}M((uGOMz=ts4^b-sb+z_^RE_!Rm)m`-#=h=y zLF7!@20FU@dY{q7rS&lf_dPN=ArItG zZ#aI6gr(0Bg`R|;V+4mh0wo-dye@e7W~Du6#|61n&==i zl7H_m&H6**>z8(x<~a-ok#N5K&X}K!UaY&@3=6$6q~N|@Q(^B3)^3d(TSC0Me2de z@~8gZSyh6ddl;=evokY!rLvLKRPt{s3WLkskLaq_$HX>7!DyUpz)50|hpfaAbM^|g zmJ`OA*9I`<*;BA9U0M8LoD7T?eLH?^y<(;|h{IT+o?`ID{~{Zy5>?=guEg}ZmLsV` z0Dhx9d%T;MAGp4P7sei>}+NTLQYa-V16i#m-3IW*o5|a=jJoiGcwy zm7Za1EQ`{D#O7#&Ppxm@BwKR$rDJuxtG7Ew1pFwU`7LZGug zR4xcS&$xmL8a;(bFNP7WTd&cExcVx=!(CFhLyIin5wYPA9P-J1jjtPWP>nR$pRZ)W zfsDLFVID)aiDdsp@H0l|q=VO3f3|$P|EN*}r!8;+?kWeRve6C5I9?Cu0ThxTzFmV7&<6-Bfi^s@5ZA^dbVy7Hb7bs?N5~3lGF=+Vqz}1+KdeOgHJ)r znjacZ2&+0nULaO%#=>?(M6 z1>(lLFOBFLZF|qip}8>Mm|sEC27LpVe+c+3o* zBT9+FHVwX$b>At^cH6nrY70AWgH8nFJfL+tYaE~#{{TFYbbFSpNqXIf^tAoXu;KsYKZ?M_f>MpTG?tp4xGd`xf4Na=_@2AEYU25c1 zdSus#C~@gXaV+>6mShbaGJHT{*#i#@PN`aY!61TUm50N_uFHL);Ldmm%6vK9#dn>% z4Y8nOfIjKPsSF0v2lnd;oDzP#5Sp7ZY>^(rbA)-d&*Q?P(uLN0<9*kDO=`1>{i=SP zfygS-3cj&~tWl`F^%xe+fG^56J|;RDUX@G)bF%f$j(Q~Zi-ZTQ>};6-DvmDUcJvag zSDM`f#wWR=VvvI^6p5lu9aIUSB3Qv{I?xfhLT?jy{oES_FNpvSV~}A`Q!3m{z^5S? zaI>mBjlwB@z6v1jhdnrmAOIT`7M2-A`?q56*ODFzL=L&ldIa zKQ)e~fj!P8XCU#`ERVhxNZa5}O8U$dRz+ z2R=Lvb{QRcN4Y}>=~Q9tz~EU??(x0_wJD8zISEJdbswHC+8%XemLhnADdXGIID9mb zhuA$kW|VAtjc>FB)dsX4Gt?HN>#^`&k5-n=Us(`;?m6vXaPfG8-+oK`>)D%+2 z_mV!%v`lxp1zwU)$?9njg;m-04V$4?wgSSYpG3W_nj#hGnak$P#gBXGyd zqW5+XqvRqAsF?zMqD^V1rjV}e`88l9G91Y^Sl48=Xe(29zV@af;fGZUIQD#fEHsET z6<@OXBQYCFON_2J zhEHaFIihSipadg8#PVX;`V+_*>yh)Q@*^_tJD8)BqgyJgN?#&&x3;rPqp~Uk zs4k9XbLdw0BZW9<7Bj-6IRn`f0`eFfgVb4BTik%Wf1~THe4TUxbDen)T0?lu9p3d)iD6DY6R~4zfq51A_qRMb0GmF@;;h# zZv_}qK3rDW^JLg3$dEy&Gzv@Hjq(Pq#%(}uW{PA&jorXJ%?&68GtAD+_iSQJIe(S( zm9mIHkY!sf{ax@|bam-=)X_yT>LQ#6(J$s|@(9VF2=7*u^wlr{eHjcCv4~khm(~*` zl;M}jKJOMu4}%{wP=b%C#t=adH4JQ*o0+M}oLA=_{mbeLJ~kpE7S*?#E3TK*6GRoJ z*1A;Us1sc*)s)sA#o9vpaz^j!$SI4m;pc0`4Al7@$E?cwdVHC7j`~JsH>$Slct5rU zne}v)Fq&A_IbNsM(qd*(?KMhH+H{ZLY~$QP_=yuE>8ZQ+NLyoziPI7${lc?8jtjK) z0eu4_m%WtPI`-itp9Y4$t({aE7zhu(8y8yQb!=?zD0@TTj2} zpxrO;2}qKkQIC{Vg7>2kl($XwrEkp5DP>*rB;PaY87Jq-p2weWi$k=RsXms5YGIn4 z^~^I<&}j_x(_TiZG;=CQr20l_E@%r5V8iL@ra2wmoydH2udU!zIv?`PIu#{uyMZy&%h+H^2t4n8ZKxGVBmanj+p8crHg^h?Y`Qc)-1;42e^>(9YIJ&_5+ zBzHaVN^4IjT+xdd54Vh5?34`b8Ar76G*lCg;7qRcN$Cqad?f)eI&2oyO@H9r2aajU zHaHRDi;IP5t2Kt5rq${SJwms*bDT-Tb-`}P`d$yX`3$*|t;nXQ;b7u6lM>h+*vu>4 zPknqdjF#=FY$KE&E3KB|V_jg_|2mr^Y@z0Oaw*i;=-B3*%;EM>SPYc$a;0Sd!Bqz} zMJdXu(z83>mNVzHZJc49IL=jc<(%FM{Mw{!Mv}JGKQg0!G#yjb`6rIv0EMg?U*eW~ zEwDh~m3jixcMVrnU1cD>15w$NEo7#8E9Agry?@d);R{x&y&2YhJyQxC#ai#n6ODqd zg{m-bT)=Gw)w6d@7kE%)_i^R(a5NCjqZVFx7h?d{j#djYm-dY6TSkI2_Q&_4t+kLzI8hSKS+*QV#P=(Fc|v7JLVMILrQ+cfV_gFd`{wC}|o{5=`m1(8fAw z0}_Sn0XmcJc5^e;FP}Jm8-e>GeK$X?ZY_CtVx7fmpU9Z5K#{3Vfb*8b#eiLE{@*c1uYah*J_$p#ST<9}=hI(HHC>#Lx0o z$?awmX@UHX+pf`);1j3Kt|j;YHf;o7o|4himx(A1!PvR6Rr)~*D`WTKR*S!QTtwGP z(a=8qWC+pLoHCzq>>})pipr?S98KOrvM_$|#VNm`15t?G+6p?a=Zow$h*sYO)hQ9j zbq(yD(a0U0O*Eh?J3g0(x*3j>+WO%gqJ@vWkm{ zpBd;MGt|u>D5Xm4S;)0W&O(rrlaLdB=tOuzHZC_u`@Phu5EKHg`r*&u@PjE9u3&w#rIAM!8X#qL7$WI7Z`i0(02xjey+GA*oi7;wW zi;6kSEefnqS{f(fa9R^RRB91gnv{SA`h8*{dWc+q^^c>Gx^{VJxtvvFW`+m)C&_%veqPCxJOpnpjN(7e#!N zE5Qh2093?Xr<~~xZ-VoZgE2ZZoq*n?CBfRRF;|;dBrBSfo{w3-%yPykUjUBQX<9ls zl8=~gHC;`y!2^nWud7Xg*Up^K4ZWzb+S$xfweKNjToc_h8{!|5V;n6bx(eGH{o0j? zfE~#4L{w|KwKHeqU%TsKK7@T|oLEg1)c66}|K9S9f_P2#`%=ji{4VDESAsmB#1&T$U1HG(EeMv&^vAits&^BEhxK0uJ5df~en7d`P{pKIt{(Sp!`yi9b}GQbomi>wtfgeY#nn_tZ6GSuVo z4$)qQB!~ERlMZnd2;oT|OM zylulC$`&TQ0@Te=!xZ6-k2nI<(2zDDt)F=wJvI~jRJ@zkIdKpS>~%QA-V+;YIRhsC z^{ob5ueYI%kHb>F5HBhzuC`HL)>>ZW=A+ZtE{}fzQg_u74KrkC&K7Jp%C-r)n>YcK z$MPDq&wI%z%nHwwO(TTELWFFw{v`_go3q)^^7iVzVYd6Ef>K$?+@qZ_~hZAxnf^moy>vCjJQy!O08cxI+S-l%3l{4%Lw zuyQXGv3~u^v}Er7&0{D-0mbl@{n^U4TUecQ87lEEqzO;rP7&L-ac6bRDf$ezMykzy zn*mGh%ggEIdo71tlB&%Gvux=iS4H@@V@XUPA2C1vcw zn?(_x#RjmG*=dD&lS(0oeSc>lvzAFk7f=n)fSDq17Hk6IK?*D>3jaQ!`E=@$%`-YT z6T)<`8Ewz0g}WFY%v0eF$S>Tb#jq50&Sm_VlPM)qU^uxPHfTGk3t#qIE@FAKk#SYY zCKT)dr7|glUJP=ZM?b*iYh1QYv;~`7;#=u)4y_*z!fl4BG<}CmyzO!81sD?|>PqO9U>Ql$)s53Z?yt@J zqh7voaaxs&bFNrp#<6ReQQ*P67eT$m^-eacbd9D$4(otpagl@-dQp^Jb1uA+kTXow zXD?G6@WKd#Bp`j$xs<`cibFRODYikHh2_^MYJ$f;)Nxk;Jdn`;5b@QE~o_?pySm#K?50lYP+c4_+qT8T_I$ZrznM zHPa^!d26I6#^S<{UB!&t-3la*aTe(65T}X(Cv%s`uRFo0wTy%rNwXY)`%K=R{fXdrG`MA?bd4 znK{3EN{WFBnmi!6$A5@fJz9&!ai?bOt=u!4pK36HYA!fmsp;!kD*P+>5xTqtY`7YO z{As_eX&17?HoeXrC@BJ)P!|AxyV5hRw8jH0JK9kd{WF2q&u4(SJ(Rp$<+ z<#`IrQHNZ9g$F7Hg>&dtk0b-Pw&=AMfbxuO(_3AjJY=d3;LbrC-DOnty~2Z$oAq9K z?h~arfhTWz<{OpVH{iGR>;UD6C4HfPNiUB?(E>PbhkU(EuX^L>B7NnQ%9{0J2z?X2 zMd=#>{C`VJw&}UG0eQr^&TYH$7b&+Vo=DjP(Y>i2^oJe@uU4U3wYM4nvQ`Y0zGVS` z$#mzXs7~6H)!;lml6NyE@jo(CD|TT!DQ_)>Kbx3Ll9LS>#L%m`n$&Jwtj{;NE4k}e zfVIX59p`Hu5FhunEMv%~5#=S*=`p=vv+l(5CaSGC24AgC;RY%(PjdfJCqvLvMpmkxrs-dvv) z33b@z@G7?^(GRWDu9e{9HW{~UunT$-x3fSplwD$g1H~b(?0K^caHJzwD1VM`(c*R! zy8OVTTeOH|lL*>GZWM^)rFFE)2Q#!yq6zX|^#z@hO#m>wRrClp`QQ#oHc*lkAuwZO zy9wz!CzkAKyW{s&SKz6h^@{-*2P?OyCYk){|NqSPICmBZ!w9eDT<@4x8xU9 z5RdOtWb~HwXm)}95w$;$8vpv6R!*1)CO*NSk1GxaCvo&c&OXiv8-lvtsVVUA-snnP zSGKOsA%VzskNQS;N0VxQly~lb0sNIKZ#T!zPiPO`dHOncV(|9e!zx75z|}oB#~V~h zt~fW0^j@i<8aquZomc!n?sDB7h;Nh#f1R4NuRHF*#MR(>1B;YmEvmEXQxC|BA@zfL2KJ|GlMS7wm};73!OP?ZdrbI za=a2FUHenkdH-tCEmm^$r^Rs}eQoAArdg8pr=+on)hy{t4{tzKH>XAh%pEB|pR>B< z_EWlhFF=GBTB&il@QDay*FiY+UJlm&{+!tUr%$9u( z&WcmHacpftDbY-|I{$THpy}#foBt1& z3jgbx+S2Q#NoK=6RxsHaET{XT;#h8BL>YGq`eY!WWzzme#(n3x(ef z>5EZB%HV+-^_3X^_vS5wt^+B`woWVQ7~EYjxiI@2eR~Af$fz6qw}B70P5TawhQyF( zoQIYH$juW?x`x(WH0PuS-R*=MBz4UVd}U|p*3Ftq&&HrV9(Ct=pzZ-ng>20b32S?k z4K}2G<JERZe?K%Pz3>I;`WpENH4f~NVGoxyRAsUCh>I)`MYn&biH?CIgdpl5`uvxg6X z!BLK`UW-CDXLyPsrcXL&X^KHxLpJAVipJ;`>gX)lMJdJr>>ig~5?uu+HcfU>M3^45o#dhz@8_ePL|>H%W&2<0ABdvO|6&2r zz_$N&5Kp@Lx0CFmSUi32@L#=BR*ZB*#k#~_-6Z-;S5r#eBswW}6w!2(=uP+rM=bP{ z>ykrky|xMy8B*>p8^vi6l#1?Y^gr;*3D(xXXB*dNimJpLizWXh zcI+~Jh-lf7SRjqJ;9L&z6d4lnu}EUDLg(=4tC$Zho5N_8T-_|fj?|bZ)lb=T!u&5O zg(w<8{$8|=9>kyQqi7Y_@$bJBc43l_qK@=Jo@5^-Bf~t)B!(+m)V)lUDBXKrqsDSV zy_>Z5@*)g{B5f2ku3{Ei^puvClYEqDqNihtWMf5*1(c-{5;qBYm+HzkSNpFtH&GYi z4wmbmki*;On<;nDeBEdB!tD5$IOoZvu2216?fYYj8=LCy^blJoN5RS8mVTByp7#D| zytiJ+eww>(h<=>A?$-Wk_&42vz0&Vq*=qpa7yMKw=*f1V)2%=jk3t(Br7(EMpMm87 z?cmqi!Ou3rdN*r-_W~Q;@5|ryQ>W^kcey2)`QEponQ9Ywr$heEibX=TJ)7SHAJZlK zzrQwg57zv=y{mh9)9Q(QQT6tJstf$5p8q-hdC~LxHtWWxkwS3kfn_;axkIl?Z9znN z8lCpnQE4ST7|Y?$P7Bda#M^LJ9U|TKk(XIjL9uJ2$oogI2)L8#NY79AN)5r0(W(0R z_*fft>z3@81k+HLLb0QLuZ$qw7Vudot{dWqb{{=e9P53ulI(CC;l0 zwXPN1C=oXhErd}G;x`diuj;clxb}qVa_XAnYx>`q`7z6XhOz-#+bht&^AIE7s6mlfsUcbhSC7(WL{fA^b-eE)ssZ* zf3|-|<~Cjs)_f(b^8y%z(7`YdgLwzm6R12D;DyD&3?8mX+#hg=2@Q|0fQ~*&j^-0SJ+1wKVbw)i}eK;ZXFr0>yrsJC9<*s2txnvhv5e{9Ih2~C8lkw5ifd*7dR z_KS+OvFHA5uC@HaloFQb4$!}p<#ODZ`SMJ+$}9;8{g{ z4FbMD)|xZFIP{VvN^ruL!rgkQP$ehgajMPqZO28Jm+l1RbGNPX(~*zWQaKzX3)Uce z#UZ`o=?7b57FkO>;^6D#;m#Ou78GU;??{mZ~^cb zbmGYNON3(#`BnK&V}xPM(QZdgAI*kz*s;SOL*?r-Np;f@M-8_WZtuDMX>XjJ8R_)c zF~ey79v*!SrrL=qbp-Xv9X$fHe*AFT1G_9Kw_lydL`E8#ap z$zH${&b%1BL_hFF`v8J=f;#Mj(f$sWhd4xdT>%_iN?;%}<6R$I9ZFD>Yk>_OrM&rc zGEjdykpBPU*kHcFKgdSB*BnhhtINN0YWQFK8M5vlj()B9(OMgF?l1NQfWN1raXCOC z0{?B$aD=Dz3!`)cb^+HKJ*1NB=oiNog?fFDFi1BW_U#oSQ%6HPky zD&9TPT-kMw2t2K^a%cqI$KN7mpGu2h=F3>8BjNJtgN*e^MTSa(19PD^Nu|TA(gciY z+X(JDc(%2uiV<11Pd2Gxg&Xu<{i`iJ$n8M7fhB0%bRYh763l}SUEET;vI$iNoQT)H z@2{A3&*^}v`y4GksAb2vFb~+>o$4iEt?$7e^fzgN(`_i#F=M*BgWG}EnZj^c?!r{x zw^^VuMQ_CF-l?CYq^nrk&A8FN%F)|bqrK@cnQ^66I7ekhlTq4dj$Vt%H~UL?v+tEI zcaF-868U%hCvs$Fzg0zV#v&F|H^*ws*vz>ISWObGDb162;w*`%#9TBde*yIK(6h#8 zz!L72HF9%rM|5J|rVG}9cw>pnj3u!BHDY9w;WnZHswO6QjPPYWWR>FmTAmb-5h~KW z+7!lb3>R}LsLu|YzEs6;1c_|To7b?$X962dX885Qe9!KuCaz_`A|^J&U7oAgIQ3T* z*~DwweT|nF?<7(Rr13T=X;_gwxuuB7rR9tJ5v{}=>^uvgJLj}rH8tl zpAXj1$e$*#b$M?qP^KZ4-J?F^i7{u7QkHAKswQ5%jCwFN!NU<>o%8lLExFL%_nDRm zzQUwKy3!HD)@J!R)$6kd<6B&;#b2IlJn^DNvUC}=Vw+Y8$Pk{D4oBuO_{jKUQNU~j z%_0gPF&zOsWAV+MI5v)KZd!8V?R_WxFO;~Jo)}35D8Sb|dxzZ!GN`t^g%QC7hbfGN z6R0p6iz&R=`$sUDc+~+;W02hl95|1AsW*0AIH2Yu*LLJDl4i8J9k?yYDhhG+O@Zx* z6Fu<|`1&`!5hn@*wxWfsXRPjs7H(7&+mwmrWvie^sp}_^x=?CpAUDVPrdLYdou01k{`u zfJDqe6%uRzo?Z7mg3F=^LR{v6+S@rcRwJ;xodPeIcfKWlJw$wU!KnTPIk~{{H71@) zi)m~_e1>Eoy{t7pBWjwhz6#LpbSo9Pbnqwq)QIS8F(tk9z5q2sBQZU|!+y(bZikAf z?fOuV-#lxsQ`R)GcItc0!{6nZN;wc8ED!yOk=lmiRgOQ*`*=_(>?MGySSv>xI+%Ge!}FOLkgj&|3R$ z`eW59Fss4!%K=r!&7+N0< z3$P<%{l1vuE_cn?9xfKQ;1h1&-{1UUGY9&Lo8&^xuWJ&gy(UZQz)I!DN8R^1;A{69 zvBeFjW-!`6f42NH`>JHXIK{wFmopL?5ZK5uBMqAB)@XTcJyb zKf(xwYsVS7Joxb%+B*!0*yb=!)^O~gZy_S~Fa0+Kj=8k#!`Xg)CWI>0<72L$2`0u+ zI2QPZ_gzRY_#q`8;3e@W=WSxyA6-i3wt6)*HoqtfFBVHE)(gUP@Ed8AWO27lu(G3NF@!e|ZE*t@?~K>t zzFtio0B>X-Ua|XR+Gv2_ch1cxL?U)@xO(e3R(_gR;6Z4|A=!TVTGr&JKQ3(rcb;%C zibMA14gRycFG)!spUZ!-{&qqzI`nZlsG<6;S)GCj@rX@UK|PA zLSRL4>?Tx2D)GpM)JHw6(7b?Uo}=N~8!MyZPK04UijP^(Ln;?UEw_3}SARw0bDeJh zcIy98z{>gCB|Wg$XcHt^pSxWvXVAxer2bx2xTc{J!0;M&2hH@0&bn2t_Tu5Fb)d|R zkDQ~Yqz&Un@`-q&=&(XZ!3ePaMRt-fO4anmoBtp(>%N?Y$RV(}*-K6f+%p)A{BNXd zYPeMaD~m9e#{fa^i#mC>cq7 zST}sOk#kA{Ax8wBykOJ}mApqd3=IZG1C%((cAT>IBCWKB1j6mA4iBcj8&o}+#!z3p%5-m zeto&?P*u>jg@j`ceLOF-9Js1+iFr;7cF;!WvHcd>lG{52<7{U%BtzrKhHlUn6eEPs zqw4k>tytdAy`n9@h66>N%R{aWvt|+48j#ttYyGXZXpgo9Mj8K!iroqwBH9Bl;5j|t zb)(X!X6cFz?qIiNVCWAg0=lOHJ|%JPa5}nR@CAa*O_Uc~ImM0hkNfVk@7VY=47tzW z!QfTN5K7&T&?rI0JY30UR4?CJx4jE%Fc*4~(NaWtasXZ}ckGN~qF~GunN4<+T@k{) zNABdir$0(;MhY^T?OhN1YW~dn&|^oMUL7j|d?@tBYVcM*R?DQrEJKk%6bCBIa;Xo!i>-2eUnZNd^WN@~><*Xt~0GCQDBd zO5Sn^1@qvZwZ{o5?mr+IPyiMvk2&4n_i*>=0ohhJ-R4fo@8T%Zf$zvnSa|hvcAU;)oeyz=f*wuAxsKL;CM*{N>+|S7(?{*LcTC1w)pWhv=uqG{cdCd&; zj!asah&|D^f!G~B^s=#A9Bl)L^85Sj(ZlC{hvG*OdWE zG!Go+^C_(c#fgDEtnKb_$OY6p9`OEq+oC(VoGXi;b8Z_KLB>9e#IdR9(gaVzik?^n z8N~!LE=tGUN5kV?psm>8u`snT=n9S$@myS!2@Z@9F5l%z!xo@|ytt5s zY*uau_&q8iZB$3;M{N>IK=znZy z0P6Kgv~??){oD?$o+QX8T&^#>f!|_#SkBjv;LsBoi^?GF96|<<*M8@5{x6>Sa_2q% ziFVL!1P7jpQ1zjJ2bY4sczrk?KYv5}|3zx;4Cj74dVBp^i>-cO^7h(u7iS%K9KQ_Q z-f592wTTm*xu75Wr2$c8j19)45PqYexgOhq-^nv8gb7t`fhWocO8|_)H0rV_0gdA@ z;PSbyy9(a-SnXQEo&;|W18^;`hp4jAX1*Dvr;deYpw5^re!RvrzONPwo8oWoJt0}p zhpqs0D+*r@zY4bFBl(rLb=0d>FbVyd$U0)8f}zcYRuV9|4XiGU5P>LdnuS(ku-hmG zR7V9pw&E>eB#jlO`;CCRBAj1>yU~LDiv3g_o?}RLdizdyb?VPzLa*;T4x=`N{A%_) z9BJKP%#4EQa5uVvexTJ0Gv;|!6A#^ZDQK`+uy#C&ywT)x3^fOkGt6blS?wEnj)S?z zTiR#)p4P)M;8%o7_u_<0G&N}*bUXvxGn~6$hW~q)vZf3!mjAz9$`>IZAlUzQDUEFm zot;gc>8%W%TD!p=bR-k%Xv~^2G7Cp%te99>G-hVdgGXm95=GHjv}bH2(OFoQnqL=Y z`mQ!MVn5}?ha=C=>#2Dj>#Jg9M6n#8T#zs^F_DmvP!js}bO^S`iz zfDltKfUZr4&OMMZw~h21pt&WsW-#5!{YI4UMyen zt<4E9*ALf=4meW|$*N)(l|j*+z*B~ClD+2(!=o3g(EQxkIX2TSN?)O|M$ezE5@r-P za;dGHutyiY2Wxx>-Qz zcwFQJP)<SwZG!2)up=t}%%!yA33fsiLM+tGJ#XciggP0y>yJ^N z59&t1yDn!v2FuOyDR%44ojoE>xtRIuC_dTPMJ1m-=bQSyJhJSDP8sfZKRTRyoRF=& zB+^lM>#@5q?GKNQ2`7}J%Z8#QigY*j)Cmr)t#0@>aUhuhQ;{6_@Tq zgEOBiW8kQmPdueqF`4%UI?`qt3diBWqf0NT{-4wu_-w8l?MpnfK_+U6bit^e!VK_) z3X=0|?ZlI9o!9)^r7L{`nHk+M7%dX(jU{oiW_+@p&4%A0mhGXLzg<5IH-GGhhY*2M zj+kR^Gu{pHYB?T@gFP+KwYT)%Gu#)dpVy0GVpKM$W{rQtu|OxT|x>E$g_1A_xofqYV&?SHS$0kbwWGO;r^rm;4$w7whTnpRI% z>{l1|10&g$ArLLn8xW4+4>>x?fEtuTgebso;19jOkC&I3y#wq*qQsh3u3fUl z(Q{tBSNiP0)6rWOx>FSXS}y<7ZH;BIWzH5|0@QlSo9LSJxO3;{qV)3LdIkgeQ}P(S z5T(6@L(;z(RWtp;AbiHUDEmtxENa{Bz3w2W#e1k)9mus4a7t<<_$Xl($r@RKf{w#B;(R50=?%zJ1z^ku} z7Z=wpYl_)}9fHPzkH(b{1WW%jsb)@9jWuk`s6uPaP}-m(vuBM?-KzB}s?PNknj4oW zxmMFDoYczJs3=$Xfqsm(xZ1Km7aeT%q%`KgLXRpnzWJ68ap)wVn5%( zz51&?-%BN!-~;A|v| z!|DBu=Bl<`74G>)7?G^aR5*9g`W;-N*tZRy7UaVnnNa*NA3Hw_wxE{9+v8yUh!J94 z+3OV{B82V85;l^`yH|U7%Eyp%+kw2Gxel0+K@cLEX>19i7=gVfqF@YItFt=s$w z8mmyzlACr?M&mg|E6#~1KH*C~%Xa`*ILb!WsogasM7Ru7xLq) zj>;K5ZcX~yb}pgX%CT$HyTXFk+^xwVfIj1f%b)ww+O1+Nh+SeEF0h*PS>Mzc<57kQ zGXS{M8g-ZSrI_@Ct0@i7YizA#0BNG4J8!^Gr#)SZ=MpflS-lh1ltaRkZZ8!l4&U8| z7g6TFJv`_(p)2{Vg)Z>@e|>#rP$tc~BUDF zh_1OMJ1Sn;EAF!1%a#rR&JVmN^&MU@zC?Xce~M{!>;7e@U+gWeG(s@Ntr zQL#9J_^{@H8X90_>^N~EPqaqwUxkw zZ*~p35~L8gMtFe2pdf876>6n*n$jg9){Qe$Df|6-l-)3Lsp z*!(jn9=-f*^b>=bviW{dIlrIgH_3(RUel!>GCr}uMM^w&kEStSTN9-0FxH$!;;e+8 zn){wdg$GUJg-pOb^cZMm9|23sKqf{pi3g3TStd35kG;>Eu%~ako)g`!e&3XNak_i zEB00qUw_aF?3|;;OOhal4|K7-6Ohk)&nd&%CN9oqY8?zXE%kqw+>+!amxWIQLvOEW z{$=ma1w)8ki>>4~`-?x@io(<-)ocUY%y7Pv(jI^)CI=;;375PSd<>qs??0Su@vdKy z3Qep_RCAgFA=Q3V)otv5i{V=}mWZ2Hx`Db!8TBPMV5fyQSybB^}Z|L!`ljzJWz#}A|b~mZ+}1V*r96NLA+QpN7=Dgv2T}GBZ0Fjsg)+Yc^g!#0$YU3 z=X7)vRD^qW;sHsIjT#j#!<`cLWyyk`tcHu})beQ;BaqR#RxVOxDb^blYII{1+Ha;h zmxF!pg7AKt&QZWBeQrOyj7y_NW^W>~5qEYcH0#RVLaG++7Q_QGy(k&CvEFbcH-5z_A?qz4uzu z?d#!W#}j3S-e4!W4`;fj#yx{&I=oEuNEj6_Ls)OG1*TL&Eq*%jN$p;}q2; z#j6t2I1PLSqDNoPQOuxScQ73Y zFl=_rdccO)=++1!$||DOmPIy1r_`$)N9><#bxec8Q4lNFiQrQ;veb0uzgLeQ8WJjI zCrm!~tF$p{idDE`eB*q1sB!MbD+*SVZxCfAI3~ z$@46H5aXG-g?|LSWLq%39d>CYW^QFXxev|a5ZEG37Bqq8F@+|*4?~sC*?k#)+}(Qz zHESOKh|hT+zvAmyq`rW&h$%W+vfJ0XEQ9PlgFa{TxR^dQTdl^>bTtHN%!vXp((=}H zX)-M0j`J6MP}N^BAR-6}mdIV< zNrQ;Ulg3s@|E!&$zVAW7L@XqjzWw#3Xp$;mM<+m2Q&xCw-7;veEP+R1u=2Ryut+3M zB;4b0Kq|arr4NWjFZfYbx-3D-^N5&G@;2&>Ud!xmQuGE3>nppUjf0a;&0c5c=H|wy z|63&W)~|b$0|Z;)m)Rrufiqe(a{R|s@VwiYs<%)ynt@c$>9g*vL*{-%@TBMk{?L&X zT^Cm2wwPU@Z*?$b>Zoz;v{CvQW~mA<6+QpKS_f$G)u^XC>2>|+{bk@Avzb!+oAq2F zhp(JKW((8w?YGl0P1dokdgqbO;fxPUEs0APK(Io*?PShbj|L*>1Z{@FJS6w10nS_u zth3=XR#-{~mZ5h)?9vJ9U>JZsYejkxA@rUV4Ih#mUJceb%v^h9Ryth?XH@J7JZ3*< z^nqUs%d)<_-m1CH7TX0QIwZZKW*g@wX2`sdgn%Zcoyv>dYV_4{5AC2UV`F3HI}*KZ zY@5fEcO>Y+5562*Lfn@4_deM+=tU%%aUNclgu#X2ytyP`8rbGv|mrBV6(4)M*&_Dqx7ZU>k?n~pf4^GBh53{SS>6}i_aReRvww~z8x932b%L< zx38NgO`(UKge6Mx;0~!O252~M^^}6w18@}Qax^@*Dg!g`gplM@81_g)u6GU%uX2^1 z2i-WWS9}xcK|AjfGk)aaK!NasMuQ5I+hG3^fUc*){2c^)t1IQO|E@xYcDYVh;$eri z@JABoCA(l-w;P-V(*q>fr+AI!)Tc^-t>To<&R?Y(t12eH*X@|Klr#AoZE)(aWfY!) zp6M>GqqPBxh)fp?a5;G&l+bszVAD)8LqY>hvW_dF%#10Yg%XwRqeXFUtU+x22V>XJ zk}g`%%|hPb&9}8yV~qGV(skapX9cm^law;ap7N@J zPh`4l5B`+8e(P7g{9LXCdS;HW3yJnGM2SR*D7bcwqSorRy5FyT?T%(aY?iod%G? z$5vRY2{!4>yp7=1Y7cxR|U2SF`GrkZR-Q+L|l{tTy`@s92=(_&ee3?q_wk-cytGuIk3 zi^bLmb(5U5WnI|E2t`T^N@{Tx<^5^8H}K2hggy_C7n}q#2efh9R`Ye6S(Ltsf3TM@r9+@%bX7fmD;u+#tr{(_|o9@Lja%4bH zN?E#zn!2dTrDPaI2MnXbb;MpcSBKxD;Rc{9=!BbBhBQ`}A!j*+Xk`^o$AfJm{J=xb zPWdy5ecW*9e9Y57l)Rv>BpwM^s}~TmM|&m;PbdAXV5(gQ39w&u!$`0*pzLp(SqAJA z(Zm7*{jmbRuB0U2Da@aPFjwkY$i~-5$zHG#Ao}v+gQNps z&Kg&X(tj=Pv^wr`u(EFY06NvFuhOFy4&TJFtJ_dKyc&6`Y_&IAmRii#@;9z8J$&2d zoa>FWo`BXHS2;-!d>`IfcQ}d1hI_FbeP9hV>PAl#9^EkCN>sjKstHib%A8_A$cAP( zuGDN7%F`+o$|Tf%7be61c*Tq;6jz-UGi%1YeI8r3SZk>2s|y5mb9%^9i_A|n@6#%OU=Qs z+EZdVz>!a=}P1Ak}KQd`BdRm4)RKy!sTpCuq{N&jd>Q&rIT zNlUfI086fc}QABQ9Pqy)II< z;!r-nOmXep78a^X;&U}pPbWvyCA#WUOU?X_Wndo9&KnnTy)X{)`>#PQV{{^=b2VOV zi=)4zDA)x2F?Ld{<7(1DsVF^zcq{%LMlEX|96@J$K)j;5Pu1*;ip`P{{ zaU)!efo@HU8hUXe8~&yo27)jaV{TZQ-9LtNWZF!^R4z9HK9xE1jd%zy5Zl8UuV^Saa=(OEod8dP#O5D3JR8Qqd5{f_Kodu zRjPxwB;*HdJ!J;Iu!(^?e7D~sh~gK#Bw58FpD0(wqr#QG7s+HWdS9U`;0ED;ND8SH z(ta58hzZ&-(dl%TLdG~?3ju$GLuUgIeAmzsTsKTs7aExIHm@&8L&BY2RTn^YZW}RQ zxbZO=x!*-Ni}e;!wV@8(456)S=IvDr?_I6Y+m3KS`x)M@f$lcb1+m@5-IeJ-8X^ye zx+F4O%Z}Mw!;+=2GXENgi^^Uqhxare zFoap&L%cw%D+_O}>SSVIUeMh$#93u%sgM}@;mfkC{h9iXshYrP+|0ya@AZR#yB-qF zw=%jdT*LI+nX+f()FTIXG6{e&e6JcanQBRZhG{*QC^#MXb16>CVC5bW1J$DY7l|6r zjylU(ns)J@dSx7DD4t3iaj5)CSVeoy+-wGtjGY)~X*pj;4vRSIgm5K8kpx+!Ru{)% z(v7=KU;yhSj5^G(iZNGa_3`MR-3{lQT$yvO`+Itm5;&z{LA&5z+cf2%0hxR;U_0KC zKFChF?1pEhsh~dcU5&Mn@UzQr==?<&;TwRZjF4oN9Iu}TN3^pI{-GJ+BJXyLd`2+o z{(%K7*J#6KUBUHh=!M9{E%vRJ{HRB2qkEN(g-rAd3p^@H-bzD;SC%{}?t!X#$O!s7 z>G&vIh0-iuokl7%Fs85z45{6dfj)aS*} z?F>oA>2^It~#7fsI#p@oK`w-n3xUa+{VoHy(>|Rv>?2vsv z4_`Ic0^mk)@-!!g2GC|0Q&&egJyNp0H&_N1)ALjoo^I0>ey4GpUGyKicRss|O;Ddj z=Y279NmshH^CRS5=%LBwi{uUXvwsg**j@qo(~faAT$M6f^b{BSGBM^7KSw>NFKS&E z)goqrF;^u&j6(540mDm{C&E~li40oV+QDYVDprLM$nABCFM_|^SqP3T$MRDAe)YY- z_}-n4f3+fNxjllC_BBHrDR-TDeLSnSqu0A*gJhA9io91k#Y`>IM5tyO_%mzC9v=x+ zW~IPZ_tKBo(P^TzG=inN%tE=;dCobDTzowXyF32GrQ+AMd+MO4Y<&<~ZS26O2fKE0 zSTRN2vMY$#-zA=R(1$%Y7#`1YhKW7g&<#;&@WCeEUT3srQvuRMMo@I1DUi)~w~M?6 zozp>7E-eXBQsYeNQpTwT?{f&72(?+^O)sLd;g}{(-mWfixiF*P?lKW+D8r5p@r~hH z;|lgjE=@c;!<4s_;krf7+%5MZ6EXFvB6CaYx^1&*0RgNMvPQvNN0PNIs9Pe1h5`*8 zVB9H@^CU=Zy=_vm;4T1XP$f@dzfU_&*e~GM+QcrVq{R3z#50a&SY?LIjF(uo3Fa%q zB!Xii_570@kAI`9I&}W0268Qm)DdAQymQ1!&~evxr|P3Cmp)W$<2?z> zINNKbi2}x&)-fGD8%C!0A?Z&t*)%Q-FUH%q&8u$W1diyb?57tW%BBaQ9kHJoR>dnL z5GxSdX^;+X!72_;Ha9Oj-G3I}6)yU0kId+FD;p4TLCxNb8sF!OO00jHh5`Ib^dYZ9 zOT(IMTl-Dki~VKxTQ#`%KWr-Yk)Z(&&PtT#VSwQUbzk{cv~_lUiZD}R4_KhAV$dzc zw{mapY&<+n{1ALk(dsv{4&~%tIchkoGw@m2o1-T~@%l7kdXXnUTjaM>(};!rxJXlO zb1My9aMgzu_A+4&UH?Q|(O+!NKZQ^ZgCdLU4qiFIWBQL}hDxYS-Ti4s*Dh1LS?7qHr~cK|qs4Xe7Rsc2KAGo4AZUYO+-(ji z4JCym<8$fP&^|EMK%&-Trz^O9!jA3R=cEC9OIDG15)dK1QqV?jOfG6q$$S}q_o?M< zG;D*C9*pN}>FnAvYA=qq_t(#UD{^Hb(-nmu!gdwfa;FXZr7iZ8_D2L5&lqa0ILQ_m zZR|9yFWRpSyj13T0RnKA69JPhV=#~&@Yc=>3)@yFBWv0g z#UIo@`w{Tx>YZH5`naja$}$%b%FABt!ldPYj0@Un8z{n;Ci7`?&?53F7uvOtdD4)= zG{-oY>eyOAYNPGkVhKDJ!L^>nl$v%QKr{!0HFZg`VaRO1nJ5FR`)MurbPjq}AY#;g zAQk;UIm)0`$Ay;|gmOsuddavF^oQSQ>%?c5qLa`{dGUfzE{m{bs@qaha4K6G`TVe4 zT=O!^Cj8?BIaze|gs<&Ll?`pGsCjrI8(JysUBY+$XqGngN_en%X*#VV%U{{ubu=_m zA&D5u6w&3g9T5dgT6@*eo4mk|S2k4PJH1LfHsrgZ(K^BH-(?ZMk%TLV(G=Pyk6k(1 z<3hD$rBiQ`Vl4G7AuDed5UR-{{wWNvMx!oVOR#hCC<_V#IMVoNNT<%GR( zs(mJ_(^5fiA9T$)Jh6{efk6zVp{29Hdq( zmd_Njimg=rU^&=8s}BfdzBtgFqz6eqkz=}xahCS6$6f@d0SogC z+!Mr0B%Fk<(@EfiPZ5VmGuu2vFxUFK@*G$6B-F>`l~xbff&W5x3y_zI|D@)6rCpO?e}!`M*Aae{%AS7ErZX zS$Rg^-Y-_MIONG|L_@RlovJ^N)W>(i7pH9y%*ba|(I&Jx2dPkH9`;ktaIdE@QqCYp z#Zqt4dQA!M*W0i6Hx9xZ*Cn8$R*%y=mv!-wN~c7oehcqc1Wx_#n|kk2lMk9Y=g(g8 z$sL&hOitK)O@6o@Qlz_to|w0_ofWRVMw9vyMDIg;&ZB#~Vo=6GIJ-f&xk2V+LuO@% zWMx0d@*b569|5tSpPD>*9IBXkzX4;r*xJ{XqfjA z_RZ=@7QL@?Zu9Ls+~*GG_v;AM;0=`im{pK~S2bixnA5b|Z!dY78?ghC2Q714BW69A)HkhqCW@ z`s?Adb>J9Z#x~a!-&8OGs%V~dWlUR@cH8URhZtuYRRHt#;9pKJ;yt;<%)Ao=>sY!*iRitW&979f&LbqhAX{YD%j2d;LA=8xAH<176#$FLAh9ZYatamsGk&A?}^LD=QP=$W`w z;<6dZWGIY!G7)W%sj~+0fyXgtG3-*v2vZ_~%`#qUQDMEh^*<$E&CvA8Pg20AaeKPR zB%P9BKJQqs_z17OH1Cxdk|$hwPlqb~@jcPxo!agERbcot;>OrrqUK_63Lr0XkZqB^d zajQ+#sV{??T%QUsTKV8Ze5&>}9YfF(>NFxpxF%yjnV6tQ;cpAV8XtnbNj1vFwK z_YHw|$6!bz3UGGi**Uln#zWF$o#k?|w1~ox&yF}P;K2)UDkPNvn?Mskms!rj!;U~X zo;q8e_*$OG9>8bp;2rf-W03V9$!rT@T?{7N12xB1BnE5?`}r?$ZQX_4J9@7NA9r7& z>rq4Nx=mxYLpdm|p-q(w_B6K!1k+n--M6P;0tpX8*JZ$RYY__Tq6?H$fUk+qC5~we zRjsZ|jQ0IP*xUNB-nxbx!Kzcu{&Y7$yhw;LYW$ z06kdp4KF#p6^r*kya#{mmOmz=>yVY+pq$Rq$DLStwz&O>>q_6(Z$s4BaMW2J9q68; zn~8A%B@?0_L^L3C)eF{lZF|10d!Xv6V^GEU#i2uwGYr|?+x6mh<3p3>hW$9Pd-Dbw zwFTos;^j{Xtd1QGB=Irgfdp=6sS?yTMNQ4T{_eWT!R1 z=pFJt`-*>YKwyuiaX@?vE5>4rW=NezYW3834qAlc6P1Jo>(md&j_?HOAS8+N#KNDu z5uw|vAi!>{p?E(HbE64x+N=$z(o8xY^|soHR-Zo8-^&IF!)t%eMT7bZ+j&?dl&=<5 z6#@q-EW5y+s+>ZaAnLBb4%XYQQMoNr2P!%v8urZcM z0Y`^W>{!Fd4_qpe12CD%aP3qGyn6>6Mh7e`*BnkNjwz{{?i=LCoO*+9Q6C`ay^37* zsNDDS<58Ho3y@ei+2|_<%nFweE@KkoR`4Dqu6^G-Sl#c>is^MthRDz3;?42#?|4Pdsa~{L8)|_ zy8nhW6SNFG_E=Pbm5h^B!b8{P5|MW!Z2SdgpWSs5L_hP;NTOyT>edXUw4<`GRIS8o z=XSYkOSOhx4r)Kte13nJ_`|;s9DuRN?VnIXq z>Nz`t4)jU{bK03yS;mFfczs)RP?VM%wK>zd@m68u~m4*Di}2*u>hML zi;t<=O+g7pM%1=dVT*J4DCu$oy~(_aSEU5_?Z{V3c|0()p-cU+E=(P4hqAt4qaJf@ z$Y@lBIF4OlSPZRI68t7DR}=4L$%bT>m9brsO1YlP?2iF#6P#CK4Qk9eQ|0@bFRT1!m7WJ>mEs20sYFNcN@~ruI z?*Qx3_IrT5V<-lrG-xCWq0=7oeA6zKY7=!EKg(`_7?R6y|_c_fu9?o%p=cK^)v(tK4fqa`3gDX6RKxtUU7#Vmi+05cUxM9QN|)N*1MY0xSUsvVr{9G znE2NLO~j1((h4(@gyJ8P7I4|~-JFrXqOmtS6#UMnGvH&+Be`nBBk~3ZxNgmf6Vn~h zFLFH5baDX)ekdu*-#EL+ckVd03K{|3OwMjrP3%KE#Sj{nlYcNWk*`U9RP?Y2i#+`% zMXRFO$m`Of^qeSGbKO8A1B@}jxkb;uP+(bWDfXqI-`^_hqGg1)61|!=n{-KZrW0Zb z8tf?@jW2~K7s|(v4eX7TD4SU1@7;&3_kL1ZZuT}i1CU~J#(!}hDwQE~0}~IAxR_pmZlnCz8}HvTZ>p0=7PnFF(&FO+?V{a zw>W>=>wW#9?`_su+qL=YN4LS1F6)-Y`qgys18iHK*VoiopxY?5K3M zZYV^=SNTJuud58e*k$2IZgg@{VIXxWID7${Fq!7hAE@xy$(l{uuY+c;yrYLREKE@>El9N;B4{?&-r9*hw@3r4P9X zb+ep@Jf;ceBHS>LDhOc(@#ECosgHAVB!@pdbJMjH5fy!?X{ea+g484GdJ;e{d!NzQ$&ED(o;)H~ ze)br$qE3-RqvksOq33jnO0Wa~*9*sC5BDK9#NpJh#~uTYDQm5&X#T;Vv4pncrAn<@ zlr7b;iLt&tm0|YfV9eE#PBn@c z@>FbNh{knhv7?*u^E&v^B?IeTlgEqkYRy2fOePMSgZ!Iph^YIh6}CtZp6chB_v*Q9 zIT|L4Y9KfS$|AWm1S~a&6`@CTI0!9vYs&)sGZA~=h}9i$Ch!;jebaiYfh6J{dFXpV z+17q~AN`j}>_JV{#-ro>w5uhlL*sBdj^CbQZYZ<$2ilJUYMZ7eBW@ z;bISdSf?RLvDWS``RVTVPRs0FyBDsjxig!-JLV(>{j3rKe4SE97OaNvYbN3g+dEe< zVTTHx+)V6oMkSU6N~U?T#*td{S{r0X3{lea&(m#aG%9_e+I|&jN0WA0vg+DC9~6|F zq%Z*YNbyh4?*;=#KXbQtuSyIlSl${0E4+jti&Y~8a;1chs3F@BP(>(EGpA9{>Lf|H z!oWh}4fe8%_oR_gSiu@t14SoyW#+P8h-AnFPN<>UqESSY5F+XT?8LPY4it$k{=Tr#GqBjGiUTpy!?R42LG|kfSPcku7bkr|O`@x* z5K=#o&51Zc4K=CrOJw&NhqPvTviA976yfdb5Ka^kTI&I)!n0Vi;XMc`fsOu7Mo9g; z>C(O2y=y7(`Sl2O=QqRwhuuj?*Hzo}M8@DxNp1c|5+F`$`kO6ael0b|U}sFQ6-P8| z5Q&Gh*(o>pXR>Q0hg}_P+uI%Ag@bGE-lH02RjY$?S#ps5tV1NDbgfx9VI+~)1uP+- z{PbyjYi|6grIdiG8Ojn*;OX=}@F5U1vQ|2Jk`JoXlv+bY)e|%fVa<>Q)M*^9%3S))=2>ZA`K{GLaLc>~rEl^I&JL2TJkn=Mzig^o576@cOnuF#vD)$hu-XYJDo?uwg{9@LP^we$&)MJ(jE z=Ie&frqjWV`U~+3apW>?NG+V)`yZx0_j6%aRYg6y?=K~PK|7(I7J*U&GpRheD62^D z+fPE>Kl$Tkr9yC@3qmLCY>K_>2eJXGPk1apijr&*#P3jT6dM)x=yE?5PA7^p`k}OU zk$4lsmJ;!l^f~WcXcStIv`&W0CxvQZ<L2Rv*5t@mLp8^w`X=gqidYs{~%4d+@Fg zu-NCPX>78}As<7|FXc?Sm6#f~tiroM)nv#4QP9EgU9`6?{iR0wP~>+XTG^NfKqMG_ zl?9YL?Z%vsWu9*<=ba2h?Y3;*!Yz>{{cIlOG zgjzvmj6a*^+P%t4cC}mGOL97~RRy9N_)t9gM}CtbvATs#@XjlvN)dSx20HcwFtD%fy}JktM|f4p9>3%ufX^gw!z6g#bC** z-y;}{R7z;VX&EBqmHuJJb;}>36CQ9ZsfZGr}LPtS|1~8Rl z08EZxI-25g@P9j`GZMuo9Tgj_@H4;LFh_Y*rS$JQ?2FHZ$jNMKO8n4F(2K_$lawb-AmlVF^)8Z{ePM_z)B8Z;P39i?A;ENF z4#c#D;rN(4w!Wl)l;=U*A|XX*u8CDduChj}ZGs~}bOV7I^m8M-qVfU-C>2dtLL1Wm zhpVPTB~IdO8mep_OP)R<8G4PD&P={Qx&F@Px$viFPm?m1is(+8hn2VV2P1jp_TON)pYSB@%i=%UikpCLaqkP&FO=tLKYYl z@J~iwtu1Z3s*2QN00HU>0GD~SYqhv|nRi46nUg$_AJDuUWHoZ5xG_j}1??Z=u$EP5F)Lv3-Z z4%KOTK>ZTcIK-xH4-{fP+nSz})516y+H6y@L#9}E-9i_u?zshM)8TYfqlh!vKQL4| zGxF>v;f;#cLk#9+$F31AG-{B*1yx1@2=!nsb8b~Qd4q{lD}^{sE!LIb_$fsUbh>Sf zD0l6m3HIg^x4yqo5)IzgBaLDz3g5{D+*`=RC41nDAdWvp6+ft}(@d)4XzOERmY;9; z>Tk*$_`00mQX8^qVi_w(lHqWxfyAUp|q2bIc&DQOH2a5$!Dh|JJprvb~4os?| zFI;|}KHo4s0Epq#}nY>}(IsF8e$xQ;}$5>NwaYx03?O32lzj z?fix6pmZ>^0ul&~jz-|)5NC?O^I(bBv>p^tP|jHu{D>wH$QBxiWX=rW*2)<7tD zgeJG<17M=!MhCCom325h2dLjjfCn6H=!u0^f54C7$*_2t_F`t<8i0#UO)JAc3+xs& zAt1BxmhVpr79d&s_}SGgBaQo+Z|!vh@utn1ND1+wc~{oJFK_=ME88%7(85Y0HmwU zLp;9Ul*Tl2I;(#Y7#F*|AN(vr{ISUXJwbH!{dtnVmcotMw0Tuu-JY&2 zQJmY5V$hl%eu7GE9G9oIABm@m>qL9_K%Ybb)c$IYv6qqDXd;twLI!#Q7L?57qhDE< zJD;BgFwz|}0%7sS{Aq2J{ADPrz~~(R^(WfTcJcsB2;$}KLBL)+^j*OA^>3(}0O{B2 z^(ZXZ8zvsxaku!VACLbR!>(V+2aqA^$)1(z+7Iw10yrTI_q*WP{=!8DJ={Y1TK;%| zKGcU#|C*W*de3Fn{DeQ$KQj^g9K!p&7BKznRCq<)?mm?G`b?wG`#|jdg1o6YVQlI~ zX0!OByAd!q{PKUbrk1+4FEf4hi+T;SStBg-<4dmpih+ZFwpaZ6)%Xg2R`X_c*?Se}X?7>S{(N6)6F9)Ke4F4XVrwEDB1JlYlAt(Fs7a zDm9(dJW!#&d9R*Inr@1LPFjwxX-^3REOR%JBo8j6V_;oHyLccl&>aadTFpteCQe8K zy-*Z41Nq-n4gI&2|Epq9Ff{Q0e^lvT?Eh><0smb7AHk&xfPbIhKXX6-MF#;X3b_A! z`#)1a|C92c_SXNR2y*|M+4Vn({{a7Qz5Yc+0=W<>`}r?r{yWA$>irjE;(syz*OU2A z;(u!Szo|t5PybH*FJ=F8ihn5oyV`#=_*eU<+Cb<3qlf|k66&7;=)Xt&-?-TFze6A( F{{wH8CyD?7 literal 0 HcmV?d00001 diff --git a/modules/mogo-module-media/src/main/AndroidManifest.xml b/modules/mogo-module-media/src/main/AndroidManifest.xml index 2b857c6071..4292dc7f05 100644 --- a/modules/mogo-module-media/src/main/AndroidManifest.xml +++ b/modules/mogo-module-media/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java index 8741bc36e9..fa467bc990 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java @@ -11,6 +11,7 @@ import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.module.media.widget.MediaWindow2; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.service.module.IMogoModuleProvider; import com.mogo.service.module.ModuleType; @@ -21,8 +22,6 @@ public class MediaCardViewProvider implements IMogoModuleProvider { private static final String TAG = "MediaCardViewProvider"; - private MediaWindow mMediaWindow; - @Override public Fragment createFragment( Context context, Bundle data ) { @@ -35,10 +34,8 @@ public class MediaCardViewProvider implements IMogoModuleProvider { @Override public void init( Context context ) { ServiceMediaHandler.init( context ); - - mMediaWindow = new MediaWindow(); - mMediaWindow.initMedia(context); - + MediaWindow2 mediaWindow2 = new MediaWindow2(); + mediaWindow2.initMedia(context); } @Override diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java index 107206a46a..f13b506d43 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java @@ -181,8 +181,12 @@ public class MediaWindow implements MediaView{ } if (first || mMediaInfoData.getPlayState() == 1 || mMediaInfoData.getPlayState() == 2) { - if (mWindowMaxTime != null) mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime())); - if (mWindowCurrTime != null) mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime())); + if (mWindowMaxTime != null){ + mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime())); + } + if (mWindowCurrTime != null){ + mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime())); + } } if (mCircleImg != null){ @@ -286,7 +290,9 @@ public class MediaWindow implements MediaView{ } - if (mCircleImg != null) mCircleImg.stopAnim(); + if (mCircleImg != null){ + mCircleImg.stopAnim(); + } if (type == 1 || type == 2 || type ==3){ UiThreadHandler.removeCallbacks(mRunnable); @@ -417,10 +423,18 @@ public class MediaWindow implements MediaView{ bookid = leTingNewsData.getSid(); } - if (mediaName == null) mediaName = ""; - if (artist == null) artist = ""; - if (cover == null) cover = ""; - if (bookid == null) bookid = ""; + if (mediaName == null){ + mediaName = ""; + } + if (artist == null){ + artist = ""; + } + if (cover == null){ + cover = ""; + } + if (bookid == null){ + bookid = ""; + } } } catch (Exception e) { e.printStackTrace(); diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java new file mode 100644 index 0000000000..e26222ae1f --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java @@ -0,0 +1,13 @@ +package com.mogo.module.media.constants; + +/** + * 音频相关常量 + * + * @author tongchenfei + */ +public class MusicConstant { + public static final int PLAY_STATE_PLAYING = 1; + public static final int PLAY_STATE_BUFF = 2; + public static final int PLAY_STATE_PAUSE_OR_STOP = 0; + public static final int PLAY_STATE_ERROR = -1; +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java new file mode 100644 index 0000000000..103528a49a --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java @@ -0,0 +1,53 @@ +package com.mogo.module.media.presenter; + +import android.content.Context; + +import com.mogo.commons.mvp.IView; +import com.mogo.commons.mvp.Presenter; +import com.mogo.module.media.model.MediaInfoData; + +/** + * 媒体播放presenter基类,目前没有整合到原MediaPresenter中,原来的qq音乐,喜马拉雅和懒人听书下掉了 + * + * @author tongchenfei + */ +public abstract class BaseMediaPresenter extends Presenter { + public BaseMediaPresenter(V view) { + super(view); + } + + /** + * 初始化 + * + * @param context 上下文 + */ + public abstract void init(Context context); + + /** + * 播放音乐 + * @param mediaInfoData 待播放音乐信息 + */ + public abstract void play(MediaInfoData mediaInfoData); + + /** + * 暂停播放 + * @param mediaInfoData 待暂停音乐信息 + */ + public abstract void pause(MediaInfoData mediaInfoData); + + /** + * 停止播放 + * @param mediaInfoData 待停止播放音乐信息 + */ + public abstract void stop(MediaInfoData mediaInfoData); + + /** + * 上一首 + */ + public abstract void pre(); + + /** + * 下一首 + */ + public abstract void next(); +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java new file mode 100644 index 0000000000..c56637d26b --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java @@ -0,0 +1,135 @@ +package com.mogo.module.media.presenter; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; + +import com.mogo.module.media.MediaConstants; +import com.mogo.module.media.constants.MusicConstant; +import com.mogo.module.media.model.MediaInfoData; +import com.mogo.module.media.view.IMusicView; +import com.mogo.utils.logger.Logger; +import com.tencent.wecarflow.flowoutside.sdk.BindListener; +import com.tencent.wecarflow.flowoutside.sdk.FlowPlayControl; +import com.tencent.wecarflow.flowoutside.sdk.MediaChangeListener; +import com.tencent.wecarflow.flowoutside.sdk.MediaInfo; +import com.tencent.wecarflow.flowoutside.sdk.PlayStateListener; + +/** + * 爱趣听presenter + * + * @author tongchenfei + */ +public class WeCarFlowPresenter extends BaseMediaPresenter { + private static final String TAG = "WeCarFlowPresenter"; + public WeCarFlowPresenter(IMusicView view) { + super(view); + } + + private Context context; + + private MediaInfoData currentMedia; + + @Override + public void init(Context context) { + this.context = context; + FlowPlayControl.getInstance().bindPlayService(context); + FlowPlayControl.getInstance().addBindListener(new BindListener() { + @Override + public void onServiceConnected() { + Logger.d(TAG, "onServiceConnected==="); + } + + @Override + public void onServiceDisconnected() { + Logger.e(TAG, "onServiceDisconnected==="); + } + + @Override + public void onBindDied() { + Logger.e(TAG, "onBindDied==="); + } + }); + + FlowPlayControl.getInstance().addMediaChangeListener(new MediaChangeListener() { + @Override + public void onMediaChange(MediaInfo mediaInfo) { + currentMedia = new MediaInfoData(); + currentMedia.setMediaName(mediaInfo.getMediaName()); + currentMedia.setMediaUrl(mediaInfo.getMediaImage()); + } + + @Override + public void onFavorChange(boolean b) { + + } + }); + + FlowPlayControl.getInstance().addPlayStateListener(new PlayStateListener() { + @Override + public void onStart() { + if (mView != null && currentMedia != null) { + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PLAYING); + mView.onMusicPlaying(currentMedia); + } + } + + @Override + public void onPause() { + if (mView != null && currentMedia != null) { + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + mView.onMusicPause(currentMedia); + } + } + + @Override + public void onStop() { + if (mView != null && currentMedia != null) { + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + mView.onMusicStoped(currentMedia); + } + } + + @Override + public void onProgress(String s, long current, long total) { + if (mView != null) { + mView.onMusicProgress(current, total); + } + } + }); + } + + @Override + public void play(MediaInfoData mediaInfoData) { + FlowPlayControl.getInstance().doPlay(); + } + + @Override + public void pause(MediaInfoData mediaInfoData) { + FlowPlayControl.getInstance().doPause(); + } + + @Override + public void stop(MediaInfoData mediaInfoData) { + FlowPlayControl.getInstance().doStop(); + } + + @Override + public void pre() { + FlowPlayControl.getInstance().doPre(); + } + + @Override + public void next() { + FlowPlayControl.getInstance().doNext(); + } + + @Override + public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); + if (context != null) { + FlowPlayControl.getInstance().unbindPlayService(context); + } + } +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java index 4a7a247c71..6ec22f102e 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java @@ -459,21 +459,23 @@ public class MusicControlBroadCast { } } -// return null; - MediaInfoData mediaInfoData = new MediaInfoData(); - mediaInfoData.setMediaId("001jiOrk2g389Y"); - mediaInfoData.setBookInfo(""); - mediaInfoData.setType(1); - mediaInfoData.setMediaName("恭喜发财 (广场舞)"); - mediaInfoData.setMediaSinger("刘德华"); - mediaInfoData.setMediaType("物流派"); - mediaInfoData.setPlayState(0); - mediaInfoData.setLocalMedia(false); - mediaInfoData.setCurTime(0); - mediaInfoData.setMaxTime(410*1000); - mediaInfoData.setMediaUrl("http://isure.stream.qqmusic.qq.com/C200000s2wCd3pzdnA.m4a?guid=2000001271&vkey=8CE1A876F5079A6E4E9BCB8306252EF152F3D4F237B3BF4C1450B50BA7E065D3D55A0735FD2E957B129E83FF7D7D5D398479D53FE2171DF0&uin=&fromtag=50"); - mediaInfoData.setMediaImg("http://music.qq.com/musicbox/img/uccpic_error.jpg"); - return mediaInfoData;//刘德华的恭喜发财 + return null; + + // 测试代码吧? +// MediaInfoData mediaInfoData = new MediaInfoData(); +// mediaInfoData.setMediaId("001jiOrk2g389Y"); +// mediaInfoData.setBookInfo(""); +// mediaInfoData.setType(1); +// mediaInfoData.setMediaName("恭喜发财 (广场舞)"); +// mediaInfoData.setMediaSinger("刘德华"); +// mediaInfoData.setMediaType("物流派"); +// mediaInfoData.setPlayState(0); +// mediaInfoData.setLocalMedia(false); +// mediaInfoData.setCurTime(0); +// mediaInfoData.setMaxTime(410*1000); +// mediaInfoData.setMediaUrl("http://isure.stream.qqmusic.qq.com/C200000s2wCd3pzdnA.m4a?guid=2000001271&vkey=8CE1A876F5079A6E4E9BCB8306252EF152F3D4F237B3BF4C1450B50BA7E065D3D55A0735FD2E957B129E83FF7D7D5D398479D53FE2171DF0&uin=&fromtag=50"); +// mediaInfoData.setMediaImg("http://music.qq.com/musicbox/img/uccpic_error.jpg"); +// return mediaInfoData;//刘德华的恭喜发财 } /** diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java new file mode 100644 index 0000000000..853a9cde86 --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java @@ -0,0 +1,19 @@ +package com.mogo.module.media.view; + +import com.mogo.commons.mvp.IView; +import com.mogo.module.media.model.MediaInfoData; + +/** + * 音频显示类的接口 + * + * @author tongchenfei + */ +public interface IMusicView extends IView { + void onMusicPlaying(MediaInfoData mediaInfoData); + + void onMusicPause(MediaInfoData mediaInfoData); + + void onMusicStoped(MediaInfoData mediaInfoData); + + void onMusicProgress(long current,long total); +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java new file mode 100644 index 0000000000..64af4f4009 --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java @@ -0,0 +1,234 @@ +package com.mogo.module.media.widget; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.mogo.module.media.R; +import com.mogo.module.media.ServiceMediaHandler; +import com.mogo.module.media.constants.MusicConstant; +import com.mogo.module.media.listener.NoDoubleClickListener; +import com.mogo.module.media.model.MediaInfoData; +import com.mogo.module.media.presenter.WeCarFlowPresenter; +import com.mogo.module.media.utils.MusicControlBroadCast; +import com.mogo.module.media.utils.Utils; +import com.mogo.module.media.view.IMusicView; +import com.mogo.utils.glide.GlideApp; +import com.mogo.utils.logger.Logger; + +/** + * 适配爱趣听的window + * + * @author tongchenfei + */ +public class MediaWindow2 implements IMusicView { + + public static final String TAG = MediaWindow2.class.getName(); + private Context mContext; + private WeCarFlowPresenter mPresenter; + + private MediaInfoData mMediaInfoData = null; + + private View mWindowView; + private AnimCircleImageView mCircleImg; + private ScrollingTextView mScrollText; + private ImageView mWindowPlayPause; + private ImageView mWindowPlayNext; + private LinearLayout mWindowMediaCenter; + private TextView mWindowCurrTime; + private TextView mWindowMaxTime; + private NoScrollSeekBar mWindowProgress; + + private boolean mHasAddWindow = false; + private boolean mTwoChange = false; + private boolean isFirstPlay = false; + + private Runnable mRunnable = new Runnable() { + @Override + public void run() { + MusicControlBroadCast.sendGetMusicPlayStateBroadcast(); + } + }; + + public void initMedia(Context context) { + mContext = context; + mPresenter = new WeCarFlowPresenter(this); + mPresenter.init(context); + + isFirstPlay = true; + } + + private void addWindowView() { + if (ServiceMediaHandler.getMogoWindowManager() == null) { + return; + } + + if (!mHasAddWindow) { + mHasAddWindow = true; + mWindowView = + LayoutInflater.from(mContext).inflate(R.layout.module_media_music_window_alert_layout, null); + mWindowView.setVisibility(View.VISIBLE); + mCircleImg = mWindowView.findViewById(R.id.window_circle_img); + mScrollText = mWindowView.findViewById(R.id.window_scroll_txt); + mWindowPlayPause = mWindowView.findViewById(R.id.window_play_pause); + mWindowPlayNext = mWindowView.findViewById(R.id.window_music_next); + mWindowMediaCenter = mWindowView.findViewById(R.id.window_media_center); + mWindowCurrTime = mWindowView.findViewById(R.id.window_current_time); + mWindowMaxTime = mWindowView.findViewById(R.id.window_max_time); + mWindowProgress = mWindowView.findViewById(R.id.window_progress_bar); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); + } + int yPos = + getContext().getResources().getDimensionPixelOffset(R.dimen.module_media_music_state_location); + int xPos = + getContext().getResources().getDimensionPixelOffset(R.dimen.module_media_music_state_location_x); + ServiceMediaHandler.getMogoWindowManager().addView(mWindowView, xPos, yPos, false); + updateWindowUI(true); + mWindowMediaCenter.setOnClickListener(new NoDoubleClickListener() { + @Override + public void onClicks(View view) { + if (mMediaInfoData != null) { + MusicControlBroadCast.openMediaApp(mMediaInfoData.getType()); + } else { + MusicControlBroadCast.openMediaApp(1); + } + } + }); + + mWindowPlayPause.setOnClickListener(new NoDoubleClickListener() { + @Override + public void onClicks(View view) { + if (isFirstPlay) { + if (mMediaInfoData != null) { + MusicControlBroadCast.listeningSendData(mMediaInfoData); + } + } else { + if (mMediaInfoData != null) { + MusicControlBroadCast.commandPlayPause(mMediaInfoData.getType(), + mMediaInfoData.getPlayState()); + } + } + } + }); + + mWindowPlayNext.setOnClickListener(new NoDoubleClickListener() { + @Override + public void onClicks(View view) { + if (mMediaInfoData != null) { + MusicControlBroadCast.commandNext(mMediaInfoData.getType()); + } + } + }); + } + } + + private void updateWindowUI() { + updateWindowUI(false); + } + + private void updateWindowUI(boolean first) { + if (mWindowView == null) { + return; + } + if (mMediaInfoData != null) { + if (mMediaInfoData.getType() == 1 || mMediaInfoData.getType() == 2 || mMediaInfoData.getType() == 3) { + mWindowView.setVisibility(View.VISIBLE); + } + } else { + mWindowView.setVisibility(View.GONE); + return; + } + + if (mScrollText != null) { + mScrollText.setText(mMediaInfoData.getMediaName()); + } + + if (first || mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_PLAYING || mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_BUFF) { + if (mWindowMaxTime != null) { + mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime())); + } + if (mWindowCurrTime != null) { + mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime())); + } + } + + if (mCircleImg != null) { + com.bumptech.glide.request.RequestOptions options = + new com.bumptech.glide.request.RequestOptions() + .placeholder(R.drawable.module_media_share_default_icon); + GlideApp.with(mContext).applyDefaultRequestOptions(options).load(mMediaInfoData.getMediaImg()).into(mCircleImg); + } + + } + + @Override + public Context getContext() { + return mContext; + } + + @Override + public void onMusicPlaying(MediaInfoData mediaInfoData) { + Logger.d(TAG, "onMusicPlaying: " + mediaInfoData); + addWindowView(); + mMediaInfoData = mediaInfoData; + updateWindowUI(); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_play); + } + + if (mCircleImg != null) { + mCircleImg.startAnim(); + } + } + + @Override + public void onMusicPause(MediaInfoData mediaInfoData) { + Logger.d(TAG, "onMusicPause: " + mediaInfoData); + mMediaInfoData = mediaInfoData; + updateWindowUI(); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); + } + + if (mCircleImg != null) { + mCircleImg.stopAnim(); + } + } + + @Override + public void onMusicStoped(MediaInfoData mediaInfoData) { + Logger.d(TAG, "onMusicStoped: " + mediaInfoData); + mMediaInfoData = mediaInfoData; + updateWindowUI(); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); + } + + + if (mCircleImg != null) { + mCircleImg.stopAnim(); + } + } + + @Override + public void onMusicProgress(long current, long total) { + Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total); + if (mWindowCurrTime != null) { + mWindowCurrTime.setText(Utils.calculateTime((int) current)); + mWindowMaxTime.setText(Utils.calculateTime((int) total)); + } + try { + int progress = + (int) ((current * 1.0f * 100) / (total * 1.0f)); + if (mWindowProgress != null) { + mWindowProgress.setProgress(progress); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} From d65bf7a709a19184c2e0e8cfc87a550f30fb5062 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Fri, 5 Jun 2020 15:30:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E7=88=B1=E8=B6=A3=E5=90=AC=EF=BC=8C=E5=9F=BA=E6=9C=AC=E5=8F=AF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../com/mogo/module/apps/model/AppEnum.java | 3 +- .../module/media/MediaCardViewProvider.java | 2 - .../media/{widget => }/MediaWindow2.java | 86 +++++++++-------- .../module/media/model/MediaInfoData.java | 9 ++ .../media/presenter/WeCarFlowPresenter.java | 92 ++++++++++++++++--- .../mogo/module/media/utils/LaunchUtils.java | 29 ++++++ .../mogo/module/media/view/IMusicView.java | 8 +- 8 files changed, 170 insertions(+), 61 deletions(-) rename modules/mogo-module-media/src/main/java/com/mogo/module/media/{widget => }/MediaWindow2.java (79%) create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java diff --git a/app/build.gradle b/app/build.gradle index d6878216d1..8a69d4c097 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ android { sourceSets { main { - manifest.srcFile 'src/independent/AndroidManifest.xml' + manifest.srcFile 'src/main/AndroidManifest.xml' } launcher { manifest.srcFile 'src/launcher/AndroidManifest.xml' diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java index ac70be137a..8c545cc2dc 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java @@ -14,7 +14,8 @@ import com.mogo.module.apps.R; * 基础类:均衡器、方控学习、蓝牙、FM、车载设置、AUX */ public enum AppEnum { - + // 爱趣听 + WeCarFlow("爱趣听","com.tencent.wecarflow", R.drawable.module_apps_ic_qq_music ), //"QQ音乐", QQMusic( "QQ音乐", "com.pvetec.musics", R.drawable.module_apps_ic_qq_music ), diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java index fa467bc990..c2e341752b 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java @@ -11,11 +11,9 @@ import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; -import com.mogo.module.media.widget.MediaWindow2; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.service.module.IMogoModuleProvider; import com.mogo.service.module.ModuleType; -import com.mogo.utils.logger.Logger; @Route( path = MediaConstants.TAG ) public class MediaCardViewProvider implements IMogoModuleProvider { diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow2.java similarity index 79% rename from modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java rename to modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow2.java index 64af4f4009..359302f586 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow2.java @@ -1,4 +1,4 @@ -package com.mogo.module.media.widget; +package com.mogo.module.media; import android.content.Context; import android.view.LayoutInflater; @@ -7,15 +7,18 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.mogo.module.media.R; -import com.mogo.module.media.ServiceMediaHandler; import com.mogo.module.media.constants.MusicConstant; import com.mogo.module.media.listener.NoDoubleClickListener; import com.mogo.module.media.model.MediaInfoData; import com.mogo.module.media.presenter.WeCarFlowPresenter; +import com.mogo.module.media.utils.LaunchUtils; import com.mogo.module.media.utils.MusicControlBroadCast; import com.mogo.module.media.utils.Utils; import com.mogo.module.media.view.IMusicView; +import com.mogo.module.media.widget.AnimCircleImageView; +import com.mogo.module.media.widget.NoScrollSeekBar; +import com.mogo.module.media.widget.ScrollingTextView; +import com.mogo.utils.TipToast; import com.mogo.utils.glide.GlideApp; import com.mogo.utils.logger.Logger; @@ -46,13 +49,6 @@ public class MediaWindow2 implements IMusicView { private boolean mTwoChange = false; private boolean isFirstPlay = false; - private Runnable mRunnable = new Runnable() { - @Override - public void run() { - MusicControlBroadCast.sendGetMusicPlayStateBroadcast(); - } - }; - public void initMedia(Context context) { mContext = context; mPresenter = new WeCarFlowPresenter(this); @@ -91,26 +87,22 @@ public class MediaWindow2 implements IMusicView { mWindowMediaCenter.setOnClickListener(new NoDoubleClickListener() { @Override public void onClicks(View view) { - if (mMediaInfoData != null) { - MusicControlBroadCast.openMediaApp(mMediaInfoData.getType()); - } else { - MusicControlBroadCast.openMediaApp(1); - } + openAqtApp(); } }); mWindowPlayPause.setOnClickListener(new NoDoubleClickListener() { @Override public void onClicks(View view) { - if (isFirstPlay) { - if (mMediaInfoData != null) { - MusicControlBroadCast.listeningSendData(mMediaInfoData); - } - } else { - if (mMediaInfoData != null) { - MusicControlBroadCast.commandPlayPause(mMediaInfoData.getType(), - mMediaInfoData.getPlayState()); + if (mMediaInfoData != null) { + if (mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_PAUSE_OR_STOP) { + mPresenter.play(mMediaInfoData); + }else{ + // 没有做详细判断,不是暂停就是播放 + mPresenter.pause(mMediaInfoData); } + }else{ + openAqtApp(); } } }); @@ -118,8 +110,8 @@ public class MediaWindow2 implements IMusicView { mWindowPlayNext.setOnClickListener(new NoDoubleClickListener() { @Override public void onClicks(View view) { - if (mMediaInfoData != null) { - MusicControlBroadCast.commandNext(mMediaInfoData.getType()); + if (mPresenter != null) { + mPresenter.next(); } } }); @@ -171,11 +163,8 @@ public class MediaWindow2 implements IMusicView { } @Override - public void onMusicPlaying(MediaInfoData mediaInfoData) { - Logger.d(TAG, "onMusicPlaying: " + mediaInfoData); - addWindowView(); - mMediaInfoData = mediaInfoData; - updateWindowUI(); + public void onMusicPlaying() { + Logger.d(TAG, "onMusicPlaying"); if (mWindowPlayPause != null) { mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_play); } @@ -186,10 +175,8 @@ public class MediaWindow2 implements IMusicView { } @Override - public void onMusicPause(MediaInfoData mediaInfoData) { - Logger.d(TAG, "onMusicPause: " + mediaInfoData); - mMediaInfoData = mediaInfoData; - updateWindowUI(); + public void onMusicPause() { + Logger.d(TAG, "onMusicPause: "); if (mWindowPlayPause != null) { mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); } @@ -200,23 +187,34 @@ public class MediaWindow2 implements IMusicView { } @Override - public void onMusicStoped(MediaInfoData mediaInfoData) { - Logger.d(TAG, "onMusicStoped: " + mediaInfoData); - mMediaInfoData = mediaInfoData; - updateWindowUI(); + public void onMusicStopped() { + Logger.d(TAG, "onMusicStopped"); if (mWindowPlayPause != null) { mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); } - if (mCircleImg != null) { mCircleImg.stopAnim(); } } + @Override + public void onMediaInfoChanged(MediaInfoData mediaInfoData) { + if(!isFirstPlay) { + mMediaInfoData = mediaInfoData; + addWindowView(); + updateWindowUI(); + } + isFirstPlay = false; + } + @Override public void onMusicProgress(long current, long total) { - Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total); +// Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total); + if(mMediaInfoData!=null) { + mMediaInfoData.setCurTime((int) current); + mMediaInfoData.setMaxTime((int) total); + } if (mWindowCurrTime != null) { mWindowCurrTime.setText(Utils.calculateTime((int) current)); mWindowMaxTime.setText(Utils.calculateTime((int) total)); @@ -231,4 +229,12 @@ public class MediaWindow2 implements IMusicView { e.printStackTrace(); } } + + private void openAqtApp(){ + try { + LaunchUtils.launchByPkg(mContext,"com.tencent.wecarflow"); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java index aafffdbe03..826e47ae51 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java @@ -142,4 +142,13 @@ public class MediaInfoData implements Serializable { public void setBookInfo(String bookInfo) { this.bookInfo = bookInfo; } + + @Override + public String toString() { + return "MediaInfoData{" + + "mediaName='" + mediaName + '\'' + + ", mediaImg='" + mediaImg + '\'' + + ", playState=" + playState + + '}'; + } } diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java index c56637d26b..3ebbc6e96f 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java @@ -5,16 +5,22 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.module.media.MediaConstants; import com.mogo.module.media.constants.MusicConstant; import com.mogo.module.media.model.MediaInfoData; import com.mogo.module.media.view.IMusicView; +import com.mogo.service.IMogoServiceApis; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.StatusDescriptor; import com.mogo.utils.logger.Logger; import com.tencent.wecarflow.flowoutside.sdk.BindListener; import com.tencent.wecarflow.flowoutside.sdk.FlowPlayControl; import com.tencent.wecarflow.flowoutside.sdk.MediaChangeListener; import com.tencent.wecarflow.flowoutside.sdk.MediaInfo; import com.tencent.wecarflow.flowoutside.sdk.PlayStateListener; +import com.tencent.wecarflow.flowoutside.sdk.QueryCallback; /** * 爱趣听presenter @@ -31,33 +37,94 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { private MediaInfoData currentMedia; + private boolean isBind = true; + private IMogoServiceApis serviceApis; + + private QueryCallback isPlayingCallback = new QueryCallback() { + @Override + public void onError(int i) { + + } + + @Override + public void onSuccess(Boolean aBoolean) { + currentMedia.setPlayState(aBoolean ? MusicConstant.PLAY_STATE_PLAYING : + MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + if (mView != null) { + mView.onMediaInfoChanged(currentMedia); + } + } + }; + + private QueryCallback currentCallback = new QueryCallback() { + @Override + public void onError(int i) { + + } + + @Override + public void onSuccess(MediaInfo mediaInfo) { + currentMedia.setMediaName(mediaInfo.getMediaName()); + currentMedia.setMediaImg(mediaInfo.getMediaImage()); + if (mView != null) { + mView.onMediaInfoChanged(currentMedia); + } + } + }; + @Override public void init(Context context) { this.context = context; - FlowPlayControl.getInstance().bindPlayService(context); + currentMedia = new MediaInfoData(); + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + + serviceApis = + (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); + + serviceApis.getStatusManagerApi().registerStatusChangedListener(MediaConstants.MODULE_TYPE, StatusDescriptor.MAIN_PAGE_RESUME, new IMogoStatusChangedListener() { + @Override + public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { + if (isTrue) { + Logger.d(TAG, "onResume, isBind: " + isBind); + // 需要在resume时候判断绑定关系是否正常 + if (!isBind) { + // 未绑定,需要重新绑定,同时第一次绑定初始化也是在此处 + FlowPlayControl.getInstance().bindPlayService(context); + } + } + } + }); + FlowPlayControl.getInstance().addBindListener(new BindListener() { @Override public void onServiceConnected() { Logger.d(TAG, "onServiceConnected==="); + isBind = true; + FlowPlayControl.getInstance().queryPlaying(isPlayingCallback); + FlowPlayControl.getInstance().queryCurrent(currentCallback); } @Override public void onServiceDisconnected() { Logger.e(TAG, "onServiceDisconnected==="); + isBind = false; } @Override public void onBindDied() { Logger.e(TAG, "onBindDied==="); + isBind = false; } }); FlowPlayControl.getInstance().addMediaChangeListener(new MediaChangeListener() { @Override public void onMediaChange(MediaInfo mediaInfo) { - currentMedia = new MediaInfoData(); + Logger.d(TAG, "onMediaChange: " + mediaInfo); + Logger.d(TAG, "onMediaChange, img: " + mediaInfo.getMediaImage()); currentMedia.setMediaName(mediaInfo.getMediaName()); - currentMedia.setMediaUrl(mediaInfo.getMediaImage()); + currentMedia.setMediaImg(mediaInfo.getMediaImage()); + mView.onMediaInfoChanged(currentMedia); } @Override @@ -71,7 +138,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void onStart() { if (mView != null && currentMedia != null) { currentMedia.setPlayState(MusicConstant.PLAY_STATE_PLAYING); - mView.onMusicPlaying(currentMedia); + mView.onMusicPlaying(); + mView.onMediaInfoChanged(currentMedia); } } @@ -79,7 +147,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void onPause() { if (mView != null && currentMedia != null) { currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); - mView.onMusicPause(currentMedia); + mView.onMusicPause(); + mView.onMediaInfoChanged(currentMedia); } } @@ -87,7 +156,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void onStop() { if (mView != null && currentMedia != null) { currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); - mView.onMusicStoped(currentMedia); + mView.onMusicStopped(); + mView.onMediaInfoChanged(currentMedia); } } @@ -98,6 +168,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { } } }); + + FlowPlayControl.getInstance().bindPlayService(context); } @Override @@ -124,12 +196,4 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void next() { FlowPlayControl.getInstance().doNext(); } - - @Override - public void onDestroy(@NonNull LifecycleOwner owner) { - super.onDestroy(owner); - if (context != null) { - FlowPlayControl.getInstance().unbindPlayService(context); - } - } } diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java new file mode 100644 index 0000000000..653a77601e --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java @@ -0,0 +1,29 @@ +package com.mogo.module.media.utils; + +import android.content.Context; +import android.content.Intent; + +/** + * @author congtaowang + * @since 2020-02-03 + *

+ * 描述 + */ +public class LaunchUtils { + + /** + * 通过包名启动app + * + * @param context + * @param pkg 包名 + */ + public static void launchByPkg( Context context, String pkg ) throws Exception { + Intent intent = getLaunchIntentForPackage( context, pkg ); + intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); + context.startActivity( intent ); + } + + public static Intent getLaunchIntentForPackage( Context context, String pkg ) { + return context.getPackageManager().getLaunchIntentForPackage( pkg ); + } +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java index 853a9cde86..d0379ff238 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java @@ -9,11 +9,13 @@ import com.mogo.module.media.model.MediaInfoData; * @author tongchenfei */ public interface IMusicView extends IView { - void onMusicPlaying(MediaInfoData mediaInfoData); + void onMediaInfoChanged(MediaInfoData mediaInfoData); - void onMusicPause(MediaInfoData mediaInfoData); + void onMusicPlaying(); - void onMusicStoped(MediaInfoData mediaInfoData); + void onMusicPause(); + + void onMusicStopped(); void onMusicProgress(long current,long total); } From f975e362757972bc39fc658b15df1f9d73740637 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 8 Jun 2020 11:31:50 +0800 Subject: [PATCH 3/3] =?UTF-8?q?1.=20=E7=BB=BC=E5=90=88=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E4=BB=A5=E5=8F=8A=E7=88=B1=E8=B6=A3=E5=90=AC?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E8=83=BD=E5=8A=9B=EF=BC=8C=E6=9C=80=E7=BB=88?= =?UTF-8?q?=E5=92=8C=E4=BA=A7=E5=93=81=E7=A1=AE=E8=AE=A4=EF=BC=8C=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E7=8A=B6=E6=80=81=E9=9F=B3=E9=A2=91=E6=A1=86=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E7=94=A8=E6=88=B7=E4=B8=BB=E5=8A=A8?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E4=B8=80=E6=AC=A1=E5=90=8E=EF=BC=8C=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E6=B5=AE=E6=A1=86=E6=98=BE=E7=A4=BA=EF=BC=8C=E7=9B=B4?= =?UTF-8?q?=E5=88=B0acc-off=E6=89=8D=E6=B6=88=E5=A4=B1=EF=BC=8C=E4=B8=8B?= =?UTF-8?q?=E6=AC=A1acc-on=E5=90=8E=E4=B8=8D=E6=98=BE=E7=A4=BA=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/module/apps/model/AppEnum.java | 2 +- .../drawable/module_apps_ic_we_car_flow.png | Bin 0 -> 4161 bytes .../com/mogo/module/media/MediaWindow2.java | 34 +++++++++--------- .../module/media/model/MediaInfoData.java | 2 ++ .../media/presenter/WeCarFlowPresenter.java | 1 - 5 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 modules/mogo-module-apps/src/main/res/drawable/module_apps_ic_we_car_flow.png diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java index 8c545cc2dc..7eadd38ab6 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java @@ -15,7 +15,7 @@ import com.mogo.module.apps.R; */ public enum AppEnum { // 爱趣听 - WeCarFlow("爱趣听","com.tencent.wecarflow", R.drawable.module_apps_ic_qq_music ), + WeCarFlow("爱趣听","com.tencent.wecarflow", R.drawable.module_apps_ic_we_car_flow ), //"QQ音乐", QQMusic( "QQ音乐", "com.pvetec.musics", R.drawable.module_apps_ic_qq_music ), diff --git a/modules/mogo-module-apps/src/main/res/drawable/module_apps_ic_we_car_flow.png b/modules/mogo-module-apps/src/main/res/drawable/module_apps_ic_we_car_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..95734bb594db3a56842405619901a85955004b84 GIT binary patch literal 4161 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 { public void init(Context context) { this.context = context; currentMedia = new MediaInfoData(); - currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); serviceApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context);