// Ġ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 Ġandroidx . annotation . Visible ForTesting Ċ import Ġcom . google . android . comp anion protos . Version Exchange Proto . Version Exchange Ċ import Ġcom . google . android . libraries . car . trust agent . ble message stream . Bluetooth ConnectionManager Ċ 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 . android . libraries . car . trust agent . util . log w Ċ import Ġcom . google . protobuf . InvalidProtocolBufferException Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠHandles Ġversion Ġexchange . Ċ Ġ* Ċ Ġ* Ġ@ property Ġmanager Ġprovides Ġthe Ġbluetooth Ġconnection Ġwith Ġthe Ġremote Ġdevice . Ċ Ġ*/ Ċ internal Ġclass ĠVersion Resolver ( private Ġval Ġmanager : ĠBluetooth ConnectionManager ) Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠEx changes Ġsupported Ġversion Ġwith Ġ[ manager ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠThe Ġreceived Ġversion ; Ġ` null ` Ġif Ġthere Ġwas Ġan Ġerror Ġduring Ġexchange . ĊĠĠ Ġ*/ ĊĠ Ġsuspend Ġfun Ġexchange Version (): ĠVersion Exchange ? Ġ= ĊĠĠĠ Ġsuspend Coroutine < Version Exchange ?> Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠ Ġval Ġmessage Callback Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠBluetooth ConnectionManager . Message Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message Received ( data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . unregister Message Callback ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Version Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVersion Exchange . parseFrom ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid ProtocolBufferException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo ge ( TAG , Ġ" Could Ġnot Ġparse Ġmessage Ġfrom Ġcar Ġas ĠBLE Version Exchange .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog i ( TAG , Ġ" Remote ĠB le Version Exchange Ġis Ġ${ remote Version ?. asString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( remote Version ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmanager . register Message Callback ( message Callback ) ĊĊĠĠĠĠĠ Ġval Ġversion Exchange Ġ= ĊĠĠĠĠĠĠĠ Ġmake Version Exchange (). also Ġ{ Ġlog i ( TAG , Ġ" Sending Ġversion Ġexchange : Ġ${ it . asString () }") Ġ} ĊĠĠĠĠĠ Ġ// ĠAfter Ġsending Ġversion Ġexchange , Ġg att Message Callback Ġwill Ġbe Ġtriggered . ĊĠĠĠĠĠ Ġif Ġ(! manager . sendMessage ( version Exchange . toByteArray ())) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog w ( TAG , Ġ" Could Ġnot Ġsend Ġmessage Ġto Ġinit Ġversion Ġexchange . ĠDis connecting .") ĊĠĠĠĠĠĠĠ Ġmanager . unregister Message Callback ( message Callback ) ĊĠĠĠĠĠĠĠ Ġmanager . disconnect () ĊĠĠĠĠĠĠĠ Ġcontinuation . resume ( null ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġthe Ġresolved Ġversion Ġbetween Ġlocal Ġand Ġ[ remote Version ]; Ġ` null ` Ġif Ġnot Ġcompatible . Ġ*/ ĊĠ Ġfun Ġresolve Version ( remote Version : ĠVersion Exchange ): ĠResolved Version ? Ġ{ ĊĠĠĠ Ġval Ġmax Security Version Ġ= Ġmin ( remote Version . max Supported Security Version , ĠMAX _ SECURITY _ VERSION ) ĊĠĠĠ Ġval Ġmin Security Version Ġ= Ġmax ( remote Version . min Supported Security Version , ĠMIN _ SECURITY _ VERSION ) ĊĠĠĠ Ġval Ġmax Message Version Ġ= Ġmin ( remote Version . max Supported Messaging Version , ĠMAX _ MESS AGING _ VERSION ) ĊĠĠĠ Ġval Ġmin Message Version Ġ= Ġmax ( remote Version . min Supported Messaging Version , ĠMIN _ MESS AGING _ VERSION ) ĊĊĠĠĠ Ġif Ġ( min Security Version Ġ> Ġmax Security Version Ġ|| Ġmin Message Version Ġ> Ġmax Message Version ) Ġ{ ĊĠĠĠĠĠ Ġlo ge ( ĊĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ| Local Ġversion Ġis Ġ${ make Version Exchange (). asString ()}; ĊĠĠĠĠĠĠĠ Ġ| remote Ġversion Ġis Ġ${ remote Version . asString ()}. ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlog i ( TAG , Ġ" Resolved Ġmessage Ġversion Ġ$ max Message Version ; Ġsecurity Ġversion Ġ$ max Security Version .") ĊĠĠĠ Ġreturn ĠResolved Version ( ĊĠĠĠĠĠ Ġmax Message Version , ĊĠĠĠĠĠ Ġmax Security Version , ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Version Resolver " ĊĠĠĠ Ġconst Ġval ĠMIN _ MESS AGING _ VERSION Ġ= Ġ 2 ĊĠĠĠ Ġconst Ġval ĠMAX _ MESS AGING _ VERSION Ġ= Ġ 3 ĊĠĠĠ Ġconst Ġval ĠMIN _ SECURITY _ VERSION Ġ= Ġ 2 ĊĠĠĠ Ġconst Ġval ĠMAX _ SECURITY _ VERSION Ġ= Ġ 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes olves Ġversion Ġvia Ġ[ manager ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġ[ Resolved Version ] Ġbased Ġon Ġthe Ġmessage Ġversion Ġof ĠI HU ; Ġ` null ` Ġif Ġlocal Ġand Ġremote ĊĠĠĠĠ Ġ* Ġversions Ġare Ġincompatible Ġor Ġan Ġerror Ġoccurred . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġresolve ( manager : ĠBluetooth ConnectionManager ): ĠResolved Version ? Ġ{ ĊĠĠĠĠĠ Ġval Ġresolver Ġ= ĠVersion Resolver ( manager ) ĊĠĠĠĠĠ Ġval Ġremote Version Ġ= Ġresolver . exchange Version () ĊĊĠĠĠĠĠ Ġreturn Ġremote Version ?. let Ġ{ Ġresolver . resolve Version ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCreates Ġa Ġproto Ġthat Ġrepresents Ġthe Ġlocally Ġsupported Ġversion . Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġmake Version Exchange ( ĊĠĠĠĠĠ Ġmin Messaging Version : ĠInt Ġ= ĠMIN _ MESS AGING _ VERSION , ĊĠĠĠĠĠ Ġmax Messaging Version : ĠInt Ġ= ĠMAX _ MESS AGING _ VERSION , ĊĠĠĠĠĠ Ġmin Security Version : ĠInt Ġ= ĠMIN _ SECURITY _ VERSION , ĊĠĠĠĠĠ Ġmax Security Version : ĠInt Ġ= ĠMAX _ SECURITY _ VERSION ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠ ĠVersion Exchange . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. set Min Supported Messaging Version ( min Messaging Version ) ĊĠĠĠĠĠĠĠ Ġ. setMax Supported Messaging Version ( max Messaging Version ) ĊĠĠĠĠĠĠĠ Ġ. set Min Supported Security Version ( min Security Version ) ĊĠĠĠĠĠĠĠ Ġ. setMax Supported Security Version ( max Security Version ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠ Ġ} Ċ } Ċ Ċ // ĠProto ĠtoString () Ġis Ġnot Ġavailable Ġin Ġproto Ġlite . Ċ private Ġfun ĠVersion Exchange . asString () Ġ= ĊĠ Ġ""" ĊĠ Ġ| min Ġsecurity Ġversion : Ġ${ this . min Supported Security Version }; ĊĠ Ġ| max Ġsecurity Ġversion : Ġ${ this . max Supported Security Version }; ĊĠ Ġ| min Ġmessage Ġversion : Ġ${ this . min Supported Messaging Version }; ĊĠ Ġ| max Ġmessage Ġversion : Ġ${ this . max Supported Messaging Version }. ĊĠ Ġ""" . trim Margin () Ċ Ċ internal Ġdata Ġclass ĠResolved Version ( ĊĠ Ġval Ġmessage Version : ĠInt , ĊĠ Ġval Ġsecurity Version : ĠInt , Ċ ) Ċ