gitextract_70x6tywz/ ├── .gitignore ├── .idea/ │ ├── .gitignore │ ├── .name │ ├── compiler.xml │ ├── jarRepositories.xml │ └── misc.xml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md └── application/ ├── .idea/ │ ├── .gitignore │ ├── .name │ ├── compiler.xml │ ├── gradle.xml │ ├── jarRepositories.xml │ ├── misc.xml │ └── modules.xml ├── KotlinConcepts/ │ ├── .gitignore │ ├── .idea/ │ │ ├── .gitignore │ │ ├── .name │ │ ├── appInsightsSettings.xml │ │ ├── compiler.xml │ │ ├── deploymentTargetDropDown.xml │ │ ├── deploymentTargetSelector.xml │ │ ├── gradle.xml │ │ ├── inspectionProfiles/ │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ ├── material_theme_project_new.xml │ │ ├── migrations.xml │ │ ├── misc.xml │ │ ├── other.xml │ │ └── runConfigurations.xml │ ├── app/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── istudio/ │ │ │ └── app/ │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets/ │ │ │ │ └── stockdata.csv │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── istudio/ │ │ │ │ └── app/ │ │ │ │ ├── application/ │ │ │ │ │ └── CurrentApplication.kt │ │ │ │ ├── data/ │ │ │ │ │ └── mock/ │ │ │ │ │ ├── FlowMockApi.kt │ │ │ │ │ ├── FlowMockData.kt │ │ │ │ │ └── MockNetworkInterceptor.kt │ │ │ │ ├── main/ │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ └── MainViewModel.kt │ │ │ │ ├── modules/ │ │ │ │ │ ├── module_demos/ │ │ │ │ │ │ ├── basic_fundamentals/ │ │ │ │ │ │ │ ├── ui/ │ │ │ │ │ │ │ │ ├── KotlinBasicsDemo.kt │ │ │ │ │ │ │ │ └── KotlinBasicsDemoVm.kt │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── Student.kt │ │ │ │ │ │ │ └── multipleInheritance/ │ │ │ │ │ │ │ ├── in_java/ │ │ │ │ │ │ │ │ └── InJava.java │ │ │ │ │ │ │ └── in_kotlin/ │ │ │ │ │ │ │ └── InKotlin.kt │ │ │ │ │ │ ├── channels/ │ │ │ │ │ │ │ ├── ChannelsDemo.kt │ │ │ │ │ │ │ └── ChannelsDemoVm.kt │ │ │ │ │ │ ├── coroutines/ │ │ │ │ │ │ │ ├── CoroutinesDemo.kt │ │ │ │ │ │ │ ├── CoroutinesDemoVm.kt │ │ │ │ │ │ │ ├── compare_join_and_async/ │ │ │ │ │ │ │ │ ├── CompareJoinAsyncDemo.kt │ │ │ │ │ │ │ │ └── CompareJoinAsyncDemoVm.kt │ │ │ │ │ │ │ ├── coroutine_cancellation/ │ │ │ │ │ │ │ │ ├── CoroutinesCancellationSelection.kt │ │ │ │ │ │ │ │ ├── ensure_active_demo/ │ │ │ │ │ │ │ │ │ ├── EnsureActiveDemo.kt │ │ │ │ │ │ │ │ │ └── EnsureActiveDemoVm.kt │ │ │ │ │ │ │ │ ├── is_active_demo/ │ │ │ │ │ │ │ │ │ ├── IsActiveDemo.kt │ │ │ │ │ │ │ │ │ └── IsActiveDemoVm.kt │ │ │ │ │ │ │ │ ├── non_cancellable_job/ │ │ │ │ │ │ │ │ │ ├── NonCancellableDemo.kt │ │ │ │ │ │ │ │ │ └── NonCancellableDemoVm.kt │ │ │ │ │ │ │ │ └── root_children_cencel_demo/ │ │ │ │ │ │ │ │ ├── RootChildrenCancelDemo.kt │ │ │ │ │ │ │ │ └── RootChildrenCancelDemoVm.kt │ │ │ │ │ │ │ ├── dispatchers/ │ │ │ │ │ │ │ │ ├── DispatchersDemo.kt │ │ │ │ │ │ │ │ └── DispatchersDemoVm.kt │ │ │ │ │ │ │ ├── exception_handeling/ │ │ │ │ │ │ │ │ ├── ExceptionHandlingSelectionDemo.kt │ │ │ │ │ │ │ │ ├── using_async/ │ │ │ │ │ │ │ │ │ ├── UsingAsyncExceptionHandleDemo.kt │ │ │ │ │ │ │ │ │ └── UsingAsyncExceptionHandleDemoVm.kt │ │ │ │ │ │ │ │ └── using_launch/ │ │ │ │ │ │ │ │ ├── UsingLaunchExceptionHandleDemo.kt │ │ │ │ │ │ │ │ └── UsingLaunchExceptionHandleDemoVm.kt │ │ │ │ │ │ │ ├── job/ │ │ │ │ │ │ │ │ ├── JobDemoSelection.kt │ │ │ │ │ │ │ │ └── JobDemoSelectionVm.kt │ │ │ │ │ │ │ ├── launch_and_withcontext/ │ │ │ │ │ │ │ │ ├── LaunchAndWithContextDemo.kt │ │ │ │ │ │ │ │ └── LaunchAndWithContextDemoVm.kt │ │ │ │ │ │ │ ├── simple_structured_concurrency/ │ │ │ │ │ │ │ │ ├── SimpleStructuredConcurrencyDemo.kt │ │ │ │ │ │ │ │ └── SimpleStructuredConcurrencyDemoVm.kt │ │ │ │ │ │ │ ├── suspend_and_launch_demo/ │ │ │ │ │ │ │ │ ├── NonCancellableDemoVm.kt │ │ │ │ │ │ │ │ └── SuspendAndLaunchDemo.kt │ │ │ │ │ │ │ ├── using_async_await/ │ │ │ │ │ │ │ │ ├── UsingAsyncAwaitDemo.kt │ │ │ │ │ │ │ │ └── UsingAsyncAwaitDemoVm.kt │ │ │ │ │ │ │ └── using_join/ │ │ │ │ │ │ │ ├── UsingJoinDemo.kt │ │ │ │ │ │ │ └── UsingJoinDemoVm.kt │ │ │ │ │ │ ├── flows/ │ │ │ │ │ │ │ ├── FlowsDemo.kt │ │ │ │ │ │ │ ├── FlowsDemoVm.kt │ │ │ │ │ │ │ └── modules/ │ │ │ │ │ │ │ ├── collect_as_state_with_lifecycle/ │ │ │ │ │ │ │ │ ├── CollectAsStateWithLifeCycleDemo.kt │ │ │ │ │ │ │ │ └── CollectAsStateWithLifeCycleVm.kt │ │ │ │ │ │ │ ├── compose_and_flatten_flows/ │ │ │ │ │ │ │ │ ├── ComposeAndFlattenFlows.kt │ │ │ │ │ │ │ │ └── ComposeAndFlattenFlowsVm.kt │ │ │ │ │ │ │ ├── flatten_flows/ │ │ │ │ │ │ │ │ ├── FlattenFlowsDemo.kt │ │ │ │ │ │ │ │ └── FlattenFlowsDemoVm.kt │ │ │ │ │ │ │ ├── flow_basics/ │ │ │ │ │ │ │ │ ├── chapters/ │ │ │ │ │ │ │ │ │ └── display_data_from_server/ │ │ │ │ │ │ │ │ │ ├── DisplayDataFromServerDemo.kt │ │ │ │ │ │ │ │ │ ├── DisplayDataFromServerVm.kt │ │ │ │ │ │ │ │ │ └── composables/ │ │ │ │ │ │ │ │ │ └── StockItem.kt │ │ │ │ │ │ │ │ ├── data/ │ │ │ │ │ │ │ │ │ ├── StockData.kt │ │ │ │ │ │ │ │ │ ├── StockPriceDataSource.kt │ │ │ │ │ │ │ │ │ └── api/ │ │ │ │ │ │ │ │ │ └── MockApiBehavior.kt │ │ │ │ │ │ │ │ ├── state/ │ │ │ │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ │ │ │ └── ui/ │ │ │ │ │ │ │ │ ├── FlowBasics.kt │ │ │ │ │ │ │ │ └── FlowBasicsVm.kt │ │ │ │ │ │ │ ├── intermediate_operators/ │ │ │ │ │ │ │ │ ├── IntermediateOperators.kt │ │ │ │ │ │ │ │ └── IntermediateOperatorsVm.kt │ │ │ │ │ │ │ ├── mutable_state_of_flow/ │ │ │ │ │ │ │ │ ├── MutableStateOfFlowDemo.kt │ │ │ │ │ │ │ │ └── MutableStateOfFlowDemoVm.kt │ │ │ │ │ │ │ ├── state_and_shared_flows/ │ │ │ │ │ │ │ │ ├── StateAndSharedFlowsDemo.kt │ │ │ │ │ │ │ │ └── StateAndSharedFlowsDemoVm.kt │ │ │ │ │ │ │ └── terminal_operators/ │ │ │ │ │ │ │ ├── TerminalOperators.kt │ │ │ │ │ │ │ └── TerminalOperatorsVm.kt │ │ │ │ │ │ ├── higher_order_functions/ │ │ │ │ │ │ │ └── ui/ │ │ │ │ │ │ │ ├── HigherOrderFunctionDemo.kt │ │ │ │ │ │ │ └── HigherOrderFunctionDemoVm.kt │ │ │ │ │ │ ├── kotlin_annotations/ │ │ │ │ │ │ │ ├── ui/ │ │ │ │ │ │ │ │ ├── KotlinAnnotationsDemoVm.kt │ │ │ │ │ │ │ │ └── kotlinAnnotationsDemo.kt │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── jvmField/ │ │ │ │ │ │ │ │ ├── JavaPerson.java │ │ │ │ │ │ │ │ ├── KotlinPerson.kt │ │ │ │ │ │ │ │ └── init/ │ │ │ │ │ │ │ │ ├── JavaInstanceJf.java │ │ │ │ │ │ │ │ └── KotlinInstanceJf.kt │ │ │ │ │ │ │ ├── jvmOverloads/ │ │ │ │ │ │ │ │ ├── Student1.kt │ │ │ │ │ │ │ │ ├── Student2.kt │ │ │ │ │ │ │ │ └── init/ │ │ │ │ │ │ │ │ ├── JavaInstanceJo.java │ │ │ │ │ │ │ │ └── KotlinInstanceJo.kt │ │ │ │ │ │ │ ├── jvmstatic/ │ │ │ │ │ │ │ │ ├── Cinema.kt │ │ │ │ │ │ │ │ └── init/ │ │ │ │ │ │ │ │ ├── JavaInstanceJs.java │ │ │ │ │ │ │ │ └── KotlinInstanceJs.kt │ │ │ │ │ │ │ ├── nullableAndNotNull/ │ │ │ │ │ │ │ │ └── SuperHero.java │ │ │ │ │ │ │ ├── stringDef/ │ │ │ │ │ │ │ │ ├── UserManager.kt │ │ │ │ │ │ │ │ └── UserStatus.kt │ │ │ │ │ │ │ └── stringRes/ │ │ │ │ │ │ │ ├── HomeNavItem.kt │ │ │ │ │ │ │ └── init/ │ │ │ │ │ │ │ ├── JavaInstanceSr.java │ │ │ │ │ │ │ └── KotlinInstanceSr.kt │ │ │ │ │ │ ├── nested_vs_inner/ │ │ │ │ │ │ │ ├── ui/ │ │ │ │ │ │ │ │ ├── NestedVsInner.kt │ │ │ │ │ │ │ │ └── NestedVsInnerVm.kt │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ └── OuterClass.kt │ │ │ │ │ │ ├── sealed_class/ │ │ │ │ │ │ │ ├── ui/ │ │ │ │ │ │ │ │ ├── SealedClassDemo.kt │ │ │ │ │ │ │ │ └── SealedClassDemoVm.kt │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── Student/ │ │ │ │ │ │ │ │ └── Student.kt │ │ │ │ │ │ │ ├── animals/ │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Monkey.kt │ │ │ │ │ │ │ │ └── Tiger.kt │ │ │ │ │ │ │ ├── payment/ │ │ │ │ │ │ │ │ └── Payment.kt │ │ │ │ │ │ │ └── superHero/ │ │ │ │ │ │ │ ├── Hero.kt │ │ │ │ │ │ │ └── Payment.kt │ │ │ │ │ │ └── type_alias/ │ │ │ │ │ │ ├── ui/ │ │ │ │ │ │ │ ├── TypeAlias.kt │ │ │ │ │ │ │ └── TypeAliasVm.kt │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ └── TypeAliasReferences.kt │ │ │ │ │ ├── module_exercises/ │ │ │ │ │ │ ├── ExerciseSelection.kt │ │ │ │ │ │ ├── exercise_1/ │ │ │ │ │ │ │ ├── Exercise1.kt │ │ │ │ │ │ │ └── Exercise1vm.kt │ │ │ │ │ │ └── exercise_2/ │ │ │ │ │ │ ├── Exercise2.kt │ │ │ │ │ │ └── Exercise2vm.kt │ │ │ │ │ └── module_selection/ │ │ │ │ │ ├── ModuleDemo.kt │ │ │ │ │ └── ModuleSelectionScreen.kt │ │ │ │ ├── ui/ │ │ │ │ │ ├── composables/ │ │ │ │ │ │ ├── Buttons.kt │ │ │ │ │ │ └── Text.kt │ │ │ │ │ └── theme/ │ │ │ │ │ ├── Color.kt │ │ │ │ │ ├── Shape.kt │ │ │ │ │ ├── Theme.kt │ │ │ │ │ └── Type.kt │ │ │ │ └── utils/ │ │ │ │ ├── base/ │ │ │ │ │ └── BaseViewModel.kt │ │ │ │ ├── endpoints/ │ │ │ │ │ └── EndPointSimulation.kt │ │ │ │ ├── extensions/ │ │ │ │ │ ├── Activity.kt │ │ │ │ │ └── Coroutine.kt │ │ │ │ └── log/ │ │ │ │ └── ThreadInfoLogger.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── themes.xml │ │ │ └── xml/ │ │ │ ├── backup_rules.xml │ │ │ └── data_extraction_rules.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── istudio/ │ │ └── app/ │ │ └── ExampleUnitTest.kt │ ├── build.gradle.kts │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle.kts └── Sample-Coroutines/ ├── .idea/ │ ├── .name │ ├── compiler.xml │ ├── deploymentTargetDropDown.xml │ ├── deploymentTargetSelector.xml │ ├── gradle.xml │ ├── kotlinc.xml │ ├── material_theme_project_new.xml │ ├── migrations.xml │ ├── misc.xml │ ├── modules.xml │ ├── other.xml │ └── workspace.xml ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── demo/ │ │ └── code/ │ │ └── ExampleInstrumentedTest.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── demo/ │ │ │ └── code/ │ │ │ ├── CoroutineUsecasesOnAndroidApplication.kt │ │ │ ├── activities/ │ │ │ │ ├── JobsActivity.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── SelectionActivity.kt │ │ │ │ └── SuspendingFuncActivity.kt │ │ │ ├── base/ │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── BaseViewModel.kt │ │ │ │ ├── UseCase.kt │ │ │ │ ├── UseCaseActivity.kt │ │ │ │ ├── UseCaseAdapter.kt │ │ │ │ └── UseCaseCategoryAdapter.kt │ │ │ ├── mock/ │ │ │ │ ├── MockAnalyticsApi.kt │ │ │ │ ├── MockApi.kt │ │ │ │ └── MockData.kt │ │ │ ├── modules/ │ │ │ │ ├── legacycode/ │ │ │ │ │ ├── LegacyCallbackSampleOne.kt │ │ │ │ │ ├── LegacyCallbackSampleTwo.kt │ │ │ │ │ └── User.kt │ │ │ │ ├── observabletypes/ │ │ │ │ │ ├── ObservableTypesActivity.kt │ │ │ │ │ └── ObservableTypesViewModel.kt │ │ │ │ └── placeholder │ │ │ ├── playground/ │ │ │ │ ├── cancellation/ │ │ │ │ │ ├── 1_cancellation.kt │ │ │ │ │ └── 2_cooperative_cancellation.kt │ │ │ │ ├── coroutine_scope.kt │ │ │ │ ├── coroutinebuilders/ │ │ │ │ │ ├── 1_launch.kt │ │ │ │ │ └── 2_async.kt │ │ │ │ ├── exceptionhandling/ │ │ │ │ │ ├── 1_try_catch.kt │ │ │ │ │ ├── 2_coroutine_exception_handler.kt │ │ │ │ │ ├── 3_try_catch_vs_exception_handler.kt │ │ │ │ │ ├── 4_launch_and_async.kt │ │ │ │ │ ├── 5_exception_handling_specifics_coroutineScope.kt │ │ │ │ │ └── 6_exception_handling_specifics_supervisorScope.kt │ │ │ │ ├── fundamentals/ │ │ │ │ │ ├── 10_how_delay_works.kt │ │ │ │ │ ├── 1_routines.kt │ │ │ │ │ ├── 2_coroutines.kt │ │ │ │ │ ├── 3_routines_threads.kt │ │ │ │ │ ├── 4_coroutines_with_thread_info.kt │ │ │ │ │ ├── 5_starting_lots_of_coroutines.kt │ │ │ │ │ ├── 7_starting_lots_of_threads.kt │ │ │ │ │ ├── 8_suspending_coroutines.kt │ │ │ │ │ └── 9_coroutine_in_different_threads.kt │ │ │ │ └── structuredconcurrency/ │ │ │ │ ├── 1_coroutines_need_to_be_started_in_scope.kt │ │ │ │ ├── 2_job_hierarchy.kt │ │ │ │ ├── 3_parents_wait_for_children.kt │ │ │ │ ├── 4_cancelling_parents_and_children.kt │ │ │ │ ├── 5_exception_propagation.kt │ │ │ │ ├── 6_globalscope.kt │ │ │ │ └── 7_scoping_functions.kt │ │ │ ├── usecases/ │ │ │ │ ├── channels/ │ │ │ │ │ └── usecase1/ │ │ │ │ │ └── ChannelUseCase1Activity.kt │ │ │ │ ├── coroutines/ │ │ │ │ │ ├── usecase1/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── PerformSingleNetworkRequestActivity.kt │ │ │ │ │ │ ├── PerformSingleNetworkRequestViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase10/ │ │ │ │ │ │ ├── CalculationInBackgroundActivity.kt │ │ │ │ │ │ ├── CalculationInBackgroundViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase11/ │ │ │ │ │ │ ├── CooperativeCancellationActivity.kt │ │ │ │ │ │ ├── CooperativeCancellationViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase12/ │ │ │ │ │ │ ├── CalculationInSeveralCoroutinesActivity.kt │ │ │ │ │ │ ├── CalculationInSeveralCoroutinesViewModel.kt │ │ │ │ │ │ ├── FactorialCalculator.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase13/ │ │ │ │ │ │ ├── ExceptionHandlingActivity.kt │ │ │ │ │ │ ├── ExceptionHandlingViewModel.kt │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase14/ │ │ │ │ │ │ ├── AndroidVersionDao.kt │ │ │ │ │ │ ├── AndroidVersionDatabase.kt │ │ │ │ │ │ ├── AndroidVersionEntity.kt │ │ │ │ │ │ ├── AndroidVersionRepository.kt │ │ │ │ │ │ ├── ContinueCoroutineWhenUserLeavesScreenActivity.kt │ │ │ │ │ │ ├── ContinueCoroutineWhenUserLeavesScreenViewModel.kt │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── UiState.kt │ │ │ │ │ │ └── ViewModelFactory.kt │ │ │ │ │ ├── usecase15/ │ │ │ │ │ │ ├── AnalyticsWorker.kt │ │ │ │ │ │ ├── ViewModelFactory.kt │ │ │ │ │ │ ├── WorkManagerActivity.kt │ │ │ │ │ │ └── WorkManagerViewModel.kt │ │ │ │ │ ├── usecase16/ │ │ │ │ │ │ ├── FactorialCalculator.kt │ │ │ │ │ │ ├── PerformanceAnalysisActivity.kt │ │ │ │ │ │ ├── PerformanceAnalysisViewModel.kt │ │ │ │ │ │ ├── ResultAdapter.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase17/ │ │ │ │ │ │ ├── PerformCalculationOnMainThreadActivity.kt │ │ │ │ │ │ ├── PerformCalculationOnMainThreadViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase2/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── Perform2SequentialNetworkRequestsActivity.kt │ │ │ │ │ │ ├── Perform2SequentialNetworkRequestsViewModel.kt │ │ │ │ │ │ ├── UiState.kt │ │ │ │ │ │ ├── callbacks/ │ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ │ ├── SequentialNetworkRequestsCallbacksActivity.kt │ │ │ │ │ │ │ ├── SequentialNetworkRequestsCallbacksViewModel.kt │ │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ │ └── rx/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── SequentialNetworkRequestsRxActivity.kt │ │ │ │ │ │ ├── SequentialNetworkRequestsRxViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase3/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── PerformNetworkRequestsConcurrentlyActivity.kt │ │ │ │ │ │ ├── PerformNetworkRequestsConcurrentlyViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase4/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── UiState.kt │ │ │ │ │ │ ├── VariableAmountOfNetworkRequestsActivity.kt │ │ │ │ │ │ └── VariableAmountOfNetworkRequestsViewModel.kt │ │ │ │ │ ├── usecase5/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── NetworkRequestWithTimeoutActivity.kt │ │ │ │ │ │ ├── NetworkRequestWithTimeoutViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase6/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── RetryNetworkRequestActivity.kt │ │ │ │ │ │ ├── RetryNetworkRequestViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase7/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── TimeoutAndRetryActivity.kt │ │ │ │ │ │ ├── TimeoutAndRetryViewModel.kt │ │ │ │ │ │ ├── UiState.kt │ │ │ │ │ │ ├── callbacks/ │ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ │ ├── TimeoutAndRetryCallbackActivity.kt │ │ │ │ │ │ │ ├── TimeoutAndRetryCallbackViewModel.kt │ │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ │ └── rx/ │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── TimeoutAndRetryRxActivity.kt │ │ │ │ │ │ ├── TimeoutAndRetryRxViewModel.kt │ │ │ │ │ │ └── UiState.kt │ │ │ │ │ ├── usecase8/ │ │ │ │ │ │ ├── AndroidVersionDao.kt │ │ │ │ │ │ ├── AndroidVersionDatabase.kt │ │ │ │ │ │ ├── AndroidVersionEntity.kt │ │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ │ ├── RoomAndCoroutinesActivity.kt │ │ │ │ │ │ ├── RoomAndCoroutinesViewModel.kt │ │ │ │ │ │ ├── UiState.kt │ │ │ │ │ │ └── ViewModelFactory.kt │ │ │ │ │ └── usecase9/ │ │ │ │ │ ├── DebuggingCoroutinesActivity.kt │ │ │ │ │ ├── DebuggingCoroutinesViewModel.kt │ │ │ │ │ ├── MockApi.kt │ │ │ │ │ └── UiState.kt │ │ │ │ └── flow/ │ │ │ │ └── usecase1/ │ │ │ │ └── FlowUseCase1Activity.kt │ │ │ └── utils/ │ │ │ ├── Extensions.kt │ │ │ └── MockNetworkInterceptor.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── ic_arrow_back_white.xml │ │ │ ├── ic_check_green_24dp.xml │ │ │ ├── ic_clear_red_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ └── recyclerview_divider.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ ├── activity_calculateonmain.xml │ │ │ ├── activity_calculationinbackground.xml │ │ │ ├── activity_calculationinmultiplebackgroundthreads.xml │ │ │ ├── activity_channels_usecase1.xml │ │ │ ├── activity_cooperativecancellation.xml │ │ │ ├── activity_debuggingcoroutines.xml │ │ │ ├── activity_exceptionhandling.xml │ │ │ ├── activity_flow_usecase1.xml │ │ │ ├── activity_jobs.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_networkrequestwithtimeout.xml │ │ │ ├── activity_observable_types.xml │ │ │ ├── activity_perform2sequentialnetworkrequests.xml │ │ │ ├── activity_performanceanalysis.xml │ │ │ ├── activity_performnetworkrequestsconcurrently.xml │ │ │ ├── activity_performsinglenetworkrequest.xml │ │ │ ├── activity_performvariableamountofnetworkrequestsconcurrently.xml │ │ │ ├── activity_queryfromroomdatabase.xml │ │ │ ├── activity_retrynetworkrequest.xml │ │ │ ├── activity_selection.xml │ │ │ ├── activity_suspending_func.xml │ │ │ ├── activity_usecases.xml │ │ │ ├── activity_workmanger.xml │ │ │ ├── recyclerview_item.xml │ │ │ ├── recyclerview_item_calculation_result.xml │ │ │ └── toolbar.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── demo/ │ └── code/ │ ├── ExampleUnitTest.kt │ ├── playground/ │ │ └── testing/ │ │ └── 1_testing_coroutines.kt │ ├── usecases/ │ │ └── coroutines/ │ │ ├── usecase1/ │ │ │ ├── FakeErrorApi.kt │ │ │ ├── FakeSuccessApi.kt │ │ │ └── PerformSingleNetworkRequestViewModelTest.kt │ │ ├── usecase10/ │ │ │ └── CalculationInBackgroundViewModelTest.kt │ │ ├── usecase12/ │ │ │ └── FactorialCalculatorTest.kt │ │ ├── usecase14/ │ │ │ ├── AndroidVersionRepositoryTest.kt │ │ │ ├── FakeApi.kt │ │ │ └── FakeDatabase.kt │ │ ├── usecase2/ │ │ │ ├── FakeFeaturesErrorApi.kt │ │ │ ├── FakeSuccessApi.kt │ │ │ ├── FakeVersionsErrorApi.kt │ │ │ ├── Perform2SequentialNetworkRequestsViewModelTest.kt │ │ │ └── callbacks/ │ │ │ ├── FakeFeaturesErrorApi.kt │ │ │ ├── FakeSuccessApi.kt │ │ │ ├── FakeVersionsErrorApi.kt │ │ │ └── SequentialNetworkRequestsCallbacksViewModelTest.kt │ │ ├── usecase3/ │ │ │ ├── FakeErrorApi.kt │ │ │ ├── FakeSuccessApi.kt │ │ │ └── PerformNetworkRequestsConcurrentlyViewModelTest.kt │ │ ├── usecase4/ │ │ │ ├── FakeFeaturesErrorApi.kt │ │ │ ├── FakeSuccessApi.kt │ │ │ ├── FakeVersionsErrorApi.kt │ │ │ └── VariableAmountOfNetworkRequestsViewModelTest.kt │ │ ├── usecase5/ │ │ │ ├── FakeSuccessApi.kt │ │ │ ├── FakeVersionsErrorApi.kt │ │ │ └── NetworkRequestWithTimeoutViewModelTest.kt │ │ └── usecase6/ │ │ ├── FakeSuccessApi.kt │ │ ├── FakeSuccessOnThirdAttemptApi.kt │ │ ├── FakeVersionsErrorApi.kt │ │ └── RetryNetworkRequestViewModelTest.kt │ └── utils/ │ ├── EndpointShouldNotBeCalledException.kt │ └── MainCoroutineScopeRule.kt ├── build.gradle.kts ├── buildSrc/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ ├── AppConfig.kt │ ├── AppDependencies.kt │ ├── BuildPlugins.kt │ └── Versions.kt ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts