// ĠCopyright Ġ 2 0 2 1 ĠGoogle ĠLLC Ċ // Ċ // Ġ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 Ġcom . google . android . libraries . car . trust agent Ċ Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Context Ċ import Ġcom . google . android . comp anion protos . System Query Ċ import Ġcom . google . android . comp anion protos . System Query Type Ċ import Ġcom . google . android . libraries . car . trust agent . util . lo ge Ċ import Ġcom . google . android . libraries . car . trust agent . util . log i Ċ import Ġcom . google . protobuf . InvalidProtocolBufferException Ċ import Ġjava . util . UUID Ċ Ċ /** Ċ Ġ* ĠFeature Ġthat Ġis Ġresponsible Ġfor Ġrespon ding Ġto Ġsystem - level Ġqueries , Ġsuch Ġas Ġproviding Ġthe Ġcurrent Ċ Ġ* Ġdevice Ġname . Ċ Ġ*/ Ċ class ĠSystem Feature Manager Ċ internal Ġconstructor ( ĊĠ Ġprivate Ġval Ġdevice Name Provider : Ġ() Ġ-> ĠString , ĊĠ Ġprivate Ġval ĠappName Provider : Ġ() Ġ-> ĠString , Ċ ) Ġ: ĠFeature Manager () Ġ{ ĊĠ Ġoverride Ġval Ġfeature Id Ġ= ĠFEATURE _ ID ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreates Ġan Ġinstance Ġof Ġthis Ġfeature Ġmanager Ġthat Ġwill Ġutilize Ġthe Ġ[ Bluetooth Adapter ] Ġand ĊĠĠ Ġ* Ġcurrent Ġ[ Context ] Ġfor Ġapplication Ġname Ġlook - up . ĊĠĠ Ġ*/ ĊĠ Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext ĊĠ Ġ) Ġ: Ġthis ( ĊĠĠĠ Ġdevice Name Provider Ġ= ĠBluetooth Adapter . getDefault Adapter () :: getName , ĊĠĠĠ ĠappName Provider Ġ= Ġcontext :: get AppName ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun Ġon Query Received ( ĊĠĠĠ Ġquery : ĠQuery , ĊĠĠĠ ĠdeviceId : ĠUUID , ĊĠĠĠ Ġresponse Handler : Ġ( Boolean , ĠByteArray ) Ġ-> ĠUnit ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġquery Proto Ġ= ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem Query . parseFrom ( query . request ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid ProtocolBufferException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlo ge ( TAG , Ġ" Received Ġa Ġquery Ġfrom Ġcar Ġ$ deviceId Ġbut Ġunable Ġto Ġparse . ĠIgn oring .") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġlog i ( TAG , Ġ" Received Ġa Ġquery Ġfrom Ġ$ deviceId ") ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġrespond To Query ( query Proto , Ġresponse Handler ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠ Ġlo ge ( TAG , Ġ" Unable Ġto Ġsend Ġquery Ġresponse Ġto Ġcar ", Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAt tempts Ġto Ġsend Ġa Ġresponse Ġto Ġthe Ġgiven Ġ[ query Proto ] Ġwith Ġthe Ġgiven Ġ[ response Handler ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThrows Ġan Ġ[ IllegalArgumentException ] Ġif Ġthe Ġcar Ġis Ġnot Ġconnected Ġat Ġthe Ġtime Ġof Ġsend . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġrespond To Query ( ĊĠĠĠ Ġquery Proto : ĠSystem Query , ĊĠĠĠ Ġresponse Handler : Ġ( Boolean , ĠByteArray ) Ġ-> ĠUnit ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġwhen Ġ( query Proto . type ) Ġ{ ĊĠĠĠĠĠ ĠSystem Query Type . DEVICE _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Name Ġ= Ġdevice Name Provider () ĊĠĠĠĠĠĠĠ Ġlog i ( TAG , Ġ" Received Ġdevice Ġname Ġquery . ĠRes pon ding Ġwith Ġ$ device Name ") ĊĠĠĠĠĠĠĠ Ġresponse Handler (/* Ġis Successful = Ġ*/ Ġtrue , Ġdevice Name . toByteArray ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠSystem Query Type . APP _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠappName Ġ= ĠappName Provider () ĊĠĠĠĠĠĠĠ Ġlog i ( TAG , Ġ" Received Ġapp Ġname Ġquery . ĠRes pon ding Ġwith Ġ$ appName ") ĊĠĠĠĠĠĠĠ Ġresponse Handler (/* Ġis Successful = Ġ*/ Ġtrue , ĠappName . toByteArray ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlo ge ( ĊĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠ Ġ" Received Ġa Ġquery Ġfrom Ġof Ġunknown Ġtype : Ġ${ query Proto . type }. ĠRes pon ding Ġwith Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" un successful Ġquery ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġresponse Handler (/* Ġis Successful = Ġ*/ Ġfalse , Ġbyte ArrayOf ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠLifecycle Ġmethods . ĠThese Ġare Ġnot Ġused Ġfor Ġthis Ġclass Ġas Ġit Ġonly Ġrespon ds Ġto Ġqueries , Ġbut Ġmust ĊĠ Ġ// Ġbe Ġimplemented Ġas Ġthey Ġare Ġabstract . ĊĊĠ Ġoverride Ġfun Ġon Car Connected ( deviceId : ĠUUID ) Ġ{} ĊĠ Ġoverride Ġfun Ġon Message Received ( message : ĠByteArray , ĠdeviceId : ĠUUID ) Ġ{} ĊĠ Ġoverride Ġfun Ġon Message Sent ( message Id : ĠInt , ĠdeviceId : ĠUUID ) Ġ{} ĊĠ Ġoverride Ġfun Ġon Car Disconnected ( deviceId : ĠUUID ) Ġ{} ĊĠ Ġoverride Ġfun Ġon Car Dis associated ( deviceId : ĠUUID ) Ġ{} ĊĠ Ġoverride Ġfun Ġon All C ars Dis associated () Ġ{} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" System Feature Manager " ĊĠĠĠ Ġprivate Ġval ĠFEATURE _ ID Ġ= ĠUUID . fromString (" 8 9 2 ac 5 d 9 - e 9 a 5 - 4 8 dc - 8 7 4 a - c 0 1 e 3 cb 0 0 d 5 d ") ĊĠ Ġ} Ċ } Ċ Ċ /** ĠReturns Ġthe Ġcurrent Ġapplication Ġname Ġbased Ġoff Ġthe Ġresult Ġof Ġ[ Application Info . load Label ]. Ġ*/ Ċ private Ġfun ĠContext . get AppName (): ĠString Ġ= Ġapplication Info . load Label ( package Manager ). toString () Ċ