package Ġsite . le os . apps . le sp as . album Ċ Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . Activity Info Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . graphics .* Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os .* Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . view . Action Mode Ċ import Ġandroidx . core . app . Shared Element Callback Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . lifecycle . as LiveData Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . recyclerview . selection .* Ċ import Ġandroidx . recyclerview . selection . Selection Tracker . Builder Ċ import Ġandroidx . recyclerview . widget .* Ċ import Ġandroidx . transition . Fade Ċ import Ġandroidx . transition . Transition Manager Ċ import Ġandroidx . work .* Ċ import Ġcom . google . android . material . button . Material Button Ċ import Ġcom . google . android . material . transition . Material Container Transform Ċ import Ġcom . google . android . material . transition . Material Elevation Scale Ċ import Ġkotlinx . coroutines .* Ċ import Ġsite . le os . apps . le sp as . MainActivity Ċ import Ġsite . le os . apps . le sp as . R Ċ import Ġsite . le os . apps . le sp as . helper .* Ċ import Ġsite . le os . apps . le sp as . photo . Photo Ċ import Ġsite . le os . apps . le sp as . photo . Photo Slide Fragment Ċ import Ġsite . le os . apps . le sp as . publication . NC Share ViewModel Ċ import Ġsite . le os . apps . le sp as . settings . Settings Fragment Ċ import Ġsite . le os . apps . le sp as . sync . Ac qu iring Dialog Fragment Ċ import Ġsite . le os . apps . le sp as . sync . Action ViewModel Ċ import Ġsite . le os . apps . le sp as . sync . Destination Dialog Fragment Ċ import Ġsite . le os . apps . le sp as . sync . Share Receiver Activity Ċ import Ġjava . io . File Ċ import Ġjava . lang . Runnable Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ class ĠAlbum Detail Fragment Ġ: ĠFragment (), ĠAction Mode . Callback Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalbum : ĠAlbum ĊĠĠĠ Ġprivate Ġvar Ġscroll To Ġ= Ġ"" ĊĊĠĠĠ Ġprivate Ġvar Ġaction Mode : ĠAction Mode ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstub : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdate Indicator : ĠMaterial Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Adapter : ĠPhoto Grid Adapter ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġselection Tracker : ĠSelection Tracker < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Selection : ĠMutable Set < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlast Selection : ĠMutable Set < String > ĊĊĠĠĠ Ġprivate Ġval Ġalbum Model : ĠAlbum ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġaction Model : ĠAction ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġimage Loader Model : ĠImage Loader ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġcurrent Photo Model : ĠPhoto Slide Fragment . Current Photo ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġdestination ViewModel : ĠDestination Dialog Fragment . Destination ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Photo : ĠPhoto ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsnap seed Catch er : ĠBroadcast Receiver ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsnap seed Output Observer : ĠContent Observer ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremove Original Broadcast Receiver : ĠRemove Original Broadcast Receiver ĊĊĠĠĠ Ġprivate Ġval Ġpublish Model : ĠNC Share ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared By Me : ĠNC Share ViewModel . Share By Me ĊĊĠĠĠ Ġprivate Ġvar Ġsort Order Changed Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadd File Launcher : ĠActivity Result Launcher < String > ĊĊĠĠĠ Ġprivate Ġvar Ġstrip Ex if Ġ= Ġ" 1 " ĊĊĠĠĠ Ġprivate Ġvar Ġis Snap seed Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġsnap seed Edit Action : ĠMenuItem ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġreuse U ris Ġ= Ġarray ListOf < Uri >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ Ġalbum Ġ= Ġarguments ?. get Parcelable ( KEY _ AL BU M ) !! ĊĠĠĠĠĠĠĠ Ġshared By Me Ġ= ĠNC Share ViewModel . Share By Me ( album . id , Ġalbum . name , Ġarray ListOf ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMust Ġbe Ġrestore Ġhere ĊĠĠĠĠĠĠĠ Ġlast Selection Ġ= Ġmutable Set Of () ĊĠĠĠĠĠĠĠ Ġshared Selection Ġ= Ġmutable Set Of () ĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Selection Ġ= Ġit . getString Array ( SELECTION )?. to Mutable Set () Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Selection Ġ= Ġit . getString Array ( SHARED _ SELECTION )?. to Mutable Set () Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsort Order Changed Ġ= Ġit . getBoolean ( SORT _ ORDER _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ Ġarguments ?. getString ( KEY _ SCROLL _ TO )?. apply Ġ{ Ġscroll To Ġ= Ġthis Ġ}} ĊĊĠĠĠĠĠĠĠ Ġm Adapter Ġ= ĠPhoto Grid Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġview , Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Photo Model . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetCurrent Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Last Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġstub Ġas Ġfake Ġtoolbar Ġsince Ġthe Ġtoolbar Ġbelongs Ġto ĠMainActivity Ġand Ġit Ġwill Ġdis appear Ġduring Ġfragment Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . background Ġ= Ġ( activity Ġas ĠMainActivity ). get Toolbar View Content () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre enter Transition Ġ= ĠMaterial Elevation Scale ( true ). apply Ġ{ Ġduration Ġ= Ġresources . getInteger ( android . R . integer . config _ medium Anim Time ). to Long () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Transition Ġ= ĠMaterial Elevation Scale ( false ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġresources . getInteger ( android . R . integer . config _ medium Anim Time ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude Target ( R . id . stub , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude Target ( view , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Shared Element ( view , Ġview . transition Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . container _ root , ĠPhoto Slide Fragment . newInstance ( album ), ĠPhoto Slide Fragment :: class . java . canonical Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġphoto , Ġview , Ġtype Ġ-> Ġimage Loader Model . load Photo ( photo , Ġview , Ġtype ) Ġ{ Ġstart Post p oned Enter Transition () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġstate Rest or ation Policy Ġ= ĠRecyclerView . Adapter . State Rest or ation Policy . PRE VENT _ WHEN _ EMPTY Ġ} ĊĊĠĠĠĠĠĠĠ Ġshared Element Enter Transition Ġ= ĠMaterial Container Transform (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġresources . getInteger ( android . R . integer . config _ short Anim Time ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs cri m Color Ġ= ĠColor . TRANSP ARENT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdjust ing Ġthe Ġshared Ġelement Ġmapping ĊĠĠĠĠĠĠĠ Ġset Exit Shared Element Callback ( object Ġ: ĠShared Element Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Map Shared Elements ( names : ĠMutable List < String > ?, Ġshared Elements : ĠMutable Map < String , ĠView > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names ?. isNotEmpty () Ġ== Ġtrue ) Ġre cyclerView . find ViewHolder For Adapter Position ( current Photo Model . getCurrent Position ()) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Elements ?. put ( names [ 0 ], Ġit . item View . findViewById ( R . id . photo )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBroadcast Ġreceiver Ġlistening Ġon Ġshare Ġdestination ĊĠĠĠĠĠĠĠ Ġsnap seed Catch er Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent !!. get Parcelable Extra < Component Name >( Intent . EXTRA _ CH OS EN _ COMPONENT )?. packageName !!. substring After Last ('.') Ġ== Ġ" snap seed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRegister Ġcontent Ġobserver Ġif Ġintegration Ġwith Ġsnap seed Ġsetting Ġis Ġon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Preference Manager . getDefault SharedPreferences ( context ). getBoolean ( getString ( R . string . snap seed _ pref _ key ), Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext !!. content Resolver . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Content Observer ( snap seed Output Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Content Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) ĠMedia Store . Images . Media . getContent Uri ( Media Store . VOLUME _ EXTERNAL _ PRIMARY ) Ġelse ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap seed Output Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext ?. register Receiver ( snap seed Catch er , ĠIntent Filter ( CH OO SER _ SP Y _ ACTION )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠContent Ġobserver Ġlooking Ġfor ĠSnap seed Ġoutput ĊĠĠĠĠĠĠĠ Ġsnap seed Output Observer Ġ= Ġobject Ġ: ĠContent Observer ( Handler ( Looper . get Main Looper ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġworker Name Ġ= Ġ"${ Album Detail Fragment :: class . java . canonical Name }. SNAP SEED _ WORK ER " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġlast Id Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġsnap seed Work : ĠOne Time Work Request ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean , Ġuri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onChange ( self Change , Ġuri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠContent Observer Ġgot Ġcalled Ġtwice , Ġonce Ġfor Ġitself , Ġonce Ġfor Ġit 's Ġdesc endant , Ġall Ġwith Ġsame Ġlast Ġpath Ġsegment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri ?. last Path Segment !! Ġ!= Ġlast Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Id Ġ= Ġuri . last Path Segment !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap seed Work Ġ= ĠOne Time Work RequestBuilder < Snap seed Result Worker >(). set InputData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġpublish Ġstatus Ġis Ġnot Ġpersistent Ġlocally ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// work Data Of ( Snap seed Result Worker . KEY _ IMAGE _ URI Ġto Ġuri . toString (), ĠSnap seed Result Worker . KEY _ SHARED _ PH OTO Ġto Ġshared Photo . id , ĠSnap seed Result Worker . KEY _ AL BU M Ġto Ġalbum . id , ĠSnap seed Result Worker . KEY _ PUBL ISHED Ġto Ġpublish Model . is Shared ( album . id ))). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Data Of ( Snap seed Result Worker . KEY _ IMAGE _ URI Ġto Ġuri . toString (), ĠSnap seed Result Worker . KEY _ SHARED _ PH OTO Ġto Ġshared Photo . id , ĠSnap seed Result Worker . KEY _ AL BU M Ġto Ġalbum . id )). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Work Manager . getInstance ( require Context ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue Unique Work ( worker Name , ĠExisting Work Policy . KEEP , Ġsnap seed Work ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Work Infos For Unique Work LiveData ( worker Name ). observe ( parent FragmentManager . find Fragment ById ( R . id . container _ root ) !! , Ġ{ Ġwork Info -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġreplace Ġoriginal Ġis Ġon , Ġremove Ġold Ġbit maps Ġfrom Ġcache Ġand Ġtake Ġcare Ġof Ġcover Ġtoo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Preference Manager . getDefault SharedPreferences ( require Context ()). getBoolean ( require Context (). getString ( R . string . snap seed _ replace _ pref _ key ), Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader Model . invalid ( shared Photo . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġcover Ġif Ġneeded , Ġcover Ġid Ġcan Ġbe Ġfound Ġonly Ġin Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter . update Cover ( shared Photo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). content Resolver . unregister Content Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġremove Original Broadcast Receiver Ġ= ĠRemove Original Broadcast Receiver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġmutable ListOf < Photo >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( photo Id Ġin Ġshared Selection ) Ġm Adapter . get Photo By ( photo Id ). run Ġ{ Ġif Ġ( id Ġ!= Ġalbum . cover ) Ġphotos . add ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġpublish Ġstatus Ġis Ġnot Ġpersistent Ġlocally ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( photos . isNotEmpty ()) Ġaction Model . delete Photos ( photos , Ġalbum . name , Ġpublish Model . is Shared ( album . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( photos . isNotEmpty ()) Ġaction Model . delete Photos ( photos , Ġalbum . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Selection . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd File Launcher Ġ= Ġregister For Activity Result ( Activity Result Contracts . Get Multiple Contents ()) Ġ{ Ġur is Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uris . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent FragmentManager . find Fragment By Tag ( TAG _ AC QUI RING _ DIALOG ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAc qu iring Dialog Fragment . newInstance ( uris Ġas ĠArrayList < Uri >, Ġalbum , false ). show ( parent FragmentManager , ĠTAG _ AC QUI RING _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ= ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . layout . fragment _ album detail , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġstub Ġ= Ġview . findViewById ( R . id . stub ) ĊĠĠĠĠĠĠĠ Ġdate Indicator Ġ= Ġview . findViewById ( R . id . date _ indicator ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= Ġview . findViewById ( R . id . photo grid ) ĊĊĠĠĠĠĠĠĠ Ġpost p one Enter Transition () ĊĠĠĠĠĠĠĠ ĠView Compat . set Transition Name ( re cyclerView , Ġalbum . id ) ĊĊĠĠĠĠĠĠĠ Ġwith ( re cyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSpecial Ġspan Ġsize Ġto Ġshow Ġcover Ġat Ġthe Ġtop Ġof Ġthe Ġgrid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Span Count Ġ= Ġ( layout Manager Ġas ĠGrid LayoutManager ). span Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠGrid LayoutManager ( context , Ġdefault Span Count ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan Size Lookup Ġ= Ġobject Ġ: ĠGrid LayoutManager . Span Size Lookup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Span Size ( position : ĠInt ): ĠInt Ġ{ Ġreturn Ġif Ġ( position Ġ== Ġ 0 ) Ġdefault Span Count Ġelse Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġm Adapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker Ġ= ĠBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" photo Selection ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPhoto Grid Adapter . Photo Key Provider ( m Adapter ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPhoto Grid Adapter . Photo Details Lookup ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Strategy . create String Storage () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). with Selection Predicate ( object Ġ: ĠSelection Tracker . Selection Predicate < String >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Set State ForKey ( key : ĠString , Ġnext State : ĠBoolean ): ĠBoolean Ġ= Ġ( key . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Set State At Position ( position : ĠInt , Ġnext State : ĠBoolean ): ĠBoolean Ġ= Ġ( position Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Select Multiple (): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). build (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Observer ( object Ġ: ĠSelection Tracker . Selection Observer < String >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Selection Changed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Selection Changed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Size Ġ= Ġselection Tracker . selection . size () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap seed Edit Action ?. isVisible Ġ= Ġselection Size Ġ== Ġ 1 Ġ&& Ġis Snap seed Enabled Ġ&& Ġ! Tools . is Media Play able ( m Adapter . get Photo By ( selection Tracker . selection . first ()). mime Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection Tracker . has Selection () Ġ&& Ġaction Mode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġ( activity Ġas ? ĠAppCompatActivity )?. start Support Action Mode ( this @ Album Detail Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode ?. let Ġ{ Ġit . title Ġ= ĠgetString ( R . string . selected _ count , Ġselection Size ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(!( selection Tracker . has Selection ()) Ġ&& Ġaction Mode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġaction Mode ?. title Ġ= ĠgetString ( R . string . selected _ count , Ġselection Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item StateChanged ( key : ĠString , Ġselected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Item StateChanged ( key , Ġselected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġlast Selection . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlast Selection . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter . setSelection Tracker ( selection Tracker ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġscroll Ġposition Ġafter Ġscroll Ġidle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhide Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhide Date Indicator Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( re cyclerView . parent Ġas ĠViewGroup , ĠF ade (). apply Ġ{ Ġduration Ġ= Ġ 8 0 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Indicator . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtitle Bar Ġ= Ġ( activity Ġas ? ĠAppCompatActivity )?. support ActionBar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTitle Ġtext Ġuse ĠText Appearance . Material Components . Head line 5 Ġstyle , Ġwhich Ġhas Ġtext Size Ġof Ġ 2 4 sp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtitle Text Size In Pixel Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ SP , Ġ 2 4 f , Ġrequire Context (). resources . display Metrics ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ IDLE -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHide Ġthe Ġdate Ġindicator Ġafter Ġshowing Ġit Ġfor Ġ 1 Ġminute ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date Indicator . visibility Ġ== ĠView . VISIBLE ) Ġhide Handler . post Delayed ( hide Date Indicator , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( layout Manager Ġas ĠGrid LayoutManager ). findFirst Visible Item Position () Ġ> Ġ 0 ) Ġtitle Bar ?. set Display Show Title Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ== Ġ 0 Ġ&& Ġdy Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġentry Ġfalse Ġcall , Ġhide Ġdata Indicator Ġand Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Indicator . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Bar ?. set Display Show Title Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( layout Manager Ġas ĠGrid LayoutManager )). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠH ints Ġthe Ġdate Ġ( or Ġ 1 st Ġcharacter Ġof Ġthe Ġname Ġif Ġsorting Ġorder Ġis Ġby Ġname ) Ġof Ġlast Ġphoto Ġshown Ġin Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( find Last Comp let ely Visible Item Position () Ġ< Ġm Adapter . item Count Ġ- Ġ 1 ) Ġ|| Ġ( findFirst Comp let ely Visible Item Position () Ġ> Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Indicator . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text Ġ= Ġif Ġ( album . sort Order Ġ== ĠAlbum . BY _ NAME _ ASC Ġ|| Ġalbum . sort Order Ġ== ĠAlbum . BY _ NAME _ DESC ) Ġm Adapter . get Photo At ( find Last Visible Item Position ()). name . take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġm Adapter . get Photo At ( find Last Visible Item Position ()). date Taken . format ( DateTime Formatter . ISO _ LOCAL _ DATE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow / hide Ġtitle Ġtext Ġin Ġtitle Bar Ġbase Ġon Ġvisibility Ġof Ġcover Ġview 's Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( findFirst Visible Item Position () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView . find ViewHolder For Adapter Position ( 0 ) Ġas ĠPhoto Grid Adapter . Cover ViewHolder ). item View . findViewById < TextView >( R . id . title ). getGlobal Visible Rect ( rect ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . bottom Ġ<= Ġ 0 ) Ġtitle Bar ?. set Display Show Title Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( rect . bottom Ġ- Ġrect . top Ġ> Ġtitle Text Size In Pixel ) Ġtitle Bar ?. set Display Show Title Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()). register Receiver ( remove Original Broadcast Receiver , ĠIntent Filter ( Ac qu iring Dialog Fragment . BRO ADCAST _ REMOVE _ ORIGIN AL )) ĊĊĠĠĠĠĠĠĠ Ġalbum Model . get Album Detail ( album . id ). observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCover Ġmight Ġchanged , Ġphoto Ġmight Ġbe Ġdeleted , Ġso Ġget Ġupdates Ġfrom Ġlatest Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . album Ġ= Ġit . album ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter . set Album ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity Ġas ? ĠAppCompatActivity )?. support ActionBar ?. title Ġ= Ġit . album . name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll Ġto Ġreveal Ġthe Ġnew Ġposition , Ġe . g . Ġthe Ġposition Ġwhere ĠPhoto Slider Fragment Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Photo Model . getCurrent Position () Ġ!= Ġcurrent Photo Model . getLast Position ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView . layout Manager Ġas ĠGrid LayoutManager ). scrollTo Position ( current Photo Model . getCurrent Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Photo Model . set Last Position ( current Photo Model . getCurrent Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll Ġto Ġdesign ated Ġphoto Ġat Ġfirst Ġrun ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scrollTo . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView . layout Manager Ġas ĠGrid LayoutManager ). scrollTo Position ( with ( m Adapter . get Photo Position ( scrollTo )) Ġ{ Ġif Ġ( this Ġ>= 0 ) Ġthis Ġelse Ġ 0 }) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRestore Ġselection Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Selection . isNotEmpty ()) Ġlast Selection . forEach Ġ{ selected -> Ġselection Tracker . select ( selected ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġpublish Model . share By Me . as LiveData (). observe ( view Lifecycle Owner ) Ġ{ Ġshares Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared By Me Ġ= Ġshares . find Ġ{ Ġit . file Id Ġ== Ġalbum . id Ġ} Ġ?: ĠNC Share ViewModel . Share By Me ( album . id , Ġalbum . name , Ġarray ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter . set Recipient ( shared By Me ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdestination ViewModel . get Destination (). observe ( view Lifecycle Owner , Ġ{ Ġalbum -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAc quire Ġfiles ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalbum ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( TAG _ AC QUI RING _ DIALOG ) Ġ== Ġnull ) ĠAc qu iring Dialog Fragment . newInstance ( reuse U ris , Ġalbum , Ġdestination ViewModel . should Remove Original ()). show ( parent FragmentManager , ĠTAG _ AC QUI RING _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRename Ġresult Ġhandler ĊĠĠĠĠĠĠĠ Ġparent FragmentManager . set Fragment Result Listener ( Album Rename Dialog Fragment . RESULT _ KEY _ NEW _ NAME , Ġview Lifecycle Owner ) Ġ{ Ġkey , Ġbundle -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== ĠAlbum Rename Dialog Fragment . RESULT _ KEY _ NEW _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . getString ( Album Rename Dialog Fragment . RESULT _ KEY _ NEW _ NAME )?. let Ġ{ ĠnewName -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Name Ġ!= Ġalbum . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( album Model . is Album Exist ed ( new Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( CONFIRM _ DIALOG ) Ġ== Ġnull ) ĠConfirm Dialog Fragment . newInstance ( getString ( R . string . name _ exist ed , ĠnewName ), ĠgetString ( android . R . string . ok ), Ġfalse ). show ( parent FragmentManager , ĠCON FIRM _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( shared By Me . with . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Model . rename Album ( album . id , Ġalbum . name , ĠnewName , Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠWhat Ġif Ġshared By Me Ġis Ġnot Ġavailable Ġwhen Ġworking Ġoffline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this ) Ġpublish Model . rename Share ( shared By Me , ĠnewName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġtitle Ġto Ġnew Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity Ġas ? ĠAppCompatActivity )?. support ActionBar ?. title Ġ= ĠnewName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfirm Ġdialog Ġresult Ġhandler ĊĠĠĠĠĠĠĠ Ġparent FragmentManager . set Fragment Result Listener ( Confirm Dialog Fragment . CONFIRM _ DIALOG _ REQUEST _ KEY , Ġview Lifecycle Owner ) Ġ{ Ġkey , Ġbundle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== ĠConfirm Dialog Fragment . CONFIRM _ DIALOG _ REQUEST _ KEY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( bundle . getString ( Confirm Dialog Fragment . IN DI VID UAL _ REQUEST _ KEY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDELETE _ REQUEST _ KEY -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bundle . getBoolean ( Confirm Dialog Fragment . CONFIRM _ DIALOG _ REQUEST _ KEY , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġmutable ListOf < Photo >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( photo Id Ġin Ġselection Tracker . selection ) Ġm Adapter . get Photo By ( photo Id ). run Ġ{ Ġif Ġ( id Ġ!= Ġalbum . cover ) Ġphotos . add ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġpublish Ġstatus Ġis Ġnot Ġpersistent Ġlocally ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( photos . isNotEmpty ()) Ġaction Model . delete Photos ( photos , Ġalbum . name , Ġpublish Model . is Shared ( album . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( photos . isNotEmpty ()) Ġaction Model . delete Photos ( photos , Ġalbum . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IP _ REQUEST _ KEY -> Ġshare Out ( bundle . getBoolean ( Confirm Dialog Fragment . CONFIRM _ DIALOG _ REQUEST _ KEY , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġ( activity Ġas ? ĠAppCompatActivity )?. support ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġstrip Ex if Ġ= ĠPreference Manager . getDefault SharedPreferences ( require Context ()). getString ( getString ( R . string . strip _ ex if _ pref _ key ), ĠgetString ( R . string . strip _ on _ value )) !! ĊĊĠĠĠĠĠĠĠ Ġis Snap seed Enabled Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ). getBoolean ( getString ( R . string . snap seed _ pref _ key ), Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . putString Array ( SELECTION , Ġlast Selection . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġout State . putString Array ( SHARED _ SELECTION , Ġshared Selection . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġout State . put Boolean ( SORT _ ORDER _ CHANGED , Ġsort Order Changed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . clear On Scroll Listeners () ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()). unregister Receiver ( remove Original Broadcast Receiver ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTime Ġto Ġupdate Ġalbum Ġmeta Ġfile Ġif Ġsort Ġorder Ġchanged Ġin Ġthis Ġsession , Ġif Ġcover Ġis Ġnot Ġuploaded Ġyet , Ġmeta Ġwill Ġbe Ġmaintained Ġin ĠSync Adapter Ġwhen Ġcover Ġfile Id Ġis Ġavailable ĊĠĠĠĠĠĠĠ Ġif Ġ( sort Order Changed Ġ&& Ġ! album . cover . contains ('. ')) Ġaction Model . update Meta ( album ) ĊĊĠĠĠĠĠĠĠ Ġrequire Context (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver ( snap seed Catch er ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . unregister Content Observer ( snap seed Output Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . album _ detail _ menu , Ġmenu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepare Options Menu ( menu : ĠMenu ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . option _ menu _ sort by date asc ). isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . option _ menu _ sort by date desc ). isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . option _ menu _ sort by name asc ). isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . option _ menu _ sort by name desc ). isChecked Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhen ( album . sort Order ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ DATE _ TA KEN _ ASC -> Ġmenu . find Item ( R . id . option _ menu _ sort by date asc ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ DATE _ TA KEN _ DESC -> Ġmenu . find Item ( R . id . option _ menu _ sort by date desc ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ NAME _ ASC -> Ġmenu . find Item ( R . id . option _ menu _ sort by name asc ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ NAME _ DESC -> Ġmenu . find Item ( R . id . option _ menu _ sort by name desc ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDisable Ġpublish Ġfunction Ġwhen Ġthis Ġis Ġa Ġnewly Ġcreated Ġalbum Ġwhich Ġdoes Ġnot Ġexist Ġon Ġserver Ġyet ĊĠĠĠĠĠĠĠ Ġif Ġ( album . e Tag . isEmpty ()) Ġmenu . find Item ( R . id . option _ menu _ publish ). isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġsuper . on Prepare Options Menu ( menu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ add _ photo -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd File Launcher . launch ("* /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ rename -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( RE NAME _ DIALOG ) Ġ== Ġnull ) ĠAlbum Rename Dialog Fragment . newInstance ( album . name ). show ( parent FragmentManager , ĠR ENAME _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ settings -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Transition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre enter Transition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent FragmentManager . beginTransaction (). replace ( R . id . container _ root , ĠSettings Fragment ()). addTo Back Stack ( null ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ sort by date asc -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate SortOrder ( Album . BY _ DATE _ TA KEN _ ASC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ sort by date desc -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate SortOrder ( Album . BY _ DATE _ TA KEN _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ sort by name asc -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate SortOrder ( Album . BY _ NAME _ ASC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ sort by name desc -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate SortOrder ( Album . BY _ NAME _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . option _ menu _ publish -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġmeaningful Ġlabel Ġfor Ġeach Ġrecipient ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Model . share es . value . let Ġ{ Ġshare es -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared By Me . with . forEach Ġ{ Ġrecipient -> Ġshare es . find Ġ{ Ġit . name Ġ== Ġrecipient . share e . name Ġ&& Ġit . type Ġ== Ġrecipient . share e . type } ?. let Ġ{ Ġrecipient . share e . label Ġ= Ġit . label Ġ}} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( PUBL ISH _ DIALOG ) Ġ== Ġnull ) ĠAlbum Publish Dialog Fragment . newInstance ( shared By Me ). show ( parent FragmentManager , ĠP UB L ISH _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse -> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠOn Ġspecial ĠActions Ġof Ġthis Ġfragment ĊĠĠĠ Ġoverride Ġfun ĠonCreate Action Mode ( mode : ĠAction Mode ?, Ġmenu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmode ?. menu Inflater ?. inflate ( R . menu . album _ detail _ actions _ mode , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġsnap seed Edit Action Ġ= Ġmenu . find Item ( R . id . snap seed _ edit ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDisable Ġsnap seed Ġedit Ġaction Ġmenu Ġif ĠSnap seed Ġis Ġnot Ġinstalled , Ġupdate Ġsnap seed Ġaction Ġmenu Ġicon Ġtoo ĊĠĠĠĠĠĠĠ Ġwith ( Preference Manager . getDefault SharedPreferences ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Snap seed Enabled Ġ= Ġget Boolean ( getString ( R . string . snap seed _ pref _ key ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnap seed Edit Action ?. isVisible Ġ= Ġis Snap seed Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Snap seed Enabled ) Ġsnap seed Edit Action ?. icon Ġ= ĠContext Compat . get Drawable ( require Context (), Ġif Ġ( getBoolean ( getString ( R . string . snap seed _ replace _ pref _ key ), Ġfalse )) ĠR . drawable . ic _ baseline _ snap seed _ 2 4 Ġelse ĠR . drawable . ic _ baseline _ snap seed _ add _ 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ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 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( item ?. itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . remove Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( CONFIRM _ DIALOG ) Ġ== Ġnull ) ĠConfirm Dialog Fragment . newInstance ( getString ( R . string . confirm _ delete ), ĠgetString ( R . string . yes _ delete ), Ġtrue , ĠDELETE _ REQUEST _ KEY ). show ( parent FragmentManager , ĠCON FIRM _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . share Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strip Ex if Ġ== ĠgetString ( R . string . strip _ ask _ value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Ex if In Selection ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( CONFIRM _ DIALOG ) Ġ== Ġnull ) ĠYes No Dialog Fragment . newInstance ( getString ( R . string . strip _ ex if _ msg , ĠgetString ( R . string . strip _ ex if _ title )), ĠSTR IP _ REQUEST _ KEY ). show ( parent FragmentManager , ĠCON FIRM _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġshare Out ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġshare Out ( strip Ex if Ġ== ĠgetString ( R . string . strip _ on _ value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . select _ all Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġm Adapter . item Count ) Ġselection Tracker . select ( m Adapter . get Photo Id ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . snap seed _ edit -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġur is Ġ= Ġprepare Shares ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uris . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Photo Ġ= Ġm Adapter . get Photo By ( selection Tracker . selection . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġur is [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġur is [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ClassName ( Settings Fragment . SNAP SEED _ PACKAGE _ NAME , ĠSettings Fragment . SNAP SEED _ MAIN _ ACTIVITY _ CLASS _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġbroadcast Ġjust Ġlike Ġsystem Ġshare Ġdoes Ġwhen Ġuser Ġch oo ses ĠSnap seed , Ġso Ġthat Ġwe Ġcan Ġcatch Ġediting Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). send Broadcast ( Intent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠC HO O SER _ SP Y _ ACTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ CH OS EN _ COMPONENT , ĠComponent Name ( Settings Fragment . SNAP SEED _ PACKAGE _ NAME , ĠSettings Fragment . SNAP SEED _ MAIN _ ACTIVITY _ CLASS _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . le sp as _ reuse -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreuse U ris Ġ= Ġprepare Shares ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reuse U ris . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( TAG _ DEST INATION _ DIALOG ) Ġ== Ġnull ) ĠDestination Dialog Fragment . newInstance ( reuse U ris , Ġtrue ). show ( parent FragmentManager , ĠTAG _ DEST INATION _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy Action Mode ( mode : ĠAction Mode ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate SortOrder ( new Order : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġalbum Model . set SortOrder ( album . id , Ġnew Order ) ĊĠĠĠĠĠĠĠ Ġsort Order Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Ex if In Selection (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( photo Id Ġin Ġselection Tracker . selection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Tools . has Ex if ( m Adapter . get Photo By ( photo Id ). mime Type )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Shares ( strip : ĠBoolean ): ĠArrayList < Uri > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġur is Ġ= Ġarray ListOf < Uri >() ĊĠĠĠĠĠĠĠ Ġvar Ġsource File : ĠFile ĊĠĠĠĠĠĠĠ Ġvar Ġdest File : ĠFile ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Selection . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( photo Id Ġin Ġselection Tracker . selection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Selection . add ( photo Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// with ( m Adapter . get Photo At ( i . toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( m Adapter . get Photo By ( photo Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSync ed Ġfile Ġis Ġnamed Ġafter Ġid , Ġnot Ġyet Ġsynced Ġfile Ġis Ġnamed Ġafter Ġfile 's Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource File Ġ= ĠFile ( Tools . getLocal Root ( require Context ()), Ġif Ġ( e Tag . isNotEmpty ()) Ġid Ġelse Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis ĠTEMP _ CACHE _ FOLDER Ġis Ġcreated Ġby ĠMainActivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest File Ġ= ĠFile ("${ require Activity (). cacheDir }${ MainActivity . TEMP _ CACHE _ FOLDER }", Ġif Ġ( strip ) Ġ"${ UUID . randomUUID ()}. ${ name . substring After Last ('.') }" Ġelse Ġname ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCopy Ġthe Ġfile Ġfrom Ġfile Dir / id Ġto Ġcache Dir / name , Ġstrip ĠEX IF Ġbase Ġon Ġsetting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strip Ġ&& ĠTools . has Ex if ( this . mime Type )) ĠBitmap Factory . decode File ( source File . canonical Path )?. compress ( Bitmap . Compress Format . JPEG , Ġ 9 5 , Ġdest File . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsource File . copy To ( dest File , Ġtrue , Ġ 4 0 9 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġur is . add ( File Provider . get Uri For File ( require Context (), ĠgetString ( R . string . file _ authority ), Ġdest File )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġe . printStackTrace () Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġur is ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshare Out ( strip : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠ Ġval Ġwaiting Msg Ġ= ĠTools . get Pre paring Shares Sn ackBar ( re cyclerView , Ġstrip ) ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTemp or arily Ġprevent Ġscreen Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). requested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ NO SENSOR ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// shared Photo Ġ= Ġm Adapter . get Photo At ( selection Tracker . selection . first (). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Photo Ġ= Ġm Adapter . get Photo By ( selection Tracker . selection . first ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġa ĠSn ackBar Ġif Ġit Ġtakes Ġtoo Ġlong Ġ( more Ġthan Ġ 3 0 0 ms ) Ġpre paring Ġshares ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ({ Ġwaiting Msg . show ()}, Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġur is Ġ= Ġprepare Shares ( strip ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġsystem Ġshare Ġcho oser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uris . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclip Data Ġ= ĠClip Data . new Uri ( require Activity (). content Resolver , Ġ"", Ġur is [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġur is . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġclip Data . addItem ( require Activity (). content Resolver , ĠClip Data . Item ( uris [ i ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġclip Data . addItem ( Clip Data . Item ( uris [ i ])) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( Intent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uris . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġsharing Ġonly Ġone Ġpicture , Ġuse ĠACTION _ SEND Ġinstead , Ġso Ġthat Ġother Ġapps Ġwhich Ġwon 't Ġaccept ĠACTION _ SEND _ MULTIPLE Ġwill Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġur is [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND _ MULTIPLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ArrayList Extra ( Intent . EXTRA _ STREAM , Ġur is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġshared Photo . mime Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . clip Data Ġ= Ġclip Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Share Receiver Activity . KEY _ SHOW _ REMOVE _ OPTION , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClear Ġselection Ġtracker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). requested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ UNSPECIFIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDis miss Ġwaiting ĠSn ackBar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( waiting Msg . is Shown Or Queued ) Ġwaiting Msg . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAdapter Ġfor Ġphoto Ġgrid ĊĠĠĠ Ġclass ĠPhoto Grid Adapter ( private Ġval Ġclick Listener : Ġ( View , ĠInt ) Ġ-> ĠUnit , Ġprivate Ġval Ġimage Loader : Ġ( Photo , ĠImageView , ĠString ) Ġ-> ĠUnit ) Ġ: ĠList Adapter < Photo , ĠRecyclerView . ViewHolder >( Photo Diff Callback ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġselection Tracker : ĠSelection Tracker < String > ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġselected Filter Ġ= ĠColor Matrix Color Filter ( Color Matrix (). apply Ġ{ Ġset Sat uration ( 0 . 0 f ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ// private Ġvar Ġold SortOrder Ġ= ĠAlbum . BY _ DATE _ TA KEN _ ASC ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġrecipients Ġ= Ġmutable ListOf < NC Share ViewModel . Recipient >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġrecipient Text Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠCover ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind View Item () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent List . first OrNull ()?. let Ġ{ Ġcover -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader ( cover , ĠfindViewById ( R . id . cover ), ĠImage Loader ViewModel . TYPE _ COVER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . title ). text Ġ= Ġcover . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays Ġ= ĠDuration . between ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover . date Taken . at Zone ( Zone Id . system Default ()). to Instant (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover . lastModified . at Zone ( Zone Id . system Default ()). to Instant () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). to Days (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . duration ). text Ġ= Ġwhen Ġ( days ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 2 1 Ġ-> Ġresources . getString ( R . string . duration _ days , Ġdays Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 2 .. 5 6 Ġ-> Ġresources . getString ( R . string . duration _ week s , Ġdays Ġ/ Ġ 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 7 .. 3 6 5 Ġ-> Ġresources . getString ( R . string . duration _ months , Ġdays Ġ/ Ġ 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresources . getString ( R . string . duration _ years , Ġdays Ġ/ Ġ 3 6 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . total ). text Ġ= Ġresources . getString ( R . string . total _ photo , Ġcurrent List . size Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recipients . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnames Ġ= Ġrecipients [ 0 ]. share e . label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġrecipients . size ) Ġnames Ġ+= Ġ", Ġ${ recipients [ i ]. share e . label }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . recipients ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= ĠString . format ( recipient Text , Ġnames ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠfindViewById < TextView >( R . id . recipients ). visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠPhoto ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind View Item ( photo : ĠPhoto , Ġis Activated : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Activated Ġ= Ġis Activated ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( it . findViewById < ImageView >( R . id . photo )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader ( photo , Ġthis , ĠImage Loader ViewModel . TYPE _ GRID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . is Activated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Filter Ġ= Ġselected Filter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . findViewById < ImageView >( R . id . selection _ mark ). visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Color Filter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . findViewById < ImageView >( R . id . selection _ mark ). visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . set Transition Name ( this , Ġphoto . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ Ġif Ġ(! selection Tracker . has Selection ()) Ġclick Listener ( this , Ġbinding Adapter Position ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . findViewById < ImageView >( R . id . play _ mark ). visibility Ġ= Ġif Ġ( Tools . is Media Play able ( photo . mime Type ) Ġ&& Ġ! this . is Activated ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠgetItem Details () Ġ= Ġobject Ġ: ĠItem Details Lookup . Item Details < String >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Position (): ĠInt Ġ= Ġbinding Adapter Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Selection Key (): ĠString Ġ= Ġget Photo Id ( binding Adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ= Ġif Ġ( position Ġ== Ġ 0 ) ĠTYPE _ COVER Ġelse ĠTYPE _ PH OTO ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Text Ġ= Ġparent . context . getString ( R . string . published _ to ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( view Type Ġ== ĠTYPE _ COVER ) ĠCover ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . recyclerview _ item _ cover , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠPhoto ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . recyclerview _ item _ photo , Ġparent , Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġis ĠPhoto ViewHolder ) Ġholder . bind View Item ( current List [ position ], Ġselection Tracker . isSelected ( current List [ position ]. id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( holder Ġas ĠCover ViewHolder ). bind View Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġset Album ( album : ĠAlbum With Photos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġmutable ListOf < Photo >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġphotos . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( album . album . sort Order ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ DATE _ TA KEN _ ASC -> Ġalbum . photos . sorted With ( compare By Ġ{ Ġit . date Taken Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ DATE _ TA KEN _ DESC -> Ġalbum . photos . sorted With ( compare By Descending Ġ{ Ġit . date Taken Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ DATE _ MODI FIED _ ASC -> Ġalbum . photos . sorted With ( compare By Ġ{ Ġit . lastModified Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ DATE _ MODI FIED _ DESC -> Ġalbum . photos . sorted With ( compare By Descending Ġ{ Ġit . lastModified Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ NAME _ ASC -> Ġalbum . photos . sorted With ( compare By Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . BY _ NAME _ DESC -> Ġalbum . photos . sorted With ( compare By Descending Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse -> Ġalbum . photos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalbum . album . run Ġ{ Ġphotos . add ( 0 , ĠPhoto ( cover , Ġid , Ġname , Ġ"", ĠstartDate , ĠendDate , Ġcover Width , Ġcover Height , Ġphotos . size . toString (), Ġcover Baseline )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit List ( photos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// internal Ġfun Ġget Recipient (): ĠList < NC Share ViewModel . Recipient > Ġ= Ġrecipients ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġset Recipient ( share : ĠNC Share ViewModel . Share By Me ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . recipients Ġ= Ġshare . with ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Photo At ( position : ĠInt ): ĠPhoto Ġ= Ġcurrent List [ position ] ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Photo By ( photo Id : ĠString ): ĠPhoto Ġ= Ġcurrent List . last Ġ{ Ġit . id Ġ== Ġphoto Id Ġ} ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġupdate Cover ( shared Photo : ĠPhoto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// notify Item Changed ( current List . indexOf Last Ġ{ Ġit . id Ġ== Ġshared Photo . id Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shared Photo . id Ġ== Ġcurrent List [ 0 ]. id ) Ġnotify Item Changed ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġset Selection Tracker ( selection Tracker : ĠSelection Tracker < String >) Ġ{ Ġthis . selection Tracker Ġ= Ġselection Tracker Ġ} ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Photo Id ( position : ĠInt ): ĠString Ġ= Ġcurrent List [ position ]. id ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Photo Position ( photo Id : ĠString ): ĠInt Ġ= Ġcurrent List . indexOf Last Ġ{ Ġit . id Ġ== Ġphoto Id Ġ} ĊĠĠĠĠĠĠĠ Ġclass ĠPhoto Key Provider ( private Ġval Ġadapter : ĠPhoto Grid Adapter ): ĠItem Key Provider < String >( SCOPE _ C ACHED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetKey ( position : ĠInt ): ĠString Ġ= Ġadapter . get Photo Id ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Position ( key : ĠString ): ĠInt Ġ= Ġwith ( adapter . get Photo Position ( key )) Ġ{ Ġif Ġ( this Ġ>= Ġ 0 ) Ġthis Ġelse ĠRecyclerView . NO _ POSITION Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclass ĠPhoto Details Lookup ( private Ġval Ġre cyclerView : ĠRecyclerView ): ĠItem Details Lookup < String >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Details ( e : ĠMotion Event ): ĠItem Details < String >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . find Child View Under ( e . x , Ġe . y )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġre cyclerView . getChild ViewHolder ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( holder Ġis ĠPhoto ViewHolder ) Ġholder . getItem Details () Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTYPE _ COVER Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTYPE _ PH OTO Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPhoto Diff Callback : ĠDiff Util . Item Callback < Photo >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠPhoto , Ġnew Item : ĠPhoto ): ĠBoolean Ġ= Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠPhoto , Ġnew Item : ĠPhoto ): ĠBoolean Ġ= Ġold Item . lastModified Ġ== Ġnew Item . lastModified Ġ&& Ġold Item . name Ġ== Ġnew Item . name Ġ&& Ġold Item . share Id Ġ== Ġnew Item . share Id Ġ&& Ġold Item . mime Type Ġ== Ġnew Item . mime Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR ENAME _ DIALOG Ġ= Ġ" RE NAME _ DIALOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP UB L ISH _ DIALOG Ġ= Ġ" PUBL ISH _ DIALOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCON FIRM _ DIALOG Ġ= Ġ" CONFIRM _ DIALOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION Ġ= Ġ" SELECTION " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHARE D _ SELECTION Ġ= Ġ" SHARED _ SELECTION " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSORT _ ORDER _ CHANGED Ġ= Ġ" SORT _ ORDER _ CHANGED " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDELETE _ REQUEST _ KEY Ġ= Ġ" AL BU M DETAIL _ DELETE _ REQUEST _ KEY " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTR IP _ REQUEST _ KEY Ġ= Ġ" AL BU M DETAIL _ STRIP _ REQUEST _ KEY " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG _ DEST INATION _ DIALOG Ġ= Ġ" AL BU M _ DETAIL _ DEST INATION _ DIALOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG _ AC QUI RING _ DIALOG Ġ= Ġ" AL BU M _ DETAIL _ AC QUI RING _ DIALOG " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC HO O SER _ SP Y _ ACTION Ġ= Ġ" site . le os . apps . le sp as . CH OO SER _ AL BU M DETAIL " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ AL BU M Ġ= Ġ" AL BU M " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ SCROLL _ TO Ġ= Ġ" KEY _ SCROLL _ TO " ĠĠ Ġ// ĠSearch Result Fragment Ġuse Ġthis Ġfor Ġscrolling Ġto Ġdesigned Ġphoto ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( album : ĠAlbum , Ġphoto Id : ĠString ) Ġ= ĠAlbum Detail Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ( KEY _ AL BU M , Ġalbum ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( KEY _ SCROLL _ TO , Ġphoto Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }