package Ġio . homeassistant . comp anion . android Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Power Manager Ċ import Ġandroid . tele phony . Tele phony Manager Ċ import Ġdagger . h ilt . android . H ilt Android App Ċ import Ġio . homeassistant . comp anion . android . common . data . prefs . Prefs Repository Ċ import Ġio . homeassistant . comp anion . android . common . sensors . Last Update Manager Ċ import Ġio . homeassistant . comp anion . android . database . App Database Ċ import Ġio . homeassistant . comp anion . android . sensors . Sensor Receiver Ċ import Ġio . homeassistant . comp anion . android . widgets . button . Button Widget Ċ import Ġio . homeassistant . comp anion . android . widgets . entity . Entity Widget Ċ import Ġio . homeassistant . comp anion . android . widgets . media _ player _ controls . MediaPlayer Controls Widget Ċ import Ġio . homeassistant . comp anion . android . widgets . template . Template Widget Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt Android App Ċ open Ġclass ĠHome Assistant Application Ġ: ĠApplication () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġio Scope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . IO Ġ+ ĠJob ()) ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġprefs Repository : ĠP refs Repository ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġio Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Crash Reporting ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Repository . is Crash Reporting () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsensor Receiver Ġ= ĠSensor Receiver () ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġcause Ġthe Ġsensor Ġto Ġbe Ġupdated Ġevery Ġtime Ġthe ĠOS Ġbroadcast s Ġthat Ġa Ġc able Ġwas Ġplug ged / un plug ged . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġshould Ġbe Ġnearly Ġinstant aneous Ġallowing Ġautom ations Ġto Ġfire Ġimmediately Ġwhen Ġa Ġphone Ġis Ġplug ged ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġor Ġun plug ged . ĠUpdates Ġwill Ġalso Ġbe Ġtriggered Ġwhen Ġthe Ġsystem Ġreports Ġlow Ġbattery Ġand Ġwhen Ġit Ġrecover s . ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ B ATTER Y _ LOW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ B ATTER Y _ OK AY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ POWER _ CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ POWER _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġcause Ġinteractive Ġand Ġpower Ġsave Ġto Ġupdate Ġupon Ġa Ġstate Ġchange ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ SCREEN _ OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ SCREEN _ ON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Power Manager . ACTION _ POWER _ SAVE _ MODE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate ĠQuest Ġonly Ġsensors Ġwhen Ġthe Ġdevice Ġis Ġa ĠQuest ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . MODEL Ġ== Ġ" Quest ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action (" com . oc ulus . intent . action . MOUNT _ STATE _ CHANGED ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġdo ze Ġmode Ġimmediately Ġon Ġsupported Ġdevices ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Power Manager . ACTION _ DEVICE _ IDLE _ MODE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġtrigger Ġan Ġupdate Ġany Ġtime Ġthe Ġwifi Ġstate Ġhas Ġchanged ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Wifi Manager . NETWORK _ STATE _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġcause Ġthe Ġphone Ġstate Ġsensor Ġto Ġbe Ġupdated Ġevery Ġtime Ġthe ĠOS Ġbroadcast s Ġthat Ġa Ġcall Ġtriggered . ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Tele phony Manager . ACTION _ PHONE _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠListen Ġfor Ġbluetooth Ġstate Ġchanges ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Bluetooth Adapter . ACTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠListen Ġto Ġchanges Ġto Ġthe Ġaudio Ġinput / output Ġon Ġthe Ġdevice ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Audio Manager . ACTION _ AUDIO _ BE COM ING _ NO IS Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Audio Manager . ACTION _ HEAD SET _ PL UG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Audio Manager . RING ER _ MODE _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġextra Ġaudio Ġreceiver Ġfor Ġdevices Ġthat Ġsupport Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Audio Manager . ACTION _ MICRO PHONE _ M UTE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Audio Manager . ACTION _ SPE AK ER PHONE _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġreceiver Ġfor ĠD ND Ġchanges Ġon Ġdevices Ġthat Ġsupport Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Notification Manager . ACTION _ INTERRUP TION _ FILTER _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġfor Ġall Ġsaved Ġuser Ġintent s ĊĠĠĠĠĠĠĠ Ġval Ġsensor Dao Ġ= ĠApp Database . getInstance ( application Context ). sensor Dao () ĊĠĠĠĠĠĠĠ Ġval Ġall Settings Ġ= Ġsensor Dao . get Settings ( Last Update Manager . last Update . id ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( setting Ġin Ġall Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( setting . value Ġ!= Ġ"" Ġ&& Ġsetting . value Ġ!= Ġ" Sensor Worker ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( setting . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġfor Ġchanges Ġto Ġthe Ġmanaged Ġprofile Ġavailability ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ MAN AG ED _ PROFILE _ AVAILABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ MAN AG ED _ PROFILE _ UN AVAILABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġwidgets Ġwhen Ġthe Ġscreen Ġturns Ġon , Ġupdates Ġare Ġskipped Ġif Ġwidgets Ġwere Ġnot Ġadded ĊĠĠĠĠĠĠĠ Ġval Ġbutton Widget Ġ= ĠButton Widget () ĊĠĠĠĠĠĠĠ Ġval Ġentity Widget Ġ= ĠEntity Widget () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Player Widget Ġ= ĠMedia Player Controls Widget () ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget Ġ= ĠTemplate Widget () ĊĊĠĠĠĠĠĠĠ Ġval Ġscreen Intent Filter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠ Ġscreen Intent Filter . addAction ( Intent . ACTION _ SCREEN _ ON ) ĊĠĠĠĠĠĠĠ Ġscreen Intent Filter . addAction ( Intent . ACTION _ SCREEN _ OFF ) ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( button Widget , Ġscreen Intent Filter ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( entity Widget , Ġscreen Intent Filter ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( media Player Widget , Ġscreen Intent Filter ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( template Widget , Ġscreen Intent Filter ) ĊĠĠĠ Ġ} Ċ } Ċ