package Ġme . h uf man . android aut oid rive . car app . music Ċ Ċ import Ġandroid . content . Context Ċ import Ġme . h uf man . android aut oid rive . AppSettings Ċ import Ġme . h uf man . android aut oid rive . Mutable AppSettings Ċ import Ġme . h uf man . id rive connection kit . android . ID rive Connection Listener Ċ import Ġjava . lang . Exception Ċ Ċ /** Ċ Ġ* ĠLogic Ġto Ġhelp Ġdecide Ġwhen Ġto Ġuse ĠAudio ĠContext Ġand Ġthe ĠID 5 Ġlayout Ċ Ġ* Ċ Ġ* ĠThe Ġonly Ġallowed Ġscenarios Ġare : Ċ Ġ* ĠĠĠĠ ĠBluetooth Ġapp Ġconnection Ġ( the ĠConnected Ġapp Ġuses Ġa Ġdistinct ĠTCP Ġport Ġfor Ġeach Ġtransport ) Ċ Ġ* ĠĠĠĠ ĠUSB Ġapp Ġconnection Ġif Ġthe Ġphone Ġhas ĠA O Av 2 Ġaudio Ġsupport Ġ( gener ally , Ġrunning Ġan ĠOS Ġearlier Ġthan ĠO re o ) Ċ Ġ*/ Ċ class ĠMusic App Mode ( val Ġcapabilities : ĠMap < String , ĠString ? >, Ġval Ġapp Settings : ĠMutable AppSettings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Heart Radio Version : ĠString ?, Ġval Ġp and ora Version : ĠString ?, Ġval Ġspot ify Version : ĠString ?) Ġ{ Ċ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ fun Ġbuild ( capabilities : ĠMap < String , ĠString ? >, Ġcontext : ĠContext ): ĠMusic App Mode Ġ{ Ċĉĉ ĉ val Ġi Heart Radio Version Ġ= Ġtry Ġ{ Ċĉĉĉ ĉ context . package Manager . get Package Info (" com . pand ora . android ", Ġ 0 ). version Name Ċĉĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ġnull Ġ} Ċĉĉ ĉ val Ġp and ora Version Ġ= Ġtry Ġ{ Ċĉĉĉ ĉ context . package Manager . get Package Info (" com . cle arch annel . i he ar trad io . connect ", Ġ 0 ). version Name Ċĉĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ċĉĉĉ ĉ try Ġ{ Ċĉĉĉĉ ĉ context . package Manager . get Package Info (" com . cle arch annel . i he ar trad io . controller ", Ġ 0 ). version Name Ċĉĉĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ġnull Ġ} Ċĉĉ ĉ } Ċĉĉ ĉ val Ġspot ify Version Ġ= Ġtry Ġ{ Ċĉĉĉ ĉ context . package Manager . get Package Info (" com . spotify . music ", Ġ 0 ). version Name Ċĉĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ġnull Ġ} Ċĉĉ ĉ return ĠMusic App Mode ( capabilities , ĠMutable AppSettings ( context ), Ġi Heart Radio Version , Ġp and ora Version , Ġspot ify Version ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠPort s Ġfor Ġeach Ġtransport , Ġas Ġidentified Ġfrom Ġthe ĠConnected Ġapp Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠTRAN SP ORT _ PORTS Ġ{ Ċĉ ĉ USB , Ċĉ ĉ BT , Ċĉ ĉ ETH ; ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ fun Ġfrom Port ( port : ĠInt ?): ĠTRAN SP ORT _ PORTS ? Ġ{ Ċĉĉĉ ĉ return Ġwhen Ġ( port ) Ġ{ Ċĉĉĉĉĉ 4 0 0 4 Ġ-> ĠUSB Ċĉĉĉĉĉ 4 0 0 7 Ġ-> ĠBT Ċĉĉĉĉĉ 4 0 0 8 Ġ-> ĠETH Ċĉĉĉĉ ĉ else Ġ-> Ġnull Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġis BT Connection (): ĠBoolean Ġ{ Ċĉ ĉ return ĠTRAN SP ORT _ PORTS . from Port ( ID rive Connection Listener . port ) Ġ== ĠTRAN SP ORT _ PORTS . BT Ċ ĉ } Ċ ĉ fun Ġsupports Usb Audio (): ĠBoolean Ġ{ Ċĉ ĉ return Ġapp Settings [ AppSettings . KEYS . AUDIO _ SUPPORT S _ USB ]. to Boolean () Ċ ĉ } Ċ ĉ fun Ġshould Request Audio Context (): ĠBoolean Ġ{ Ċĉ ĉ val Ġmanual Override Ġ= Ġapp Settings [ AppSettings . KEYS . AUDIO _ FORCE _ CONTEXT ]. to Boolean () Ċĉ ĉ if Ġ( manual Override ) Ġ{ Ċĉĉ ĉ return Ġmanual Override Ċĉ ĉ } Ċĉ ĉ val Ġuse USB Ġ= Ġsupports Usb Audio () Ġ// Ġworks Ġeven Ġif Ġan Ġold Ġphone Ġis Ġconnected Ġover ĠBT Ċĉ ĉ val Ġuse BT Ġ= Ġis BT Connection () Ċĉ ĉ return Ġuse USB Ġ|| Ġuse BT Ċ ĉ } Ċ ĉ fun Ġis Id 4 (): ĠBoolean Ġ{ Ċĉ ĉ return Ġcapabilities [" h mi . type "] ?. contains (" ID 4 ") Ġ== Ġtrue Ċ ĉ } Ċ ĉ fun Ġshould Id 5 Playback (): ĠBoolean Ġ{ Ċĉ ĉ val Ġid rive 4 Ġ= Ġcapabilities [" h mi . type "] ?. contains (" ID 4 ") Ġ== Ġtrue Ċĉ ĉ val Ġmanual Override Ġ= Ġ! id rive 4 Ġ&& Ġapp Settings [ AppSettings . KEYS . FORCE _ SP OT IFY _ LAYOUT ]. to Boolean () Ċĉ ĉ val Ġspot ify Spl its Ġ= Ġspot ify Version ?. split ('.') ?. map Ġ{ Ġit . toInt () Ġ} Ċĉ ĉ val Ġnew Spot ify Installed Ġ= Ġspot ify Spl its Ġ!= Ġnull Ġ&& Ġspot ify Spl its . size Ġ>= Ġ 3 Ġ&& Ġ( Ċĉĉĉ ĉ spotify Spl its [ 0 ] Ġ> Ġ 8 Ġ|| Ċĉĉĉ ĉ ( spotify Spl its [ 0 ] Ġ== Ġ 8 Ġ&& Ġspot ify Spl its [ 1 ] Ġ> Ġ 5 ) Ġ|| Ċĉĉĉ ĉ ( spotify Spl its [ 0 ] Ġ== Ġ 8 Ġ&& Ġspot ify Spl its [ 1 ] Ġ== Ġ 5 Ġ&& Ġspot ify Spl its [ 2 ] Ġ>= Ġ 6 8 ) Ċĉ ĉ ) Ċĉ ĉ val Ġaut ode t ect Ġ= Ġ! id rive 4 Ġ&& Ġnew Spot ify Installed Ġ&& Ġshould Request Audio Context () Ċĉ ĉ return Ġmanual Override Ġ|| Ġaut ode t ect Ċ ĉ } ĊĊ ĉ /** ĠIf Ġa Ġsingle Ġofficial ĠRadio Ġapp Ġis Ġrunning , Ġreturn Ġthat Ġname Ġ*/ Ċ ĉ fun Ġget Radio AppName (): ĠString ? Ġ{ Ċĉ ĉ if Ġ(! is BT Connection ()) Ġreturn Ġnull Ġ Ġ// Ġno Ġofficial Ġradio Ġapps Ġrun Ġover ĠUSB ĊĊĉ ĉ return Ġif Ġ( i Heart Radio Version Ġ!= Ġnull Ġ&& Ġp and ora Version Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ " i Heart Radio " Ċĉ ĉ } Ġelse Ġif Ġ( i Heart Radio Version Ġ== Ġnull Ġ&& Ġp and ora Version Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ " P and ora " Ċĉ ĉ } Ġelse Ġnull Ċ ĉ } Ċ }