package Ġst 2 3 5 . com . github . se am car ving . presentation . gallery . list Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ import Ġandroidx . transition . Change Bounds Ċ import Ġandroidx . transition . Change Transform Ċ import Ġandroidx . transition . Fade Ċ import Ġcom . google . android . material . floating action button . Extended Floating ActionButton Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġorg . k oin . android x . view model . ext . android . shared ViewModel Ċ import Ġst 2 3 5 . com . github . se am car ving . R Ċ import Ġst 2 3 5 . com . github . se am car ving . data . State ful Media Request Ċ import Ġst 2 3 5 . com . github . se am car ving . inter actors . models . Image Info Ċ import Ġst 2 3 5 . com . github . se am car ving . presentation . editor . Editor Activity Ċ import Ġst 2 3 5 . com . github . se am car ving . presentation . gallery . Gallery ViewModel Ċ import Ġst 2 3 5 . com . github . se am car ving . presentation . gallery . detailed . Gallery Detailed Fragment ĊĊ Ċ class ĠGallery List Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġgallery ViewModel : ĠGallery ViewModel Ġby Ġshared ViewModel () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgallery RecyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcreate New Project From Gallery Button : ĠExtended Floating ActionButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcreate New Project From Camera Button : ĠFloating ActionButton ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlayout Manager : ĠRecyclerView . LayoutManager ĊĠĠĠ Ġprivate Ġval Ġgallery Adapter Ġ= ĠGallery Adapter Ġ{ Ġimage Info , ĠimageView Ġ-> ĊĠĠĠĠĠĠĠ Ġon Gallery Item Clicked ( image Info , ĠimageView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Open Gallery Result Launcher Ġ= Ġregister For Activity Result ( ĊĠĠĠĠĠĠĠ ĠActivity Result Contracts . Start Activity For Result () ĊĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= Ġresult . data ?. data ĊĠĠĠĠĠĠĠ Ġif Ġ( image Uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon File Write Finished ( image Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Open Camera Result Launcher Ġ= Ġregister For Activity Result ( ĊĠĠĠĠĠĠĠ ĠActivity Result Contracts . Take Picture () ĊĠĠĠ Ġ) Ġ{ Ġwas Successful Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( was Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgallery ViewModel . consume Pending File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ= Ġinflater . inflate ( R . layout . fragment _ gallery _ list , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġgallery RecyclerView Ġ= Ġview . findViewById ( R . id . gallery _ list _ recycler _ view ) ĊĠĠĠĠĠĠĠ Ġcreate New Project From Gallery Button Ġ= Ġview . findViewById ( R . id . gallery _ list _ gallery _ project ) ĊĠĠĠĠĠĠĠ Ġcreate New Project From Camera Button Ġ= Ġview . findViewById ( R . id . gallery _ list _ camera _ project ) ĊĊĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠSt agger ed Grid LayoutManager ( 2 , ĠSt agger ed Grid LayoutManager . VERTICAL ) ĊĠĠĠĠĠĠĠ Ġgallery RecyclerView . adapter Ġ= Ġgallery Adapter ĊĠĠĠĠĠĠĠ Ġgallery RecyclerView . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġgallery RecyclerView . set Has Fixed Size ( true ) ĊĊĠĠĠĠĠĠĠ Ġgallery RecyclerView . add On Scroll Listener ( Fab Collapse Scroll Listener ()) ĊĊĠĠĠĠĠĠĠ Ġcreate New Project From Gallery Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon New Project Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate New Project From Camera Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Camera Project Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgallery ViewModel . observe Album Images (). observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgallery Adapter . set Items ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgallery ViewModel . observe Media Requests (). observe ( view Lifecycle Owner ) Ġ{ Ġmedia Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( media Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStateful Media Request . Pending Fetch Ġ-> Ġon Camera File Prepared ( media Request . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStateful Media Request . Finished Fetch Ġ-> Ġon File Write Finished ( media Request . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgallery ViewModel . load Next Album Page () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġgallery ViewModel . obtain Current Album Page () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon New Project Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ P ICK , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġon Open Gallery Result Launcher . launch ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Camera Project Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġgallery ViewModel . request Empty File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Camera File Prepared ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Media Store . ACTION _ IMAGE _ CAPTURE ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Media Store . EXTRA _ OUTPUT , Ġuri ) ĊĠĠĠĠĠĠĠ Ġon Open Camera Result Launcher . launch ( uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon File Write Finished ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Editor Activity . launch Intent ( require Context (), Ġuri )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Gallery Item Clicked ( image Info : ĠImage Info , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgallery ViewModel . update Selected Image ( image Info ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠGallery Detailed Fragment . create ( view . transition Name ) ĊĠĠĠĠĠĠĠ Ġfragment . shared Element Enter Transition Ġ= ĠGallery Item Transition () ĊĠĠĠĠĠĠĠ Ġfragment . enter Transition Ġ= ĠF ade () ĊĠĠĠĠĠĠĠ Ġfragment . exit Transition Ġ= ĠF ade () ĊĠĠĠĠĠĠĠ Ġfragment . shared Element Return Transition Ġ= ĠGallery Item Transition () ĊĠĠĠĠĠĠĠ Ġfragment . post p one Enter Transition () ĊĊĠĠĠĠĠĠĠ Ġparent FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Shared Element ( view , Ġview . transition Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . fragment _ container , Ġfragment , ĠGallery Detailed Fragment . TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠF ab Collapse Scroll Listener Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexpand Callback Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate New Project From Gallery Button . extend () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( dy Ġ> Ġ 0 Ġ|| Ġdy Ġ< Ġ 0 ) Ġ&& Ġcreate New Project From Gallery Button . is Extended ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( expand Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate New Project From Gallery Button . shrink () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! re cyclerView . can Scroll Vert ically ( 1 ) Ġ&& Ġdy Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgallery ViewModel . load Next Album Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ IDLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( expand Callback , Ġ 1 _ 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }