package Ġcom . example . flow playground Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . view pager . widget . ViewPager Ċ import Ġcom . example . flow playground . repo . Animal Ċ import Ġcom . example . flow playground . repo . App Database Ċ import Ġcom . example . flow playground . repo . Database Holder Ċ import Ġcom . example . flow playground . ui . Add Animal Dialog Ċ import Ġcom . example . flow playground . ui . main . Sections Pager Adapter Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . google . android . material . tabs . Tab Layout Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠMainActivity ViewModel Factory ( ĊĠĠĠ Ġprivate Ġval Ġdb : ĠApp Database Ċ ) Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( MainActivity ViewModel :: class . java . isAssignableFrom ( model Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Class . get Constructor ( App Database :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newInstance ( db ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Cannot Ġcreate Ġan Ġinstance Ġof Ġ$ model Class ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMainActivity ViewModel ( ĊĠĠĠ Ġval Ġdb : ĠApp Database Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġadd Animal ( name : ĠString , Ġcut eness : ĠInt , Ġb ark Volume : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . animal Dao (). add ( Animal ( name , Ġcut eness , Ġb ark Volume )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMainActivity ViewModel Ġby Ġview Models Ġ{ ĊĠĠĠĠĠĠĠ ĠMainActivity ViewModel Factory ( Database Holder . get Database ( application )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġthe Ġlazy Ġevaluation Ġhappen Ġso Ġthat Ġit 's Ġready Ġfor Ġthe Ġfragments ĊĠĠĠĠĠĠĠ ĠviewModel . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġview Pager : ĠView Pager Ġ= ĠfindViewById < ViewPager >( R . id . view _ pager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠSe ctions Pager Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . resources :: getString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠfindViewById < Tab Layout >( R . id . tabs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setup With ViewPager ( view Pager ) ĊĊĠĠĠĠĠĠĠ ĠfindViewById < Floating ActionButton >( R . id . fab ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOnClickListener Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Dog Dialog Ġ= ĠAdd Animal Dialog ( view . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( view . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( add Dog Dialog . view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" Save ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . add Animal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Dog Dialog . getName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Dog Dialog . getC ut eness (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Dog Dialog . getB ark Volume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button (" Cancel ") Ġ{ Ġdialog , Ġ_ Ġ-> Ġdialog . cancel () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }