package Ġir . me h di y ari . f allery . buckets . bucket List Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . transition . Transition Manager Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Alpha Animation Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Simple Item Animator Ċ import Ġir . me h di y ari . f allery . R Ċ import Ġir . me h di y ari . f allery . main . di . F allery Activity Component Holder Ċ import Ġir . me h di y ari . f allery . main . f allery . Bucket RecyclerView Item Mode Ċ import Ġir . me h di y ari . f allery . main . ui . F allery ViewModel Ċ import Ġir . me h di y ari . f allery . utils . divide Screen To Equal Part Ċ import Ġir . me h di y ari . f allery . utils . dp To Px Ċ import Ġir . me h di y ari . f allery . utils . setOn Animation End Listener Ċ import Ġkotlinx . android . synt hetic . main . fragment _ bucket _ list .* Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ internal Ġclass ĠBucket List Fragment Ġ: ĠFragment ( R . layout . fragment _ bucket _ list ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbucket List ViewModel : ĠBucket List ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġf allery ViewModel : ĠF allery ViewModel ĊĊĠĠĠ Ġprivate Ġval Ġbucket Adapter Ġby Ġlazy Ġ{ ĠF allery Activity Component Holder . get OrNull () !!. provide Bucket ListAdapter () Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgrid LayoutManager : ĠGrid LayoutManager ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġgrid LayoutManager Ġ= ĠGrid LayoutManager ( require Context (), Ġget Span Count Based On RecyclerView Mode ()) ĊĠĠĠĠĠĠĠ Ġinit ViewModel () ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġbucket Adapter . view Holder Id Ġ= ĠF allery Activity Component Holder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrNull ()?. provide F allery Options ()?. bucket RecyclerView Item Mode ?. value Ġ?: ĠR . layout . grid _ bucket _ item _ view ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Buckets . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġbucket Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġgrid LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( item Animator Ġas ĠSimple Item Animator ). supports Change Animations Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbucket Adapter . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bucket Click Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf allery ViewModel . open Bucket With Id ( it , Ġbucket List ViewModel . get Bucket Name ById ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ImageView Width Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Buckets . layout Manager Ġis ĠGrid LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView Buckets . layout Manager Ġas ĠGrid LayoutManager ). let Ġ{ Ġgrid LayoutManager Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Metric Ġ= Ġrequire Activity (). resources . display Metrics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((( display Metric . width Pixels Ġ- Ġdp To Px ( 3 ) Ġ* Ġ( grid LayoutManager . span Count Ġ- Ġ 1 )) Ġ/ Ġgrid LayoutManager . span Count ) Ġ* Ġ 0 . 5 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdp To Px ( 7 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġf allery ViewModel Ġ= ĠViewModel Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF allery Activity Component Holder . create Or GetComponent ( require Activity ()). provide F allery ViewModel Factory () ĊĠĠĠĠĠĠĠ Ġ) [ F allery ViewModel :: class . java ]. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Re cycle View Mode LiveData . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange RecyclerView Item Mode To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbucket List ViewModel Ġ= ĠViewModel Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF allery Activity Component Holder . create Or GetComponent ( require Activity ()). provide Bucket List ViewModel Factory () ĊĠĠĠĠĠĠĠ Ġ) [ Bucket List ViewModel :: class . java ] ĊĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf allery ViewModel . storage Permission Granted State Flow . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket List ViewModel . get Buckets () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbucket List ViewModel . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading ViewState Flow . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading ViewState . Error Ġ-> Ġshow Error Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading ViewState . Show Loading Ġ-> Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading ViewState . Hide Loading Ġ-> Ġhide Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġall Media Count Changed . collect Ġ{ Ġf allery ViewModel . total Media Count Ġ= Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuckets State Flow . collect Ġ{ Ġbucket Adapter . submit List ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange RecyclerView Item Mode To ( bucket RecyclerView Item Mode : ĠBucket RecyclerView Item Mode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Buckets . layout Manager Ġis ĠGrid LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Adapter . view Holder Id Ġ= Ġbucket RecyclerView Item Mode . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT ) ĠTransition Manager . begin Delayed Transition ( re cyclerView Buckets ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView Buckets . layout Manager Ġas ĠGrid LayoutManager ). span Count Ġ= Ġget Span Count Based On RecyclerView Mode () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġshow Error Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠ Ġre cyclerView Buckets . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġerror Layout Bucket List . show () ĊĠĠĠĠĠĠĠ Ġerror Layout Bucket List . setOn Retry ClickListener Ġ{ Ġbucket List ViewModel . retry () Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Layout Bucket List . hide () ĊĠĠĠĠĠĠĠ Ġcontent Loading ProgressBar Bucket List . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Buckets . visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Buckets . start Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlpha Animation ( 1 f , Ġ 0 . 5 f ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 2 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Animation End Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Buckets . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Layout Bucket List . hide () ĊĠĠĠĠĠĠĠ Ġcontent Loading ProgressBar Bucket List . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġre cyclerView Buckets . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġre cyclerView Buckets . start Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlpha Animation ( 0 . 5 f , Ġ 1 f ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 2 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Animation End Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Buckets . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Span Count Based On RecyclerView Mode (): ĠInt Ġ= Ġif Ġ( F allery Activity Component Holder . get OrNull ()?. provide F allery Options ()?. bucket RecyclerView Item Mode Ġ== ĊĠĠĠĠĠĠĠ ĠBucket RecyclerView Item Mode . Grid Style ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdivide Screen To Equal Part ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Width Ġ= Ġresources . display Metrics . width Pixels , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Width Ġ= Ġresources . get Dimension ( R . dim en . f allery _ bucket _ max _ width ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Count Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView Buckets ?. adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġre cyclerView Buckets ?. layout Manager Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} Ċ }