/* Ċ Ġ* ĠĠ ĠCopyright Ġ 2 0 2 0 - 2 0 2 1 ĠLe on ĠL ats ch Ċ Ġ* Ċ Ġ* ĠĠ Ġ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 Ġdev . leon l ats ch . phot ok . ui . gallery Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . view . Action Mode Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . Simple Item Animator Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġdev . leon l ats ch . phot ok . R Ċ import Ġdev . leon l ats ch . phot ok . databinding . Fragment Gallery Binding Ċ import Ġdev . leon l ats ch . phot ok . other .* Ċ import Ġdev . leon l ats ch . phot ok . ui . MainActivity Ċ import Ġdev . leon l ats ch . phot ok . ui . backup . Validate Backup Dialog Fragment Ċ import Ġdev . leon l ats ch . phot ok . ui . components . Dialog s Ċ import Ġdev . leon l ats ch . phot ok . ui . components . bindings . Bind able Fragment Ċ import Ġdev . leon l ats ch . phot ok . ui . process . Delete Bottom Sheet Dialog Fragment Ċ import Ġdev . leon l ats ch . phot ok . ui . process . Export Bottom Sheet Dialog Fragment Ċ import Ġdev . leon l ats ch . phot ok . ui . process . Import Bottom Sheet Dialog Fragment Ċ import Ġdev . leon l ats ch . phot ok . ui . view photo . View Photo Activity Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . launch Ċ import Ġpub . dev rel . eas yper missions . After Permission Granted Ċ import Ġpub . dev rel . eas yper missions . Easy Permissions Ċ Ċ /** Ċ Ġ* ĠFragment Ġfor Ġdisplaying Ġa Ġgallery . Ċ Ġ* Ċ Ġ* Ġ@ since Ġ 1 . 0 . 0 Ċ Ġ* Ġ@ author ĠLe on ĠL ats ch Ċ Ġ*/ Ċ @ Android EntryPoint Ċ class ĠGallery Fragment Ġ: ĠBind able Fragment < Fragment Gallery Binding >( R . layout . fragment _ gallery ) Ġ{ ĊĊĠĠĠ Ġ// Ġregion Ġbinding Ġproperties ĊĊĠĠĠ Ġvar Ġplaceholder Visibility : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData ( View . VISIBLE ) ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠGallery ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠPhoto Adapter ĊĠĠĠ Ġprivate Ġvar Ġaction Mode : ĠAction Mode ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbinding . gallery Photo Grid . layout Manager Ġ= ĠGrid LayoutManager ( require Context (), Ġget Col Count ()) ĊĠĠĠĠĠĠĠ Ġ( binding . gallery Photo Grid . item Animator Ġas ĠSimple Item Animator ). supports Change Animations Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠPhoto Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . photo Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: show Full Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadapter . register Adapter Data Observer ( on Adapter Data Observer ) ĊĠĠĠĠĠĠĠ Ġbinding . gallery Photo Grid . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . photos . collect Latest Ġ{ Ġadapter . submit Data ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadapter . is Multi Select Mode . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġ( activity Ġas ĠMainActivity ). start Action Mode ( action Mode Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Adapter Data Observer Ġ= Ġobject Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Placeholder ( adapter . item Count ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Removed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Placeholder ( adapter . item Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Col Count () Ġ= Ġwhen Ġ( resources . configuration . orientation ) Ġ{ ĊĠĠĠĠĠĠĠ ĠConfiguration . OR IENTATION _ POR TRA IT Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ ĠConfiguration . OR IENTATION _ LAND SC APE Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 4 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Placeholder ( item Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġif Ġ( item Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplaceholder Visibility . post Value ( visibility ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġphoto Ġimport . ĊĠĠĠĠ Ġ* ĠStarts Ġa Ġcho oser Ġfor Ġimages . ĊĠĠĠĠ Ġ* ĠMay Ġrequest Ġpermission ĠREAD _ EXTERNAL _ STORAGE . ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġui . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ After Permission Granted ( REQ _ PERM _ IMPORT ) ĊĠĠĠ Ġfun Ġstart Import () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Easy Permissions . has Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . gallery Action Menu . collapse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ GET _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ ALLOW _ MULTIPLE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result And Ignore Timer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . create Chooser ( intent , Ġ" Select ĠPh otos "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ CONTENT _ PH OT OS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Permissions . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . import _ permission _ ration ale ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ PERM _ IMPORT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġrest oring Ġa Ġbackup . ĊĠĠĠĠ Ġ* ĠRequests Ġpermission Ġand Ġshows Ġ[ Validate Backup Dialog Fragment ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ After Permission Granted ( REQ _ PERM _ REST ORE ) ĊĠĠĠ Ġfun Ġstart Restore () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Easy Permissions . has Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . gallery Action Menu . collapse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ OPEN _ DOCUMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" application / zip " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result And Ignore Timer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . create Chooser ( intent , Ġ" Select ĠBackup "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ CONTENT _ BACKUP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Permissions . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . import _ permission _ ration ale ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ PERM _ REST ORE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġthe Ġdeleting Ġprocess Ġwith Ġall Ġselected Ġitems . ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġui . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Delete () Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete Bottom Sheet Dialog Fragment ( adapter . getAll Selected ()). show ( require Activity (). support FragmentManager ) ĊĠĠĠĠĠĠĠ Ġadapter . disable Selection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġexporting Ġprocess . ĊĠĠĠĠ Ġ* ĠMay Ġrequest Ġpermission ĠWRITE _ EXTERNAL _ STORAGE . ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġui . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ After Permission Granted ( REQ _ PERM _ EXPORT ) ĊĠĠĠ Ġfun Ġstart Export () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Easy Permissions . has Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ|| ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExport Bottom Sheet Dialog Fragment ( adapter . getAll Selected ()). show ( require Activity (). support FragmentManager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . disable Selection () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Permissions . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . export _ permission _ ration ale ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ PERM _ EXPORT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠResult Ġfrom Ġselect Ġphotos Ġfor Ġimport ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQ _ CONTENT _ PH OT OS Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimages Ġ= Ġmutable ListOf < Uri >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Data From Result ( images , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( images . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImport Bottom Sheet Dialog Fragment ( images ). show ( require Activity (). support FragmentManager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request Code Ġ== ĠREQ _ CONTENT _ BACKUP Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . data Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValidate Backup Dialog Fragment ( data . data !! ). show ( require Activity (). support FragmentManager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Data From Result ( images : ĠMutable List < Uri >, Ġdata : ĠIntent ): ĠMutable List < Uri > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . clip Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġdata . clip Data !!. item Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= Ġdata . clip Data !!. getItem At ( i ). uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages . add ( image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( data . data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= Ġdata . data !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages . add ( image Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġimages ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Full Size ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( require Activity (), ĠView Photo Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( INT ENT _ PH OTO _ ID , Ġid ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġaction Mode Callback Ġ= Ġobject Ġ: ĠAction Mode . Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Action Mode ( mode : ĠAction Mode ?, Ġmenu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode ?. menu Inflater ?. inflate ( R . menu . menu _ multi _ select , Ġmenu ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Prepare Action Mode ( mode : ĠAction Mode ?, Ġmenu : ĠMenu ?): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Action Item Clicked ( mode : ĠAction Mode ?, Ġitem : ĠMenuItem ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item ?. itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu Ms All Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu Ms Delete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog s . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . delete _ are _ you _ sure ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . selected Items . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġ// ĠOn Ġpositive Ġbutton Ġclicked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu Ms Export Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog s . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . export _ are _ you _ sure ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . selected Items . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġ// ĠOn Ġpositive Ġbutton Ġclicked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Export () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy Action Mode ( mode : ĠAction Mode ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . disable Selection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġ// ĠForward Ġresult Ġto ĠEasy Permissions ĊĠĠĠĠĠĠĠ ĠEasy Permissions . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind ( binding : ĠFragment Gallery Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . bind ( binding ) ĊĠĠĠĠĠĠĠ Ġbinding . context Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQ _ CONTENT _ PH OT OS Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQ _ CONTENT _ BACKUP Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ }