/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠA ce ĠExplorer Ġowned Ġby ĠS ij u ĠS ak aria Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . si ju . ac explorer . home . view Ċ Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġcom . si ju . ac explorer . R Ċ import Ġcom . si ju . ac explorer . databinding . Home screen Binding Ċ import Ġcom . si ju . ac explorer . home . view model . Home ViewModel Ċ import Ġcom . si ju . ac explorer . main . helper . Update Checker Ċ import Ġcom . si ju . ac explorer . main . model . groups . Category Ċ import Ġcom . si ju . ac explorer . main . view model . Main ViewModel Ċ import Ġcom . si ju . ac explorer . permission . Permission Helper Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Home Screen Fragment " Ċ Ċ @ Android EntryPoint Ċ class ĠHome Screen Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmain ViewModel : ĠMain ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġhome ViewModel : ĠHome ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcategory Adapter : ĠHome Lib Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstorage Adapter : ĠHome Storage Adapter ĊĊĠĠĠ Ġprivate Ġvar Ġsearch Item : ĠMenuItem ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠHome screen Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠHome screen Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠ Ġinit List () ĊĠĠĠĠĠĠĠ Ġcheck If File Picker () ĊĠĠĠĠĠĠĠ Ġinit Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= Ġbinding . toolbar Container . toolbar ĊĠĠĠĠĠĠĠ Ġtoolbar . title Ġ= Ġresources . getString ( R . string . app _ name ) ĊĠĠĠĠĠĠĠ Ġ( activity Ġas ĠAppCompatActivity ). set Support ActionBar ( toolbar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit List () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Categories List () ĊĠĠĠĠĠĠĠ Ġsetup Storage List () ĊĠĠĠĠĠĠĠ Ġbinding . category . edit Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Category Edit Screen () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Category Edit Screen () Ġ{ ĊĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠHome Screen Fragment Directions . action Navigation Home To Category Edit () ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ViewModel . navigate To Recent . observe ( view Lifecycle Owner , Ġ{ Ġnavigate To Recent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( navigate To Recent Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Recent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġhome ViewModel . categories . observe ( view Lifecycle Owner , Ġ{ Ġcategory List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" categories : Ġ${ category List . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Adapter . submit List ( category List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhome ViewModel . fetch Count ( category List ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġhome ViewModel . storage . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . set Storage List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Adapter . submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġmain ViewModel . permission Status . observe ( view Lifecycle Owner , Ġ{ Ġpermission Status Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" init Observer s : Ġperm status :$ permission Status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( permission Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPermission Helper . Permission State . Granted Ġ-> Ġhome ViewModel . load Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġhome ViewModel . category Data . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Adapter . notify Item Changed ( it . first , Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġhome ViewModel . category Click Event . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Category ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome ViewModel . set Category Click Event ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If File Picker () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( main ViewModel . isFile Picker ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon File Picker () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon File Picker () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Search () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Recent () Ġ{ ĊĠĠĠĠĠĠĠ Ġload Category ( null , ĠCategory . REC ENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Search () Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Item ?. isVisible Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Categories List () Ġ{ ĊĠĠĠĠĠĠĠ Ġcategory Adapter Ġ= ĠHome Lib Adapter ( home ViewModel ) ĊĠĠĠĠĠĠĠ Ġsetup Category Adapter () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Storage List () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage List Ġ= Ġbinding . storage . storage List ĊĠĠĠĠĠĠĠ Ġstorage Adapter Ġ= ĠHome Storage Adapter Ġ{ Ġstorage Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload List ( storage Item . path , Ġstorage Item . category ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstorage List . adapter Ġ= Ġstorage Adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Category Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgrid Columns Ġ= Ġhome ViewModel . get Category Grid Columns () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" grid Columns $ grid Columns ") ĊĠĠĠĠĠĠĠ Ġval Ġgrid LayoutManager Ġ= ĠGrid LayoutManager ( context , Ġgrid Columns ) ĊĠĠĠĠĠĠĠ Ġbinding . category . category List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġgrid LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcategory Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload List ( path : ĠString ?, Ġcategory : ĠCategory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactions Ġ= ĠHome Screen Fragment Directions . action Navigation Home ToFile List Fragment ( path , Ġcategory , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġfind Nav Controller () ĊĠĠĠĠĠĠĠ Ġnav Controller . navigate ( actions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Category ( path : ĠString ?, Ġcategory : ĠCategory ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" load Category () Ġcalled Ġwith : Ġpath Ġ= Ġ$ path , Ġcategory Ġ= Ġ$ category ") ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġif Ġ( is Category Split Required ( category )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHome Screen Fragment Directions . action Navigation Home To Category Fragment ( path , Ġcategory ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHome Screen Fragment Directions . action Navigation Home ToFile List Fragment ( path , Ġcategory , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Category Split Required ( category : ĠCategory ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcategory Ġ== ĠCategory . WH ATS APP Ġ|| Ġcategory Ġ== ĠCategory . TELE GRAM Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ== ĠCategory . GENERIC _ M US IC Ġ|| Ġcategory Ġ== ĠCategory . GENERIC _ I MAGES Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ== ĠCategory . GENERIC _ VID EOS Ġ|| Ġcategory Ġ== ĠCategory . CAMERA _ GENERIC Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ== ĠCategory . REC ENT Ġ|| Ġcategory Ġ== ĠCategory . LARGE _ FILES Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ== ĠCategory . DOCS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . home , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġsearch Item Ġ= Ġmenu . find Item ( R . id . action _ search ) ĊĠĠĠĠĠĠĠ Ġif Ġ( main ViewModel . isFile Picker ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Search () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ search Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Search Screen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Search Screen () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ViewModel . navigate To Search () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Configuration Changed :$ new Config ") ĊĠĠĠĠĠĠĠ Ġsetup Category Adapter () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Update Snackbar ( update Checker : ĠUpdate Checker ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Checker ?. show Update Snackbar ( view ?. findViewById ( R . id . container )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ