package Ġcom . github . file _ picker Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . annotation . Color Int Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . github . file _ picker . adapter . Item Adapter Ċ import Ġcom . github . file _ picker . extension . get Storage Files Ċ import Ġcom . github . file _ picker . extension . has Permission Ċ import Ġcom . github . file _ picker . listener . On ItemClickListener Ċ import Ġcom . github . file _ picker . listener . On Submit ClickListener Ċ import Ġcom . github . file _ picker . model . Media Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Dialog Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Dialog Fragment Ċ import Ġir . one _ developer . file _ picker . R Ċ import Ġir . one _ developer . file _ picker . databinding . File Picker Binding Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠA Ġfragment Ġthat Ġshows Ġa Ġlist Ġof Ġitems Ġas Ġa Ġmodal Ġbottom Ġsheet . Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġshow Ġthis Ġmodal Ġbottom Ġsheet Ġfrom Ġyour Ġactivity Ġlike Ġthis : Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠ ĠFile Picker . Builder ([ Context ]). build And Show () Ċ Ġ* Ġ</ pre > Ċ Ġ*/ Ċ class ĠFile Picker Ġprivate Ġconstructor ( ĊĠĠĠ Ġbuilder : ĠBuilder Ċ ) Ġ: ĠBottom Sheet Dialog Fragment () Ġ{ ĊĊĠĠĠ Ġ// ĠThis Ġproperty Ġis Ġonly Ġvalid Ġbetween ĠonCreate View Ġand Ġon Destroy View . ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFile Picker Binding ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġitems Adapter : ĠItem Adapter ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġtitle : ĠString ĊĠĠĠ Ġprivate Ġvar Ġtitle TextColor Ġby ĠDeleg ates . notNull < Int >() ĊĠĠĠ Ġprivate Ġvar Ġsubmit Text : ĠString ĊĠĠĠ Ġprivate Ġvar Ġsubmit TextColor Ġby ĠDeleg ates . notNull < Int >() ĊĠĠĠ Ġprivate Ġvar Ġselected Files : ĠList < Media > ĊĠĠĠ Ġprivate Ġvar ĠfileType : ĠFile Type ĊĠĠĠ Ġprivate Ġvar Ġlist Direction : ĠList Direction ĊĠĠĠ Ġprivate Ġvar Ġlimit Count Ġby ĠDeleg ates . notNull < Int >() ĊĠĠĠ Ġprivate Ġvar Ġaccent Color Ġby ĠDeleg ates . notNull < Int >() ĊĠĠĠ Ġprivate Ġvar Ġgrid Span Count Ġby ĠDeleg ates . notNull < Int >() ĊĠĠĠ Ġprivate Ġvar Ġcancell able Ġby ĠDeleg ates . notNull < Boolean >() ĊĊĠĠĠ Ġprivate Ġvar Ġon ItemClickListener : ĠOn ItemClickListener ? ĊĠĠĠ Ġprivate Ġvar ĠonSubmit ClickListener : ĠOn Submit ClickListener ? ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġbuilder . title ĊĠĠĠĠĠĠĠ Ġthis . title TextColor Ġ= Ġbuilder . title TextColor ĊĠĠĠĠĠĠĠ Ġthis . submit Text Ġ= Ġbuilder . submit Text ĊĠĠĠĠĠĠĠ Ġthis . submit TextColor Ġ= Ġbuilder . submit TextColor ĊĠĠĠĠĠĠĠ Ġthis . selected Files Ġ= Ġbuilder . selected Files ĊĠĠĠĠĠĠĠ Ġthis . fileType Ġ= Ġbuilder . fileType ĊĠĠĠĠĠĠĠ Ġthis . list Direction Ġ= Ġbuilder . list Direction ĊĠĠĠĠĠĠĠ Ġthis . c ancellable Ġ= Ġbuilder . c ancellable ĊĠĠĠĠĠĠĠ Ġthis . grid Span Count Ġ= Ġbuilder . grid Span Count ĊĠĠĠĠĠĠĠ Ġthis . limit Count Ġ= Ġbuilder . limit Count ĊĠĠĠĠĠĠĠ Ġthis . accent Color Ġ= Ġbuilder . accent Color ĊĠĠĠĠĠĠĠ Ġthis . on ItemClickListener Ġ= Ġbuilder . on ItemClickListener ĊĠĠĠĠĠĠĠ Ġthis . on Submit ClickListener Ġ= Ġbuilder . on Submit ClickListener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġrequest Permission Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Request Permission ()) Ġ{ Ġis Granted : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Granted ) Ġload Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġdismiss Allow ing State Loss () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapp Compat Activity : ĠAppCompatActivity ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtitle : ĠString Ġ= ĠDEFAULT _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġtitle TextColor : ĠInt Ġ= ĠDEFAULT _ TITLE _ TEXT _ COLOR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġsubmit Text : ĠString Ġ= ĠDEFAULT _ SUBMIT _ TEXT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġsubmit TextColor : ĠInt Ġ= ĠDEFAULT _ SUBMIT _ TEXT _ COLOR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġaccent Color : ĠInt Ġ= ĠDEFAULT _ ACC ENT _ COLOR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġselected Files : ĠList < Media > Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġlimit Count : ĠInt Ġ= ĠDEFAULT _ LIMIT _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar ĠfileType : ĠFile Type Ġ= ĠDEFAULT _ FILE _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġgrid Span Count : ĠInt Ġ= ĠDEFAULT _ SPAN _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġcancell able : ĠBoolean Ġ= ĠDEFAULT _ CANCEL ABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġlist Direction : ĠList Direction Ġ= ĠDEFAULT _ LIST _ DIRECTION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġon ItemClickListener : ĠOn ItemClickListener ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar ĠonSubmit ClickListener : ĠOn Submit ClickListener ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġtitle ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtitle ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠsetTitle ( title : ĠString ) Ġ= Ġapply Ġ{ Ġthis . title Ġ= Ġtitle Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġtitle Ġtext Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠsetTitle TextColor ( color : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . title TextColor Ġ= Ġcolor Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġsubmit Ġtext ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Submit Text ( text : ĠString ) Ġ= Ġapply Ġ{ Ġthis . submit Text Ġ= Ġtext Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġsubmit Ġtext Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Submit TextColor ( color : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . submit TextColor Ġ= Ġcolor Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġaccent Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Accent Color (@ Color Int Ġcolor : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . accent Color Ġ= Ġcolor Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġselected Ġfiles , Ġfor Ġshow Ġas Ġselected Ġstyle Ġin Ġlist ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġselected Files ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠsetSelected Files ( selected Files : ĠList < Media >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . selected Files Ġ= Ġselected Files Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġlimit Ġitem Ġselection ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġthe Ġlimit Ġitem Ġcan Ġselect ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Limit Item Selection ( limit : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . limit Count Ġ= Ġlimit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġfile Ġtype ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠfileType Ġthe Ġ[ FileType ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset FileType ( fileType : ĠFile Type ) Ġ= Ġapply Ġ{ Ġthis . fileType Ġ= ĠfileType Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġgrid Ġspan Ġcount ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġspan Count Ġthe Ġlist Ġspan Ġcount ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Grid Span Count ( span Count : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . grid Span Count Ġ= Ġspan Count Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġcancell able ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcancell able ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset C ancellable ( c ancellable : ĠBoolean ) Ġ= Ġapply Ġ{ Ġthis . c ancellable Ġ= Ġcancell able Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġlist Ġdirection ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlist Direction Ġ[ List Direction ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset List Direction ( list Direction : ĠList Direction ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . list Direction Ġ= Ġlist Direction Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġon Ġsubmit Ġclick Ġlistener ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠonSubmit ClickListener ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset On Submit ClickListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSubmit ClickListener : ĠOn Submit ClickListener ? ĊĠĠĠĠĠĠĠ Ġ) Ġ= Ġapply Ġ{ Ġthis . on Submit ClickListener Ġ= ĠonSubmit ClickListener Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġon Ġitem Ġclick Ġlistener ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġon ItemClickListener ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset On ItemClickListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ItemClickListener : ĠOn ItemClickListener ? ĊĠĠĠĠĠĠĠ Ġ) Ġ= Ġapply Ġ{ Ġthis . on ItemClickListener Ġ= Ġon ItemClickListener Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuild Ġfile Ġpicker Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild () Ġ= ĠFile Picker ( this ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuild Ġfile Ġpicker Ġand Ġshow Ġit ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild And Show () Ġ= Ġbuild (). show ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Compat Activity . support FragmentManager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" file . picker " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Style ( STYLE _ NORMAL , ĠR . style . Bottom Sheet Dialog ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFile Picker Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset C ancellable Dialog ( c ancellable ) ĊĠĠĠĠĠĠĠ Ġsetup Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġval Ġread Storage Permission Ġ= ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Permission ( read Storage Permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( read Storage Permission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġload Files () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow ( manager : ĠFragment Manager , Ġtag : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Shown ) Ġreturn ĊĠĠĠĠĠĠĠ Ġsuper . show ( manager , Ġtag ) ĊĠĠĠĠĠĠĠ Ġis Shown Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Dismiss ( dialog : ĠDialog Interface ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsuper . on Dismiss ( dialog ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrequest Permission . unregister () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġpermission ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpermission ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequest Permission ( permission : ĠString ) Ġ= Ġrequest Permission . launch ( permission ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġcancell able Ġdialog ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcancell able ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset C ancellable Dialog ( c ancellable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdialog ?. set Cancel able ( c ancellable ) ĊĠĠĠĠĠĠĠ Ġdialog ?. set Canceled On Touch Outside ( c ancellable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġfixed Ġsubmit Ġbutton ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Fixed Submit Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbehavior : ĠBottom Sheet Behavior < *> Ġ= Ġ( dialog Ġas ĠBottom Sheet Dialog ). behavior ĊĠĠĠĠĠĠĠ Ġbehavior . add Bottom Sheet Callback ( object Ġ: ĠBottom Sheet Behavior . Bottom Sheet Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( bottom Sheet : ĠView , ĠnewState : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Slide ( bottom Sheet : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbutton Ġ= Ġbinding . button Container ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( bottom Sheet . parent Ġas ĠView ). height Ġ- Ġbottom Sheet . top Ġ- Ġbutton . height ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . post Ġ{ Ġon Slide ( root . parent Ġas ĠView , Ġ 0 f ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSetup Ġviews ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Views () Ġ= Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Submit Button State () ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView ( rv Files ) ĊĠĠĠĠĠĠĠ Ġset Fixed Submit Button () ĊĠĠĠĠĠĠĠ Ġupdate Selected Count () ĊĊĠĠĠĠĠĠĠ Ġcard Line . set Card BackgroundColor ( Color State List . valueOf ( accent Color )) ĊĠĠĠĠĠĠĠ Ġprogress . in determinate Tint List Ġ= ĠColor State List . valueOf ( accent Color ) ĊĠĠĠĠĠĠĠ Ġtv Title . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset TextColor ( title TextColor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbtn Submit . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġsubmit Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Allow ing State Loss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġselected Ġcount ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Selected Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Count Ġ= Ġget Selected Items ()?. size Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġbinding . tv Title . text Ġ= Ġ"$ title Ġ($ selected Count /$ limit Count )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSetup Ġre cycler Ġview ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġre cyclerView ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems Adapter Ġ= ĠItem Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccent Color Ġ= Ġaccent Color , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Selection Count Ġ= Ġlimit Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Ġ= Ġ{ Ġitem Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup On ItemClickListener ( item Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Selected Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Submit Button State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Direction Ġ= Ġwhen Ġ( list Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Direction . LTR Ġ-> ĠRecyclerView . LAYOUT _ DIRECTION _ LTR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Direction . RTL Ġ-> ĠRecyclerView . LAYOUT _ DIRECTION _ RTL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠGrid LayoutManager ( require Context (), Ġgrid Span Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġitems Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSetup Ġon Ġitem Ġclick Ġlistener ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup On ItemClickListener ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( on ItemClickListener Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( items Adapter Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġmedia Ġ= Ġitems Adapter ?. current List ?. get ( position ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġon ItemClickListener ?. onClick ( media , Ġposition , Ġitems Adapter !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġchange Ġsubmit Ġbutton Ġstate ĊĠĠĠĠ Ġ* Ġif Ġhas Ġselected Ġitem Ġchange Ġto Ġenable Ġotherwise Ġdisable Ġit ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġchange Submit Button State () Ġ= Ġbinding . btn Submit . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġhas SelectedItem () ĊĠĠĠĠĠĠĠ Ġif Ġ( isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset TextColor ( submit TextColor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( accent Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ apply ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset TextColor ( Color . GRAY ) ĊĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . LT GRAY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġfiles ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Files () Ġ= ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġget Storage Files ( fileType Ġ= ĠfileType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠMedia ( file Ġ= Ġit , Ġtype Ġ= ĠfileType ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( selected Files . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Files . forEach Ġ{ Ġmedia Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Media Ġ= Ġfiles . find Ġ{ Ġit . id Ġ== Ġmedia . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Media Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Media . isSelected Ġ= Ġmedia . isSelected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Media . order Ġ= Ġmedia . order ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire Activity (). run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Adapter ?. submit List ( files ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Selected Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Fixed Submit Button () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Submit Button State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubmit Ġlist ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsubmit List () Ġ= Ġget Selected Items ()?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠonSubmit ClickListener ?. onClick ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġselected Ġitems ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Selected Items (): ĠList < Media >? Ġ= ĊĠĠĠĠĠĠĠ Ġitems Adapter ?. current List ?. filter Ġ{ Ġit . isSelected Ġ} ?. sorted By Ġ{ Ġit . order Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHas Ġselected Ġitem ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas SelectedItem (): ĠBoolean Ġ= Ġ! getSelected Items (). isNull OrEmpty () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDefaults ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SPAN _ COUNT Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ LIMIT _ COUNT Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ CANCEL ABLE Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ FILE _ TYPE Ġ= ĠFile Type . IMAGE ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ LIST _ DIRECTION Ġ= ĠList Direction . LTR ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ ACC ENT _ COLOR Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ TITLE Ġ= Ġ" Choose ĠFile " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ TITLE _ TEXT _ COLOR Ġ= ĠDEFAULT _ ACC ENT _ COLOR ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SUBMIT _ TEXT Ġ= Ġ" Submit " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SUBMIT _ TEXT _ COLOR Ġ= ĠColor . WHITE ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġis Shown : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ Ċ }