package Ġcom . um air . be ac ons _ plugin Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Service Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Power Manager Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ private Ġfun ĠPackage Manager . missing System Feature ( name : ĠString ): ĠBoolean Ġ= Ġ! has System Feature ( name ) Ċ Ċ fun Ġhas BLE Feature ( activity : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠ Ġactivity . package Manager . take If Ġ{ Ġit . missing System Feature ( PackageManager . FEATURE _ BL U ETO OTH _ LE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠsetUp Blue T ooth Adapter ( content : ĠContext ): ĠBluetooth Adapter ? Ġ{ ĊĠĠĠ Ġval Ġbluetooth Adapter : ĠBluetooth Adapter ? Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠĠĠĠĠ Ġbluetooth Manager . adapter ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbluetooth Adapter Ċ } Ċ Ċ private Ġval ĠBluetooth Adapter . is Disabled : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġ! isEnabled Ċ Ċ fun Ġis Bluetooth Enabled ( content : ĠContext ) Ġ{ ĊĊĠĠĠ ĠsetUp Blue T ooth Adapter ( content )?. take If Ġ{ Ġit . is Disabled Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenable Bt Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠ Ġcontent . startActivity ( enable Bt Intent ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcheck Permissions ( activity : ĠActivity , Ġis Granted : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Request Ġfor Ġstorage Ġpermissions ĊĠĠĠĠĠĠĠ ĠPermissions Helper . request Location Permissions ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 1 , ĠTimeUnit . SECONDS , ĠAndroid Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Next Ġ= Ġ{ Ġcallback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Granted . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġget Readable Time ( timestamp : ĠLong ): ĠString Ġ{ ĊĠĠĠ Ġval ĠTIME _ FORMAT _ READ ABLE Ġ= Ġ" dd ĠM MMM Ġy yyy Ġhh : mm : ss Ġa " ĊĠĠĠ Ġif Ġ( timestamp Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate 1 Ġ= ĠDate ( timestamp ) ĊĠĠĠĠĠĠĠ Ġval Ġout Format Ġ= ĠSimpleDateFormat ( TIME _ FORMAT _ READ ABLE , ĠLocale . EN GL ISH ) ĊĠĠĠĠĠĠĠ Ġreturn Ġout Format . format ( date 1 ) ĊĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠ Ġreturn Ġ" No ĠTime ĠProvide d !" Ċ } Ċ Ċ fun ĠService . create Notification ( channelId : ĠString , Ġchannel Name : ĠString , Ġwake Lock TAG : ĠString , Ġtitle : ĠString , Ġcontent : ĠString ) Ġ{ ĊĠĠĠ Ġcreate Notification Channel ( channelId , Ġchannel Name ) ĊĠĠĠ Ġval Ġimage Id Ġ= Ġresources . getIdentifier (" ic _ launcher ", Ġ" mip map ", ĠpackageName ) ĊĊĠĠĠ Ġval Ġnotification Ġ= ĠNotification Compat . Builder ( this , Ġchannel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( image Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set When ( System . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ LOW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ( getSystem Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Wake Lock ( Power Manager . PAR TIAL _ WAKE _ LOCK , Ġwake Lock TAG ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Reference Count ed ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacquire ( 3 6 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġstart Foreground ( 1 8 2 3 7 , Ġnotification ) Ċ } Ċ Ċ private Ġfun ĠService . create Notification Channel ( channelId : ĠString , Ġchannel Name : ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Id , Ġchannel Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġget System Service ( Notification Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġmanager ?. create Notification Channel ( service Channel ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠService . acquire Wake Lock ( intent : ĠIntent ?, Ġwake Lock TAG : ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( intent ?. action Ġ== Ġ" SHUT DOWN ") Ġ{ ĊĠĠĠĠĠĠĠ Ġ( getSystem Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Wake Lock ( Power Manager . PAR TIAL _ WAKE _ LOCK , Ġwake Lock TAG ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Location Permission Granted ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ( Permissions Helper . is Permission Granted ( context , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| ĠPermissions Helper . is Permission Granted ( context , ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION )) Ċ }