├── .circleci └── config.yml ├── .github └── issue_template.md ├── .gitignore ├── BasicRxJavaSample ├── .gitignore ├── .google │ └── packaging.yaml ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── observability │ │ │ └── persistence │ │ │ ├── LocalUserDataSourceTest.java │ │ │ └── UserDaoTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── android │ │ │ │ └── observability │ │ │ │ ├── Injection.java │ │ │ │ ├── UserDataSource.java │ │ │ │ ├── persistence │ │ │ │ ├── LocalUserDataSource.java │ │ │ │ ├── User.java │ │ │ │ ├── UserDao.java │ │ │ │ └── UsersDatabase.java │ │ │ │ └── ui │ │ │ │ ├── UserActivity.java │ │ │ │ ├── UserViewModel.java │ │ │ │ └── ViewModelFactory.java │ │ └── res │ │ │ ├── layout │ │ │ └── activity_user.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── android │ │ └── observability │ │ └── UserViewModelTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── BasicRxJavaSampleKotlin ├── .gitignore ├── .google │ └── packaging.yaml ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── observability │ │ │ └── persistence │ │ │ └── UserDaoTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── android │ │ │ │ └── observability │ │ │ │ ├── Injection.kt │ │ │ │ ├── persistence │ │ │ │ ├── User.kt │ │ │ │ ├── UserDao.kt │ │ │ │ └── UsersDatabase.kt │ │ │ │ └── ui │ │ │ │ ├── UserActivity.kt │ │ │ │ ├── UserViewModel.kt │ │ │ │ └── ViewModelFactory.kt │ │ └── res │ │ │ ├── layout │ │ │ └── activity_user.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── android │ │ └── observability │ │ ├── MockitoKotlinHelpers.kt │ │ └── UserViewModelTest.kt ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── BasicSample ├── .gitignore ├── .google │ └── packaging.yaml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ ├── EspressoTestUtil.java │ │ │ ├── LiveDataTestUtil.java │ │ │ ├── db │ │ │ ├── CommentDaoTest.java │ │ │ ├── ProductDaoTest.java │ │ │ └── TestData.java │ │ │ └── ui │ │ │ └── MainActivityTest.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ ├── AppExecutors.java │ │ │ ├── BasicApp.java │ │ │ ├── DataRepository.java │ │ │ ├── db │ │ │ ├── AppDatabase.java │ │ │ ├── DataGenerator.java │ │ │ ├── converter │ │ │ │ └── DateConverter.java │ │ │ ├── dao │ │ │ │ ├── CommentDao.java │ │ │ │ └── ProductDao.java │ │ │ └── entity │ │ │ │ ├── CommentEntity.java │ │ │ │ ├── ProductEntity.java │ │ │ │ └── ProductFtsEntity.java │ │ │ ├── model │ │ │ ├── Comment.java │ │ │ └── Product.java │ │ │ ├── ui │ │ │ ├── BindingAdapters.java │ │ │ ├── CommentAdapter.java │ │ │ ├── CommentClickCallback.java │ │ │ ├── MainActivity.java │ │ │ ├── ProductAdapter.java │ │ │ ├── ProductClickCallback.java │ │ │ ├── ProductFragment.java │ │ │ └── ProductListFragment.java │ │ │ └── viewmodel │ │ │ ├── ProductListViewModel.java │ │ │ └── ProductViewModel.java │ │ └── res │ │ ├── drawable │ │ └── ic_search_black_24dp.xml │ │ ├── layout │ │ ├── comment_item.xml │ │ ├── list_fragment.xml │ │ ├── main_activity.xml │ │ ├── product_fragment.xml │ │ └── product_item.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── product_app.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── docs │ └── images │ │ ├── VM_diagram.png │ │ └── VM_subscriptions.png ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── CONTRIBUTING.md ├── GithubBrowserSample ├── .gitignore ├── .google │ └── packaging.yaml ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── github │ │ │ ├── TestApp.kt │ │ │ ├── db │ │ │ ├── DbTest.kt │ │ │ ├── RepoDaoTest.kt │ │ │ └── UserDaoTest.kt │ │ │ ├── ui │ │ │ ├── repo │ │ │ │ └── RepoFragmentTest.kt │ │ │ ├── search │ │ │ │ └── SearchFragmentTest.kt │ │ │ └── user │ │ │ │ └── UserFragmentTest.kt │ │ │ └── util │ │ │ ├── AutoClearedValueTest.kt │ │ │ ├── CountingAppExecutorsRule.kt │ │ │ ├── DataBindingIdlingResource.kt │ │ │ ├── DataBindingIdlingResourceRule.kt │ │ │ ├── DataBindingIdlingResourceTest.kt │ │ │ ├── EspressoTestUtil.kt │ │ │ ├── GithubTestRunner.kt │ │ │ ├── RecyclerViewMatcher.kt │ │ │ ├── TaskExecutorWithIdlingResourceRule.kt │ │ │ └── ViewModelUtil.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── github │ │ │ └── testing │ │ │ ├── OpenForTesting.kt │ │ │ └── SingleFragmentActivity.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── android │ │ │ │ └── example │ │ │ │ └── github │ │ │ │ ├── AppExecutors.kt │ │ │ │ ├── GithubApp.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── api │ │ │ │ ├── ApiResponse.kt │ │ │ │ ├── GithubService.kt │ │ │ │ └── RepoSearchResponse.kt │ │ │ │ ├── binding │ │ │ │ ├── BindingAdapters.kt │ │ │ │ ├── FragmentBindingAdapters.kt │ │ │ │ └── FragmentDataBindingComponent.kt │ │ │ │ ├── db │ │ │ │ ├── GithubDb.kt │ │ │ │ ├── GithubTypeConverters.kt │ │ │ │ ├── RepoDao.kt │ │ │ │ └── UserDao.kt │ │ │ │ ├── di │ │ │ │ ├── AppComponent.kt │ │ │ │ ├── AppInjector.kt │ │ │ │ ├── AppModule.kt │ │ │ │ ├── FragmentBuildersModule.kt │ │ │ │ ├── Injectable.kt │ │ │ │ ├── MainActivityModule.kt │ │ │ │ ├── ViewModelKey.kt │ │ │ │ └── ViewModelModule.kt │ │ │ │ ├── repository │ │ │ │ ├── FetchNextSearchPageTask.kt │ │ │ │ ├── NetworkBoundResource.kt │ │ │ │ ├── RepoRepository.kt │ │ │ │ └── UserRepository.kt │ │ │ │ ├── ui │ │ │ │ ├── common │ │ │ │ │ ├── DataBoundListAdapter.kt │ │ │ │ │ ├── DataBoundViewHolder.kt │ │ │ │ │ ├── RepoListAdapter.kt │ │ │ │ │ └── RetryCallback.kt │ │ │ │ ├── repo │ │ │ │ │ ├── ContributorAdapter.kt │ │ │ │ │ ├── RepoFragment.kt │ │ │ │ │ └── RepoViewModel.kt │ │ │ │ ├── search │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ └── SearchViewModel.kt │ │ │ │ └── user │ │ │ │ │ ├── UserFragment.kt │ │ │ │ │ └── UserViewModel.kt │ │ │ │ ├── util │ │ │ │ ├── AbsentLiveData.kt │ │ │ │ ├── AutoClearedValue.kt │ │ │ │ ├── LiveDataCallAdapter.kt │ │ │ │ ├── LiveDataCallAdapterFactory.kt │ │ │ │ └── RateLimiter.kt │ │ │ │ ├── viewmodel │ │ │ │ └── GithubViewModelFactory.kt │ │ │ │ └── vo │ │ │ │ ├── Contributor.kt │ │ │ │ ├── Repo.kt │ │ │ │ ├── RepoSearchResult.kt │ │ │ │ ├── Resource.kt │ │ │ │ ├── Status.kt │ │ │ │ └── User.kt │ │ └── res │ │ │ ├── layout │ │ │ ├── contributor_item.xml │ │ │ ├── loading_state.xml │ │ │ ├── main_activity.xml │ │ │ ├── repo_fragment.xml │ │ │ ├── repo_item.xml │ │ │ ├── search_fragment.xml │ │ │ └── user_fragment.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── main.xml │ │ │ ├── transition │ │ │ └── move.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── release │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── github │ │ │ └── testing │ │ │ └── OpenForTesting.kt │ │ ├── test-common │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── github │ │ │ └── util │ │ │ ├── CountingAppExecutors.kt │ │ │ ├── LiveDataTestUtil.kt │ │ │ ├── MockitoExt.kt │ │ │ └── TestUtil.kt │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── github │ │ │ ├── api │ │ │ ├── ApiResponseTest.kt │ │ │ └── GithubServiceTest.kt │ │ │ ├── repository │ │ │ ├── FetchNextSearchPageTaskTest.kt │ │ │ ├── NetworkBoundResourceTest.kt │ │ │ ├── RepoRepositoryTest.kt │ │ │ └── UserRepositoryTest.kt │ │ │ ├── ui │ │ │ ├── repo │ │ │ │ └── RepoViewModelTest.kt │ │ │ ├── search │ │ │ │ ├── NextPageHandlerTest.kt │ │ │ │ └── SearchViewModelTest.kt │ │ │ └── user │ │ │ │ └── UserViewModelTest.kt │ │ │ └── util │ │ │ ├── ApiUtil.kt │ │ │ └── InstantAppExecutors.kt │ │ └── resources │ │ └── api-response │ │ ├── contributors.json │ │ ├── repos-yigit.json │ │ ├── search.json │ │ └── user-yigit.json ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── lint.xml ├── settings.gradle └── versions.gradle ├── LICENSE ├── NavigationAdvancedSample ├── .gitignore ├── .google │ └── packaging.yaml ├── .idea │ └── runConfigurations │ │ ├── app.xml │ │ └── deeplink.xml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── sampledata │ │ └── rank.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── navigationadvancedsample │ │ │ ├── BottomNavigationTest.kt │ │ │ └── DeepLinkTest.kt │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── navigationadvancedsample │ │ │ ├── MainActivity.kt │ │ │ ├── NavigationExtensions.kt │ │ │ ├── formscreen │ │ │ ├── Register.kt │ │ │ └── Registered.kt │ │ │ ├── homescreen │ │ │ ├── About.kt │ │ │ └── Title.kt │ │ │ └── listscreen │ │ │ ├── Leaderboard.kt │ │ │ └── UserProfile.kt │ │ └── res │ │ ├── anim │ │ ├── fade_in.xml │ │ └── fade_out.xml │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── avatar_1_raster.png │ │ ├── avatar_2_raster.png │ │ ├── avatar_3_raster.png │ │ ├── avatar_4_raster.png │ │ ├── avatar_5_raster.png │ │ ├── avatar_6_raster.png │ │ ├── button_press.xml │ │ ├── button_press_dark.xml │ │ ├── circle.xml │ │ ├── ic_feedback.xml │ │ ├── ic_home.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_list.xml │ │ ├── image_category_entertainment_raster.png │ │ ├── purple_frame.xml │ │ ├── rounded_button.xml │ │ └── rounded_rect.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── fragment_about.xml │ │ ├── fragment_leaderboard.xml │ │ ├── fragment_register.xml │ │ ├── fragment_registered.xml │ │ ├── fragment_title.xml │ │ ├── fragment_user_profile.xml │ │ ├── layout_picker.xml │ │ ├── list_view_item.xml │ │ └── user_card.xml │ │ ├── menu │ │ └── bottom_nav.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ ├── form.xml │ │ ├── home.xml │ │ └── list.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenshot.png ├── settings.gradle └── versions.gradle ├── NavigationBasicSample ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── sampledata │ │ └── rank.json │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── android │ │ │ │ └── navigationsample │ │ │ │ ├── GameOver.kt │ │ │ │ ├── InGame.kt │ │ │ │ ├── Leaderboard.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── Match.kt │ │ │ │ ├── Register.kt │ │ │ │ ├── ResultsWinner.kt │ │ │ │ ├── TitleScreen.kt │ │ │ │ └── UserProfile.kt │ │ └── res │ │ │ ├── anim │ │ │ ├── fade_in.xml │ │ │ ├── fade_out.xml │ │ │ ├── slide_in_left.xml │ │ │ ├── slide_in_right.xml │ │ │ ├── slide_out_left.xml │ │ │ └── slide_out_right.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── avatar_10_raster.png │ │ │ ├── avatar_11_raster.png │ │ │ ├── avatar_12_raster.png │ │ │ ├── avatar_13_raster.png │ │ │ ├── avatar_14_raster.png │ │ │ ├── avatar_15_raster.png │ │ │ ├── avatar_16_raster.png │ │ │ ├── avatar_1_raster.png │ │ │ ├── avatar_2_raster.png │ │ │ ├── avatar_3_raster.png │ │ │ ├── avatar_4_raster.png │ │ │ ├── avatar_5_raster.png │ │ │ ├── avatar_6_raster.png │ │ │ ├── avatar_7_raster.png │ │ │ ├── avatar_8_raster.png │ │ │ ├── avatar_9_raster.png │ │ │ ├── button_press.xml │ │ │ ├── button_press_dark.xml │ │ │ ├── circle.xml │ │ │ ├── dark_frame.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── icon_category_leaderboard_raster.png │ │ │ ├── image_category_entertainment_raster.png │ │ │ ├── image_category_tvmovies_raster.png │ │ │ ├── lose_button.xml │ │ │ ├── mask.xml │ │ │ ├── purple_frame.xml │ │ │ ├── rounded_button.xml │ │ │ ├── rounded_button_dark.xml │ │ │ ├── rounded_button_white.xml │ │ │ ├── rounded_rect.xml │ │ │ ├── white_outline.xml │ │ │ └── win_button.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── fragment_game_over.xml │ │ │ ├── fragment_in_game.xml │ │ │ ├── fragment_leaderboard.xml │ │ │ ├── fragment_match.xml │ │ │ ├── fragment_register.xml │ │ │ ├── fragment_results_winner.xml │ │ │ ├── fragment_title_screen.xml │ │ │ ├── fragment_user_profile.xml │ │ │ ├── layout_picker.xml │ │ │ ├── list_view_item.xml │ │ │ └── user_card.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── navigation.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── uiTest │ │ └── java │ │ └── com │ │ └── example │ │ └── android │ │ └── navigationsample │ │ ├── TitleScreenTestJava.java │ │ └── TitleScreenTestKotlin.kt ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenshot.png ├── settings.gradle └── versions.gradle ├── PagingSample ├── .gitignore ├── .google │ └── packaging.yaml ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── paging │ │ │ └── android │ │ │ └── example │ │ │ └── com │ │ │ └── pagingsample │ │ │ └── MainActivityTest.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── paging │ │ │ └── android │ │ │ └── example │ │ │ └── com │ │ │ └── pagingsample │ │ │ ├── Cheese.kt │ │ │ ├── CheeseAdapter.kt │ │ │ ├── CheeseDao.kt │ │ │ ├── CheeseDb.kt │ │ │ ├── CheeseViewHolder.kt │ │ │ ├── CheeseViewModel.kt │ │ │ ├── Executors.kt │ │ │ └── MainActivity.kt │ │ └── res │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ └── cheese_item.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── PagingWithNetworkSample ├── .gitignore ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── paging │ │ │ └── pagingwithnetwork │ │ │ └── reddit │ │ │ └── ui │ │ │ └── RedditActivityTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ ├── androidx │ │ │ │ └── paging │ │ │ │ │ └── PagingRequestHelper.java │ │ │ └── com │ │ │ │ └── android │ │ │ │ └── example │ │ │ │ └── paging │ │ │ │ └── pagingwithnetwork │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── RedditAppGlideModule.kt │ │ │ │ └── reddit │ │ │ │ ├── ServiceLocator.kt │ │ │ │ ├── api │ │ │ │ └── RedditApi.kt │ │ │ │ ├── db │ │ │ │ ├── RedditDb.kt │ │ │ │ └── RedditPostDao.kt │ │ │ │ ├── repository │ │ │ │ ├── Listing.kt │ │ │ │ ├── NetworkState.kt │ │ │ │ ├── RedditPostRepository.kt │ │ │ │ ├── inDb │ │ │ │ │ ├── DbRedditPostRepository.kt │ │ │ │ │ └── SubredditBoundaryCallback.kt │ │ │ │ └── inMemory │ │ │ │ │ ├── byItem │ │ │ │ │ ├── InMemoryByItemRepository.kt │ │ │ │ │ ├── ItemKeyedSubredditDataSource.kt │ │ │ │ │ └── SubRedditDataSourceFactory.kt │ │ │ │ │ └── byPage │ │ │ │ │ ├── InMemoryByPageKeyRepository.kt │ │ │ │ │ ├── PageKeyedSubredditDataSource.kt │ │ │ │ │ └── SubRedditDataSourceFactory.kt │ │ │ │ ├── ui │ │ │ │ ├── NetworkStateItemViewHolder.kt │ │ │ │ ├── PostsAdapter.kt │ │ │ │ ├── RedditActivity.kt │ │ │ │ ├── RedditPostViewHolder.kt │ │ │ │ └── SubRedditViewModel.kt │ │ │ │ ├── util │ │ │ │ └── PagingRequestHelperExt.kt │ │ │ │ └── vo │ │ │ │ └── RedditPost.kt │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ └── ic_insert_photo_black_48dp.png │ │ │ ├── drawable-mdpi │ │ │ └── ic_insert_photo_black_48dp.png │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable-xhdpi │ │ │ └── ic_insert_photo_black_48dp.png │ │ │ ├── drawable-xxhdpi │ │ │ └── ic_insert_photo_black_48dp.png │ │ │ ├── drawable-xxxhdpi │ │ │ └── ic_insert_photo_black_48dp.png │ │ │ ├── drawable │ │ │ └── ic_launcher_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── activity_reddit.xml │ │ │ ├── network_state_item.xml │ │ │ └── reddit_post_item.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── test-common │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── example │ │ │ └── paging │ │ │ └── pagingwithnetwork │ │ │ └── repository │ │ │ ├── FakeRedditApi.kt │ │ │ └── PostFactory.kt │ │ └── test │ │ └── java │ │ └── com │ │ └── android │ │ └── example │ │ └── paging │ │ └── pagingwithnetwork │ │ └── reddit │ │ └── repository │ │ └── inMemory │ │ └── InMemoryRepositoryTest.kt ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── PersistenceContentProviderSample ├── .gitignore ├── .google │ └── packaging.yaml ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.example.android.contentprovidersample.data.SampleDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── contentprovidersample │ │ │ ├── CheeseTest.java │ │ │ └── SampleContentProviderTest.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── contentprovidersample │ │ │ ├── MainActivity.java │ │ │ ├── data │ │ │ ├── Cheese.java │ │ │ ├── CheeseDao.java │ │ │ └── SampleDatabase.java │ │ │ └── provider │ │ │ └── SampleContentProvider.java │ │ └── res │ │ ├── layout │ │ └── main_activity.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── PersistenceMigrationsSample ├── .gitignore ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.example.android.persistence.migrations.UsersDatabase │ │ │ ├── 2.json │ │ │ ├── 3.json │ │ │ ├── 4.json │ │ │ └── 5.json │ └── src │ │ ├── androidTestRoom │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── LocalUserDataSourceTest.java │ │ │ ├── MigrationTest.java │ │ │ └── UserDaoTest.java │ │ ├── androidTestRoom2 │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── LocalUserDataSourceTest.java │ │ │ └── MigrationTest.java │ │ ├── androidTestRoom3 │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── LocalUserDataSourceTest.java │ │ │ └── MigrationTest.java │ │ ├── androidTestRoom_Common │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── SqliteDatabaseTestHelper.java │ │ │ └── SqliteTestDbOpenHelper.java │ │ ├── androidTestSqlite │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ └── LocalUserDataSourceTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── android │ │ │ │ └── persistence │ │ │ │ └── migrations │ │ │ │ ├── AppExecutors.java │ │ │ │ ├── LoadUserCallback.java │ │ │ │ ├── UpdateUserCallback.java │ │ │ │ ├── UserActivity.java │ │ │ │ ├── UserDataSource.java │ │ │ │ ├── UserPresenter.java │ │ │ │ └── UserView.java │ │ └── res │ │ │ ├── layout │ │ │ └── activity_user.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── room │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── User.java │ │ │ ├── UserRepository.java │ │ │ └── UsersDatabase.java │ │ ├── room2 │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── DateConverter.java │ │ │ ├── User.java │ │ │ ├── UserRepository.java │ │ │ └── UsersDatabase.java │ │ ├── room3 │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── DateConverter.java │ │ │ ├── User.java │ │ │ ├── UserRepository.java │ │ │ └── UsersDatabase.java │ │ ├── room_common │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── LocalUserDataSource.java │ │ │ └── UserDao.java │ │ ├── sqlite │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ └── persistence │ │ │ └── migrations │ │ │ ├── LocalUserDataSource.java │ │ │ ├── User.java │ │ │ ├── UserPersistenceContract.java │ │ │ ├── UserRepository.java │ │ │ └── UsersDbHelper.java │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── android │ │ └── persistence │ │ └── migrations │ │ ├── SingleExecutors.java │ │ ├── UserPresenterTest.java │ │ └── UserRepositoryTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── README.md ├── WorkManagerSample ├── .gitignore ├── ASSETS_LICENSE.md ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ ├── assets │ │ │ └── test_outputs │ │ │ │ └── grayscale.png │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── background │ │ │ ├── ImageOperationsTest.kt │ │ │ └── TestLifeCycleOwner.kt │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── images │ │ │ ├── jetpack.png │ │ │ ├── lit_pier.jpg │ │ │ ├── parting_ways.jpg │ │ │ └── wrong_way.jpg │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── background │ │ │ ├── App.kt │ │ │ ├── Constants.kt │ │ │ ├── FilterActivity.kt │ │ │ ├── FilterViewModel.kt │ │ │ ├── ImageOperations.kt │ │ │ ├── SelectImageActivity.kt │ │ │ ├── StockImages.kt │ │ │ ├── imgur │ │ │ ├── ImgurApi.kt │ │ │ ├── ImgurService.kt │ │ │ └── PostImageResponse.kt │ │ │ └── workers │ │ │ ├── BaseFilterWorker.kt │ │ │ ├── BlurEffectFilterWorker.kt │ │ │ ├── CleanupWorker.kt │ │ │ ├── GrayScaleFilterWorker.kt │ │ │ ├── SaveImageToGalleryWorker.kt │ │ │ ├── UploadWorker.kt │ │ │ └── WaterColorFilterWorker.kt │ │ ├── res │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ │ ├── activity_processing.xml │ │ │ └── activity_select.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── rs │ │ ├── grayscale.rs │ │ └── waterColorEffect.rs ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── versions.gradle ├── gradle-wrapper.properties ├── run_all_tests.sh ├── test_all_ftl.sh ├── update_versions.sh └── versions.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .idea 3 | .gradle 4 | /local.properties 5 | .DS_Store 6 | build/ 7 | /captures 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /BasicRxJavaSample/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /BasicRxJavaSample/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /BasicRxJavaSample/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/florinam/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /BasicRxJavaSample/app/src/main/res/layout/activity_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 20 | 21 |