package Ġde . se em oo . at _ tracking _ detection . database . models . device . types Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . bluetooth . Bluetooth Gatt Ċ import Ġandroid . bluetooth . Bluetooth Gatt Callback Ċ import Ġandroid . bluetooth . Bluetooth GattCharacteristic Ċ import Ġandroid . bluetooth . Bluetooth Profile Ċ import Ġandroid . bluetooth . le . Scan Filter Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġde . se em oo . at _ tracking _ detection . AT Tracking Detection Application Ċ import Ġde . se em oo . at _ tracking _ detection . R Ċ import Ġde . se em oo . at _ tracking _ detection . database . models . device . Connect able Ċ import Ġde . se em oo . at _ tracking _ detection . database . models . device . Device Ċ import Ġde . se em oo . at _ tracking _ detection . database . models . device . Device Context Ċ import Ġde . se em oo . at _ tracking _ detection . database . models . device . DeviceType Ċ import Ġde . se em oo . at _ tracking _ detection . util . ble . Bluetooth Constants Ċ import Ġde . se em oo . at _ tracking _ detection . util . ble . Bluetooth Le Service Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ Ċ class ĠFind My ( val Ġid : ĠInt ) Ġ: ĠDevice (), ĠConnect able Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġimage Resource : ĠInt ĊĠĠĠĠĠĠĠ Ġ@ Drawable Res ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠR . drawable . ic _ baseline _ device _ unknown _ 2 4 ĊĊĠĠĠ Ġoverride Ġval Ġdefault Device Name With Id : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠAT Tracking Detection Application . get AppContext (). resources . getString ( R . string . device _ name _ find _ my _ device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ( id ) ĊĊĠĠĠ Ġoverride Ġval Ġdevice Context : ĠDevice Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠFind My ĊĊĊĠĠĠ Ġoverride Ġval Ġbluetooth Gatt Callback : ĠBluetooth Gatt Callback ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠBluetooth Gatt Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( g att : ĠBluetooth Gatt , Ġstatus : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Profile . STATE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Connected Ġto Ġg att Ġdevice !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att . discover Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Profile . STATE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Update ( Bluetooth Constants . ACTION _ G ATT _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Disconnected Ġfrom Ġg att Ġdevice !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Connection Ġstate Ġchanged Ġto Ġ$ newState ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Failed Ġto Ġconnect Ġto Ġbluetooth Ġdevice ! ĠStatus : Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Update ( Bluetooth Constants . ACTION _ EVENT _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Services Dis covered ( g att : ĠBluetooth Gatt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid s Ġ= Ġg att . services . map Ġ{ Ġit . uuid . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Found ĠUUID S Ġ$ uuid s ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġg att . services . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . uuid . toString (). lowercase (). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF IND MY _ SOUND _ SERVICE . lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Playing Ġsound Ġservice Ġnot Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Update ( Bluetooth Constants . ACTION _ EVENT _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġservice . get Characteristic ( Find My . FIND MY _ SOUND _ CHARACTER ISTIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att . set Characteristic Notification ( it , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Ġ= ĠF IND MY _ START _ SOUND _ OPCODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att . write Characteristic ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Playing Ġsound Ġon ĠFind ĠMy Ġdevice Ġwith Ġ${ it . uuid }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Update ( Bluetooth Constants . ACTION _ EVENT _ RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġstop Sound On Find My Device ( g att : ĠBluetooth Gatt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġg att . services . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . uuid . toString (). lowercase (). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF IND MY _ SOUND _ SERVICE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Sound Ġservice Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠF IND MY _ SOUND _ CHARACTER ISTIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġservice . get Characteristic ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att . set Characteristic Notification ( it , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Ġ= ĠF IND MY _ STOP _ SOUND _ OPCODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att . write Characteristic ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Stopping Ġsound Ġon ĠFind ĠMy Ġdevice Ġwith Ġ${ it . uuid }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Write ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Finished Ġwriting Ġto Ġcharacteristic ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic ?. value . content Equals ( FIND MY _ START _ SOUND _ OPCODE ) Ġ&& Ġg att Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Sound On Find My Device ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic ?. value . content Equals ( FIND MY _ STOP _ SOUND _ OPCODE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Update ( Bluetooth Constants . ACTION _ EVENT _ COMPLETED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Writing Ġto Ġcharacteristic Ġfailed Ġ${ character istic ?. uuid }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Update ( Bluetooth Constants . ACTION _ EVENT _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Write ( g att , Ġcharacteristic , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDevice Context Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠF IND MY _ SOUND _ SERVICE Ġ= Ġ" fd 4 4 " ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠF IND MY _ SOUND _ CHARACTER ISTIC Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString (" 4 F 8 6 0 0 0 3 - 9 4 3 B - 4 9 EF - B ED 4 - 2 F 7 3 0 3 0 4 4 2 7 A ") ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠF IND MY _ START _ SOUND _ OPCODE Ġ= Ġbyte ArrayOf ( 0 x 0 1 , Ġ 0 x 0 0 , Ġ 0 x 0 3 ) ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠF IND MY _ STOP _ SOUND _ OPCODE Ġ= Ġbyte ArrayOf ( 0 x 0 1 , Ġ 0 x 0 1 , Ġ 0 x 0 3 ) ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġbluetooth Filter : ĠScan Filter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠScan Filter . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Manufacturer Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 4 C , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte ArrayOf (( 0 x 1 2 ). to Byte (), Ġ( 0 x 1 9 ). to Byte (), Ġ( 0 x 1 0 ). to Byte ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte ArrayOf (( 0 xFF ). to Byte (), Ġ( 0 xFF ). to Byte (), Ġ( 0 x 1 8 ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdevice Type : ĠDevice Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠDevice Type . FIND _ MY ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdefault Device Name : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Find My ĠDevice " ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstatus Byte DeviceType : ĠUInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 2 u ĊĠĠĠ Ġ} Ċ }