/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠJ U UL ĠLabs , ĠInc . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Red undant Unit ReturnType ") Ċ Ċ package Ġcom . ju ul . able . experimental Ċ Ċ import Ġandroid . bluetooth . Bluetooth Gatt Ċ import Ġandroid . bluetooth . Bluetooth Profile Ċ import Ġcom . ju ul . able . experimental . messenger . On Connection StateChange Ċ import Ġkotlinx . coroutines . channels . Receive Channel Ċ import Ġkotlinx . coroutines . channels . consume Each Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġjava . io . Closeable Ċ Ċ class ĠConnection State Monitor ( private Ġval Ġg att : ĠG att ) Ġ: ĠClose able Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconnection State Mutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġvar Ġconnection State Subscription : ĠReceive Channel < On Connection StateChange >? Ġ= Ġnull ĊĊĠĠĠ Ġsuspend Ġfun Ġsuspend Until Connection State ( state : ĠG att State ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠAb le . debug Ġ{ Ġ" Sus pending Ġuntil Ġ${ state . as Gatt State String () }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġg att . on Connection StateChange . open Subscription (). also Ġ{ Ġsubscription Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠBluetooth Profile . STATE _ DIS CONNECTED Ġ&& Ġsubscription . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġdisconnect ing , Ġthe Ġchannel Ġmay Ġbe Ġempty Ġif Ġwe 've Ġnever Ġconnected Ġbefore , Ġso ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġshouldn 't Ġwait . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAb le . info Ġ{ Ġ" suspend Until Connection State ĠâĨĴ Ġsubscription . isEmpty , Ġabort ing " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġanother Ġ` suspend Until Connection State ` Ġis Ġin Ġprogress Ġthen Ġwe Ġabort Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Subscription ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Subscription Ġ= Ġsubscription ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . consume Each Ġ{ Ġ( status , ĠnewState ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAb le . verbose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus String Ġ= Ġstatus . as Gatt Connection Status String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate String Ġ= ĠnewState . as Gatt State String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" status Ġ= Ġ$ status String , ĠnewState Ġ= Ġ$ state String " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAb le . info Ġ{ Ġ" Received Ġ${ status . as Gatt Connection Status String ()}, Ġgiving Ġup ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠnewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAb le . info Ġ{ Ġ" Reached Ġ${ state . as Gatt State String () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAb le . debug Ġ{ Ġ" suspend Until Connection State ĠâĨĴ ĠAbort ed ." Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose (): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection State Subscription ?. cancel () ĊĠĠĠ Ġ} Ċ } Ċ