package Ġcom . ss mm hh . free 2 play games . feature _ game . presentation . game _ detail Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . lifecycle . repeat On Lifecycle Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . view pager . widget . ViewPager Ċ import Ġcom . ss mm hh . free 2 play games . R Ċ import Ġcom . ss mm hh . free 2 play games . common . process Queue Ċ import Ġcom . ss mm hh . free 2 play games . databinding . Fragment Game Detail Binding Ċ import Ġcom . ss mm hh . free 2 play games . feature _ game . domain . model . Game Detail Ċ import Ġcom . ss mm hh . free 2 play games . feature _ game . presentation . game _ detail . view state . Game Detail ViewState Ċ import Ġcom . ss mm hh . free 2 play games . feature _ game . presentation . util . TextView Col lap sing Animation Ċ import Ġcom . ss mm hh . free 2 play games . feature _ game . presentation . util . setVisibility To G one Ċ import Ġcom . ss mm hh . free 2 play games . feature _ game . presentation . util . setVisibility To Visible Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Android EntryPoint Ċ class ĠGame Detail Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġview Models < Game Detail ViewModel >() ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Game Detail Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġprivate Ġvar ĠtextView Col lap sing Animation : ĠTextView Col lap sing Animation ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġimages ViewPager Adapter : ĠGame Detail Images ViewPager Adapter ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Ui () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Swipe To Refresh Layout () ĊĠĠĠĠĠĠĠ Ġsetup On click Listeners () ĊĠĠĠĠĠĠĠ Ġsetup TextView Col lap sing Animation () ĊĠĠĠĠĠĠĠ Ġinstantiate Images ViewPager () ĊĠĠĠĠĠĠĠ Ġ// set Ġon Ġclick Ġlistener Ġon Ġtoolbar Ġback Ġbutton ĊĠĠĠĠĠĠĠ Ġbinding . toolbar Game Detail . set Navigation OnClickListener Ġ{ Ġfind Nav Controller (). navigate Up () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstantiate Images ViewPager () Ġ{ ĊĠĠĠĠĠĠĠ Ġimages ViewPager Adapter Ġ= ĠGame Detail Images ViewPager Adapter () ĊĠĠĠĠĠĠĠ Ġbinding . v pg Game Images . adapter Ġ= Ġimages ViewPager Adapter ĊĊĠĠĠĠĠĠĠ Ġbinding . v pg Game Images . add On Page ChangeListener ( object Ġ: ĠView Pager . On Page ChangeListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Sc rolled ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Offset : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Offset Pixels : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Selected ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Image Slider Position Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Scroll StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠDisable Ġswipe Ġto Ġrefresh Ġwhile Ġuser Ġis Ġscrolling Ġthe Ġview Ġpager */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Disable Swipe Refresh ( state Ġ== ĠView Pager . SCROLL _ STATE _ IDLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Disable Swipe Refresh ( enable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Game Detail . isEnabled Ġ= Ġenable ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsetup TextView Col lap sing Animation () Ġ{ ĊĠĠĠĠĠĠĠ ĠtextView Col lap sing Animation Ġ= ĠTextView Col lap sing Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer View Ġ= Ġbinding . constraint Layout Detail Container , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Ġ= Ġbinding . txt Game Description , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Collapsed At Init Ġ= ĠviewModel . is Game Description TextView Collapsed . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Duration Ġ= ĠDESCRIPTION _ TEXT VIEW _ COLL AP SING _ ANIM ATION _ DURATION , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollapsed TextView Max Line Ġ= ĠDESCRIPTION _ TEXT VIEW _ COLL AP SED _ MAX _ LINE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Swipe To Refresh Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Game Detail . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . refresh Game Detail () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup On click Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . btn Play Now . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Game Play Now Url ()?. let Ġ{ Ġplay Now Url Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Url In New Activity ( play Now Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn Profile Page . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Game Profile Url ()?. let Ġ{ Ġprofile Url Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Url In New Activity ( profile Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . txt Game Description . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reverse Is Game Description TextView Collapsed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Url In New Activity ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( url ) ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , Ġuri ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe Collectors () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle . repeat On Lifecycle ( Lifecycle . State . STARTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . game Name . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Game Name To Toolbar ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . is Game Description TextView Collapsed . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Description TextView Collapse State ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . game Detail ViewState . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Game Detail ViewState ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . state Message Queue . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Queue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Game Detail Fragment . require Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . remove Head From Queue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Game Name To Toolbar ( game Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . toolbar Game Detail . title Ġ= Ġgame Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Description TextView Collapse State ( is Collapsed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠtextView Col lap sing Animation ?. on Collapse StateChanged ( is Collapsed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Game Detail ViewState ( vs : ĠGame Detail ViewState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// handle Ġloading ĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Game Detail . is Refresh ing Ġ= Ġvs . isLoading ĊĠĠĠĠĠĠĠ Ġ// handle Ġdata ĊĠĠĠĠĠĠĠ Ġvs . game Detail ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . scroll Main Game Detail . setVisibility To Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Game Detail Values ToText Views ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Game Detail Values ToText Views ( game Detail : ĠGame Detail ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// set Ġimage ĊĠĠĠĠĠĠĠ Ġimages ViewPager Adapter . submit New Data ( build List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( game Detail . thumbnail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addAll ( game Detail . screenshots ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ// Restore Ġimage Ġposition Ġafter Ġrotation ĊĠĠĠĠĠĠĠ ĠviewModel . getImage Slider Position (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Of Images Ġ= Ġgame Detail . screenshots . size . plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġcount Of Images ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . v pg Game Images . setCurrent Item ( it , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// title Ġvalue ĊĠĠĠĠĠĠĠ Ġbinding . toolbar Game Detail . title Ġ= Ġgame Detail . title ĊĠĠĠĠĠĠĠ Ġ// about Ġthe Ġgame ĊĠĠĠĠĠĠĠ Ġbinding . txt Game Description Header . text Ġ= Ġ"${ getString ( R . string . about )} Ġ${ game Detail . title }" ĊĠĠĠĠĠĠĠ ĠtextView Col lap sing Animation ?. update With New Text ( game Detail . description ) ĊĠĠĠĠĠĠĠ Ġ// additional Ġinformation Ġsection ĊĠĠĠĠĠĠĠ Ġbinding . game Title Box . title Text . text Ġ= ĠgetString ( R . string . title ) ĊĠĠĠĠĠĠĠ Ġbinding . game Title Box . sub Text . text Ġ= Ġgame Detail . title ĊĊĠĠĠĠĠĠĠ Ġbinding . game Developer Box . title Text . text Ġ= ĠgetString ( R . string . developer ) ĊĠĠĠĠĠĠĠ Ġbinding . game Developer Box . sub Text . text Ġ= Ġgame Detail . developer ĊĊĠĠĠĠĠĠĠ Ġbinding . game Publisher Box . title Text . text Ġ= ĠgetString ( R . string . publisher ) ĊĠĠĠĠĠĠĠ Ġbinding . game Publisher Box . sub Text . text Ġ= Ġgame Detail . publisher ĊĊĠĠĠĠĠĠĠ Ġbinding . game Release Date Box . title Text . text Ġ= ĠgetString ( R . string . release _ date ) ĊĠĠĠĠĠĠĠ Ġbinding . game Release Date Box . sub Text . text Ġ= Ġgame Detail . release Date ĊĊĠĠĠĠĠĠĠ Ġbinding . game Genre Box . title Text . text Ġ= ĠgetString ( R . string . genre ) ĊĠĠĠĠĠĠĠ Ġbinding . game Genre Box . sub Text . text Ġ= Ġgame Detail . genre ĊĊĠĠĠĠĠĠĠ Ġbinding . game Platform Box . title Text . text Ġ= ĠgetString ( R . string . platform ) ĊĠĠĠĠĠĠĠ Ġbinding . game Platform Box . sub Text . text Ġ= Ġgame Detail . platform ĊĊĠĠĠĠĠĠĠ Ġ// Minimum ĠSystem ĠRequirements Ġsection ĊĠĠĠĠĠĠĠ Ġval Ġunknown Text Ġ= ĠgetString ( R . string . Unknown ) ĊĊĠĠĠĠĠĠĠ Ġbinding . game Os Box . title Text . text Ġ= ĠgetString ( R . string . os ) ĊĠĠĠĠĠĠĠ Ġbinding . game Os Box . sub Text . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Detail . minimum System Requirements . os Ġ?: Ġunknown Text ĊĊĠĠĠĠĠĠĠ Ġbinding . game Memory Box . title Text . text Ġ= ĠgetString ( R . string . memory ) ĊĠĠĠĠĠĠĠ Ġbinding . game Memory Box . sub Text . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Detail . minimum System Requirements . memory Ġ?: Ġunknown Text ĊĊĠĠĠĠĠĠĠ Ġbinding . game Storage Box . title Text . text Ġ= ĠgetString ( R . string . storage ) ĊĠĠĠĠĠĠĠ Ġbinding . game Storage Box . sub Text . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Detail . minimum System Requirements . storage Ġ?: Ġunknown Text ĊĊĠĠĠĠĠĠĠ Ġbinding . game Processor Box . title Text . text Ġ= ĠgetString ( R . string . processor ) ĊĠĠĠĠĠĠĠ Ġbinding . game Processor Box . sub Text . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Detail . minimum System Requirements . processor Ġ?: Ġunknown Text ĊĊĠĠĠĠĠĠĠ Ġbinding . game Graphics Box . title Text . text Ġ= ĠgetString ( R . string . graphics ) ĊĠĠĠĠĠĠĠ Ġbinding . game Graphics Box . sub Text . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Detail . minimum System Requirements . graphics Ġ?: Ġunknown Text ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Game Detail Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Ui () ĊĠĠĠĠĠĠĠ Ġsubscribe Collectors () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ ĠtextView Col lap sing Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDESCRIPTION _ TEXT VIEW _ COLL AP SED _ MAX _ LINE Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDESCRIPTION _ TEXT VIEW _ COLL AP SING _ ANIM ATION _ DURATION Ġ= Ġ 1 0 0 0 L ĊĠĠĠ Ġ} Ċ Ċ }