package Ġio . github . ach mad h af id . fit n aph one Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . os . Build Ċ import Ġandroid . text . Sp ann able Ċ import Ġandroid . text . Sp ann able String Ċ import Ġandroid . text . Sp ann able StringBuilder Ċ import Ġandroid . text . style . Bullet Span Ċ import Ġandroid . text . style . Style Span Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . lifecycle . Lifecycle Service Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġio . github . ach mad h af id . simple pref . Simple Pref Ċ import Ġio . github . ach mad h af id . simple pref . simple Pref Ċ import Ġio . github . ach mad h af id . z pack . extension . at Least O re o Ċ import Ġio . github . ach mad h af id . z pack . extension . dim en Res Ċ import Ġio . github . ach mad h af id . z pack . extension . foreground App Ċ import Ġio . github . ach mad h af id . z pack . extension . int Res Ċ import Ġio . github . ach mad h af id . z pack . extension . notification Manager Compat Ċ import Ġio . github . ach mad h af id . z pack . extension . open Home Launcher Ċ import Ġio . github . ach mad h af id . z pack . extension . power Manager Ċ import Ġio . github . ach mad h af id . z pack . extension . string Res Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠBlock er Service Ġ: ĠLifecycle Service (), ĠSimple Pref Ġ{ ĊĊĠĠĠ Ġ// region ĠPreferences ĊĊĠĠĠ Ġprivate Ġval Ġblocked Apps Ġby Ġsimple Pref (" blocked _ apps ") Ġ{ Ġmutable ListOf < App Info >() Ġ} ĊĊĠĠĠ Ġ// endregion ĊĠĠĠ Ġ// region ĠResource ĠBinding ĊĊĠĠĠ Ġprivate Ġval Ġscan Interval Ġby Ġint Res ( R . integer . scan _ interval ) ĊĠĠĠ Ġprivate Ġval Ġnotification Id Ġby Ġint Res ( R . integer . notification _ id ) ĊĠĠĠ Ġprivate Ġval Ġnotification Title Ġby Ġstring Res ( R . string . block er _ notification _ title ) ĊĠĠĠ Ġprivate Ġval Ġnotification Title Multi Ġby Ġstring Res ( R . string . block er _ notification _ title _ multi ) ĊĠĠĠ Ġprivate Ġval Ġnotification Text Ġby Ġstring Res ( R . string . block er _ notification _ content ) ĊĠĠĠ Ġprivate Ġval Ġnotification Channel Id Ġby Ġstring Res ( R . string . notification _ channel _ id ) ĊĠĠĠ Ġprivate Ġval Ġnotification Channel Name Ġby Ġstring Res ( R . string . notification _ channel _ name ) ĊĠĠĠ Ġprivate Ġval Ġnotification Channel Description Ġby Ġstring Res ( R . string . notification _ channel _ description ) ĊĠĠĠ Ġprivate Ġval Ġdp Small Ġby Ġdim en Res ( R . dim en . small ) ĊĊĠĠĠ Ġ// endregion ĊĠĠĠ Ġ// region ĠLifecycle ĠCallback ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġ// region ĠCreate Ġnotification ĊĊĠĠĠĠĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . O ) ĊĠĠĠĠĠĠĠ Ġif Ġ( at Least O re o ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ HIGH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager Compat . create Notification Channel ( it . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimportance Ġ= ĠNotification Manager Compat . IMPORT ANCE _ HIGH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnotification Channel Description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// endregion ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Complex Method ") ĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Foreground ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// region ĠMake Ġthis Ġservice Ġforeground ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Title Ġ= Ġ"${ blocked Apps . size } Ġ${ when Ġ( blocked Apps . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġnotification Title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnotification Title Multi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Text Short Ġ= ĠSp ann able String ( notification Text ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Span ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStyle Span ( Type face . BOLD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġlength , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp ann able . SPAN _ INCL USIVE _ EXCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Text Long Ġ= Ġblocked Apps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġapp Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp ann able StringBuilder ( app Info . name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Span ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBullet Span ( dp Small ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġlength , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp ann able . SPAN _ INCL USIVE _ EXCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ ĠappName Ġ-> ĠappName . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġacc , Ġsp ann able String Ġ-> Ġacc . append ("\ n ", Ġsp ann able String ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( content Text Short ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= ĠNotification Compat . Builder ( this , Ġnotification Channel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ lock _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ MAX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( content Title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( content Text Short ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( Notification Compat . Big TextStyle (). big Text ( content Text Long )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( notification Id , Ġnotification ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// endregion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// region ĠScan Ġforeground Ġapp ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( scan Interval . to Long ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Run Activity From Service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( power Manager . is Interactive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground App ?. let Ġ{ ĠpackageName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( blocked Apps Ġcontains ĠpackageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Home Launcher () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// endregion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Foreground Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Foreground Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġ} Ċ Ċ } Ċ