package Ġsite . le os . apps . le sp as . cam er ar oll Ċ Ċ import Ġandroid . accounts . Account Manager Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . Activity Info Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . media . Media Metadata Retriever Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . provider . Open able Columns Ċ import Ġandroid . view .* Ċ import Ġandroid . webkit . MimeType Map Ċ import Ġandroid . widget . Image Button Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . On Back Pressed Callback Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . Intent Sender Request Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . app . Shared Element Callback Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . core . graphics . Color Utils Ċ import Ġandroidx . core . view . Gesture Detector Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . ex if interface . media . Ex if Interface Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle .* Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . recyclerview . selection . Item Details Lookup Ċ import Ġandroidx . recyclerview . selection . Item Key Provider Ċ import Ġandroidx . recyclerview . selection . Selection Tracker Ċ import Ġandroidx . recyclerview . selection . Storage Strategy Ċ import Ġandroidx . recyclerview . widget .* Ċ import Ġandroidx . transition . Transition Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . google . android . material . transition . Material Container Transform Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ 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 . sync . Ac qu iring Dialog Fragment Ċ 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 Ġsite . le os . apps . le sp as . sync . Sync Adapter Ċ import Ġjava . io . File Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . time . format . Format Style Ċ import Ġjava . time . format . TextStyle Ċ import Ġjava . util .* Ċ import Ġkotlin . math . atan 2 Ċ Ċ class ĠCamera Roll Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbottom Sheet : ĠBottom Sheet Behavior < Constraint Layout > ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Pager : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġquick Scroll : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Pager Adapter : ĠMedia Pager Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġquick Scroll Adapter : ĠQuick Scroll Adapter ĊĠĠĠ Ġprivate Ġvar Ġquick Scroll Grid Span Count Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdivider : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġname TextView : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsize TextView : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshare Button : ĠImage Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremove Button : ĠImage Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġle sp as Button : ĠImage Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclose Button : ĠImage Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġselection Text : ĠTextView ĊĊĠĠĠ Ġprivate Ġvar Ġsaved StatusBar Color Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġsaved NavigationBar Color Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġsaved NavigationBar Divider Color Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġview Re Created Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstart With This Media : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġselection Tracker : ĠSelection Tracker < String > ĊĠĠĠ Ġprivate Ġvar Ġlast Selection Ġ= Ġarray ListOf < Uri >() ĊĠĠĠ Ġprivate Ġvar Ġstrip Ex if Ġ= Ġ" 1 " ĊĠĠĠ Ġ// private Ġvar Ġside Touch Area Width Ġ Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġimage Loader Model : ĠImage Loader ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġdestination Model : ĠDestination Dialog Fragment . Destination ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġcam er ar oll Model : ĠCamera Roll ViewModel Ġby Ġview Models Ġ{ ĠCamera Roll ViewModel Factory ( require Activity (). application , Ġarguments ?. getString ( KEY _ URI )) Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremove Original Broadcast Receiver : ĠRemove Original Broadcast Receiver ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdelete Media Launcher : ĠActivity Result Launcher < Intent Sender Request > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstorage Permission Request Launcher : ĠActivity Result Launcher < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgesture Detector : ĠGest ure Detector Compat ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġadapter Ġhere Ġso Ġthat Ġit Ġwon 't Ġleak ĊĠĠĠĠĠĠĠ Ġmedia Pager Adapter Ġ= ĠMedia Pager Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġstate -> Ġbottom Sheet . state Ġ= Ġif Ġ( state Ġ?: Ġrun Ġ{ Ġbottom Sheet . state Ġ== ĠBottom Sheet Behavior . STATE _ HIDDEN Ġ}) ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġelse ĠBottom Sheet Behavior . STATE _ HIDDEN Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġphoto , ĠimageView , Ġtype -> Ġimage Loader Model . load Photo ( photo , ĠimageView , Ġtype ) Ġ{ Ġstart Post p oned Enter Transition () Ġ}}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġview -> Ġimage Loader Model . cancel Loading ( view Ġas ĠImageView ) Ġ} ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġstate Rest or ation Policy Ġ= ĠRecyclerView . Adapter . State Rest or ation Policy . PRE VENT _ WHEN _ EMPTY Ġ} ĊĊĠĠĠĠĠĠĠ Ġquick Scroll Adapter Ġ= ĠQuick Scroll Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġphoto Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager . scrollTo Position ( media Pager Adapter . find Media Position ( photo )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġphoto , ĠimageView , Ġtype Ġ-> Ġimage Loader Model . load Photo ( photo , ĠimageView , Ġtype ) Ġ} ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġstate Rest or ation Policy Ġ= ĠRecyclerView . Adapter . State Rest or ation Policy . PRE VENT _ WHEN _ EMPTY Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart With This Media Ġ= Ġarguments ?. getString ( KEY _ SCROLL _ TO ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart With This Media Ġ= Ġit . getString ( KEY _ SCROLL _ TO ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Parcelable < Media Slider Adapter . Player State >( KEY _ PLAYER _ STATE )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager Adapter . set Player State ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager Adapter . setAuto Start ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Selection Ġ= Ġit . get Parcelable ArrayList ( KEY _ LAST _ SELECTION ) Ġ?: Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ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 ĊĠĠĠĠĠĠĠ Ġ}. addListener ( object : ĠTransition . Transition Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Transition Start ( transition : ĠTransition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager . find Child View Under ( 5 0 0 . 0 f , Ġ 5 0 0 . 0 f )?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Transition End ( transition : ĠTransition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager . find Child View Under ( 5 0 0 . 0 f , Ġ 5 0 0 . 0 f )?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Transition Cancel ( transition : ĠTransition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager . find Child View Under ( 5 0 0 . 0 f , Ġ 5 0 0 . 0 f )?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Transition Pause ( transition : ĠTransition ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Transition Resume ( transition : ĠTransition ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdjust ing Ġthe Ġshared Ġelement Ġmapping ĊĠĠĠĠĠĠĠ Ġset Enter 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 ) Ġmedia Pager . find ViewHolder For Adapter Position ( getCurrent Visible Item Position ()) ?. item View ?. findViewById < View >( R . id . media )?. apply Ġ{ Ġshared Elements ?. put ( names [ 0 ], Ġthis ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġremove Original Broadcast Receiver Ġ= ĠRemove Original Broadcast Receiver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Media Launcher . launch ( Intent Sender Request . Builder ( Media Store . create Delete Request ( require Context (). content Resolver , Ġlast Selection )). setFill In Intent ( null ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcam er ar oll Model . remove Med ias ( last Selection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIm mediate ly Ġsync Ġwith Ġserver Ġafter Ġadding Ġphoto Ġto Ġlocal Ġalbum ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent Resolver . request Sync ( Account Manager . get ( require Context ()). get Account sBy Type ( getString ( R . string . account _ type _ nc ))[ 0 ], ĠgetString ( R . string . sync _ authority ), ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( Content Resolver . SYNC _ EX TR AS _ MAN UAL , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// put Boolean ( Content Resolver . SYNC _ EX TR AS _ EX PED IT ED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( Sync Adapter . ACTION , ĠSync Adapter . SYNC _ LOCAL _ CHANG ES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstorage Permission Request Launcher Ġ= Ġregister For Activity Result ( Activity Result Contracts . Request Permission ()) Ġ{ Ġis Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). requested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ UNSPECIFIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Granted Ġ-> Ġobserve Camera Roll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity () Ġis ĠMainActivity Ġ-> Ġparent FragmentManager . pop Back Stack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrequire Activity (). finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBack Ġkey Ġhandler Ġfor ĠBottom Sheet ĊĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed Dispatcher . add Callback ( this , Ġobject : ĠOn Back Pressed Callback ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Switch Int Def ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle On Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( bottom Sheet . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ HIDDEN -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED -> Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ EXP AN DED -> Ġif Ġ( selection Tracker . has Selection ()) Ġselection Tracker . clear Selection () Ġelse Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetect Ġswipe Ġup Ġgesture Ġand Ġshow ĠBottom Sheet ĊĠĠĠĠĠĠĠ Ġgesture Detector Ġ= ĠGest ure Detector Compat ( require Context (), Ġobject : ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOver write Ġon Fl ing Ġrather Ġthan Ġon Scroll , Ġsince Ġon Scroll Ġwill Ġbe Ġcalled Ġmultiple Ġtimes Ġduring Ġone Ġscroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fl ing ( e 1 : ĠMotion Event ?, Ġe 2 : ĠMotion Event ?, Ġvelocity X : ĠFloat , Ġvelocity Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e 1 Ġ!= Ġnull Ġ&& Ġe 2 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( Math . to Degrees ( atan 2 ( e 1 . y Ġ- Ġe 2 . y , Ġe 2 . x Ġ- Ġe 1 . x ). toDouble ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 5 . 0 .. 1 2 5 . 0 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= Ġif Ġ( media Pager Adapter . item Count Ġ> Ġ 1 ) ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġelse ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ- 1 2 5 . 0 .. - 5 5 . 0 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bottom Sheet . state Ġ== ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġ|| Ġbottom Sheet . state Ġ== ĠBottom Sheet Behavior . STATE _ COLL AP SED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Fl ing ( e 1 , Ġe 2 , Ġvelocity X , Ġvelocity Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// side Touch Area Width Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , Ġ 4 0 f , Ġresources . display Metrics ). round ToInt () ĊĠĠĠĠĠĠĠ Ġquick Scroll Grid Span Count Ġ= Ġresources . getInteger ( R . integer . cam er ar oll _ grid _ span _ count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ= ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . layout . fragment _ camera _ roll , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġview Re Created Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠAppCompatActivity ). support ActionBar !!. hide () ĊĊĠĠĠĠĠĠĠ Ġpost p one Enter Transition () ĊĊĠĠĠĠĠĠĠ Ġview . set BackgroundColor ( Color . BLACK ) ĊĊĠĠĠĠĠĠĠ Ġdivider Ġ= Ġview . findViewById ( R . id . divider ) ĊĠĠĠĠĠĠĠ Ġname TextView Ġ= Ġview . findViewById ( R . id . name ) ĊĠĠĠĠĠĠĠ Ġsize TextView Ġ= Ġview . findViewById ( R . id . size ) ĊĠĠĠĠĠĠĠ Ġshare Button Ġ= Ġview . findViewById ( R . id . share _ button ) ĊĠĠĠĠĠĠĠ Ġremove Button Ġ= Ġview . findViewById ( R . id . remove _ button ) ĊĠĠĠĠĠĠĠ Ġle sp as Button Ġ= Ġview . findViewById ( R . id . le sp as _ button ) ĊĠĠĠĠĠĠĠ Ġclose Button Ġ= Ġview . findViewById ( R . id . close _ button ) ĊĠĠĠĠĠĠĠ Ġselection Text Ġ= Ġview . findViewById ( R . id . selection _ text ) ĊĊĠĠĠĠĠĠĠ Ġshare Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Target U ris () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġle sp as Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Target U ris () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( TAG _ DEST INATION _ DIALOG ) Ġ== Ġnull ) ĠDestination Dialog Fragment . newInstance ( last Selection , true ). show ( parent FragmentManager , ĠTAG _ DEST INATION _ DIALOG ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġremove Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Target U ris () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġconfirmation Ġfrom Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Media Launcher . launch ( Intent Sender Request . Builder ( Media Store . create Delete Request ( require Context (). content Resolver , Ġlast Selection )). setFill In Intent ( null ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ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 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclose Button . setOnClickListener Ġ{ Ġif Ġ( selection Tracker . has Selection ()) Ġselection Tracker . clear Selection () Ġelse Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN Ġ} ĊĊĠĠĠĠĠĠĠ Ġquick Scroll Ġ= Ġview . findViewById < RecyclerView >( R . id . quick _ scroll ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġquick Scroll Adapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( layout Manager Ġas ĠGrid LayoutManager ). span Size Lookup Ġ= Ġobject : ĠGrid LayoutManager . Span Size Lookup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Span Size ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( quick Scroll Adapter . getItem ViewType ( position ) Ġ== ĠQuick Scroll Adapter . DATE _ TYPE ) Ġquick Scroll Grid Span Count Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Nested Scrolling Enabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker Ġ= ĠSelection Tracker . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cam er ar oll Selection ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuick Scroll Adapter . Photo Key Provider ( quick Scroll Adapter ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuick Scroll 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 () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection Tracker . has Selection ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cam er ar oll Model . should Disable Remove ()) Ġremove Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle sp as Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Button . setImage Resource ( R . drawable . ic _ baseline _ close _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Text . text Ġ= ĠgetString ( R . string . selected _ count , Ġselection . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Text . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle sp as Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Button . setImage Resource ( R . drawable . ic _ baseline _ arrow _ down ward _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Text . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Text . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ /* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . P ) Ġthis . system Gesture Ex clusion Rects Ġ= ĠlistOf ( Rect ( this . left , Ġthis . top , Ġside Touch Area Width , Ġthis . bottom ), ĠRect ( this . right Ġ- Ġside Touch Area Width , Ġthis . top , Ġthis . right , Ġthis . bottom )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( Header Item Decoration ( this ) Ġ{ Ġitem Position -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( adapter Ġas ĠQuick Scroll Adapter ). getItem ViewType ( item Position ) Ġ== ĠQuick Scroll Adapter . DATE _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( object : ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġto Right Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseparator Width Ġ= Ġresources . get Dimension ( R . dim en . camera _ roll _ date _ grid _ size ). round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Grid Width Ġ= Ġresources . get Dimension ( R . dim en . camera _ roll _ grid _ size ). round ToInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Right Ġ= Ġdx Ġ< Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ IDLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( re cyclerView . layout Manager Ġas ĠLinearLayoutManager ). find Last Visible Item Position () Ġ< Ġre cyclerView . adapter ?. item Count !! Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġdate Ġseparator Ġis Ġappro aching Ġthe Ġheader , Ġperform Ġsn apping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . find Child View Under ( separator Width . toFloat (), Ġ 0 f )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== Ġseparator Width ) Ġsnap To ( this , Ġre cyclerView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġre cyclerView . find Child View Under ( separator Width . toFloat () Ġ+ Ġmedia Grid Width Ġ/ Ġ 3 , Ġ 0 f )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== Ġseparator Width ) Ġsnap To ( this , Ġre cyclerView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsnap To ( view : ĠView , Ġre cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSnap Ġto Ġthis ĠView Ġif Ġscrolling Ġto Ġleft , Ġor Ġit 's Ġprevious Ġone Ġif Ġscrolling Ġto Ġright ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Right ) Ġre cyclerView . smooth Scroll By ( view . left Ġ- Ġseparator Width Ġ- Ġmedia Grid Width , Ġ 0 , Ġnull , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġre cyclerView . smooth Scroll By ( view . left , Ġ 0 , Ġnull , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ċ */ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġquick Scroll Adapter . setSelection Tracker ( selection Tracker ) ĊĊĠĠĠĠĠĠĠ Ġmedia Pager Ġ= Ġview . findViewById < RecyclerView >( R . id . media _ pager ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġmedia Pager Adapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSnap Ġlike Ġa ĠView Pager ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ager Snap Helper (). attach To RecyclerView ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDetect Ġswipe Ġup Ġgesture Ġand Ġshow ĠBottom Sheet ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Item Touch Listener ( object : ĠRecyclerView . Simple On Item Touch Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Detector . on Touch Event ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Intercept Touch Event ( rv , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( object : ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDis miss ĠBottom Sheet Ġwhen Ġuser Ġstarts Ġscrolling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ DR AG GING -> Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġmeta Ġdisplay Ġtext view Ġafter Ġsc rolled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ IDLE -> Ġupdate Meta Display () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġdirty Ġhack Ġto Ġreduce Ġmedia Pager 's Ġscroll Ġsensitivity Ġto Ġget Ġsm oo ther Ġzoom Ġexperience ĊĠĠĠĠĠĠĠ Ġ( RecyclerView :: class . java . getDeclared Field (" m Touch S lop ")). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( media Pager , Ġ( get ( media Pager ) Ġas ĠInt ) Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Ġ= ĠBottom Sheet Behavior . from ( view . findViewById ( R . id . bottom _ sheet ) Ġas ĠConstraint Layout ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Flags Ġ= ĠBottom Sheet Behavior . SAVE _ ALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Collapsed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Bottom Sheet Callback ( object : ĠBottom Sheet Behavior . Bottom Sheet Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Color Ġ= ĠContext Compat . getColor ( require Context (), ĠR . color . color _ on _ primary _ invert ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbackgroundColor Ġ= ĠContext Compat . getColor ( require Context (), ĠR . color . color _ background ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint ( Ġ" Switch Int Def ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( view : ĠView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Pager Adapter . item Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġonly Ġ 1 Ġitem Ġin Ġthe Ġlist , Ġuser Ġswipe Ġup Ġto Ġreveal Ġthe Ġexpanded Ġsheet , Ġthen Ġwe Ġshould Ġupdate Ġthe Ġtext Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġany Ġbetter Ġway Ġto Ġdetect Ġmedia Pager 's Ġscroll Ġto Ġevent ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Meta Display () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġare Ġmore Ġthan Ġ 1 Ġmedia Ġin Ġthe Ġlist , Ġget Ġready Ġto Ġshow ĠBottom Sheet Ġexpanded Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! close Button . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname TextView . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize TextView . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle sp as Button . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Button . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Text . isVisible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquick Scroll . scrollTo Position ( quick Scroll Adapter . get Photo Position ( media Pager Adapter . get Media At Position ( getCurrent Visible Item Position ()). id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquick Scroll . foreground Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ HIDDEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( close Button . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname TextView . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize TextView . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname TextView . setTextColor ( primary Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize TextView . setTextColor ( primary Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Button . isEnabled Ġ= Ġ! cam er ar oll Model . should Disable Remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button . isEnabled Ġ= Ġ! cam er ar oll Model . should Disable Share () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle sp as Button . isEnabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Button . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Text . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġmedia Ġmeta Ġwhen Ġin Ġcollapsed Ġstate , Ġshould Ġdo Ġit Ġhere Ġsince Ġwhen Ġmedia Ġlist Ġupdated , Ġlike Ġafter Ġdeletion , Ġlist 's Ġadd On Scroll Listener Ġcallback Ġwon 't Ġbe Ġcalled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġany Ġbetter Ġway Ġto Ġdetect Ġmedia Pager 's Ġscroll Ġto Ġevent ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Meta Display () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Slide ( view : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Pager Adapter . item Count Ġ> Ġ 1 Ġ&& Ġslide Offset Ġ>= Ġ 0 Ġ&& Ġname TextView . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġ 2 5 5 Ġ- Ġ( 2 5 5 Ġ* Ġslide Offset ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Color Utils . set Alpha Component ( primary Color , Ġalpha )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname TextView . setTextColor ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize TextView . setTextColor ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquick Scroll . foreground Ġ= ĠColor Drawable ( Color Utils . set Alpha Component ( backgroundColor , Ġalpha )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġway Ġto Ġanimate ĠImage Button Ġfrom Ġenabled Ġto Ġdisabled Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġi Alpha Ġ= Ġ( 1 2 8 Ġ* Ġslide Offset ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// remove Button . setColor Filter ( Color . arg b ( i Alpha , Ġ 0 , Ġ 0 Ġ, Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// share Button . setColor Filter ( Color . arg b ( i Alpha , Ġ 0 , Ġ 0 Ġ, Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// le sp as Button . setColor Filter ( Color . arg b ( i Alpha , Ġ 0 , Ġ 0 Ġ, Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Camera Roll () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . R ) Ġandroid . Manifest . permission . READ _ EXTERNAL _ STORAGE Ġelse Ġandroid . Manifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( require Context (), Ġpermission ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). requested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ NO SENSOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Permission Request Launcher . launch ( permission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġobserve Camera Roll () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAc qu iring Ġnew Ġmedi as ĊĠĠĠĠĠĠĠ Ġdestination Model . get Destination (). observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġalbum Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalbum ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAc quire Ġfiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent FragmentManager . find Fragment By Tag ( TAG _ AC QUI RING _ DIALOG ) Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAc qu iring Dialog Fragment . newInstance ( last Selection , Ġalbum , Ġdestination Model . should Remove Original ()). show ( parent FragmentManager , ĠTAG _ AC QUI RING _ DIALOG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()). register Receiver ( remove Original Broadcast Receiver , ĠIntent Filter ( Ac qu iring Dialog Fragment . BRO ADCAST _ REMOVE _ ORIGIN AL )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemoving Ġmedi as Ġconfirm Ġresult Ġhandler ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Media Launcher Ġ= Ġregister For Activity Result ( Activity Result Contracts . Start Intent Sender For Result ()) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( result . result Code Ġ== ĠActivity . RESULT _ OK ) Ġcam er ar oll Model . remove Current Media () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . result Code Ġ== ĠActivity . RESULT _ OK ) Ġcam er ar oll Model . remove Med ias ( last Selection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ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 )) Ġcam er ar oll Model . remove Current Media () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDELETE _ REQUEST _ KEY Ġ-> Ġif Ġ( bundle . getBoolean ( Confirm Dialog Fragment . CONFIRM _ DIALOG _ REQUEST _ KEY , Ġfalse )) Ġcam er ar oll Model . remove Med ias ( last Selection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IP _ REQUEST _ KEY Ġ-> Ġshare Out ( bundle . getBoolean ( Confirm Dialog Fragment . CONFIRM _ DIALOG _ REQUEST _ KEY , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġmedia Pager Adapter . initialize Player ( require Context (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġmedia Pager Adapter . setAuto Start ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Log . e ("> >>>> ", Ġ" on Resume Ġ$ video Stop Position ") ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠAppCompatActivity ). window . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved StatusBar Color Ġ= Ġstatus Bar Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved NavigationBar Color Ġ= Ġnavigation Bar Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Bar Color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved NavigationBar Divider Color Ġ= Ġnavigation Bar Divider Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Divider Color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠgetCurrent Visible Item Position () ĊĠĠĠĠĠĠĠ Ġwith ( media Pager . find ViewHolder For Adapter Position ( pos )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! view Re Created Ġ&& Ġmedia Pager Adapter . current List [ pos ]. mime Type . startsWith (" video ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this Ġas ĠMedia Slider Adapter <* >. Video ViewHolder ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager Adapter . setAuto Start ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstrip Ex if Ġ= ĠPreference Manager . getDefault SharedPreferences ( require Context ()). getString ( getString ( R . string . strip _ ex if _ pref _ key ), ĠgetString ( R . string . strip _ on _ value )) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Log . e ("> >>>> ", Ġ" on Pause ") ĊĠĠĠĠĠĠĠ Ġwith ( media Pager . find ViewHolder For Adapter Position ( getCurrent Visible Item Position ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠMedia Slider Adapter <* >. Video ViewHolder ) Ġthis . pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Re Created Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( KEY _ PLAYER _ STATE , Ġmedia Pager Adapter . getPlayer State ()) ĊĠĠĠĠĠĠĠ Ġout State . putString ( KEY _ SCROLL _ TO , Ġmedia Pager Adapter . get Media At Position ( getCurrent Visible Item Position ()). id ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ArrayList ( KEY _ LAST _ SELECTION , Ġlast Selection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Pager Adapter . clean Up () ĊĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()). unregister Receiver ( remove Original Broadcast Receiver ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠAppCompatActivity ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar !!. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . status Bar Color Ġ= Ġsaved StatusBar Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . navigation Bar Color Ġ= Ġsaved NavigationBar Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġwindow . navigation Bar Divider Color Ġ= Ġsaved NavigationBar Divider Color ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Camera Roll () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOb serving Ġmedia Ġlist Ġupdate ĊĠĠĠĠĠĠĠ Ġcam er ar oll Model . get Media List (). observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (), ĠgetString ( R . string . empty _ camera _ roll ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( require Activity () Ġis ĠMainActivity ) Ġparent FragmentManager . pop Back Stack () Ġelse Ġrequire Activity (). finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġquick Ġscroll Ġif Ġthere Ġis Ġonly Ġone Ġmedia ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquick Scroll . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdivider . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( bottom Sheet . state Ġ== ĠBottom Sheet Behavior . STATE _ EXP AN DED ) Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġshare Ġfunction Ġif Ġscheme Ġof Ġthe Ġuri Ġshared Ġwith Ġus Ġis Ġ" file ", Ġthis Ġonly Ġhappened Ġwhen Ġviewing Ġa Ġsingle Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( media Pager Adapter . get Media At Position ( 0 ). id . startsWith (" file ")) Ġshare Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġinitial Ġposition Ġif Ġpassed Ġin Ġarguments Ġor Ġrestore Ġfrom Ġlast Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start With This Media . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcam er ar oll Model . set Start Position ( it . indexOf First Ġ{ Ġmedia Ġ-> Ġmedia . id Ġ== Ġstart With This Media Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart With This Media Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPopulate Ġlist Ġand Ġscroll Ġto Ġcorrect Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( media Pager . adapter Ġas ĠMedia Pager Adapter ). submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager . scrollTo Position ( cam er ar oll Model . getStart Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( quick Scroll . adapter Ġas ĠQuick Scroll Adapter ). submit List ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġdelete Ġfunction Ġif Ġit 's Ġlaunched Ġas Ġmedia Ġviewer Ġon ĠAndroid Ġ 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( cam er ar oll Model . should Disable Remove ()) Ġremove Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġprivate Ġfun Ġupdate Meta Display () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( media Pager Adapter . get Media At Position ( getCurrent Visible Item Position ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname TextView . text Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize TextView . text Ġ= Ġ"${ date Taken . day OfWeek . get DisplayName ( TextStyle . SHORT , ĠLocale . getDefault ()) }, Ġ${ date Taken . format ( DateTime Formatter . of Localized Date ( Format Style . MEDIUM ))} ĠĠ Ġ| ĠĠ Ġ${ Tools . human Readable Byte Count SI ( e Tag . to Long ()) }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Visible Item Position (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġ( media Pager . layout Manager Ġas ĠLinearLayoutManager ). findFirst Visible Item Position () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pos Ġ== ĠRecyclerView . NO _ POSITION ) Ġ 0 Ġelse Ġpos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Target U ris () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġtarget Ġmedia Ġitem Ġlist ĊĠĠĠĠĠĠĠ Ġlast Selection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection Tracker . has Selection ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġur is Ġ= Ġarray ListOf < Uri >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( uri Ġin Ġselection Tracker . selection ) Ġur is . add ( Uri . parse ( uri )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġur is ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġarray ListOf ( Uri . parse ( media Pager Adapter . get Media At Position ( getCurrent Visible Item Position ()). id )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDis miss ĠBottom Sheet Ġwhen Ġit 's Ġin Ġcollapsed Ġmode , Ġwhich Ġmeans Ġit 's Ġworking Ġon Ġthe Ġcurrent Ġitem ĊĠĠĠĠĠĠĠ Ġif Ġ( bottom Sheet . state Ġ== ĠBottom Sheet Behavior . STATE _ COLL AP SED ) Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Ex if In Selection (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( photo Id Ġin Ġlast Selection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Tools . has Ex if ( media Pager Adapter . get Photo By ( photo Id . toString ()). mime Type )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Shares ( strip : ĠBoolean ): ĠArrayList < Uri > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġur is Ġ= Ġarray ListOf < Uri >() ĊĠĠĠĠĠĠĠ Ġvar Ġdest File : ĠFile ĊĠĠĠĠĠĠĠ Ġval Ġcr Ġ= Ġrequire Context (). content Resolver ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( photo Id Ġin Ġlast Selection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Pager Adapter . get Photo By ( photo Id . toString ()). also Ġ{ Ġ Ġphoto -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis ĠTEMP _ CACHE _ FOLDER Ġis Ġcreated Ġby ĠMainActivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest File Ġ= ĠFile ("${ require Activity (). cacheDir }${ MainActivity . TEMP _ CACHE _ FOLDER }", Ġif Ġ( strip ) Ġ"${ UUID . randomUUID ()}. ${ photo . name . substring After Last ('.') }" Ġelse Ġphoto . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCopy Ġthe Ġfile Ġfrom Ġcamera Ġroll Ġto Ġcache Dir / name , Ġstrip ĠEX IF Ġbase Ġon Ġsetting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strip Ġ&& ĠTools . has Ex if ( photo . mime Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStrip ĠEX IF , Ġrotate Ġpicture Ġif Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( cr . open InputStream ( Uri . parse ( photo . id ))) ?. let Ġ{ Ġbmp -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( photo . share Id Ġ!= Ġ 0 ) ĠBitmap . create Bitmap ( bmp , Ġ 0 , Ġ 0 , Ġphoto . width , Ġphoto . height , ĠMatrix (). apply Ġ{ Ġpre Rotate ( photo . share Id . toFloat ()) Ġ}, Ġtrue ) Ġelse Ġbmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compress ( Bitmap . Compress Format . JPEG , Ġ 9 5 , Ġdest File . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġur is . add ( File Provider . get Uri For File ( require Context (), ĠgetString ( R . string . file _ authority ), Ġdest File )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġe . printStackTrace () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġur is . add ( photo Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ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 ( media Pager , Ġstrip ) ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTemp or arily Ġprevent Ġscreen Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). requested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ NO SENSOR ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ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 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ /* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia To Share Ġ= Ġmedia Pager Adapter . get Media At Position ( getCurrent Visible Item Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strip Ġ&& ĠTools . has Ex if ( media To Share . mime Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr Ġ= Ġrequire Context (). content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest File Ġ= ĠFile ("${ require Context (). cacheDir }${ MainActivity . TEMP _ CACHE _ FOLDER }", Ġif Ġ( strip ) Ġ"${ UUID . randomUUID ()}. ${ media To Share . name . substring After Last ('.') }" Ġelse Ġmedia To Share . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStrip ĠEX IF , Ġrotate Ġpicture Ġif Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( cr . open InputStream ( Uri . parse ( media To Share . id ))) ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( media To Share . share Id Ġ!= Ġ 0 ) ĠBitmap . create Bitmap ( this , Ġ 0 , Ġ 0 , Ġmedia To Share . width , Ġmedia To Share . height , ĠMatrix (). apply Ġ{ Ġpre Rotate ( media To Share . share Id . toFloat ()) Ġ}, Ġtrue ) Ġelse Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compress ( Bitmap . Compress Format . JPEG , Ġ 9 5 , Ġdest File . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( require Context (), ĠgetString ( R . string . file _ authority ), Ġdest File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( Intent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" image / jpeg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclip Data Ġ= ĠClip Data . new Uri ( cr , Ġ"", Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Share Receiver Activity . KEY _ SHOW _ REMOVE _ OPTION , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( Intent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġmedia To Share . mime Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , ĠUri . parse ( media To Share . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Share Receiver Activity . KEY _ SHOW _ REMOVE _ OPTION , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġe . printStackTrace () Ġ} Ċ */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND _ MULTIPLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ArrayList Extra ( Intent . EXTRA _ STREAM , Ġur is ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ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 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġrequire Context (). content Resolver . getType ( uris [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ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 () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġclass ĠCamera Roll ViewModel Factory ( private Ġval Ġapplication : ĠApplication , Ġprivate Ġval Ġfile Uri : ĠString ?): ĠViewModel Provider . New Instance Factory () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ= ĠCamera Roll ViewModel ( application , Ġfile Uri ) Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCamera Roll ViewModel ( application : ĠApplication , Ġfile Uri : ĠString ?): ĠAndroid ViewModel ( application ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmedia List Ġ= ĠMutable LiveData < Mutable List < Photo >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠstartPosition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcr Ġ= Ġapplication . content Resolver ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġshould Disable Remove Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġshould Disable Share Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmedi as Ġ= Ġmutable ListOf < Photo >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Uri ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools . get Folder From Uri ( this , Ġapplication . content Resolver )?. let Ġ{ Ġuri -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . e ("> >>>> ", Ġ"${ uri . first } ĠĠ Ġ${ uri . second }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedi as Ġ= ĠTools . list Media Content ( uri . first , Ġcr , Ġimage Only Ġ= Ġfalse , Ġstrict Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Start Position ( medi as . indexOf First Ġ{ Ġit . id . substring After Last ('/') Ġ== Ġuri . second Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . R ) Ġshould Disable Remove Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Ġ= ĠPhoto ( this , ĠImage Loader ViewModel . FROM _ CAMERA _ ROLL , Ġ"", Ġ" 0 ", ĠLocalDateTime . now (), ĠLocalDateTime . MIN , Ġ 0 , Ġ 0 , Ġ"", Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . mime Type Ġ= Ġcr . getType ( uri )?. let Ġ{ ĠIntent . normalize MimeType ( it ) Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMime TypeMap . get Singleton (). get MimeType From Extension ( MimeType Map . getFile Extension From Url ( file Uri ). lowercase ()) Ġ?: Ġ" image / jpeg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( uri . scheme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" content " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr . query ( uri , Ġnull , Ġnull , Ġnull , Ġnull )?. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex OrThrow ( Open able Columns . DISPLAY _ NAME )) ?. let Ġ{ Ġphoto . name Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġfile Ġsize Ġin Ġproperty Ġe Tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex OrThrow ( Open able Columns . SIZE )) ?. let Ġ{ Ġphoto . e Tag Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" file " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri . path ?. let Ġ{ Ġphoto . name Ġ= Ġit . substring After Last ('/') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Disable Share Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( photo . mime Type . startsWith (" video / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata Retriever (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset DataSource ( application , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . width Ġ= Ġextract Metadata ( Media Metadata Retriever . METADATA _ KEY _ VIDEO _ WIDTH )?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . height Ġ= Ġextract Metadata ( Media Metadata Retriever . METADATA _ KEY _ VIDEO _ HEIGHT )?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . date Taken Ġ= ĠTools . get Video File Date ( this , Ġphoto . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( photo . mime Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" image / jpeg ", Ġ" image / tiff " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex if Ġ= ĠEx if Interface ( cr . open InputStream ( uri ) !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . date Taken Ġ= ĠTools . getImage File Date ( ex if , Ġphoto . name )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . parse ( it , ĠDateTime Formatter . of Pattern (" yyyy : MM : dd ĠHH : mm : ss ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġorientation Ġin Ġproperty Ġshare Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . share Id Ġ= Ġex if . rotation Degrees ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . Options (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( cr . open InputStream ( uri ), Ġnull , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . width Ġ= Ġout Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto . height Ġ= Ġout Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedi as . add ( photo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ Ġmedi as Ġ= ĠTools . get Camera Roll ( cr , Ġfalse ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia List . post Value ( medi as ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Start Position ( position : ĠInt ) Ġ{ ĠstartPosition Ġ= Ġposition Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Start Position (): ĠInt Ġ= ĠstartPosition ĊĠĠĠĠĠĠĠ Ġfun Ġget Media List (): ĠLive Data < Mutable List < Photo >> Ġ= Ġmedia List ĊĠĠĠĠĠĠĠ Ġfun Ġremove Med ias ( remove List : ĠList < Uri >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġfrom Ġsystem Ġif Ġrunning Ġon ĠAndroid Ġ 1 0 Ġor Ġlower ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . R ) Ġremove List . forEach Ġ{ Ġmedia -> Ġcr . delete ( media , Ġnull , Ġnull ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġfrom Ġour Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia List . value ?. to Mutable List ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Ġ{ Ġremove List . contains ( Uri . parse ( it . id )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia List . post Value ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġshould Disable Remove (): ĠBoolean Ġ= Ġthis . should Disable Remove ĊĠĠĠĠĠĠĠ Ġfun Ġshould Disable Share (): ĠBoolean Ġ= Ġthis . should Disable Share ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMedia Pager Adapter ( val Ġclick Listener : Ġ( Boolean ?) Ġ-> ĠUnit , Ġval Ġimage Loader : Ġ( Photo , ĠImageView , ĠString ) Ġ-> ĠUnit , Ġcancel Loader : Ġ( View ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠMedia Slider Adapter < Photo >( Photo Diff Callback (), Ġclick Listener , Ġimage Loader , Ġcancel Loader ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Video Item ( position : ĠInt ): ĠVideo Item Ġ= Ġwith ( getItem ( position ) Ġas ĠPhoto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVideo Item ( Uri . parse ( id ), ĠmimeType , Ġwidth , Ġheight , Ġid . substring After Last ('/ ')) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Transition Name ( position : ĠInt ): ĠString Ġ= Ġ( getItem ( position ) Ġas ĠPhoto ). id ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem MimeType ( position : ĠInt ): ĠString Ġ= Ġ( getItem ( position ) Ġas ĠPhoto ). mime Type ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Media At Position ( position : ĠInt ): ĠPhoto Ġ= Ġcurrent List [ position ] Ġas ĠPhoto ĊĠĠĠĠĠĠĠ Ġfun Ġfind Media Position ( photo : ĠPhoto ): ĠInt Ġ= Ġ( current List Ġas ĠList < Photo >). indexOf ( photo ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Photo By ( photo Id : ĠString ): ĠPhoto Ġ= Ġcurrent List . last Ġ{ Ġit . id Ġ== Ġphoto Id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠQuick Scroll Adapter ( private Ġval Ġclick Listener : Ġ( Photo ) Ġ-> Ġ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 ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠMedia ViewHolder ( item View : ĠView ): ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind ( item : ĠPhoto , Ġis Activated : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Activated Ġ= Ġis Activated ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( item View . findViewById < ImageView >( R . id . photo )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader ( item , Ġ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 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ Ġif Ġ(! selection Tracker . has Selection ()) Ġclick Listener ( item ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . findViewById < ImageView >( R . id . play _ mark ). visibility Ġ= Ġif Ġ( Tools . is Media Play able ( item . mime Type )) Ġ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 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ /* ĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠDate ViewHolder ( item View : ĠView ): ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind ( item : ĠPhoto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( item . date Taken ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < TextView >( R . id . month ). text Ġ= Ġthis . month Value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < TextView >( R . id . day ). text Ġ= Ġthis . day OfMonth . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ */ ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠHorizontal Date ViewHolder ( item View : ĠView ): ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind ( item : ĠPhoto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( item . date Taken ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// item View . findViewById < TextView >( R . id . date ). text Ġ= Ġ"${ format ( DateTime Formatter . of Localized Date ( Format Style . LONG )) }, Ġ${ day OfWeek . get DisplayName ( TextStyle . FULL , ĠLocale . getDefault ()) } ĠĠ Ġ| ĠĠ Ġ${ String . format ( item View . context . getString ( R . string . total _ photo ), Ġitem . share Id )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < TextView >( R . id . date ). text Ġ= Ġ"${ format ( DateTime Formatter . of Localized Date ( Format Style . LONG )) }, Ġ${ day OfWeek . get DisplayName ( TextStyle . FULL , ĠLocale . getDefault ()) }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ= Ċ /* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Type Ġ== ĠMED IA _ TYPE ) ĠMedia ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . recyclerview _ item _ cam er ar oll , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠDate ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . recyclerview _ item _ cam er ar oll _ date , Ġparent , Ġfalse )) Ċ */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Type Ġ== ĠMED IA _ TYPE ) ĠMedia ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . recyclerview _ item _ photo , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠHorizontal Date ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . recyclerview _ item _ cam er ar oll _ date _ horizontal , Ġparent , Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġis ĠMedia ViewHolder ) Ġholder . bind ( current List [ position ], Ġselection Tracker . isSelected ( current List [ position ]. id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// else Ġif Ġ( holder Ġis ĠDate ViewHolder ) Ġholder . bind ( current List [ position ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( holder Ġis ĠHorizontal Date ViewHolder ) Ġholder . bind ( current List [ position ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsubmit List ( list : ĠMutable List < Photo > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGroup Ġby Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Group edBy Date Ġ= Ġmutable ListOf < Photo >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Date Ġ= ĠLocalDate . now (). plus Days ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( media Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media . date Taken . to LocalDate () Ġ!= Ġcurrent Date ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Date Ġ= Ġmedia . date Taken . to LocalDate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Group edBy Date . add ( Photo ("", ĠImage Loader ViewModel . FROM _ CAMERA _ ROLL , Ġ"", Ġ"", Ġmedia . date Taken , Ġmedia . date Taken , Ġ 0 , Ġ 0 , Ġ"", Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Group edBy Date . add ( media ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ /* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġtotal Ġfor Ġeach Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsection Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlist Group edBy Date . size - 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Group edBy Date [ i ]. id . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Group edBy Date [ i ]. share Id Ġ= Ġsection Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsection Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsection Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . submit List ( list Group edBy Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ= Ġif Ġ( current List [ position ]. id . isEmpty ()) ĠDATE _ TYPE Ġelse ĠMED IA _ TYPE ĊĊĠĠĠĠĠĠĠ Ġ// fun Ġfind Media Position ( photo : ĠPhoto ): ĠInt Ġ= Ġcurrent List . indexOf ( photo ) ĊĊĠĠĠĠĠĠĠ Ġ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 : ĠQuick Scroll 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 ĠMedia ViewHolder ) Ġholder . getItem Details () Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMED IA _ TYPE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠDATE _ TYPE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPhoto Diff Callback Ġ: ĠDiff Util . Item Callback < Photo >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠPhoto , Ġnew Item : ĠPhoto ): ĠBoolean Ġ= Ġif Ġ( old Item . id . isEmpty () Ġ|| Ġnew Item . id . isEmpty ()) Ġfalse Ġelse Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠPhoto , Ġnew Item : ĠPhoto ): ĠBoolean Ġ= Ġold Item Ġ== Ġnew Item ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ SCROLL _ TO Ġ= Ġ" KEY _ SCROLL _ TO " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ URI Ġ= Ġ" KEY _ URI " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ PLAYER _ STATE Ġ= Ġ" KEY _ PLAYER _ STATE " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ LAST _ SELECTION Ġ= Ġ" KEY _ LAST _ SELECTION " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG _ DEST INATION _ DIALOG Ġ= Ġ" CAM ER AR OL L _ DEST INATION _ DIALOG " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG _ AC QUI RING _ DIALOG Ġ= Ġ" CAM ER AR OL L _ AC QUI RING _ DIALOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCON FIRM _ DIALOG Ġ= Ġ" CONFIRM _ DIALOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDELETE _ REQUEST _ KEY Ġ= Ġ" CAMERA _ ROLL _ DELETE _ REQUEST _ KEY " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTR IP _ REQUEST _ KEY Ġ= Ġ" CAMERA _ ROLL _ STRIP _ REQUEST _ KEY " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( scrollTo : ĠString ) Ġ= ĠCamera Roll Fragment (). apply Ġ{ Ġarguments Ġ= ĠBundle (). apply Ġ{ Ġput String ( KEY _ SCROLL _ TO , Ġscroll To ) Ġ}} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( uri : ĠUri ) Ġ= ĠCamera Roll Fragment (). apply Ġ{ Ġarguments Ġ= ĠBundle (). apply Ġ{ Ġput String ( KEY _ URI , Ġuri . toString ()) Ġ}} ĊĠĠĠ Ġ} Ċ } Ċ