package Ġcom . l uk as le ch ner . coroutine use case son android . use cases . coroutines . use case 7 Ċ Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . l uk as le ch ner . coroutine use case son android . base . Base ViewModel Ċ import Ġcom . l uk as le ch ner . coroutine use case son android . mock . Mock Api Ċ import Ġkotlinx . coroutines .* Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠTimeout And Retry ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġapi : ĠMock Api Ġ= Ġmock Api () Ċ ) Ġ: ĠBase ViewModel < Ui State >() Ġ{ ĊĊĠĠĠ Ġfun Ġperform Network Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Loading ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Retries Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġtimeout Ġ= Ġ 1 0 0 0 L ĊĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġapi . get Android Version Features ( 2 7 ) Ġand Ġapi . get Android Version Features ( 2 8 ) Ġin Ġparallel ĊĠĠĠĠĠĠĠ Ġval Ġdeferred 1 Ġ= ĠviewModel Scope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry WithTimeout ( numberOf Retries , Ġtimeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Android Version Features ( 2 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdeferred 2 Ġ= ĠviewModel Scope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry WithTimeout ( numberOf Retries , Ġtimeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Android Version Features ( 2 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversions Ġ= ĠlistOf ( deferred 1 , Ġdeferred 2 ). await All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Success ( versions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Error (" Network ĠRequest Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T > Ġretry WithTimeout ( numberOf Retries : ĠInt , Ġtimeout : ĠLong , Ġblock : Ġsuspend Ġ() Ġ-> ĠT ) Ġ= Ġretry ( numberOf Retries ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Timeout ( timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T > Ġretry ( times : ĠInt , Ġinitial Delay Millis : ĠLong Ġ= Ġ 1 0 0 , Ġblock : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( times ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( initial Delay Millis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġblock () Ġ// Ġlast Ġattempt ĊĠĠĠ Ġ} Ċ }