package Ġcom . k inner ap ri y ap . s ugar Ċ Ċ import Ġandroid . Manifest . permission . CAMERA Ċ import Ġandroid . Manifest . permission . READ _ EXTERNAL _ STORAGE Ċ import Ġandroid . Manifest . permission . WRITE _ EXTERNAL _ STORAGE Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . navigation . fragment . Nav Host Fragment Ċ import Ġcom . k inner ap ri y ap . s ugar . databinding . Activity Sh erg il Binding Ċ import Ġcom . k inner ap ri y ap . s ugar . medi ag allery . album . Media Gallery Album Spinner Adapter Ċ import Ġcom . k inner ap ri y ap . s ugar . medi ag allery . album . to Bucket DisplayName Ċ import Ġcom . k inner ap ri y ap . s ugar . result launcher . Result Launcher Handler Ċ Ċ internal Ġclass ĠSh erg il Activity Ġ: ĊĠĠĠ ĠAppCompatActivity (), ĊĠĠĠ ĠAdapter View . On ItemSelected Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġobserver : ĠResult Launcher Handler ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠSh erg il ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Gallery Album Spinner Adapter : ĠMedia Gallery Album Spinner Adapter ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Sh erg il Binding ĊĊĠĠĠ Ġprivate Ġval Ġnav Controller Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġ( support FragmentManager . find Fragment ById ( R . id . nav _ host _ fragment ) Ġas ĠNav Host Fragment ). nav Controller ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ UR IS Ġ= Ġ" result U ris " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtheme . apply Style ( viewModel . get Choice Spec (). theme , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Sh erg il Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġbinding . preview Button . isVisible Ġ= ĠviewModel . get Choice Spec (). allow Preview ĊĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . toolbar ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Show Title Enabled ( false ) ĊĊĠĠĠĠĠĠĠ Ġrequested Orientation Ġ= ĠviewModel . get Choice Spec (). orientation ĊĊĠĠĠĠĠĠĠ Ġobserver Ġ= ĠResult Launcher Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: set Read Storage Permission Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: set Write Storage And Camera Permissions Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: set Camera Capture Result ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . getSelected Media Count (). observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġselected Count Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . preview Button . isEnabled Ġ= Ġselected Count Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . apply Button . isEnabled Ġ= Ġselected Count Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . apply Button . text Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( resources . getString ( R . string . apply )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Count Ġ!= Ġ 0 ) Ġappend (" Ġ($ selected Count )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . get ErrorMessage (). observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ?: Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġit , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . get Cursor (). observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ?: Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Toolbar Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġnav Controller . add On Destination Changed Listener Ġ{ Ġ_, Ġdestination , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Media Gallery Ġ= Ġdestination . id Ġ== ĠR . id . media Gallery Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Media Preview Ġ= Ġdestination . id Ġ== ĠR . id . media Preview Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . isVisible Ġ= Ġis Media Gallery ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . preview Button . isVisible Ġ= Ġis Media Gallery ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . bottom bar . isVisible Ġ= Ġis Media Gallery Ġ|| Ġis Media Preview ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . preview Button . setOnClickListener Ġ{ Ġon Preview Clicked () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . apply Button . setOnClickListener Ġ{ Ġon Apply Clicked () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel . get Choice Spec (). show Camera First ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Permission And Open Camera Capture () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Permission And Open Gallery () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġask Permission And Open Gallery () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREAD _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ?. ask Read Storage Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Media Gallery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Support Navigate Up (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Sh erg il Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Intent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ArrayList Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESULT _ UR IS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . getSelected Media Uri List () Ġas ? ĠArrayList ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġresult Intent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Read Storage Permission Result ( allowed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( allowed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Media Gallery () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result Cancelled And Finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Write Storage And Camera Permissions Result ( map : ĠMap < String , ĠBoolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( map [ CAMERA ] Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Build . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . P Ġ|| Ġmap [ WRITE _ EXTERNAL _ STORAGE ] Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Camera Capture () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result Cancelled And Finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Toolbar Spinner () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Gallery Album Spinner Adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Gallery Album Spinner Adapter ( this , ĠviewModel . fetch Album s ()) ĊĠĠĠĠĠĠĠ Ġbinding . album Spinner . adapter Ġ= Ġmedia Gallery Album Spinner Adapter ĊĠĠĠĠĠĠĠ Ġbinding . album Spinner . on ItemSelected Listener Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġbinding . album Spinner . setSelection ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġask Permission And Open Camera Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCAM ERA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ?. ask Write Storage And Camera Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Camera Capture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Camera Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel . get Choice Spec (). show Device Camera ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Camera Capture Uri () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ?. camera Capture ( viewModel . get Camera Capture Uri ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( Nav Graph Directions . action Global Camera Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Camera Capture Result ( result : ĠBoolean ) Ġ= ĠUnit ĊĊĠĠĠ Ġprivate Ġfun Ġopen Media Gallery () Ġ{ ĊĠĠĠĠĠĠĠ Ġnav Controller . navigate ( Nav Graph Directions . action Global Media Gallery Fragment ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . setSelected Album Spinner Name ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . setSelected Album Spinner Name ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Gallery Album Spinner Adapter . getItem ( position )?. to Bucket DisplayName () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġobserver Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Apply Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Sh erg il Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Preview Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNav Graph Directions . action Global Media Preview Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . getSelected Media Cell Display Models (). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġnav Controller . navigate ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Result Cancelled And Finish () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} Ċ } Ċ