package Ġde . m ch ll n gr . quick ero . module . main Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . view . Context Theme Wrapper Ċ import Ġandroidx . lifecycle . as LiveData Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . bottom sheets . Bottom Sheet Ċ import Ġcom . af ol le st ad . material dialogs . lifecycle . lifecycle Owner Ċ import Ġcom . af ol le st ad . material dialogs . list . custom ListAdapter Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġde . m ch ll n gr . quick ero . R Ċ import Ġde . m ch ll n gr . quick ero . databinding . Activity Main Binding Ċ import Ġde . m ch ll n gr . quick ero . extension . device Screen Width Ċ import Ġde . m ch ll n gr . quick ero . module . about . About Activity Ċ import Ġde . m ch ll n gr . quick ero . repository . application . PackageName Ċ import Ġde . m ch ll n gr . quick ero . util . application list . Application ListAdapter Ċ import Ġde . m ch ll n gr . quick ero . util . notification . Notification Helper Ċ import Ġde . m ch ll n gr . quick ero . util . swipe . Swipe Item Touch Callback Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . first OrNull Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ @ Android EntryPoint Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMain ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġnotification Helper : ĠNotification Helper ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġadapter : ĠMain Adapter ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . toolbar ) ĊĊĠĠĠĠĠĠĠ Ġbinding . init RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġbinding . enable . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Ġ-> ĠviewModel . set Notification Enabled ( checked ) Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . fab . setOnClickListener Ġ{ Ġbinding . open Application Selection () Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . applications . as LiveData (). observe ( this ) Ġ{ Ġadapter . submit List ( it ) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . applications Max Reached . as LiveData (). observe ( this ) Ġ{ Ġbinding . fab . visibility Ġ= Ġif Ġ( it ) ĠView . VISIBLE Ġelse ĠView . GONE Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . notification Enabled . as LiveData (). observe ( this ) Ġ{ Ġbinding . enable . isChecked Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠActivity Main Binding . init RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . re cyclerView . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . addItem Decoration ( Divider Item Decoration ( this @ MainActivity , ĠLinearLayoutManager . VERTICAL )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Helper ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Item Touch Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . swipe Background , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Screen Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSw ipe Item Touch Callback . Delegate Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Position : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Position : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . move Application ( from Position , Ġto Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . remove Application ( position )?. let Ġ{ ĠpackageName Ġ-> Ġshow Removed Snackbar ( packageName , Ġposition ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). attach To RecyclerView ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ) Ġ= Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠ ĠR . id . about Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAbout Activity . start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠR . id . settings Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Helper . open Settings ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġcheck Notification Enabled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Notification Enabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! notification Helper . is Notification Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. lifecycle Owner ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( R . string . dialog _ notification _ disabled _ title , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( null , ĠgetString ( R . string . dialog _ notification _ disabled _ text , ĠgetString ( R . string . app _ name )), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cancel On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Button ( R . string . dialog _ notification _ disabled _ button _ ok , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. negative Button ( R . string . dialog _ notification _ disabled _ button _ settings , Ġnull ) Ġ{ Ġnotification Helper . open Settings ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠActivity Main Binding . open Application Selection () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġloading Dialog Ġ= ĠMaterial Dialog ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. lifecycle Owner ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . dialog _ progress _ please _ wait , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. cancel On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġshow () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Installed Applications (). first OrNull () Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Dialog . dismiss () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( coordinator Layout , ĠR . string . sn ackbar _ empty _ application _ list _ error , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( Context Theme Wrapper ( this @ MainActivity , ĠR . style . App Theme _ Application List ), ĠBottom Sheet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. lifecycle Owner ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( R . string . dialog _ application _ list _ title , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom ListAdapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication ListAdapter ( list ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . add Application ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠActivity Main Binding . show Removed Snackbar ( ĊĠĠĠĠĠĠĠ ĠpackageName : ĠPackage Name , ĊĠĠĠĠĠĠĠ Ġposition : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( coordinator Layout , ĠR . string . sn ackbar _ undo _ remove , ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( R . string . sn ackbar _ undo _ remove _ action ) Ġ{ ĠviewModel . add Application ( packageName , Ġposition ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} Ċ } Ċ