package Ġcom . sample app Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . mock lets . pl uto . Pl uto Log Ċ import Ġcom . sample app . databinding . Activity Main Binding Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding ĊĠĠĠ Ġprivate Ġval Ġnetwork ViewModel Ġby Ġlazy Ġ{ ĠViewModel Provider ( this ). get ( Network ViewModel :: class . java ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ ĠPl uto Log . v ( TAG _ ACTION , Ġ" MainActivity ĠonCreate ") ĊĠĠĠĠĠĠĠ ĠTest (). java Test () ĊĊĠĠĠĠĠĠĠ Ġhandle API Manage CT As () ĊĠĠĠĠĠĠĠ Ġhandle Exception CT As () ĊĠĠĠĠĠĠĠ Ġhandle Shared Pref CT As () ĊĠĠĠĠĠĠĠ Ġhandle App Properties CT As () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle App Properties CT As () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . app Properties C ta . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave App Properties () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Shared Pref CT As () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . shared Pref C ta . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset SharedPreferences ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Exception CT As () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . exception C ta . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException (" Custom ĠException ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . dead lock C ta . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTesting Thread AN R . test Dead Lock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . sleep C ta . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTesting Thread AN R . test Sleep () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . infinite Loop C ta . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTesting Thread AN R . test Infinite Loop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle API Manage CT As () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . post Call . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl uto Log . event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG _ CLICK , Ġ" post _ call _ cta ", Ġget Attr Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork ViewModel . post () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . get Call . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl uto Log . event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG _ CLICK , Ġ" get _ call _ cta ", Ġget Attr Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork ViewModel . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . xml Call . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl uto Log . event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG _ CLICK , Ġ" xml _ call _ cta ", Ġget Attr Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork ViewModel . xml () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . form Encoded Call . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl uto Log . event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG _ CLICK , Ġ" form _ url _ encoded _ call _ cta ", Ġget Attr Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork ViewModel . form () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ ĠPl uto Log . v ( TAG _ ACTION , Ġ" MainActivity ĠonStart ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠPl uto Log . v ( TAG _ ACTION , Ġ" MainActivity Ġon Resume ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Attr Map (): ĠHashMap < String , ĠAny ?> Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠ Ġ" screen " Ġto Ġ" MainActivity ", ĊĠĠĠĠĠĠĠ Ġ" timestamp " Ġto ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG _ ACTION Ġ= Ġ" action " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG _ CLICK Ġ= Ġ" click _ event " ĊĠĠĠ Ġ} Ċ } Ċ