package Ġdev . k drag 0 n . android 1 2 ext . ui . main Ċ Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . top john wu . superuser . Shell Ċ import Ġdev . k drag 0 n . android 1 2 ext . core . Broadcast Manager Ċ import Ġdev . k drag 0 n . android 1 2 ext . core . data . Settings Repository Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠMain ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġsettings Repo : ĠSettings Repository , ĊĠĠĠ Ġprivate Ġval Ġbroadcast Manager : ĠBroadcast Manager , Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġ// ĠSet Ġinitial Ġstate Ġto Ġtrue Ġto Ġavoid Ġa Ġdialog Ġflash ĊĠĠĠ Ġval Ġis X posed Hook ed Ġ= ĠMutable LiveData ( true ) ĊĠĠĠ Ġfun Ġupdate Hook State () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis X posed Hook ed . value Ġ= Ġbroadcast Manager . ping Sys Ui () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDoes n 't Ġneed Ġto Ġbe Ġatomic Ġbecause Ġthe ĠviewModel Scope Ġdispatcher Ġis Ġsingle - threaded ĊĠĠĠ Ġprivate Ġvar Ġpref Change Count Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠNeeds Ġto Ġbe Ġseparate Ġfrom Ġregister On Shared Preference ChangeListener Ġin Ġorder Ġto Ġhold Ġa Ġstrong Ġreference ĊĠĠĠ Ġprivate Ġval Ġpref ChangeListener Ġ= ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ Ġ_, Ġkey Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġkey Ġis Ġapplied Ġseparately ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġ" ao sp _ circle _ icons 2 _ enabled ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Shared Preference ChangeListener ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDe bounce Ġrestart s Ġto Ġmit igate Ġexcess ive Ġdis ruption ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Reload Warning . value Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Count Ġ= Ġ++ pref Change Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Broadcast Manager . RE LOAD _ DE BOUN CE _ DELAY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġdebounce : Ġshow Ġwarning ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Change Count Ġ== Ġstart Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Reload Warning . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Broadcast Manager . RE LOAD _ WARNING _ DURATION . to Long ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecond Ġdebounce : Ġmake Ġsure Ġwarning Ġis Ġstill Ġshown Ġ* and * Ġno Ġpref Ġchanges Ġwere Ġmade ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Change Count Ġ== Ġstart Count Ġ&& Ġshow Reload Warning . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Manager . broadcast Reload () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGive Ġtime Ġfor ĠSystem UI Ġto Ġrestart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Broadcast Manager . RE LOAD _ RE START _ DELAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Reload Warning . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġshow Reload Warning Ġ= ĠMutable LiveData ( false ) ĊĊĠĠĠ Ġval Ġis Root ed Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġfun Ġupdate Root State () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Root ed . value Ġ= ĠShell . root Access () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings Repo . prefs . register On Shared Preference ChangeListener ( pref ChangeListener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings Repo . prefs . unregister On Shared Preference ChangeListener ( pref ChangeListener ) ĊĠĠĠ Ġ} Ċ } Ċ