package Ġorg . db tools . sample . room sqlite . ux Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . db tools . android . room . sqlite org . Sqlite Org Database Util Ċ import Ġorg . db tools . android . room . util . Database Util Ċ import Ġorg . db tools . sample . room sqlite . databinding . Activity Main Binding Ċ import Ġorg . db tools . sample . room sqlite . model . repository . Individual Repository Ċ import Ġtim ber . log . Tim ber Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠCor outine Scope Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding ĊĊĠĠĠ Ġprivate Ġval Ġindividual Repository Ġby Ġlazy Ġ{ ĠIndividual Repository ( application ) Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . Main ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġindividual Repository . init () ĊĊĊĠĠĠĠĠĠĠ Ġbinding . create Button . setOnClickListener Ġ{ Ġinsert Individual () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . update Button . setOnClickListener Ġ{ Ġupdate Last Individual () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . delete Button . setOnClickListener Ġ{ Ġdelete Last Individual () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . show Button . setOnClickListener Ġ{ Ġshow Last Individual Name () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . test Database Repository Button . setOnClickListener Ġ{ Ġtest Database Repository () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . test Room LiveData Button . setOnClickListener Ġ{ Ġtest Room LiveData () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . test Room Flow Button . setOnClickListener Ġ{ Ġtest Room Flow () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . test Merge Database Button . setOnClickListener Ġ{ Ġtest Merge Database () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . log Individual s Button . setOnClickListener Ġ{ Ġindividual Repository . show All Individual s () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . delete All Individual s Button . setOnClickListener Ġ{ Ġindividual Repository . delete All Individual s () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . validate Good Database Button . setOnClickListener Ġ{ Ġtest Validate Good Database () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . validate Bad Database Button . setOnClickListener Ġ{ Ġtest Validate Bad Database () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . test Views Database Button . setOnClickListener Ġ{ Ġtest Views Database () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert Individual () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . add Individual (" J eff ", Ġ" Camp bell ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġindividual Repository . get Individual Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" Individual ĠCount : Ġ$ count ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Last Individual () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Records ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdelete Count Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . delete Last Individual () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( delete Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" Last Ġindividual Ġdeleted ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Last Individual () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġmake Ġsure Ġthere Ġis Ġindividuals ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Records ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . update Last Individual Name () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" Last Ġindividual Ġupdated ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" Failed Ġto Ġfind Ġlast Ġindividual ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Last Individual Name () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġmake Ġsure Ġthere Ġis Ġindividuals ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Records ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfirstName Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġindividual Repository . getLast Individual FirstName () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" Last ĠIndividual ĠFirst ĠName : Ġ$ firstName ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhas Records (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġindividual Repository . find Count () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" No ĠRecords Ġexist ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Database Repository () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . validate Databases () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Room LiveData () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġmake Ġsure Ġthere Ġis Ġindividuals ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Records ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Cannot Ġtest .... Ġno Ġindividuals ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠLive Data ĊĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġindividual Repository . find Number ById LiveData () ĊĊĠĠĠĠĠĠĠ Ġ// ĠOB SER VE Ġand Ġshow Ġlast Ġnumber ĊĠĠĠĠĠĠĠ ĠTim ber . i (" test Room LiveData (): ĠInitial Ġobserve Ġ") ĊĠĠĠĠĠĠĠ Ġlive Data . observe ( this @ MainActivity , ĠObserver Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ?: Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" Last ĠNumber ĠSet : Ġ$ data " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" test Room LiveData (): Ġ$ message Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġmessage , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCHANGE ĠNUMBER ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" test Room LiveData (): Ġchange Ġ# 1 Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Number Ġ= Ġindividual Repository . getLast Individual Number () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . update Last Individual Number ( 5 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠREST ORE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" test Room LiveData (): Ġchange Ġ# 2 Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . update Last Individual Number ( last Number ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Room Flow () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġmake Ġsure Ġthere Ġis Ġindividuals ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Records ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Cannot Ġtest .... Ġno Ġindividuals ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠLive Data ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġindividual Repository . find Number ById Flow () ĊĊĠĠĠĠĠĠĠ Ġ// ĠOB SER VE Ġand Ġshow Ġlast Ġnumber ĊĠĠĠĠĠĠĠ ĠTim ber . i (" test Room Flow (): ĠInitial Ġcollect Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow . collect Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" COLLECT Ġ/ ĠLast ĠNumber ĠSet : Ġ$ data " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" test Room Flow (): Ġ$ message Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġmessage , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCHANGE ĠNUMBER ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" test Room Flow (): Ġchange Ġ# 1 Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Number Ġ= Ġindividual Repository . getLast Individual Number () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . update Last Individual Number ( 5 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠREST ORE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" test Room Flow (): Ġchange Ġ# 2 Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . update Last Individual Number ( last Number ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) Ġ// Ġallow Ġtime Ġfor Ġchange Ġ# 2 Ġshow ĊĊĠĠĠĠĠĠĠ Ġ// Ġcleanup ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Merge Database () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual Repository . merge Databases () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( results . success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Test ĠMerge Ġresults : Ġ${ results . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġresults . message , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Test ĠMerge Ġresults : Ġ${ results . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġresults . message , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Validate Good Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdatabase 1 Ġ= ĠDatabase Util . copy Database From Assets ( this @ MainActivity , Ġ" merge 1 ", Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= ĠSql ite Org Database Util . validate Database File ( database 1 . absolute Path ) ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Database ĠValid : Ġ[$ success ]", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Validate Bad Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdatabase 1 Ġ= ĠDatabase Util . copy Database From Assets ( this @ MainActivity , Ġ" b add b ", Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= ĠSql ite Org Database Util . validate Database File ( database 1 . absolute Path ) ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Database ĠValid : Ġ[$ success ]", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Views Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġindividual Repository . test Views () ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" Views Ġtest Ġcomplete . ĠSuccess Ġ= Ġ$ results ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} Ċ } Ċ