/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠL iz ha ot ail ang Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġio . github . ton ny l . m ango . ui . shot Ċ Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Clipboard Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . design . widget . Snackbar Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 7 . graphics . Palette Ċ import Ġandroid . text . Html Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . text . method . Link Movement Method Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġio . github . ton ny l . m ango . R Ċ import Ġio . github . ton ny l . m ango . data . Shot Ċ import Ġio . github . ton ny l . m ango . data . User Ċ import Ġio . github . ton ny l . m ango . databinding . Fragment Shot Binding Ċ import Ġio . github . ton ny l . m ango . glide . G lide Loader Ċ import Ġio . github . ton ny l . m ango . glide . On Palette Processing Callback Ċ import Ġio . github . ton ny l . m ango . ui . shot . comments . Comments Activity Ċ import Ġio . github . ton ny l . m ango . ui . shot . comments . Comments Presenter Ċ import Ġio . github . ton ny l . m ango . ui . shot . likes . Lik es Activity Ċ import Ġio . github . ton ny l . m ango . ui . shot . likes . Lik es Presenter Ċ import Ġio . github . ton ny l . m ango . ui . user . UserProfile Activity Ċ import Ġio . github . ton ny l . m ango . ui . user . UserProfile Presenter Ċ import Ġkotlinx . android . synt hetic . main . fragment _ shot .* Ċ import Ġorg . jetbrains . ank o . browse Ċ import Ġorg . jetbrains . ank o . run On Ui Thread Ċ import Ġorg . jetbrains . ank o . share Ċ import Ġorg . jetbrains . ank o . startActivity Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġli z ha ot ail ang Ġon Ġ 2 0 1 7 / 6 / 2 8 . Ċ Ġ* Ċ Ġ* ĠMain Ġui Ġfor Ġthe Ġshot Ġscreen . Ċ Ġ*/ Ċ Ċ class ĠShot Fragment Ġ: ĠFragment (), ĠShot Contract . View Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Presenter : ĠShot Contract . Presenter ĊĠĠĠ Ġprivate Ġval Ġrg bs Ġ= Ġarray ListOf < Int >() ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : Fragment Shot Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠShot Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠShot Fragment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠĠĠĠĠ Ġ_ binding = ĠFragment Shot Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġm Presenter . subscribe () ĊĊĠĠĠĠĠĠĠ Ġinit View () ĊĊĠĠĠĠĠĠĠ Ġbinding . fab . setOnClickListener ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Presenter . toggle Like () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . avatar . setOnClickListener ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Presenter . navigate To UserProfile () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . button Lik es . setOnClickListener ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Presenter . navigate To Lik es () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . button Comments . setOnClickListener ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Presenter . navigate To Comments () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġm Presenter . unsubscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?, Ġinflater : ĠMenu Inflater ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater ?. inflate ( R . menu . menu _ shot , Ġmenu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġitem ?. itemId ĊĠĠĠĠĠĠĠ Ġwhen Ġ( id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġactivity ?. on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ open _ in _ browser Ġ-> Ġm Presenter . open In Browser () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ share Ġ-> Ġm Presenter . share () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Presenter ( presenter : ĠShot Contract . Presenter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Presenter Ġ= Ġpresenter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Network Error () Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . fab , ĠR . string . network _ error , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow ( shot : ĠShot ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe Ġmenu _ shot Ġimage ĊĠĠĠĠĠĠĠ ĠG lide Loader . load High Quality With Palette ( binding . shot ImageView , Ġshot . images . best (), Ġobject Ġ: ĠOn Palette Processing Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Palette Generated ( palette : ĠPalette ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpalette ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Palette ( palette ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . palette Layout . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Palette Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . palette Layout . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠG lide Loader . load Avatar ( binding . avatar , Ġshot . user ?. avatar Url ) ĊĊĠĠĠĠĠĠĠ Ġbinding . toolbar . title Ġ= Ġshot . title ĊĊĠĠĠĠĠĠĠ Ġif Ġ( shot . description Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . shot Description . text Ġ= ĠHtml . from Html ( shot . description , ĠHtml . FROM _ HTML _ MODE _ LEG ACY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . shot Description . text Ġ= ĠHtml . from Html ( shot . description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . shot Description . movement Method Ġ= ĠLink Movement Method . getInstance () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . shot Description . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . name . text Ġ= Ġshot . user ?. name ĊĠĠĠĠĠĠĠ Ġbinding . userName . text Ġ= Ġshot . user ?. username ĊĠĠĠĠĠĠĠ Ġbinding . created Time . text Ġ= ĠDate Utils . get Relative TimeSpan String ( shot . createdAt . time , ĠSystem . currentTimeMillis (), ĠDate Utils . MINUTE _ IN _ M ILL IS ) ĊĊĠĠĠĠĠĠĠ Ġbinding . button Lik es . text Ġ= ĠgetString ( R . string . likes _ formatted ). format ( shot . likes Count ) ĊĠĠĠĠĠĠĠ Ġbinding . button Views . text Ġ= ĠgetString ( R . string . views _ formatted ). format ( shot . views Count ) ĊĠĠĠĠĠĠĠ Ġbinding . button Comments . text Ġ= ĠgetString ( R . string . comments _ formatted ). format ( shot . comments Count ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe Ġtags ĊĠĠĠĠĠĠĠ Ġshow Tags ( shot . tags ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Like Status ( like : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . fab . setImage Resource ( if Ġ( like ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ favorite _ white _ 2 4 dp ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ favorite _ border _ white _ 2 4 dp ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Like Count ( count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . button Lik es . text Ġ= ĠgetString ( R . string . likes _ formatted ). format ( count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate To UserProfile ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. startActivity < UserProfile Activity >( UserProfile Presenter . EXTRA _ USER Ġto Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate To Comments ( shot : ĠShot ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. startActivity < Comments Activity >( Comments Presenter . EXTRA _ SHOT Ġto Ġshot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate To Lik es ( shot : ĠShot ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. startActivity < Lik es Activity >( Lik es Presenter . EXTRA _ SHOT Ġto Ġshot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġopen In Browser ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. browse ( url , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshare ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. share ( url , ĠgetString ( R . string . share _ to )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Tags ( tags : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tag Ġin Ġtags ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= ĠTextView ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . background Ġ= ĠContext Compat . get Drawable ( this , ĠR . drawable . bg _ shot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġtag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( Context Compat . getColor ( this , Ġandroid . R . color . white )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . gravity Ġ= ĠGr avity . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . set Padding ( 1 6 , Ġ 8 , Ġ 1 6 , Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags _ box . addView ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġ[ com . bump tech . glide . request . RequestListener . on Resource Ready ] ĊĠĠĠĠ Ġ* Ġis Ġcalled Ġtwice , Ġso Ġuse Ġa Ġrg bs Ġfield Ġto Ġrecord Ġthe Ġrgb Ġvalues ĊĠĠĠĠ Ġ* Ġto Ġprevent Ġduplicate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Palette ( palette : ĠPalette ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( sw atch Ġin Ġpalette . sw atches ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! rg bs . contains ( sw atch . rgb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrg bs . add ( sw atch . rgb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= ĠTextView ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . layout Params Ġ= ĠLinearLayout . LayoutParams ( 0 , ĠLinearLayout . LayoutParams . MATCH _ PARENT , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . set BackgroundColor ( sw atch . rgb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠString . format ("# % 0 6 X ", Ġ( 0 x FFFFFF Ġand Ġsw atch . rgb )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( fab , Ġcolor , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( getString ( R . string . copy _ to _ clipboard ), Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġcontext ?. getSystem Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . primary Clip Ġ= ĠClip Data . new Plain Text (" text ", Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . fab , ĠR . string . copied , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . palette Layout . addView ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġact Ġ= Ġactivity Ġas ĠShot Activity ĊĠĠĠĠĠĠĠ Ġact . set Support ActionBar ( binding . toolbar ) ĊĠĠĠĠĠĠĠ Ġact . support ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ