package Ġco . yel lo . db . batch inser ts ample Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . Receive Channel Ċ import Ġkotlinx . coroutines . channels . produce Ċ import Ġkotlin . system . measure Time Millis Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . TextView . On Editor ActionListener ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ// ĠA Ġjob Ġthat Ġjust Ġtracks Ġthe Ġdatabase Ġinserts . ĠWhen Ġthe Ġmain Scope Job Ġis Ġcancelled Ġit Ġwill Ġmake Ġthe Ġscope Ġun usable ĊĠĠĠ Ġ// Ġso Ġwe Ġneed Ġthis Ġindependent Ġjob Ġto Ġbe Ġable Ġto Ġstart Ġand Ġstop Ġthe Ġinserts Ġwithout Ġstopping Ġall Ġfuture Ġinserts . ĊĠĠĠ Ġprivate Ġvar Ġdb Insert Job Ġ= ĠJob () ĊĠĠĠ Ġ// ĠThis Ġjob Ġis Ġa Ġparent Ġjob Ġfor Ġall Ġjobs Ġran Ġwithin Ġthe Ġmain Scope . ĠWhen Ġthis Ġis Ġcancelled Ġall Ġchildren Ġare Ġalso ĊĠĠĠ Ġ// Ġcancelled ĊĠĠĠ Ġprivate Ġval Ġmain Scope Job : ĠJob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġmain Scope Ġ= ĠCor outine Scope ( main Scope Job Ġ+ ĠDispatch ers . Main ) ĊĊĠĠĠ Ġprivate Ġval Ġdatabase Helper : ĠSQLite Helper Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSQLite Helper ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġdo Insert Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Inser ts () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrow Count . setOn Editor ActionListener ( object Ġ: ĠOn Editor ActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Editor Action ( v : ĠTextView , Ġaction Id : ĠInt , Ġevent : ĠKeyEvent ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event ?. keyCode Ġ== ĠKeyEvent . KEYCODE _ ENTER Ġ|| Ġaction Id Ġ== ĠEditor Info . IME _ ACTION _ DONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Inser ts () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Inser ts () Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate And Run ( rowCount . text . toString (). if Blank Ġ{ Ġ" 0 " Ġ}. toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġmain Scope Job . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġfunction Ġto Ġgenerate Ġa Ġlist Ġof Ġ[ Medium Size Object ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcount Ġthe Ġnumber Ġof Ġobjects Ġto Ġput Ġin Ġthe Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Medium Objects ( count : ĠInt ): ĠList < Medium Size Object > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠgetString ( R . string . static _ text ) ĊĠĠĠĠĠĠĠ Ġval Ġmore Text Ġ= ĠgetString ( R . string . more _ static _ text ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( 1 .. count ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedium Size Object ( it , Ġtext , Ġmore Text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert Items ( items : ĠList < Medium Size Object >) Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġ" Starting Ġindividual Ġinsertion Ġexecution .") ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Int >( Channel . CON FL ATED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Helper . loop Insert ( channel , Ġitems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Pipeline Ġ= Ġcalc Progress ( channel , Ġinserts Per One Percent ( items . size )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( progress Ġin Ġprogress Pipeline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle _ time . text Ġ= ĠgetString ( R . string . progress _ percentage , Ġprogress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexecution Time Ġ= Ġtime / 1 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġsingle _ time . text Ġ= ĠgetString ( R . string . single _ insert _ Time , Ġexecution Time ) ĊĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġ" Finished Ġindividual Ġinsertion Ġexecution Ġin Ġ$ execution Time Ġseconds .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġbatch Insert Items ( items : ĠList < Medium Size Object >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġ" Starting Ġbatch Ġinsertion Ġexecution .") ĊĠĠĠĠĠĠĠ Ġbatch _ time . text Ġ= ĠgetString ( R . string . inser ting ) ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Helper . batch Insert ( items ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexecution Time Ġ= Ġtime / 1 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġbatch _ time . text Ġ= ĠgetString ( R . string . batch _ insert _ time , Ġexecution Time ) ĊĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġ" Finished Ġbatch Ġinsertion Ġexecution Ġin Ġ$ execution Time Ġseconds .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate And Run ( size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsertion Count Text . text Ġ= Ġresources . get Quantity String ( R . plurals . inser ting _ medium _ objects , Ġsize , Ġsize ) ĊĊĠĠĠĠĠĠĠ Ġbatch _ time . text Ġ= ĠgetString ( R . string . waiting _ to _ start ) ĊĠĠĠĠĠĠĠ Ġsingle _ time . text Ġ= ĠgetString ( R . string . waiting _ to _ start ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġclears Ġout Ġpotential Ġexisting Ġtransactions Ġto Ġrestart Ġthe ĠSQLite Ġbatch Ġinsertion Ġjob ĊĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġ" Cancel Ġ$ db Insert Job ") ĊĠĠĠĠĠĠĠ Ġdb Insert Job . cancel () ĊĊĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġ" Clear ing ĠDatabase ") ĊĠĠĠĠĠĠĠ Ġdatabase Helper . clear Db () ĊĊĠĠĠĠĠĠĠ Ġdb Insert Job Ġ= Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġcreate Medium Objects ( size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Items ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Insert Items ( list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinserts Per One Percent ( total Count : ĠInt ) Ġ= Ġif Ġ( total Count Ġ<= Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtotal Count Ġ/ Ġ 1 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġtag Ġ= Ġ" Batch ĠInsert ĠDemo " ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Cor outines Api Ċ fun ĠCor outine Scope . calc Progress ( ĊĠĠĠ Ġinsert Count Channel : ĠReceive Channel < Int >, ĊĠĠĠ Ġmodulo Value : ĠInt Ċ ): ĠReceive Channel < Int > Ġ= Ġproduce Ġ{ ĊĠĠĠ Ġfor Ġ( count Ġin Ġinsert Count Channel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( count . rem ( modulo Value ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( count Ġ/ Ġmodulo Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ