/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠGoogle ĠInc . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . example . android . u amp . fragments Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . example . android . u amp . Media Item Data Ċ import Ġcom . example . android . u amp . R Ċ import Ġcom . example . android . u amp . ads . Ad Media Item Adapter Ċ import Ġcom . example . android . u amp . databinding . Fragment Media item List Binding Ċ import Ġcom . example . android . u amp . utils . Injector Utils Ċ import Ġcom . example . android . u amp . view models . MainActivity ViewModel Ċ import Ġcom . example . android . u amp . view models . Media Item Fragment ViewModel Ċ import Ġcom . google . android . gms . ads . Ad Listener Ċ import Ġcom . google . android . gms . ads . Ad Loader Ċ import Ġcom . google . android . gms . ads . Ad Request Ċ import Ġcom . google . android . gms . ads . Inter stitial Ad Ċ Ċ /** Ċ Ġ* ĠA Ġfragment Ġrepresenting Ġa Ġlist Ġof ĠMedia Items . Ċ Ġ*/ Ċ class ĠMedia Item Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Id : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmain Activity ViewModel : ĠMainActivity ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Item Fragment ViewModel : ĠMedia Item Fragment ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Media item List Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinter stitial Ad : ĠInter stitial Ad ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclicked Item : ĠMedia Item Data ĊĊĠĠĠ Ġprivate Ġval Ġlist Adapter Ġ= ĠAd Media Item Adapter Ġ{ Ġclicked Item Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . clicked Item Ġ= Ġclicked Item ĊĠĠĠĠĠĠĠ Ġif Ġ(:: inter stitial Ad . isInitialized Ġ&& Ġinter stitial Ad . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter stitial Ad . show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Next Screen () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( media Id : ĠString ): ĠMedia Item Fragment Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMedia Item Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( MEDIA _ ID _ ARG , Ġmedia Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Media item List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġtrue , Ġbut Ġlets Ġlint Ġknow Ġthat Ġas Ġwell . ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġactivity Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġmedia Id Ġ= Ġarguments ?. getString ( MEDIA _ ID _ ARG ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġmain Activity ViewModel Ġ= ĠViewModel Providers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of ( context , ĠInject or Utils . provide MainActivity ViewModel ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( MainActivity ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġmedia Item Fragment ViewModel Ġ= ĠViewModel Providers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of ( this , ĠInject or Utils . provide Media Item Fragment ViewModel ( context , Ġmedia Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Media Item Fragment ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġmedia Item Fragment ViewModel . media Items . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loading Spinner . visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list ?. isNotEmpty () Ġ== Ġtrue ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . setData ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġmedia Item Fragment ViewModel . network Error . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . network Error . visibility Ġ= Ġif Ġ( error ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loading Spinner . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġmain Activity ViewModel . search Query . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġquery Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Item Fragment ViewModel . search ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġadapter ĊĠĠĠĠĠĠĠ Ġbinding . list . adapter Ġ= Ġlist Adapter ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe ĠInter stitial Ad Ġand Ġset Ġit Ġup . ĊĠĠĠĠĠĠĠ Ġif Ġ(( 0 .. 9 ). random () Ġ> Ġ 8 ) Ġcreate Inter stitial Ad () ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠNative Ad ĊĠĠĠĠĠĠĠ Ġcreate Native Ad () ĊĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġfocus ĊĠĠĠĠĠĠĠ Ġmain Activity ViewModel . clear Search Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġlist Adapter . destroy Native Ad () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Inter stitial Ad () Ġ{ ĊĠĠĠĠĠĠĠ Ġinter stitial Ad Ġ= ĠInter stitial Ad ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Unit Id Ġ= ĠgetString ( R . string . inter _ media _ item _ ad _ unit _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Listener Ġ= Ġ( object Ġ: ĠAd Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Loaded () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Failed To Load ( errorCode : ĠInt ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Closed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Next Screen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Ad ( Ad Request . Builder (). build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Native Ad () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAd Loader . Builder ( context , ĠgetString ( R . string . native _ media _ item _ ad _ unit _ id )) ĊĠĠĠĠĠĠĠ Ġbuilder . for Unified Native Ad Ġ{ Ġunified Native Ad Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn Unified Native Ad Loaded Listener Ġimplementation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġcallback Ġoccurs Ġafter Ġthe Ġactivity Ġis Ġdestroyed , Ġyou Ġmust Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdestroy Ġand Ġreturn Ġor Ġyou Ġmay Ġget Ġa Ġmemory Ġleak . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity ?. is Destroyed Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunified Native Ad . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ for Unified Native Ad ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠYou Ġmust Ġcall Ġdestroy Ġon Ġold Ġads Ġwhen Ġyou Ġare Ġdone Ġwith Ġthem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġyou Ġwill Ġhave Ġa Ġmemory Ġleak . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . destroy Native Ad () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . set Native Ad ( unified Native Ad ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġad Loader Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠ Ġad Loader . load Ad ( Ad Request . Builder (). build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Next Screen () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Activity ViewModel . media Item Clicked ( clicked Item ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠMED IA _ ID _ ARG Ġ= Ġ" com . example . android . u amp . fragments . Media Item Fragment . MEDIA _ ID " Ċ private Ġconst Ġval ĠINTER _ AD _ UNIT _ ID Ġ= Ġ" ca - app - pub - 3 9 4 0 2 5 6 0 9 9 9 4 2 5 4 4 / 1 0 3 3 1 7 3 7 1 2 " Ċ private Ġconst Ġval ĠN ATIVE _ AD _ UNIT _ ID Ġ= Ġ" ca - app - pub - 3 9 4 0 2 5 6 0 9 9 9 4 2 5 4 4 / 2 2 4 7 6 9 6 1 1 0 " Ċ