/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 ĠT ol ri q Ġ/ ĠGen ime e . Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠJ esse ĠCh an Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġio . je sec . y at se . plugin . lg Ċ Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . widget . Toast Ċ Ċ import Ġjava . util . ArrayList Ċ Ċ import Ġjava . net . Socket Ċ Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . spec . Iv Parameter Spec Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ Ċ import Ġkotlin . math . round Ċ Ċ import Ġtv . y at se . plugin . av receiver . api . AV Receiver Plugin Service Ċ import Ġtv . y at se . plugin . av receiver . api . Plugin Custom Command Ċ import Ġtv . y at se . plugin . av receiver . api . Y at se Logger Ċ import Ġio . je sec . y at se . plugin . lg . helpers . Preferences Helper Ċ import Ġjava . lang . Exception Ċ Ċ /** Ċ Ġ* ĠSample ĠAV Receiver Plugin Service Ġthat Ġimplement Ġall Ġfunctions Ġwith Ġdummy Ġcode Ġthat Ġdisplays ĠToast Ġand Ġlogs Ġto Ġmain ĠY at se Ġlog Ġsystem . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠSee Ġ[ AV Receiver Plugin Service ] Ġfor Ġdocumentation Ġon Ġall Ġfunctions Ċ Ġ*/ Ċ class ĠAV Plugin Service Ġ: ĠAV Receiver Plugin Service () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġprivate Ġvar Ġm Host UniqueId : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm HostName : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Host Ip : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Receiver IP : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Is Mut ed Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Volume Percent Ġ= Ġ 5 0 . 0 ĊĊĠĠĠ Ġinternal Ġclass ĠSend Data Task Ġ: ĠAsync Task < String , ĠVoid , ĠString >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠString ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaes Iv Ġ= ĠI v Parameter Spec ("' %^ Ur 7 gy \$ ~ t + f )% @ ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaes Key Ġ= ĠSecret KeySpec (" T ^ & * J %^ 7 tr ~ 4 ^ %^ & I ( o %^ ! j IJ __ + a 0 Ġk ". toByteArray (), Ġ" AES ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠSocket ( params [ 0 ], Ġ 9 7 4 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġos Ġ= Ġs . get OutputStream () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġec Ġ= ĠCipher . getInstance (" AES / CBC / No Padding ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġec . init ( Cipher . ENCRYPT _ MODE , Ġaes Key , Ġaes Iv ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpad len Ġ= Ġ 1 6 Ġ- Ġ( params [ 1 ]. length Ġ% Ġ 1 6 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpadded Data Ġ= Ġparams [ 1 ]. toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. pad len ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadded Data Ġ+= Ġpad len . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data Ġ= Ġec . do Final ( padded Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre lude Ġ= Ġbyte ArrayOf ( 0 x 1 0 , Ġ 0 x 0 0 , Ġ 0 x 0 0 , Ġ 0 x 0 0 , Ġencrypted Data . size . to Byte ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= Ġpre lude Ġ+ Ġencrypted Data ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos . write ( packet ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Volume Unit Type (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAV Receiver Plugin Service . UNIT _ TYPE _ PERCENT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Volume Minimal Value (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Volume Max imal Value (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 0 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Mute Status ( status : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Setting Ġmute Ġstatus Ġ: Ġ% s ", Ġstatus ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Receiver IP Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSend Data Task (). execute ( m Receiver IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"{\" cmd \": Ġ\" set \", Ġ\" data \": Ġ{ \" b _ mute \": Ġ$ status }, Ġ\" msg \": Ġ\" SP K _ LIST _ VIEW _ INFO \" }") ĊĠĠĠĠĠĠĠ Ġm Is Mut ed Ġ= Ġstatus ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Mute Status (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Is Mut ed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtoggle Mute Status (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" To g gling Ġmute Ġstatus ") ĊĠĠĠĠĠĠĠ Ġreturn Ġset Mute Status (! m Is Mut ed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Volume Level ( volume : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Setting Ġvolume Ġlevel Ġ: Ġ% s ", Ġvolume ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Receiver IP Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġactual Volume Ġ= Ġround ( volume Ġ/ Ġ 5 ) ĊĠĠĠĠĠĠĠ ĠSend Data Task (). execute ( m Receiver IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"{\" cmd \": Ġ\" set \", Ġ\" data \": Ġ{ \" i _ vol \": Ġ$ actual Volume }, Ġ\" msg \": Ġ\" SP K _ LIST _ VIEW _ INFO \" }") ĊĠĠĠĠĠĠĠ Ġm Volume Percent Ġ= Ġvolume ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Volume Level (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Volume Percent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvolume Plus (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Volume Percent Ġ= ĠMath . min ( 1 0 0 . 0 , Ġm Volume Percent Ġ+ Ġ 5 ) ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Calling Ġvolume Ġplus ") ĊĠĠĠĠĠĠĠ Ġreturn Ġset Volume Level ( m Volume Percent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvolume Minus (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Volume Percent Ġ= ĠMath . max ( 0 . 0 , Ġm Volume Percent Ġ- Ġ 5 ) ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Calling Ġvolume Ġminus ") ĊĠĠĠĠĠĠĠ Ġreturn Ġset Volume Level ( m Volume Percent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrefresh (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Refresh ing Ġvalues Ġfrom Ġreceiver ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDefault Custom Commands (): ĠList < Plugin Custom Command > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠgetString ( R . string . plugin _ unique _ id ) ĊĠĠĠĠĠĠĠ Ġval Ġcommands Ġ= ĠArrayList < Plugin Custom Command >() ĊĠĠĠĠĠĠĠ Ġ// ĠPlugin Ġcustom Ġcommands Ġmust Ġset Ġthe Ġsource Ġparameter Ġto Ġtheir Ġplugin Ġunique ĠId Ġ! ĊĠĠĠĠĠĠĠ Ġcommands . add ( Plugin Custom Command (). title (" Sample Ġcommand Ġ 1 "). source ( source ). param 1 (" Sample Ġcommand Ġ 1 "). type ( 0 )) ĊĠĠĠĠĠĠĠ Ġcommands . add ( Plugin Custom Command (). title (" Sample Ġcommand Ġ 2 "). source ( source ). param 1 (" Sample Ġcommand Ġ 2 "). type ( 1 ). readOnly ( true )) ĊĠĠĠĠĠĠĠ Ġreturn Ġcommands ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute Custom Command ( custom Command : ĠPlugin Custom Command ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Executing ĠCustom Command Ġ: Ġ% s ", Ġcustom Command . title ()) ĊĠĠĠĠĠĠĠ Ġdisplay Toast ( custom Command . param 1 ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Toast ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĠToast . makeText ( application Context , Ġmessage , ĠToast . LENGTH _ SHORT ). show () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconnect To Host ( unique Id : ĠString ?, Ġname : ĠString ?, Ġip : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Host UniqueId Ġ= Ġunique Id ĊĠĠĠĠĠĠĠ Ġm HostName Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġm Host Ip Ġ= Ġip ĊĠĠĠĠĠĠĠ Ġm Receiver IP Ġ= ĠPreferences Helper . getInstance ( application Context ) !!. host Ip ( m Host UniqueId ) ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( m Receiver IP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Error ( TAG , Ġ" No Ġconfiguration Ġfor Ġ% s ", Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠY at se Logger . getInstance ( application Context ). log Verbose ( TAG , Ġ" Connected Ġto Ġ: Ġ% s Ġ/ Ġ% s Ġ", Ġname , Ġm Host UniqueId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Settings Version (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPreferences Helper . getInstance ( application Context ) !!. settings Version () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Settings (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPreferences Helper . getInstance ( application Context ) !!. settings As JSON ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore Settings ( settings : ĠString , Ġversion : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠPreferences Helper . getInstance ( application Context ) !!. import Settings From JSON ( settings , Ġversion ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect To Host ( m Host UniqueId , Ġm HostName , Ġm Host Ip ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" AV Plugin Service " ĊĠĠĠ Ġ} Ċ } Ċ