package Ġcom . bern af err ari . change detection . details Image Ċ Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . transition . Auto Transition Ċ import Ġandroid . support . transition . Transition Manager Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 4 . app . Fragment Activity Ċ import Ġandroid . support . v 4 . app . Share Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 4 . content . File Provider Ċ import Ġandroid . support . v 4 . view . Gravity Compat Ċ import Ġandroid . support . v 7 . widget . Divider Item Decoration Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . navigation . Navigation Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . bern af err ari . change detection . Application Ċ import Ġcom . bern af err ari . change detection . R Ċ import Ġcom . bern af err ari . change detection . ViewModel Factory Ċ import Ġcom . bern af err ari . change detection . data . Snap Ċ import Ġcom . bern af err ari . change detection . details Text . Text Fragment Ċ import Ġcom . bern af err ari . change detection . extensions .* Ċ import Ġcom . bern af err ari . change detection . group ie . Row Item Ċ import Ġcom . bern af err ari . change detection . util . G lide App Ċ import Ġcom . dav em or ris sey . labs . sub scale view . Image Source Ċ import Ġcom . x wr ay . group ie . Group Adapter Ċ import Ġcom . x wr ay . group ie . Section Ċ import Ġcom . y aro leg ov ich . dis cre tes c roll view . Discrete ScrollView Ċ import Ġcom . y aro leg ov ich . dis cre tes c roll view . transform . Scale Transformer Ċ import Ġkotlinx . android . synt hetic . main . control _ bar .* Ċ import Ġkotlinx . android . synt hetic . main . control _ bar _ update _ page .* Ċ import Ġkotlinx . android . synt hetic . main . diff _ image _ fragment .* Ċ import Ġkotlinx . android . synt hetic . main . diff _ image _ fragment . view .* Ċ import Ġkotlinx . coroutines . experimental . android . UI Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġjava . io . File Ċ import Ġkotlin . properties . Observable Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ // Ċ // ĠThis Ġis Ġadapted Ġfrom ĠB ÃŃ b lia Ġem ĠLi br as Ġapp , Ġwhich Ġhas Ġa ĠGIF Ġdictionary Ġin Ġa Ġcarousel Ġpowered Ġby ĠEx o Media . Ċ // ĠIf Ġyou Ġare Ġinterested , Ġdownload Ġit Ġand Ġscroll Ġthe Ġinitial Ġlist Ġof Ġitems Ġfor Ġa Ġlarge Ġbutton Ġnamed Ġ" D icion Ã¡rio ": Ċ // Ġhttps :// play . google . com / store / apps / details ? id = com . bib li ali br as . android Ċ // Ċ class ĠImage Fragment Ġ: ĠFragment (), ĊĠĠĠ ĠDis crete ScrollView . On Item Changed Listener < RecyclerView . ViewHolder > Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġmodel : ĠImage ViewModel ĊĠĠĠ Ġlateinit Ġvar Ġadapter : ĠImage Adapter ĊĊĠĠĠ Ġprivate Ġvar Ġprevious Adapter Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġitems Ġ= Ġmutable ListOf < Row Item >() ĊĠĠĠ Ġprivate Ġval Ġsection Ġ= ĠSection () ĊĊĠĠĠ Ġprivate Ġval Ġtransition Ġ= ĠAuto Transition (). apply Ġ{ Ġduration Ġ= Ġ 1 7 5 Ġ} ĊĠĠĠ Ġprivate Ġval Ġui State Ġ= ĠUi State Ġ{ Ġupdate Ui From State () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġgroup Adapter Ġ= ĠGroup Adapter < com . x wr ay . group ie . ViewHolder >() ĊĊĠĠĠ Ġ// Ġthis Ġvariable Ġis Ġnecessary Ġsince Ġon Current Item Changed Ġmight Ġbe Ġtriggered Ġwhen ĠRecyclerView Ġis Ġshown / hidden ĊĠĠĠ Ġ// Ġ( visibility Ġbutton ). ĠThis Ġway , Ġthe Ġapp Ġnever Ġhas Ġto Ġrefresh Ġthe Ġfile ĊĠĠĠ Ġprivate Ġvar Ġcurrent File Id Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġon Current Item Changed ( view Holder : ĠRecyclerView . ViewHolder ?, Ġadapter Position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġadapter . getItem From Adapter ( adapter Position ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġtitle content . text Ġ= Ġitem . timestamp . convert Timestamp ToDate () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item . snap Id Ġ== Ġcurrent File Id ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcurrent File Id Ġ= Ġitem . snap Id ĊĊĠĠĠĠĠĠĠ Ġval Ġnew File Ġ= ĠFile ( Application . instance . files Dir , Ġitem . snap Id ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication . instance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . bern af err ari . change detection . files ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġphoto _ view . setImage ( Image Source . uri ( content Uri )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( items . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġselect Item ( adapter Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ= Ġinflater . inflate ( R . layout . diff _ image _ fragment , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġmodel Ġ= Ġobtain ViewModel ( require Activity ()) ĊĊĠĠĠĠĠĠĠ Ġclose content . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . let Ġ{ ĠNavigation . find Nav Controller ( it ). navigate Up () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext _ previous _ bar . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġhigh Quality Toggle . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcontrol Bar . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġview . menu content . setOnClickListener Ġ{ Ġview . drawer . open Drawer ( Gravity Compat . END ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġshare Toggle . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . getItem From Adapter ( previous Adapter Position ) Ġ?: Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Item ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġneeded . ĠIf Ġvisibility Ġis Ġoff Ġand Ġthe Ġfragment Ġis Ġreopen ed , ĊĠĠĠĠĠĠĠ Ġ// Ġdrawable Ġwill Ġkeep Ġthe Ġdrawable Ġfrom ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġstate Ġ( off ) Ġeven Ġthought Ġit Ġshould Ġbe Ġon . ĊĠĠĠĠĠĠĠ Ġvisibility . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . visibility _ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvisibility . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui State . visibility ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġui State . carousel Ġ= Ġui State . visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui State . control Bar Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġand Ġrun Ġthe Ġcorrect Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ui State . visibility ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility . set And Start Animation ( R . drawable . visibility _ off _ to _ on , Ġrequire Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility . set And Start Animation ( R . drawable . visibility _ on _ to _ off , Ġrequire Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġre cycler Listener Ġ= Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText Fragment . Companion . RecyclerView Item Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick Listener ( item : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcarousel Recycler . smooth Scroll To Position (( item Ġas ĠImage ViewHolder ). item Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long ClickListener ( item : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Item Dialog (( item Ġas ĠImage ViewHolder ). current Snap ?. snap Id Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmenu content . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . drawer . open Drawer ( Gravity Compat . END ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġwindow Dimensions Ġ= ĠPoint () ĊĠĠĠĠĠĠĠ Ġrequire Activity (). window Manager . default Display . getSize ( window Dimensions ) ĊĠĠĠĠĠĠĠ Ġval Ġitem Width Ġ= ĠMath . round ( Math . min ( window Dimensions . y , Ġwindow Dimensions . x ) Ġ* Ġ 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġval Ġitem Height Ġ= Ġ( 1 2 0 Ġ* Ġ 0 . 7 ). toInt (). to Dp ( view . resources ) ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠImage Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler Listener , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Width , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide App . with ( this ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsite Id Ġ= Ġarguments ?. getString (" SITE ID ") Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġmodel . getAll Snap s Paged For Id ( site Id , Ġarguments ?. getString (" TYPE ") Ġ?: Ġ" image % ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe ( this , ĠObserver ( adapter :: submit List )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġneeded Ġsince Ġget Snap s Filtered Ġretrieves Ġa Ġlive Data Ġfrom ĠRoom Ġto Ġbe Ġobserved ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġmodel . getS nap s Filtered ( site Id , Ġ" image % ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( UI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . observe ( this @ Image Fragment , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Items Empty Ġ= Ġitems . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . map To ( items ) Ġ{ ĠRow Item ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsection . update ( items ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġselect Item Ġis Ġbeing Ġset Ġat Ġon Current Item Changed , Ġand Ġthis Ġcode Ġis Ġran Ġasync , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġhappens Ġafter Ġon Current Item Changed Ġis Ġcalled , Ġwhich Ġusually Ġhappens , Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġitem Ġwon 't Ġbe Ġselected . ĠThe Ġtwo Ġlines Ġbelow Ġfix Ġthis . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Items Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Item ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġall Ġitems Ġwere Ġremoved , Ġclose Ġthis Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . find Nav Controller ( view ). navigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcarousel Recycler . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Slide On Fl ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Slide On Fl ing Threshold ( 4 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setItem Transition Time Millis ( 1 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setItem Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScale Transformer . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Min Scale ( 0 . 8 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add On Item Changed Listener ( this @ Image Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer Recycler . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout Manager Ġ= ĠLinearLayoutManager ( this . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . adapter Ġ= Ġgroup Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . addItem Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiv ider Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiv ider Item Decoration . VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup Adapter . add ( section ) ĊĠĠĠĠĠĠĠ Ġgroup Adapter . setOn ItemClickListener Ġ{ Ġitem , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġis ĠRow Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Position Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . indexOf First Ġ{ Ġit . snap . snap Id Ġ== Ġitem . snap . snap Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer . close Drawer ( Gravity Compat . END ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcarousel Recycler . smooth Scroll To Position ( next Position ) Ġ// Ġposition Ġbecomes Ġselected Ġwith Ġanimated Ġscroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgroup Adapter . setOn Item Long ClickListener Ġ{ Ġitem , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġis ĠRow Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Item Dialog ( item . snap . snap Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Item ( adapter Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdes lect Ġthe Ġprevious Ġitem Ġon Ġthe Ġdrawer . ĠThis Ġmight Ġtrigger Ġan Ġexception Ġif Ġitem Ġwas Ġadded / removed ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ previous Adapter Position ]. isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Adapter . notify Item Changed ( previous Adapter Position ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer Recycler . scrollTo Index With Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Adapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprevious Adapter Position Ġ= Ġadapter Position ĊĊĠĠĠĠĠĠĠ Ġ// Ġselect Ġthe Ġnew Ġitem Ġon Ġthe Ġdrawer ĊĠĠĠĠĠĠĠ Ġitems [ adapter Position ]. isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgroup Adapter . notify Item Changed ( adapter Position ) ĊĠĠĠĠĠĠĠ Ġsection . notify Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshare Item ( item : ĠSnap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġimages / jpeg Ġshould Ġbecome Ġj peg ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Extension Ġ= Ġitem . contentType . split ("/ "). get OrNull ( 1 ) Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( require Context (). cacheDir , Ġ" share .$ file Extension ") ĊĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġfile . write Bytes ( require Context (). open File Input ( item . snap Id ). read Bytes ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . bern af err ari . change detection . files ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠShare Compat . Intent Builder . from ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Stream ( content Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. intent ĊĊĠĠĠĠĠĠĠ Ġshare Intent . type Ġ= Ġitem . contentType ĊĠĠĠĠĠĠĠ Ġshare Intent . data Ġ= Ġcontent Uri ĊĠĠĠĠĠĠĠ Ġshare Intent . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĊĠĠĠĠĠĠĠ ĠstartActivity ( share Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Item Dialog ( snap Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMaterial Dialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( R . string . remove ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( R . string . remove _ content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Text ( R . string . yes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. negative Text ( R . string . no ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Positive Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . remove Snap ( snap Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain ViewModel ( activity : ĠFragment Activity ): ĠImage ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġa ĠFactory Ġto Ġinject Ġdependencies Ġinto Ġthe ĠViewModel ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠViewModel Factory . getInstance ( activity . application ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewModel Providers . of ( activity , Ġfactory ). get ( Image ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Ui From State () Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Delayed Transition () ĊĊĠĠĠĠĠĠĠ Ġcarousel Recycler . isVisible Ġ= Ġui State . carousel ĊĠĠĠĠĠĠĠ Ġcontrol Bar . isVisible Ġ= Ġui State . control Bar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbegin Delayed Transition () Ġ= ĊĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( container , Ġtransition ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠUi State ( private Ġval Ġcallback : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠBoolean Property ( initial Value : ĠBoolean ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable Property < Boolean >( initial Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty : ĠK Property <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvisibility Ġby ĠBoolean Property ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcarousel Ġby ĠBoolean Property ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontrol Bar Ġby ĠBoolean Property ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhigh Quality Ġby ĠBoolean Property ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ