/* Ċ Ġ* Ġ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 Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . appcompat . widget . Search View . On Query Text Listener Ċ import Ġandroidx . appcompat . widget . Share Action Provider Ċ import Ġandroidx . core . app . Share Compat Ċ import Ġandroidx . core . view . MenuItem Compat Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . example . android . u amp . fragments . Media Item Fragment Ċ import Ġcom . example . android . u amp . media . Music Service Ċ import Ġcom . example . android . u amp . utils . Event Ċ import Ġcom . example . android . u amp . utils . Injector Utils Ċ import Ġcom . example . android . u amp . view models . MainActivity ViewModel Ċ import Ġcom . google . android . gms . ads . Ad Request Ċ import Ġcom . google . android . gms . ads . Mobile Ads Ċ import Ġcom . google . android . gms . ads . Request Configuration Ċ import Ġcom . google . android . gms . cast . framework . Cast Button Factory Ċ import Ġcom . google . android . gms . cast . framework . Cast Context ĊĊ Ċ class ĠMainActivity Ġ: ĠDraw er Activity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠMainActivity ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch View : ĠSearch View ĊĊĠĠĠ Ġprivate Ġvar Ġcast Context : ĠCast Context ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġshare Action Provider : ĠShare Action Provider ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Theme ( R . style . App Theme ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġthe ĠCast Ġcontext . ĠThis Ġis Ġrequired Ġso Ġthat Ġthe Ġmedia Ġroute Ġbutton Ġcan Ġbe ĊĠĠĠĠĠĠĠ Ġ// Ġcreated Ġin Ġthe ĠApp Bar ĊĠĠĠĠĠĠĠ Ġcast Context Ġ= ĠCast Context . get Shared Instance ( this ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġset Toolbar () ĊĠĠĠĠĠĠĠ Ġset Search View () ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġthe ĠMobile ĠA ds ĠSDK . ĊĠĠĠĠĠĠĠ Ġinitialize Mobile Ads () ĊĠĠĠĠĠĠĠ Ġset Mobile Ads Config () ĊĊĠĠĠĠĠĠĠ Ġdrawer Layout Ġ= ĠfindViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠ Ġnavigation View Ġ= ĠfindViewById ( R . id . nav _ view ) ĊĠĠĠĠĠĠĠ Ġset Navigation View () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSince ĠU AMP Ġis Ġa Ġmusic Ġplayer , Ġthe Ġvolume Ġcontrols Ġshould Ġadjust Ġthe Ġmusic Ġvolume Ġwhile ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġapp . ĊĠĠĠĠĠĠĠ Ġvolume Control Stream Ġ= ĠAudio Manager . STREAM _ M US IC ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠInject or Utils . provide MainActivity ViewModel ( this ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( MainActivity ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOb serve Ġ[ MainActivity ViewModel . navigate To Fragment ] Ġfor Ġ[ Event ] s Ġthat Ġrequest Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġfragment Ġswap . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠviewModel . navigate To Fragment . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. getContent IfNot Handled ()?. let Ġ{ Ġfragment Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . fragment Container , Ġfragment Request . fragment , Ġfragment Request . tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment Request . back Stack ) Ġtransaction . addTo Back Stack ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOb serve Ġchanges Ġto Ġthe Ġ[ MainActivity ViewModel . root Media Id ]. ĠWhen Ġthe Ġapp Ġstarts , ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġthe ĠUI Ġconnects Ġto Ġ[ Music Service ], Ġthis Ġwill Ġbe Ġupdated Ġand Ġthe Ġapp Ġwill Ġshow ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġinitial Ġlist Ġof Ġmedia Ġitems . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠviewModel . root Media Id . observe ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver < String > Ġ{ Ġroot Media Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Media Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Media Item ( root Media Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOb serve Ġ[ MainActivity ViewModel . navigate To Media Item ] Ġfor Ġ[ Event ] s Ġindicating ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġuser Ġhas Ġrequested Ġto Ġbrowse Ġto Ġa Ġdifferent Ġ[ Media Item Data ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠviewModel . navigate To Media Item . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. getContent IfNot Handled ()?. let Ġ{ Ġmedia Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Media Item ( media Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . clear Focus Search . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch View . clear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Keyboard ( search View ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġset Navigation ItemSelected ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġdismiss Keyboard ( search View ) ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . search Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Icon ified Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . toolbar _ menu , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . share ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Action Provider Ġ= ĠMenuItem Compat . getAction Provider ( it ) Ġas ĠShare Action Provider ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠShare Compat . Intent Builder . from ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType (" text / plain "). setText ( Build Config . URL _ TO _ SHARE ). intent ĊĠĠĠĠĠĠĠ Ġshare Action Provider ?. set Share Intent ( share Intent ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġup Ġa ĠMedia Route Button Ġto Ġallow Ġthe Ġuser Ġto Ġcontrol Ġthe Ġcurrent Ġmedia Ġplayback Ġroute ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠCast Button Factory . setUp Media Route Button ( application Context , Ġmenu , ĠR . id . media _ route ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Media Item ( media Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfragment : ĠMedia Item Fragment ? Ġ= Ġget Browse Fragment ( media Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= ĠMedia Item Fragment . newInstance ( media Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġis Ġnot Ġthe Ġtop Ġlevel Ġmedia Ġ( root ), Ġwe Ġadd Ġit Ġto Ġthe Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġback Ġstack , Ġso Ġthat Ġaction bar Ġtoggle Ġand ĠBack Ġwill Ġwork Ġappropriately : ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . show Fragment ( fragment , Ġ! is Root Id ( media Id ), Ġmedia Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Root Id ( media Id : ĠString ) Ġ= Ġmedia Id Ġ== ĠviewModel . root Media Id . value ĊĊĠĠĠ Ġprivate Ġfun Ġget Browse Fragment ( media Id : ĠString ): ĠMedia Item Fragment ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsupport FragmentManager . find Fragment By Tag ( media Id ) Ġas ĠMedia Item Fragment ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Mobile Ads () Ġ= ĠMobile Ads . initialize ( this ) Ġ{} ĊĊĠĠĠ Ġprivate Ġfun Ġset Mobile Ads Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġyour Ġtest Ġdevices . ĠCheck Ġyour Ġlog cat Ġoutput Ġfor Ġthe Ġhashed Ġdevice ĠID Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġtest Ġads Ġon Ġa Ġphysical Ġdevice . Ġe . g . ĊĠĠĠĠĠĠĠ Ġ// Ġ" Use ĠRequest Configuration . Builder (). set Test Device Ids ( Arrays . asList (" ABCDEF 0 1 2 3 4 5 ")) ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġget Ġtest Ġads Ġon Ġthis Ġdevice ." ĊĠĠĠĠĠĠĠ ĠMobile Ads . setRequest Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Configuration . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Test Device Ids ( listOf ( Ad Request . DEVICE _ ID _ EM UL ATOR )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Search View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch View Ġ= ĠfindViewById ( R . id . search View ) ĊĠĠĠĠĠĠĠ Ġsearch View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Query Text Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Search Query Changed ( new Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Keyboard ( this @ apply ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġfocus Ġon Ġthe ĠSearch View Ġand Ġopen Ġthe Ġkeyboard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Query Text Focus ChangeListener Ġ{ Ġview , Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Keyboard ( view . find Focus ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Close Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Close Listener Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Keyboard ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġview . context . getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠ Ġimm . show Soft Input ( view , ĠInput Method Manager . SHOW _ FOR CED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdismiss Keyboard ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġview . context . getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠ Ġimm . hide Soft Input From Window ( view . window Token , Ġ 0 ) ĊĠĠĠ Ġ} Ċ } Ċ