From 9bf736559cd81bfd30032cef4092432790c2a6eb Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 8 Oct 2021 14:01:03 -0700 Subject: [PATCH] Fix #3803, #3804, #3853, #3669, #3383: Add basic KitKat support in Bazel (#3910) * Initial commit for drawable->SVG conversion script. At the moment, about ~40% of drawables can be successfully converted (with some coordinate system inconsistencies for their gradients that need to be corrected). Some other SVG constructs still need to be added for the remaining drawables (such as groups & clip regions). * Add basic KitKat support. This includes: - Defining KitKat-specific flavors - Utilizing a manual main dex file list (minimized) so that the Bazel-built KitKat flavor of the app can start successfully - Migrating all drawable usage over to compat-compatible so that vectors can load properly in the KitKat world (+ opted-in compatibility layer) - Adding a missing permission that seems only needed on KitKat with WorkManager (but isn't unreasonable to request in general) * Flavor updates & move main dex file. * Fix alpha KitKat flavor. * Remove script changes. * Add regex checks + tests. Lock vector compat call behind KitKat gate. * Address TODOs. * Fix broken tests (potentially round 1). * Test fixes (round 2). * Add new test suite for NetworkModule. * Post-merge + lint fixes. * Fixes & remove files post-merge. The removed files were accidentally re-added upon merge. * Fix broken instrumentation build. This came from an unrelated previously merged PR. * Fix syntax error in workflow script. * Add codeowner for new file. * Actually fix syntax mistake in workflow. * Gradle build fixes. The styles simplification comes from https://stackoverflow.com/a/50854279/3689782. Apparently, Bazel is more permissive about this sort of thing than Gradle, but it might have actually been wrong before (i.e. this version seems more correct). * Use deep fetch for binary build workflow. The develop branch needs to also be pulled for building //:oppia dev now since it uses a transformed manifest. --- .github/CODEOWNERS | 3 + .github/workflows/build_tests.yml | 78 ++++++++- BUILD.bazel | 80 ++++++--- app/BUILD.bazel | 2 +- app/src/main/AndroidManifest.xml | 2 + .../app/application/OppiaApplication.kt | 12 ++ .../databinding/ImageViewBindingAdapters.java | 104 +---------- .../databinding/TextViewBindingAdapters.java | 12 ++ .../NavigationDrawerFragmentPresenter.kt | 42 +++-- .../main/res/layout-land/hints_summary.xml | 2 +- .../res/layout-land/lessons_chapter_view.xml | 5 +- .../res/layout-land/onboarding_fragment.xml | 2 +- .../main/res/layout-land/onboarding_slide.xml | 2 +- .../layout-land/onboarding_slide_final.xml | 2 +- .../layout-land/profile_chooser_add_view.xml | 2 +- .../layout-land/profile_chooser_fragment.xml | 4 +- .../layout-land/profile_progress_header.xml | 2 +- .../layout-land/question_player_fragment.xml | 4 +- .../main/res/layout-land/solution_summary.xml | 2 +- .../res/layout-land/story_chapter_view.xml | 2 +- .../res/layout-land/topic_info_fragment.xml | 2 +- .../topic_lessons_story_summary.xml | 2 +- .../walkthrough_final_fragment.xml | 2 +- .../walkthrough_welcome_fragment.xml | 2 +- .../res/layout-sw600dp-land/hints_summary.xml | 2 +- .../onboarding_fragment.xml | 2 +- .../layout-sw600dp-land/onboarding_slide.xml | 2 +- .../onboarding_slide_final.xml | 2 +- .../profile_chooser_add_view.xml | 2 +- .../profile_chooser_fragment.xml | 4 +- .../profile_progress_header.xml | 2 +- .../question_player_fragment.xml | 4 +- .../layout-sw600dp-land/solution_summary.xml | 2 +- .../topic_info_fragment.xml | 2 +- .../topic_lessons_story_summary.xml | 2 +- .../res/layout-sw600dp-port/hints_summary.xml | 2 +- .../onboarding_fragment.xml | 2 +- .../layout-sw600dp-port/onboarding_slide.xml | 2 +- .../onboarding_slide_final.xml | 2 +- .../profile_chooser_add_view.xml | 2 +- .../profile_chooser_fragment.xml | 4 +- .../profile_progress_header.xml | 2 +- .../question_player_fragment.xml | 4 +- .../layout-sw600dp-port/solution_summary.xml | 2 +- .../topic_info_fragment.xml | 2 +- .../topic_lessons_story_summary.xml | 2 +- .../main/res/layout-sw600dp/help_activity.xml | 2 +- .../res/layout-sw600dp/story_chapter_view.xml | 4 +- .../activity_view_binding_adapters_test.xml | 5 +- .../main/res/layout/add_profile_activity.xml | 6 +- .../main/res/layout/app_version_fragment.xml | 2 +- app/src/main/res/layout/audio_fragment.xml | 4 +- .../layout/drag_drop_interaction_items.xml | 8 +- app/src/main/res/layout/drawer_fragment.xml | 4 +- .../main/res/layout/exploration_activity.xml | 2 +- .../force_network_type_network_item_view.xml | 2 +- app/src/main/res/layout/hints_summary.xml | 2 +- .../image_region_selection_test_fragment.xml | 3 +- .../main/res/layout/lessons_chapter_view.xml | 5 +- ...hapters_completed_chapter_summary_view.xml | 2 +- ...k_stories_completed_story_summary_view.xml | 2 +- .../mark_topics_completed_topic_view.xml | 2 +- .../main/res/layout/onboarding_fragment.xml | 2 +- app/src/main/res/layout/onboarding_slide.xml | 2 +- .../res/layout/onboarding_slide_final.xml | 2 +- .../main/res/layout/pin_password_activity.xml | 2 +- .../layout/previous_responses_header_item.xml | 2 +- .../res/layout/profile_chooser_add_view.xml | 2 +- .../res/layout/profile_chooser_fragment.xml | 4 +- .../res/layout/profile_progress_header.xml | 2 +- .../res/layout/question_player_fragment.xml | 4 +- .../main/res/layout/replay_button_item.xml | 2 +- app/src/main/res/layout/solution_summary.xml | 2 +- app/src/main/res/layout/state_fragment.xml | 4 +- .../main/res/layout/story_chapter_view.xml | 4 +- .../main/res/layout/submitted_answer_item.xml | 2 +- .../main/res/layout/topic_info_fragment.xml | 2 +- .../layout/topic_lessons_story_summary.xml | 2 +- .../res/layout/topic_practice_subtopic.xml | 2 +- .../main/res/layout/walkthrough_activity.xml | 2 +- .../res/layout/walkthrough_final_fragment.xml | 2 +- .../layout/walkthrough_welcome_fragment.xml | 2 +- app/src/main/res/values/styles.xml | 8 +- .../PlatformParameterIntegrationTest.kt | 21 ++- build_flavors.bzl | 118 ++++++++++--- config/kitkat_main_dex_class_list.txt | 62 +++++++ data/build.gradle | 1 + .../android/data/backends/gae/BUILD.bazel | 1 + .../data/backends/gae/NetworkModule.kt | 78 +++++---- .../data/backends/gae/NetworkModuleTest.kt | 161 ++++++++++++++++++ .../syncup/PlatformParameterSyncUpWorker.kt | 47 ++--- ...rameterSyncUpWorkManagerInitializerTest.kt | 21 ++- .../PlatformParameterSyncUpWorkerTest.kt | 21 ++- instrumentation/src/java/AndroidManifest.xml | 2 +- .../file_content_validation_checks.textproto | 19 ++- scripts/assets/test_file_exemptions.textproto | 1 - .../regex/RegexPatternValidationCheckTest.kt | 92 +++++++++- .../testing/network/RetrofitTestModule.kt | 13 +- .../android/testing/robolectric/BUILD.bazel | 1 + .../robolectric/ShadowBidiFormatter.kt | 2 +- .../android/testing/robolectric/BUILD.bazel | 1 + .../robolectric/ShadowBidiFormatterTest.kt | 7 +- .../org/oppia/android/util/locale/BUILD.bazel | 1 + .../util/locale/OppiaBidiFormatterImpl.kt | 2 +- .../util/parser/image/GlideImageLoader.kt | 1 + version.bzl | 6 +- 106 files changed, 850 insertions(+), 364 deletions(-) create mode 100644 config/kitkat_main_dex_class_list.txt create mode 100644 data/src/test/java/org/oppia/android/data/backends/gae/NetworkModuleTest.kt diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index aa0b6a2f64b..0f6d464f4a1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -96,6 +96,9 @@ NOTICE @BenHenning # Language configuration files. config/**/languages/*.textproto @BenHenning +# Configuration for KitKat-specific curated builds. +config/kitkat_main_dex_class_list.txt @BenHenning + ##################################################################################### # app module # ##################################################################################### diff --git a/.github/workflows/build_tests.yml b/.github/workflows/build_tests.yml index b827f77733b..4fa60d192e0 100644 --- a/.github/workflows/build_tests.yml +++ b/.github/workflows/build_tests.yml @@ -22,6 +22,8 @@ jobs: CACHE_DIRECTORY: ~/.bazel_cache steps: - uses: actions/checkout@v2 + with: + fetch-depth: 0 - name: Set up JDK 9 uses: actions/setup-java@v1 @@ -130,16 +132,36 @@ jobs: run: | bazel build -- //:oppia - - name: Copy Oppia APK for uploading - run: cp $GITHUB_WORKSPACE/bazel-bin/oppia.apk /home/runner/work/oppia-android/oppia-android/ + # Note that caching only works on non-forks. + - name: Build Oppia KitKat binary (with caching, non-fork only) + if: ${{ env.ENABLE_CACHING == 'true' && github.event.pull_request.head.repo.full_name == 'oppia/oppia-android' }} + env: + BAZEL_REMOTE_CACHE_URL: ${{ secrets.BAZEL_REMOTE_CACHE_URL }} + run: | + bazel build --remote_http_cache=$BAZEL_REMOTE_CACHE_URL --google_credentials=./config/oppia-dev-workflow-remote-cache-credentials.json -- //:oppia_kitkat + + - name: Build Oppia binary KitKat (without caching, or on a fork) + if: ${{ env.ENABLE_CACHING == 'false' || github.event.pull_request.head.repo.full_name != 'oppia/oppia-android' }} + run: | + bazel build -- //:oppia_kitkat + + - name: Copy Oppia dev APKs for uploading + run: | + cp $GITHUB_WORKSPACE/bazel-bin/oppia.apk /home/runner/work/oppia-android/oppia-android/ + cp $GITHUB_WORKSPACE/bazel-bin/oppia_kitkat.apk /home/runner/work/oppia-android/oppia-android/ - uses: actions/upload-artifact@v2 with: name: oppia-bazel.apk path: /home/runner/work/oppia-android/oppia-android/oppia.apk + - uses: actions/upload-artifact@v2 + with: + name: oppia-bazel-kitkat.apk + path: /home/runner/work/oppia-android/oppia-android/oppia_kitkat.apk + build_oppia_dev_aab: - name: Build Oppia AAB (developer flavor) + name: Build Oppia AAB (developer flavors) runs-on: ${{ matrix.os }} strategy: matrix: @@ -259,16 +281,36 @@ jobs: run: | bazel build -- //:oppia_dev - - name: Copy Oppia APK for uploading - run: cp $GITHUB_WORKSPACE/bazel-bin/oppia_dev.aab /home/runner/work/oppia-android/oppia-android/ + # Note that caching only works on non-forks. + - name: Build Oppia developer KitKat AAB (with caching, non-fork only) + if: ${{ env.ENABLE_CACHING == 'true' && github.event.pull_request.head.repo.full_name == 'oppia/oppia-android' }} + env: + BAZEL_REMOTE_CACHE_URL: ${{ secrets.BAZEL_REMOTE_CACHE_URL }} + run: | + bazel build --remote_http_cache=$BAZEL_REMOTE_CACHE_URL --google_credentials=./config/oppia-dev-workflow-remote-cache-credentials.json -- //:oppia_dev_kitkat + + - name: Build Oppia developer KitKat AAB (without caching, or on a fork) + if: ${{ env.ENABLE_CACHING == 'false' || github.event.pull_request.head.repo.full_name != 'oppia/oppia-android' }} + run: | + bazel build -- //:oppia_dev_kitkat + + - name: Copy Oppia developer AABs for uploading + run: | + cp $GITHUB_WORKSPACE/bazel-bin/oppia_dev.aab /home/runner/work/oppia-android/oppia-android/ + cp $GITHUB_WORKSPACE/bazel-bin/oppia_dev_kitkat.aab /home/runner/work/oppia-android/oppia-android/ - uses: actions/upload-artifact@v2 with: name: oppia_dev.aab path: /home/runner/work/oppia-android/oppia-android/oppia_dev.aab + - uses: actions/upload-artifact@v2 + with: + name: oppia_dev_kitkat.aab + path: /home/runner/work/oppia-android/oppia-android/oppia_dev_kitkat.aab + build_oppia_alpha_aab: - name: Build Oppia AAB (alpha flavor) + name: Build Oppia AAB (alpha flavors) runs-on: ${{ matrix.os }} strategy: matrix: @@ -388,10 +430,30 @@ jobs: run: | bazel build --compilation_mode=opt -- //:oppia_alpha - - name: Copy Oppia APK for uploading - run: cp $GITHUB_WORKSPACE/bazel-bin/oppia_alpha.aab /home/runner/work/oppia-android/oppia-android/ + # Note that caching only works on non-forks. + - name: Build Oppia alpha KitKat AAB (with caching, non-fork only) + if: ${{ env.ENABLE_CACHING == 'true' && github.event.pull_request.head.repo.full_name == 'oppia/oppia-android' }} + env: + BAZEL_REMOTE_CACHE_URL: ${{ secrets.BAZEL_REMOTE_CACHE_URL }} + run: | + bazel build --compilation_mode=opt --remote_http_cache=$BAZEL_REMOTE_CACHE_URL --google_credentials=./config/oppia-dev-workflow-remote-cache-credentials.json -- //:oppia_alpha_kitkat + + - name: Build Oppia alpha KitKat AAB (without caching, or on a fork) + if: ${{ env.ENABLE_CACHING == 'false' || github.event.pull_request.head.repo.full_name != 'oppia/oppia-android' }} + run: | + bazel build --compilation_mode=opt -- //:oppia_alpha_kitkat + + - name: Copy Oppia alpha AABs for uploading + run: | + cp $GITHUB_WORKSPACE/bazel-bin/oppia_alpha.aab /home/runner/work/oppia-android/oppia-android/ + cp $GITHUB_WORKSPACE/bazel-bin/oppia_alpha_kitkat.aab /home/runner/work/oppia-android/oppia-android/ - uses: actions/upload-artifact@v2 with: name: oppia_alpha.aab path: /home/runner/work/oppia-android/oppia-android/oppia_alpha.aab + + - uses: actions/upload-artifact@v2 + with: + name: oppia_alpha_kitkat.aab + path: /home/runner/work/oppia-android/oppia-android/oppia_alpha_kitkat.aab diff --git a/BUILD.bazel b/BUILD.bazel index 845129a3402..b6eefe19198 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,6 +1,10 @@ # TODO(#1532): Rename file to 'BUILD' post-Gradle. -load("//:build_flavors.bzl", "AVAILABLE_FLAVORS", "define_oppia_binary_flavor") +load("//:build_flavors.bzl", "AVAILABLE_FLAVORS", "define_oppia_aab_binary_flavor", "transform_android_manifest") +load("//:version.bzl", "MAJOR_VERSION", "MINOR_VERSION", "OPPIA_DEV_KITKAT_VERSION_CODE", "OPPIA_DEV_VERSION_CODE") + +# This is exported here since config/ isn't a Bazel package. +exports_files(["config/kitkat_main_dex_class_list.txt"]) # Corresponds to being accessible to all Oppia targets. This should be used for production APIs & # modules that may be used both in production targets and in tests. @@ -68,28 +72,66 @@ package_group( ) # TODO(#1640): Move binary manifest to top-level package post-Gradle. -android_binary( - name = "oppia", - custom_package = "org.oppia.android", - enable_data_binding = True, - manifest = "//app:src/main/AndroidManifest.xml", - manifest_values = { - "applicationId": "org.oppia.android", - "minSdkVersion": "19", - "targetSdkVersion": "29", - "versionCode": "0", - "versionName": "0.1-alpha", - }, - multidex = "native", - deps = [ - "//app", - ], -) +[ + transform_android_manifest( + name = "oppia_apk_%s_transformed_manifest" % apk_flavor_metadata["flavor"], + build_flavor = apk_flavor_metadata["flavor"], + input_file = "//app:src/main/AndroidManifest.xml", + major_version = MAJOR_VERSION, + minor_version = MINOR_VERSION, + output_file = "AndroidManifest_transformed_%s.xml" % apk_flavor_metadata["flavor"], + version_code = apk_flavor_metadata["version_code"], + ) + for apk_flavor_metadata in [ + { + "flavor": "oppia", + "version_code": OPPIA_DEV_VERSION_CODE, + }, + { + "flavor": "oppia_kitkat", + "version_code": OPPIA_DEV_KITKAT_VERSION_CODE, + }, + ] +] + +[ + android_binary( + name = apk_flavor_metadata["flavor"], + custom_package = "org.oppia.android", + enable_data_binding = True, + main_dex_list = apk_flavor_metadata.get("main_dex_list"), + manifest = "oppia_apk_%s_transformed_manifest" % apk_flavor_metadata["flavor"], + manifest_values = { + "applicationId": "org.oppia.android", + "minSdkVersion": "%d" % apk_flavor_metadata["min_sdk_version"], + "targetSdkVersion": "%d" % apk_flavor_metadata["target_sdk_version"], + }, + multidex = apk_flavor_metadata["multidex"], + deps = [ + "//app", + ], + ) + for apk_flavor_metadata in [ + { + "flavor": "oppia", + "min_sdk_version": 21, + "multidex": "native", + "target_sdk_version": 29, + }, + { + "flavor": "oppia_kitkat", + "main_dex_list": "//:config/kitkat_main_dex_class_list.txt", + "min_sdk_version": 19, + "multidex": "manual_main_dex", + "target_sdk_version": 29, + }, + ] +] # Define all binary flavors that can be built. Note that these are AABs, not APKs, and can be # be installed on a local device or emulator using a 'bazel run' command like so: # bazel run //:install_oppia_dev [ - define_oppia_binary_flavor(flavor = flavor) + define_oppia_aab_binary_flavor(flavor = flavor) for flavor in AVAILABLE_FLAVORS ] diff --git a/app/BUILD.bazel b/app/BUILD.bazel index fba131c801b..caf40076824 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -529,7 +529,6 @@ android_library( # Library for layout resource files. android_library( name = "databinding_resources", - srcs = BINDING_ADAPTERS, custom_package = "org.oppia.android.app.databinding", enable_data_binding = True, exports_manifest = True, @@ -685,6 +684,7 @@ android_library( "//third_party:androidx_lifecycle_lifecycle-livedata-ktx", "//third_party:circularimageview_circular_image_view", "//third_party:com_google_android_material_material", + "//third_party:de_hdodenhof_circleimageview", "//third_party:io_github_chaosleung_pinview", "//utility", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f15f4bfc3..7d433c0fea2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ + + PNG pipeline + // in Bazel. + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) + } FirebaseApp.initializeApp(applicationContext) WorkManager.initialize(applicationContext, workManagerConfiguration) component.getApplicationStartupListeners().forEach(ApplicationStartupListener::onCreate) diff --git a/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java index 710098a0dee..818fa574dec 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java @@ -10,116 +10,26 @@ import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; import org.oppia.android.R; -import org.oppia.android.app.model.LessonThumbnailGraphic; import org.oppia.android.app.model.ProfileAvatar; /** Holds all custom binding adapters that bind to [ImageView]. */ public final class ImageViewBindingAdapters { - /** - * Allows binding drawables to an [ImageView] via "android:src". - * Reference: https://stackoverflow.com/a/35809319/3689782. - */ - @BindingAdapter("android:src") - public static void setImageDrawable(@NonNull ImageView imageView, String imageUrl) { - RequestOptions requestOptions = new RequestOptions().placeholder(R.drawable.review_placeholder); - Glide.with(imageView.getContext()) - .load(imageUrl) - .apply(requestOptions) - .into(imageView); - } - - /** - * Allows binding drawables to an [ImageView] via "android:src". - * Reference: https://stackoverflow.com/a/35809319/3689782. - */ - @BindingAdapter("android:src") - public static void setImageDrawable( + @BindingAdapter("app:srcCompat") + public static void setImageDrawableCompat( @NonNull ImageView imageView, @DrawableRes int drawableResourceId ) { imageView.setImageResource(drawableResourceId); } - /** - * Binds the specified [LessonThumbnailGraphic] as the source for the [ImageView]. - *

- * The view should be specified to have no width/height (when sized in a constraint layout), and - * use centerCrop for the image to appear correctly. - */ - @BindingAdapter("android:src") - public static void setImageDrawable( - ImageView imageView, - LessonThumbnailGraphic thumbnailGraphic + @BindingAdapter("app:srcCompat") + public static void setImageDrawableCompat( + @NonNull ImageView imageView, + Drawable drawable ) { - int drawableResourceId; - switch (thumbnailGraphic) { - case BAKER: - drawableResourceId = R.drawable.lesson_thumbnail_graphic_baker; - break; - case CHILD_WITH_BOOK: - drawableResourceId = R.drawable.lesson_thumbnail_graphic_child_with_book; - break; - case CHILD_WITH_CUPCAKES: - drawableResourceId = R.drawable.lesson_thumbnail_graphic_child_with_cupcakes; - break; - case CHILD_WITH_FRACTIONS_HOMEWORK: - drawableResourceId = R.drawable.lesson_thumbnail_graphic_child_with_fractions_homework; - break; - case DUCK_AND_CHICKEN: - drawableResourceId = R.drawable.lesson_thumbnail_graphic_duck_and_chicken; - break; - case PERSON_WITH_PIE_CHART: - drawableResourceId = R.drawable.lesson_thumbnail_graphic_person_with_pie_chart; - break; - case IDENTIFYING_THE_PARTS_OF_A_FRACTION: - drawableResourceId = R.drawable.topic_fractions_01; - break; - case WRITING_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_02; - break; - case EQUIVALENT_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_03; - break; - case MIXED_NUMBERS_AND_IMPROPER_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_04; - break; - case COMPARING_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_05; - break; - case ADDING_AND_SUBTRACTING_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_06; - break; - case MULTIPLYING_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_07; - break; - case DIVIDING_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_08; - break; - case DERIVE_A_RATIO: - drawableResourceId = R.drawable.topic_ratios_01; - break; - case WHAT_IS_A_FRACTION: - drawableResourceId = R.drawable.topic_fractions_01; - break; - case FRACTION_OF_A_GROUP: - drawableResourceId = R.drawable.topic_fractions_02; - break; - case ADDING_FRACTIONS: - drawableResourceId = R.drawable.topic_fractions_03; - break; - case MIXED_NUMBERS: - drawableResourceId = R.drawable.topic_fractions_04; - break; - default: - drawableResourceId = R.drawable.topic_fractions_01; - } - setImageDrawable( - imageView, - drawableResourceId - ); + imageView.setImageDrawable(drawable); } /** diff --git a/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java index e701a8cf20b..00b2abb0255 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java @@ -3,6 +3,7 @@ import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; +import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; @@ -45,6 +46,17 @@ public static void setProfileLastVisitedText(@NonNull TextView textView, long ti textView.setText(profileLastVisited); } + /** Binds an AndroidX KitKat-compatible drawable end to the specified text view. */ + @BindingAdapter("app:drawableEndCompat") + public static void setDrawableEndCompat( + @NonNull TextView imageView, + Drawable drawable + ) { + imageView.setCompoundDrawablesRelativeWithIntrinsicBounds( + /* start= */ null, /* top= */ null, /* end= */ drawable, /* bottom=*/ null + ); + } + private static String getTimeAgo(View view, long lastVisitedTimestamp) { long timeStampMillis = ensureTimestampIsInMilliseconds(lastVisitedTimestamp); long currentTimeMillis = getOppiaClock(view).getCurrentTimeMs(); diff --git a/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt index 3f0525734ab..709d7f5af05 100644 --- a/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt @@ -1,6 +1,5 @@ package org.oppia.android.app.drawer -import android.os.Build import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -15,6 +14,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.lifecycle.Transformations import com.google.android.material.navigation.NavigationView +import com.google.common.base.Optional import org.oppia.android.R import org.oppia.android.app.administratorcontrols.AdministratorControlsActivity import org.oppia.android.app.devoptions.DeveloperOptionsStarter @@ -40,7 +40,6 @@ import org.oppia.android.domain.topic.TopicController import org.oppia.android.util.data.AsyncResult import org.oppia.android.util.data.DataProviders.Companion.toLiveData import org.oppia.android.util.statusbar.StatusBarColor -import java.util.Optional import javax.inject.Inject const val NAVIGATION_PROFILE_ID_ARGUMENT_KEY = @@ -98,29 +97,26 @@ class NavigationDrawerFragmentPresenter @Inject constructor( // TODO(#3382): Remove debug only code from prod build (also check imports, constructor and drawer_fragment.xml) private fun setIfDeveloperOptionsMenuItemListener() { - // TODO(#3383): Find a way to make this work below N - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - developerOptionsStarter.ifPresent { starter -> - getFooterViewModel().isDebugMode.set(true) - binding.developerOptionsLinearLayout.setOnClickListener { - if (getFooterViewModel().isDeveloperOptionsSelected.get() == true) { - drawerLayout.closeDrawers() - return@setOnClickListener - } - uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() - drawerLayout.closeDrawers() - getFooterViewModel().isDeveloperOptionsSelected.set(true) - val intent = starter.createIntent(activity, internalProfileId) - fragment.activity!!.startActivity(intent) - if (previousMenuItemId == 0) fragment.activity!!.finish() - else if (previousMenuItemId != null && - NavigationDrawerItem.valueFromNavId(previousMenuItemId!!) != - NavigationDrawerItem.HOME - ) { - fragment.activity!!.finish() - } + developerOptionsStarter.asSet().forEach { starter -> + getFooterViewModel().isDebugMode.set(true) + binding.developerOptionsLinearLayout.setOnClickListener { + if (getFooterViewModel().isDeveloperOptionsSelected.get() == true) { drawerLayout.closeDrawers() + return@setOnClickListener + } + uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() + drawerLayout.closeDrawers() + getFooterViewModel().isDeveloperOptionsSelected.set(true) + val intent = starter.createIntent(activity, internalProfileId) + fragment.activity!!.startActivity(intent) + if (previousMenuItemId == 0) fragment.activity!!.finish() + else if (previousMenuItemId != null && + NavigationDrawerItem.valueFromNavId(previousMenuItemId!!) != + NavigationDrawerItem.HOME + ) { + fragment.activity!!.finish() } + drawerLayout.closeDrawers() } } } diff --git a/app/src/main/res/layout-land/hints_summary.xml b/app/src/main/res/layout-land/hints_summary.xml index c1dcba67a30..2b654d0c309 100644 --- a/app/src/main/res/layout-land/hints_summary.xml +++ b/app/src/main/res/layout-land/hints_summary.xml @@ -84,7 +84,7 @@ android:layout_gravity="center_vertical" android:contentDescription="@{viewModel.computeHintListDropDownIconContentDescription()}" android:padding="8dp" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout-land/lessons_chapter_view.xml b/app/src/main/res/layout-land/lessons_chapter_view.xml index 3b7897fb411..d3fdbbca226 100644 --- a/app/src/main/res/layout-land/lessons_chapter_view.xml +++ b/app/src/main/res/layout-land/lessons_chapter_view.xml @@ -1,5 +1,6 @@ - + @@ -31,7 +32,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="8dp" android:contentDescription="@{viewModel.computeChapterPlayStateIconContentDescription()}" - android:src="@{viewModel.chapterPlayState == ChapterPlayState.COMPLETED?@drawable/ic_check_24dp:@drawable/ic_pending_24dp}" + app:srcCompat="@{viewModel.chapterPlayState == ChapterPlayState.COMPLETED?@drawable/ic_check_24dp:@drawable/ic_pending_24dp}" android:visibility="@{(viewModel.chapterPlayState == ChapterPlayState.COMPLETED || viewModel.chapterPlayState == ChapterPlayState.IN_PROGRESS_SAVED)?View.VISIBLE : View.INVISIBLE}" /> diff --git a/app/src/main/res/layout-land/onboarding_slide.xml b/app/src/main/res/layout-land/onboarding_slide.xml index ce316a794bd..3ac11c15768 100644 --- a/app/src/main/res/layout-land/onboarding_slide.xml +++ b/app/src/main/res/layout-land/onboarding_slide.xml @@ -29,7 +29,7 @@ android:adjustViewBounds="true" android:importantForAccessibility="no" android:scaleType="fitXY" - android:src="@{viewModel.slideImage}" + app:srcCompat="@{viewModel.slideImage}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="H, 10:9" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout-land/onboarding_slide_final.xml b/app/src/main/res/layout-land/onboarding_slide_final.xml index 934c8ed5758..afec77e83e1 100644 --- a/app/src/main/res/layout-land/onboarding_slide_final.xml +++ b/app/src/main/res/layout-land/onboarding_slide_final.xml @@ -30,7 +30,7 @@ android:adjustViewBounds="true" android:importantForAccessibility="no" android:scaleType="fitXY" - android:src="@drawable/ic_landscape_onboarding_3" + app:srcCompat="@drawable/ic_landscape_onboarding_3" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="H, 10:9" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout-land/profile_chooser_add_view.xml b/app/src/main/res/layout-land/profile_chooser_add_view.xml index ca149ec25ff..71071ed8f22 100644 --- a/app/src/main/res/layout-land/profile_chooser_add_view.xml +++ b/app/src/main/res/layout-land/profile_chooser_add_view.xml @@ -33,7 +33,7 @@ android:layout_width="72dp" android:layout_height="72dp" android:layout_marginBottom="8dp" - android:src="@drawable/ic_add_profile" + app:srcCompat="@{@drawable/ic_add_profile}" app:civ_border_color="@color/avatarBorder" app:civ_border_width="1dp" /> diff --git a/app/src/main/res/layout-land/profile_chooser_fragment.xml b/app/src/main/res/layout-land/profile_chooser_fragment.xml index 3d9a06b1bc4..43d2939a6a7 100644 --- a/app/src/main/res/layout-land/profile_chooser_fragment.xml +++ b/app/src/main/res/layout-land/profile_chooser_fragment.xml @@ -33,7 +33,7 @@ android:paddingStart="4dp" android:paddingTop="20dp" android:paddingEnd="20dp" - android:src="@drawable/ic_language_icon_grey_24dp" + app:srcCompat="@drawable/ic_language_icon_grey_24dp" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -117,7 +117,7 @@ android:paddingTop="12dp" android:paddingEnd="16dp" android:paddingBottom="12dp" - android:src="@drawable/ic_settings_grey_48dp" /> + app:srcCompat="@drawable/ic_settings_grey_48dp" /> diff --git a/app/src/main/res/layout-land/profile_progress_header.xml b/app/src/main/res/layout-land/profile_progress_header.xml index 3607624b315..8e9cfdc89c2 100644 --- a/app/src/main/res/layout-land/profile_progress_header.xml +++ b/app/src/main/res/layout-land/profile_progress_header.xml @@ -39,7 +39,7 @@ android:onClick="@{() -> viewModel.clickOnProfilePicture()}" android:paddingStart="12dp" android:paddingTop="12dp" - android:src="@drawable/rounded_white_background_with_shadow" + app:srcCompat="@drawable/rounded_white_background_with_shadow" app:layout_constraintBottom_toBottomOf="@+id/profile_edit_image" app:layout_constraintEnd_toEndOf="@+id/profile_edit_image" /> diff --git a/app/src/main/res/layout-land/question_player_fragment.xml b/app/src/main/res/layout-land/question_player_fragment.xml index 02b7cbdcfa0..b90b0b24ffc 100644 --- a/app/src/main/res/layout-land/question_player_fragment.xml +++ b/app/src/main/res/layout-land/question_player_fragment.xml @@ -148,7 +148,7 @@ android:layout_gravity="top|end" android:layout_margin="8dp" android:contentDescription="@string/new_hint_available" - android:src="@drawable/ic_dot_yellow_24dp" + app:srcCompat="@drawable/ic_dot_yellow_24dp" android:visibility="@{viewModel.isHintOpenedAndUnRevealed() ? View.VISIBLE : View.GONE}" /> + app:srcCompat="@drawable/ic_hint_bulb_white_24dp" /> diff --git a/app/src/main/res/layout-land/story_chapter_view.xml b/app/src/main/res/layout-land/story_chapter_view.xml index d1d43288657..be3a47b2989 100644 --- a/app/src/main/res/layout-land/story_chapter_view.xml +++ b/app/src/main/res/layout-land/story_chapter_view.xml @@ -95,7 +95,7 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="4dp" android:contentDescription="@{@string/chapter_completed}" - android:src="@drawable/ic_check_24dp" + app:srcCompat="@drawable/ic_check_24dp" android:visibility="@{viewModel.chapterSummary.chapterPlayState == ChapterPlayState.COMPLETED ? View.VISIBLE : View.GONE}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout-land/topic_info_fragment.xml b/app/src/main/res/layout-land/topic_info_fragment.xml index f42fd7673d2..007ec49262d 100644 --- a/app/src/main/res/layout-land/topic_info_fragment.xml +++ b/app/src/main/res/layout-land/topic_info_fragment.xml @@ -104,7 +104,7 @@ android:layout_marginTop="24dp" android:layout_marginEnd="72dp" android:layout_marginBottom="32dp" - android:src="@{viewModel.downloadStatusIndicatorDrawableResourceId, default=@drawable/ic_available_offline_primary_24dp}" + app:srcCompat="@{viewModel.downloadStatusIndicatorDrawableResourceId, default=@drawable/ic_available_offline_primary_24dp}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/see_more_text_view" /> diff --git a/app/src/main/res/layout-land/topic_lessons_story_summary.xml b/app/src/main/res/layout-land/topic_lessons_story_summary.xml index 09e92d066df..48ef7150074 100644 --- a/app/src/main/res/layout-land/topic_lessons_story_summary.xml +++ b/app/src/main/res/layout-land/topic_lessons_story_summary.xml @@ -135,7 +135,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:contentDescription="@{isListExpanded ? @string/hide_chapter_list : @string/show_chapter_list}" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout-land/walkthrough_final_fragment.xml b/app/src/main/res/layout-land/walkthrough_final_fragment.xml index c23c0c09f82..09ab8eeebb9 100644 --- a/app/src/main/res/layout-land/walkthrough_final_fragment.xml +++ b/app/src/main/res/layout-land/walkthrough_final_fragment.xml @@ -23,7 +23,7 @@ android:layout_width="180dp" android:layout_height="180dp" android:layout_marginStart="28dp" - android:src="@drawable/ic_portrait_onboarding_0" + app:srcCompat="@drawable/ic_portrait_onboarding_0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout-land/walkthrough_welcome_fragment.xml b/app/src/main/res/layout-land/walkthrough_welcome_fragment.xml index 5ce14f69346..a34f65e94d7 100644 --- a/app/src/main/res/layout-land/walkthrough_welcome_fragment.xml +++ b/app/src/main/res/layout-land/walkthrough_welcome_fragment.xml @@ -57,7 +57,7 @@ android:layout_width="180dp" android:layout_height="180dp" android:layout_marginStart="56dp" - android:src="@drawable/ic_portrait_onboarding_0" + app:srcCompat="@drawable/ic_portrait_onboarding_0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout-sw600dp-land/hints_summary.xml b/app/src/main/res/layout-sw600dp-land/hints_summary.xml index a9e5eb3639c..8f38a2a47a8 100644 --- a/app/src/main/res/layout-sw600dp-land/hints_summary.xml +++ b/app/src/main/res/layout-sw600dp-land/hints_summary.xml @@ -78,7 +78,7 @@ android:layout_gravity="center_vertical" android:contentDescription="@{viewModel.computeHintListDropDownIconContentDescription()}" android:padding="8dp" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout-sw600dp-land/onboarding_fragment.xml b/app/src/main/res/layout-sw600dp-land/onboarding_fragment.xml index 1f018a5b7a7..54be918fb4d 100644 --- a/app/src/main/res/layout-sw600dp-land/onboarding_fragment.xml +++ b/app/src/main/res/layout-sw600dp-land/onboarding_fragment.xml @@ -75,7 +75,7 @@ android:minHeight="48dp" android:onClick="@{(v) -> presenter.clickOnNext()}" android:scaleType="center" - android:src="@drawable/ic_arrow_forward_black_24dp" + app:srcCompat="@drawable/ic_arrow_forward_black_24dp" android:visibility="@{viewModel.slideNumber != 3 ? View.VISIBLE: View.GONE, default=visible}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout-sw600dp-land/onboarding_slide.xml b/app/src/main/res/layout-sw600dp-land/onboarding_slide.xml index 2e4497cf4b8..d583edeb5eb 100644 --- a/app/src/main/res/layout-sw600dp-land/onboarding_slide.xml +++ b/app/src/main/res/layout-sw600dp-land/onboarding_slide.xml @@ -28,7 +28,7 @@ android:layout_height="0dp" android:adjustViewBounds="true" android:importantForAccessibility="no" - android:src="@{viewModel.slideImage}" + app:srcCompat="@{viewModel.slideImage}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="40:39" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout-sw600dp-land/onboarding_slide_final.xml b/app/src/main/res/layout-sw600dp-land/onboarding_slide_final.xml index 3944fb465ae..c3b3095228c 100644 --- a/app/src/main/res/layout-sw600dp-land/onboarding_slide_final.xml +++ b/app/src/main/res/layout-sw600dp-land/onboarding_slide_final.xml @@ -29,7 +29,7 @@ android:layout_height="0dp" android:adjustViewBounds="true" android:importantForAccessibility="no" - android:src="@drawable/ic_landscape_onboarding_3_tablet" + app:srcCompat="@drawable/ic_landscape_onboarding_3_tablet" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="40:39" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout-sw600dp-land/profile_chooser_add_view.xml b/app/src/main/res/layout-sw600dp-land/profile_chooser_add_view.xml index 5e34a5d1fc9..6339536d44e 100644 --- a/app/src/main/res/layout-sw600dp-land/profile_chooser_add_view.xml +++ b/app/src/main/res/layout-sw600dp-land/profile_chooser_add_view.xml @@ -39,7 +39,7 @@ android:id="@+id/profile_add_button" android:layout_width="108dp" android:layout_height="108dp" - android:src="@drawable/ic_add_profile" + app:srcCompat="@{@drawable/ic_add_profile}" app:layoutMarginTop="@{hasProfileEverBeenAddedValue ? @dimen/profile_chooser_add_view_circular_image_margin_top_profile_already_added : @dimen/space_0dp}" app:civ_border_color="@color/avatarBorder" app:civ_border_width="1dp" /> diff --git a/app/src/main/res/layout-sw600dp-land/profile_chooser_fragment.xml b/app/src/main/res/layout-sw600dp-land/profile_chooser_fragment.xml index e00baba31e8..7598fcc7260 100644 --- a/app/src/main/res/layout-sw600dp-land/profile_chooser_fragment.xml +++ b/app/src/main/res/layout-sw600dp-land/profile_chooser_fragment.xml @@ -37,7 +37,7 @@ android:paddingStart="4dp" android:paddingTop="20dp" android:paddingEnd="20dp" - android:src="@drawable/ic_language_icon_grey_24dp" + app:srcCompat="@drawable/ic_language_icon_grey_24dp" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -121,7 +121,7 @@ android:layout_height="48dp" android:layout_marginEnd="96dp" android:padding="8dp" - android:src="@drawable/ic_settings_grey_48dp" /> + app:srcCompat="@drawable/ic_settings_grey_48dp" /> diff --git a/app/src/main/res/layout-sw600dp-land/profile_progress_header.xml b/app/src/main/res/layout-sw600dp-land/profile_progress_header.xml index 9398bca7926..6848b0031ef 100644 --- a/app/src/main/res/layout-sw600dp-land/profile_progress_header.xml +++ b/app/src/main/res/layout-sw600dp-land/profile_progress_header.xml @@ -38,7 +38,7 @@ android:onClick="@{() -> viewModel.clickOnProfilePicture()}" android:paddingStart="12dp" android:paddingTop="12dp" - android:src="@drawable/rounded_white_background_with_shadow" + app:srcCompat="@drawable/rounded_white_background_with_shadow" app:layout_constraintBottom_toBottomOf="@+id/profile_edit_image" app:layout_constraintEnd_toEndOf="@+id/profile_edit_image" /> diff --git a/app/src/main/res/layout-sw600dp-land/question_player_fragment.xml b/app/src/main/res/layout-sw600dp-land/question_player_fragment.xml index 55251dd52f7..8f6b5818b8d 100644 --- a/app/src/main/res/layout-sw600dp-land/question_player_fragment.xml +++ b/app/src/main/res/layout-sw600dp-land/question_player_fragment.xml @@ -152,7 +152,7 @@ android:layout_gravity="top|end" android:layout_margin="8dp" android:contentDescription="@string/new_hint_available" - android:src="@drawable/ic_dot_yellow_24dp" + app:srcCompat="@drawable/ic_dot_yellow_24dp" android:visibility="@{viewModel.isHintOpenedAndUnRevealed() ? View.VISIBLE : View.GONE}" /> + app:srcCompat="@drawable/ic_hint_bulb_white_24dp" /> diff --git a/app/src/main/res/layout-sw600dp-land/topic_info_fragment.xml b/app/src/main/res/layout-sw600dp-land/topic_info_fragment.xml index 428ddefc4f8..fb3a79937e2 100644 --- a/app/src/main/res/layout-sw600dp-land/topic_info_fragment.xml +++ b/app/src/main/res/layout-sw600dp-land/topic_info_fragment.xml @@ -99,7 +99,7 @@ android:layout_height="20dp" android:layout_marginStart="64dp" android:layout_marginTop="32dp" - android:src="@{viewModel.downloadStatusIndicatorDrawableResourceId, default=@drawable/ic_available_offline_primary_24dp}" + app:srcCompat="@{viewModel.downloadStatusIndicatorDrawableResourceId, default=@drawable/ic_available_offline_primary_24dp}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/see_more_text_view" /> diff --git a/app/src/main/res/layout-sw600dp-land/topic_lessons_story_summary.xml b/app/src/main/res/layout-sw600dp-land/topic_lessons_story_summary.xml index c7b07e6e927..d3f338cd0e6 100644 --- a/app/src/main/res/layout-sw600dp-land/topic_lessons_story_summary.xml +++ b/app/src/main/res/layout-sw600dp-land/topic_lessons_story_summary.xml @@ -138,7 +138,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:contentDescription="@{isListExpanded ? @string/hide_chapter_list : @string/show_chapter_list}" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout-sw600dp-port/hints_summary.xml b/app/src/main/res/layout-sw600dp-port/hints_summary.xml index 28dcfdd4ffb..c457db4d9ba 100644 --- a/app/src/main/res/layout-sw600dp-port/hints_summary.xml +++ b/app/src/main/res/layout-sw600dp-port/hints_summary.xml @@ -78,7 +78,7 @@ android:layout_gravity="center_vertical" android:contentDescription="@{viewModel.computeHintListDropDownIconContentDescription()}" android:padding="8dp" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout-sw600dp-port/onboarding_fragment.xml b/app/src/main/res/layout-sw600dp-port/onboarding_fragment.xml index 37cdf46fe28..7bfbe54ab2d 100644 --- a/app/src/main/res/layout-sw600dp-port/onboarding_fragment.xml +++ b/app/src/main/res/layout-sw600dp-port/onboarding_fragment.xml @@ -74,7 +74,7 @@ android:minHeight="48dp" android:onClick="@{(v) -> presenter.clickOnNext()}" android:scaleType="center" - android:src="@drawable/ic_arrow_forward_black_24dp" + app:srcCompat="@drawable/ic_arrow_forward_black_24dp" android:visibility="@{viewModel.slideNumber != 3 ? View.VISIBLE: View.GONE, default=visible}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout-sw600dp-port/onboarding_slide.xml b/app/src/main/res/layout-sw600dp-port/onboarding_slide.xml index 74a4ab27d9e..ef07a22d85b 100644 --- a/app/src/main/res/layout-sw600dp-port/onboarding_slide.xml +++ b/app/src/main/res/layout-sw600dp-port/onboarding_slide.xml @@ -27,7 +27,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:importantForAccessibility="no" - android:src="@{viewModel.slideImage}" + app:srcCompat="@{viewModel.slideImage}" app:layout_constraintDimensionRatio="5:4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout-sw600dp-port/onboarding_slide_final.xml b/app/src/main/res/layout-sw600dp-port/onboarding_slide_final.xml index 1890899d7cd..f7b1c43797a 100644 --- a/app/src/main/res/layout-sw600dp-port/onboarding_slide_final.xml +++ b/app/src/main/res/layout-sw600dp-port/onboarding_slide_final.xml @@ -28,7 +28,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:importantForAccessibility="no" - android:src="@drawable/ic_portrait_onboarding_3" + app:srcCompat="@drawable/ic_portrait_onboarding_3" app:layout_constraintDimensionRatio="5:4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout-sw600dp-port/profile_chooser_add_view.xml b/app/src/main/res/layout-sw600dp-port/profile_chooser_add_view.xml index 7ebf1309dd1..2b493e7cd69 100644 --- a/app/src/main/res/layout-sw600dp-port/profile_chooser_add_view.xml +++ b/app/src/main/res/layout-sw600dp-port/profile_chooser_add_view.xml @@ -40,7 +40,7 @@ android:id="@+id/profile_add_button" android:layout_width="108dp" android:layout_height="108dp" - android:src="@drawable/ic_add_profile" + app:srcCompat="@{@drawable/ic_add_profile}" app:layoutMarginTop="@{hasProfileEverBeenAddedValue ? @dimen/profile_chooser_add_view_circular_image_margin_top_profile_already_added : @dimen/space_0dp}" app:civ_border_color="@color/avatarBorder" app:civ_border_width="1dp" /> diff --git a/app/src/main/res/layout-sw600dp-port/profile_chooser_fragment.xml b/app/src/main/res/layout-sw600dp-port/profile_chooser_fragment.xml index 92c6e540cee..0c68b38ba4f 100644 --- a/app/src/main/res/layout-sw600dp-port/profile_chooser_fragment.xml +++ b/app/src/main/res/layout-sw600dp-port/profile_chooser_fragment.xml @@ -37,7 +37,7 @@ android:paddingStart="4dp" android:paddingTop="20dp" android:paddingEnd="20dp" - android:src="@drawable/ic_language_icon_grey_24dp" + app:srcCompat="@drawable/ic_language_icon_grey_24dp" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -121,7 +121,7 @@ android:layout_height="48dp" android:layout_marginEnd="64dp" android:padding="8dp" - android:src="@drawable/ic_settings_grey_48dp" /> + app:srcCompat="@drawable/ic_settings_grey_48dp" /> diff --git a/app/src/main/res/layout-sw600dp-port/profile_progress_header.xml b/app/src/main/res/layout-sw600dp-port/profile_progress_header.xml index 46455c87825..a7b3a4ce187 100644 --- a/app/src/main/res/layout-sw600dp-port/profile_progress_header.xml +++ b/app/src/main/res/layout-sw600dp-port/profile_progress_header.xml @@ -38,7 +38,7 @@ android:onClick="@{() -> viewModel.clickOnProfilePicture()}" android:paddingStart="12dp" android:paddingTop="12dp" - android:src="@drawable/rounded_white_background_with_shadow" + app:srcCompat="@drawable/rounded_white_background_with_shadow" app:layout_constraintBottom_toBottomOf="@+id/profile_edit_image" app:layout_constraintEnd_toEndOf="@+id/profile_edit_image" /> diff --git a/app/src/main/res/layout-sw600dp-port/question_player_fragment.xml b/app/src/main/res/layout-sw600dp-port/question_player_fragment.xml index ceaa478e9ab..ef3b272aceb 100644 --- a/app/src/main/res/layout-sw600dp-port/question_player_fragment.xml +++ b/app/src/main/res/layout-sw600dp-port/question_player_fragment.xml @@ -152,7 +152,7 @@ android:layout_gravity="top|end" android:layout_margin="8dp" android:contentDescription="@string/new_hint_available" - android:src="@drawable/ic_dot_yellow_24dp" + app:srcCompat="@drawable/ic_dot_yellow_24dp" android:visibility="@{viewModel.isHintOpenedAndUnRevealed() ? View.VISIBLE : View.GONE}" /> + app:srcCompat="@drawable/ic_hint_bulb_white_24dp" /> diff --git a/app/src/main/res/layout-sw600dp-port/topic_info_fragment.xml b/app/src/main/res/layout-sw600dp-port/topic_info_fragment.xml index 2aa1375f61a..c9bfa875c35 100644 --- a/app/src/main/res/layout-sw600dp-port/topic_info_fragment.xml +++ b/app/src/main/res/layout-sw600dp-port/topic_info_fragment.xml @@ -118,7 +118,7 @@ android:layout_height="20dp" android:layout_marginStart="120dp" android:layout_marginTop="24dp" - android:src="@{viewModel.downloadStatusIndicatorDrawableResourceId, default=@drawable/ic_available_offline_primary_24dp}" + app:srcCompat="@{viewModel.downloadStatusIndicatorDrawableResourceId, default=@drawable/ic_available_offline_primary_24dp}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/see_more_text_view" /> diff --git a/app/src/main/res/layout-sw600dp-port/topic_lessons_story_summary.xml b/app/src/main/res/layout-sw600dp-port/topic_lessons_story_summary.xml index 25b801e8054..9649b299c79 100644 --- a/app/src/main/res/layout-sw600dp-port/topic_lessons_story_summary.xml +++ b/app/src/main/res/layout-sw600dp-port/topic_lessons_story_summary.xml @@ -138,7 +138,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:contentDescription="@{isListExpanded ? @string/hide_chapter_list : @string/show_chapter_list}" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout-sw600dp/help_activity.xml b/app/src/main/res/layout-sw600dp/help_activity.xml index 219ff664632..1b812394dea 100644 --- a/app/src/main/res/layout-sw600dp/help_activity.xml +++ b/app/src/main/res/layout-sw600dp/help_activity.xml @@ -37,7 +37,7 @@ android:background="@color/oppiaGreyBackground" android:contentDescription="@string/help_activity_back_arrow_description" android:padding="12dp" - android:src="@drawable/ic_arrow_back_black_24_dp" + app:srcCompat="@drawable/ic_arrow_back_black_24_dp" android:visibility="gone" app:layout_constraintStart_toEndOf="@id/multipane_guideline" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout-sw600dp/story_chapter_view.xml b/app/src/main/res/layout-sw600dp/story_chapter_view.xml index 8ea5b6867a4..72b96f4a8ef 100644 --- a/app/src/main/res/layout-sw600dp/story_chapter_view.xml +++ b/app/src/main/res/layout-sw600dp/story_chapter_view.xml @@ -67,7 +67,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="center" - android:src="@drawable/ic_baseline_lock_24" + app:srcCompat="@drawable/ic_baseline_lock_24" android:visibility="@{viewModel.chapterSummary.chapterPlayState == ChapterPlayState.NOT_PLAYABLE_MISSING_PREREQUISITES ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintBottom_toBottomOf="@id/chapter_thumbnail" app:layout_constraintEnd_toEndOf="@id/chapter_thumbnail" @@ -128,7 +128,7 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="4dp" android:contentDescription="@{@string/chapter_completed}" - android:src="@drawable/ic_check_24dp" + app:srcCompat="@drawable/ic_check_24dp" android:visibility="@{viewModel.chapterSummary.chapterPlayState == ChapterPlayState.COMPLETED ? View.VISIBLE : View.GONE}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/activity_view_binding_adapters_test.xml b/app/src/main/res/layout/activity_view_binding_adapters_test.xml index ae933b4f361..1ea2f715569 100644 --- a/app/src/main/res/layout/activity_view_binding_adapters_test.xml +++ b/app/src/main/res/layout/activity_view_binding_adapters_test.xml @@ -1,5 +1,6 @@ - + + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" /> diff --git a/app/src/main/res/layout/add_profile_activity.xml b/app/src/main/res/layout/add_profile_activity.xml index bf756349f13..3765a11afa0 100644 --- a/app/src/main/res/layout/add_profile_activity.xml +++ b/app/src/main/res/layout/add_profile_activity.xml @@ -45,7 +45,7 @@ android:clickable="true" android:contentDescription="@string/current_profile_picture_content_description" android:focusable="true" - android:src="@drawable/ic_default_avatar" + app:srcCompat="@drawable/ic_default_avatar" app:add_shadow="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -59,7 +59,7 @@ android:contentDescription="@string/edit_profile_picture_content_description" android:paddingStart="12dp" android:paddingTop="12dp" - android:src="@drawable/rounded_white_background_with_shadow" + app:srcCompat="@drawable/rounded_white_background_with_shadow" app:layout_constraintBottom_toBottomOf="@+id/add_profile_activity_user_image_view" app:layout_constraintEnd_toEndOf="@+id/add_profile_activity_user_image_view" /> @@ -113,7 +113,7 @@ android:layout_height="48dp" android:contentDescription="@string/add_profile_info_content_description" android:padding="12dp" - android:src="@drawable/ic_info_icon" + app:srcCompat="@drawable/ic_info_icon" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/add_profile_activity_pin_check_box" /> diff --git a/app/src/main/res/layout/app_version_fragment.xml b/app/src/main/res/layout/app_version_fragment.xml index 17c0b0ff013..3c0dae0e83e 100644 --- a/app/src/main/res/layout/app_version_fragment.xml +++ b/app/src/main/res/layout/app_version_fragment.xml @@ -36,7 +36,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/app_version_image_view_margin_start" - android:src="@drawable/ic_info_icon_gray_24dp" + app:srcCompat="@drawable/ic_info_icon_gray_24dp" app:layout_constraintEnd_toStartOf="@id/app_last_update_date_text_view" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/app_last_update_date_text_view" /> diff --git a/app/src/main/res/layout/audio_fragment.xml b/app/src/main/res/layout/audio_fragment.xml index 6b7417560ab..63c5bbe3562 100755 --- a/app/src/main/res/layout/audio_fragment.xml +++ b/app/src/main/res/layout/audio_fragment.xml @@ -35,7 +35,7 @@ android:contentDescription="@{viewModel.playStatusLiveData == UiAudioPlayStatus.PLAYING ? @string/audio_pause_description : @string/audio_play_description}" android:onClick="@{(v) -> viewModel.togglePlayPause(viewModel.playStatusLiveData)}" android:padding="12dp" - android:src="@{viewModel.playStatusLiveData == UiAudioPlayStatus.PLAYING ? @drawable/ic_pause_circle_filled_white_24dp : @drawable/ic_play_circle_filled_white_24dp}" + app:srcCompat="@{viewModel.playStatusLiveData == UiAudioPlayStatus.PLAYING ? @drawable/ic_pause_circle_filled_white_24dp : @drawable/ic_play_circle_filled_white_24dp}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -69,7 +69,7 @@ android:gravity="center" android:onClick="@{(v) -> audioFragment.languageSelectionClicked()}" android:padding="12dp" - android:src="@drawable/ic_audio_lang_24px" + app:srcCompat="@drawable/ic_audio_lang_24px" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/drag_drop_interaction_items.xml b/app/src/main/res/layout/drag_drop_interaction_items.xml index 2c7a8a1dd3f..429c8799e47 100644 --- a/app/src/main/res/layout/drag_drop_interaction_items.xml +++ b/app/src/main/res/layout/drag_drop_interaction_items.xml @@ -45,7 +45,7 @@ android:enabled="@{viewModel.itemIndex != 0}" android:focusable="true" android:onClick="@{(v) -> viewModel.handleUpMovement(adapter)}" - android:src="@drawable/ic_arrow_up_black_24dp" + app:srcCompat="@drawable/ic_arrow_up_black_24dp" android:tint="@{dragDropMoveUpItem.enabled? @color/mergeIconEnabled : @color/mergeIconDisabled}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -62,7 +62,7 @@ android:enabled="@{viewModel.itemIndex != viewModel.listSize-1}" android:focusable="true" android:onClick="@{(v) -> viewModel.handleDownMovement(adapter)}" - android:src="@drawable/ic_keyboard_arrow_down_black_24dp" + app:srcCompat="@drawable/ic_keyboard_arrow_down_black_24dp" android:tint="@{dragDropMoveDownItem.enabled? @color/mergeIconEnabled : @color/mergeIconDisabled}" /> @@ -91,7 +91,7 @@ android:focusable="true" android:onClick="@{(v) -> viewModel.handleGrouping(adapter)}" android:padding="16dp" - android:src="@drawable/ic_merge_icon_24" + app:srcCompat="@drawable/ic_merge_icon_24" android:tint="@{dragDropContentGroupItem.enabled? @color/mergeIconEnabled : @color/mergeIconDisabled}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -107,7 +107,7 @@ android:focusable="true" android:onClick="@{(v) -> viewModel.handleUnlinking(adapter)}" android:padding="16dp" - android:src="@drawable/ic_unlink_icon_24" + app:srcCompat="@drawable/ic_unlink_icon_24" app:layout_constraintBottom_toTopOf="@+id/drag_drop_content_group_item" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/drawer_fragment.xml b/app/src/main/res/layout/drawer_fragment.xml index b440a07d396..ae5fd677775 100644 --- a/app/src/main/res/layout/drawer_fragment.xml +++ b/app/src/main/res/layout/drawer_fragment.xml @@ -65,7 +65,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center_vertical" - android:src="@drawable/ic_baseline_code_24" + app:srcCompat="@drawable/ic_baseline_code_24" android:tint="@{footerViewModel.isDeveloperOptionsSelected ? @color/highlightedDeveloperOptionsNavMenuItem : @color/oppiaPrimaryTextDark}"/> diff --git a/app/src/main/res/layout/force_network_type_network_item_view.xml b/app/src/main/res/layout/force_network_type_network_item_view.xml index 86ecad0dac2..5c57171578a 100644 --- a/app/src/main/res/layout/force_network_type_network_item_view.xml +++ b/app/src/main/res/layout/force_network_type_network_item_view.xml @@ -42,7 +42,7 @@ android:layout_marginEnd="18dp" android:layout_marginBottom="4dp" android:contentDescription="@{@string/force_network_type_network_selected}" - android:src="@drawable/ic_check_24dp" + app:srcCompat="@drawable/ic_check_24dp" android:visibility="@{isNetworkSelected ? View.VISIBLE : View.GONE }" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/hints_summary.xml b/app/src/main/res/layout/hints_summary.xml index 75db37f1e2b..7b0763ccce5 100644 --- a/app/src/main/res/layout/hints_summary.xml +++ b/app/src/main/res/layout/hints_summary.xml @@ -84,7 +84,7 @@ android:layout_gravity="center_vertical" android:contentDescription="@{viewModel.computeHintListDropDownIconContentDescription()}" android:padding="8dp" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout/image_region_selection_test_fragment.xml b/app/src/main/res/layout/image_region_selection_test_fragment.xml index 57758ce4d1d..5ff07314181 100644 --- a/app/src/main/res/layout/image_region_selection_test_fragment.xml +++ b/app/src/main/res/layout/image_region_selection_test_fragment.xml @@ -1,6 +1,7 @@ + app:srcCompat="@drawable/testing_fraction" /> - + @@ -31,7 +32,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="8dp" android:contentDescription="@{viewModel.computeChapterPlayStateIconContentDescription()}" - android:src="@{viewModel.chapterPlayState == ChapterPlayState.COMPLETED?@drawable/ic_check_24dp:@drawable/ic_pending_24dp}" + app:srcCompat="@{viewModel.chapterPlayState == ChapterPlayState.COMPLETED?@drawable/ic_check_24dp:@drawable/ic_pending_24dp}" android:visibility="@{(viewModel.chapterPlayState == ChapterPlayState.COMPLETED || viewModel.chapterPlayState == ChapterPlayState.IN_PROGRESS_SAVED)?View.VISIBLE : View.INVISIBLE}" /> diff --git a/app/src/main/res/layout/onboarding_slide.xml b/app/src/main/res/layout/onboarding_slide.xml index 72ac87b4bff..b3b42071e30 100644 --- a/app/src/main/res/layout/onboarding_slide.xml +++ b/app/src/main/res/layout/onboarding_slide.xml @@ -27,7 +27,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:importantForAccessibility="no" - android:src="@{viewModel.slideImage}" + app:srcCompat="@{viewModel.slideImage}" app:layout_constraintDimensionRatio="5:4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/onboarding_slide_final.xml b/app/src/main/res/layout/onboarding_slide_final.xml index 40158512bd7..b9d63d9d3c3 100644 --- a/app/src/main/res/layout/onboarding_slide_final.xml +++ b/app/src/main/res/layout/onboarding_slide_final.xml @@ -29,7 +29,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:importantForAccessibility="no" - android:src="@drawable/ic_portrait_onboarding_3" + app:srcCompat="@drawable/ic_portrait_onboarding_3" app:layout_constraintDimensionRatio="5:4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/pin_password_activity.xml b/app/src/main/res/layout/pin_password_activity.xml index d45770e047a..59065c76ec2 100644 --- a/app/src/main/res/layout/pin_password_activity.xml +++ b/app/src/main/res/layout/pin_password_activity.xml @@ -173,7 +173,7 @@ android:layout_height="32dp" android:layout_gravity="center_horizontal" android:contentDescription="@{viewModel.showPassword ? @string/password_shown_icon : @string/password_hidden_icon}" - android:src="@{viewModel.showPassword ? @drawable/ic_show_eye_icon : @drawable/ic_hide_eye_icon}" /> + app:srcCompat="@{viewModel.showPassword ? @drawable/ic_show_eye_icon : @drawable/ic_hide_eye_icon}" /> diff --git a/app/src/main/res/layout/profile_chooser_fragment.xml b/app/src/main/res/layout/profile_chooser_fragment.xml index bba2aeb6c10..cb7210cc957 100644 --- a/app/src/main/res/layout/profile_chooser_fragment.xml +++ b/app/src/main/res/layout/profile_chooser_fragment.xml @@ -33,7 +33,7 @@ android:paddingStart="4dp" android:paddingTop="20dp" android:paddingEnd="20dp" - android:src="@drawable/ic_language_icon_grey_24dp" + app:srcCompat="@drawable/ic_language_icon_grey_24dp" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"/> @@ -117,7 +117,7 @@ android:paddingTop="12dp" android:paddingEnd="16dp" android:paddingBottom="12dp" - android:src="@drawable/ic_settings_grey_48dp" /> + app:srcCompat="@drawable/ic_settings_grey_48dp" /> diff --git a/app/src/main/res/layout/profile_progress_header.xml b/app/src/main/res/layout/profile_progress_header.xml index 706fe2ecc61..c83060e0fd7 100644 --- a/app/src/main/res/layout/profile_progress_header.xml +++ b/app/src/main/res/layout/profile_progress_header.xml @@ -40,7 +40,7 @@ android:onClick="@{() -> viewModel.clickOnProfilePicture()}" android:paddingStart="8dp" android:paddingTop="8dp" - android:src="@drawable/rounded_white_background_with_shadow" + app:srcCompat="@drawable/rounded_white_background_with_shadow" app:layout_constraintBottom_toBottomOf="@+id/profile_edit_image" app:layout_constraintEnd_toEndOf="@+id/profile_edit_image"/> diff --git a/app/src/main/res/layout/question_player_fragment.xml b/app/src/main/res/layout/question_player_fragment.xml index f0d1fc08d77..7591436349e 100644 --- a/app/src/main/res/layout/question_player_fragment.xml +++ b/app/src/main/res/layout/question_player_fragment.xml @@ -128,7 +128,7 @@ android:layout_gravity="top|end" android:layout_margin="8dp" android:contentDescription="@string/new_hint_available" - android:src="@drawable/ic_dot_yellow_24dp" + app:srcCompat="@drawable/ic_dot_yellow_24dp" android:visibility="@{viewModel.isHintOpenedAndUnRevealed() ? View.VISIBLE : View.GONE}" /> + app:srcCompat="@drawable/ic_hint_bulb_white_24dp" /> diff --git a/app/src/main/res/layout/state_fragment.xml b/app/src/main/res/layout/state_fragment.xml index 3568b2df265..c70dd2cbc7c 100755 --- a/app/src/main/res/layout/state_fragment.xml +++ b/app/src/main/res/layout/state_fragment.xml @@ -114,7 +114,7 @@ android:layout_gravity="top|end" android:layout_margin="8dp" android:contentDescription="@string/new_hint_available" - android:src="@drawable/ic_dot_yellow_24dp" + app:srcCompat="@drawable/ic_dot_yellow_24dp" android:visibility="@{viewModel.isHintOpenedAndUnRevealed() ? View.VISIBLE : View.GONE}" /> + app:srcCompat="@drawable/ic_hint_bulb_white_24dp" /> diff --git a/app/src/main/res/layout/topic_lessons_story_summary.xml b/app/src/main/res/layout/topic_lessons_story_summary.xml index 722c8bb94f6..9e37a313bf3 100644 --- a/app/src/main/res/layout/topic_lessons_story_summary.xml +++ b/app/src/main/res/layout/topic_lessons_story_summary.xml @@ -135,7 +135,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:contentDescription="@{isListExpanded ? @string/hide_chapter_list : @string/show_chapter_list}" - android:src="@drawable/ic_arrow_drop_down_black_24dp" + app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" app:isRotationAnimationClockwise="@{isListExpanded}" app:rotationAnimationAngle="@{180f}" /> diff --git a/app/src/main/res/layout/topic_practice_subtopic.xml b/app/src/main/res/layout/topic_practice_subtopic.xml index d476aef4138..d08d11b5a40 100755 --- a/app/src/main/res/layout/topic_practice_subtopic.xml +++ b/app/src/main/res/layout/topic_practice_subtopic.xml @@ -45,7 +45,7 @@ android:layout_height="wrap_content" android:button="@drawable/selector_checkbox" android:checked="@{isChecked}" - android:drawableStart="@android:color/transparent" + app:drawableStartCompat="@android:color/transparent" android:drawablePadding="20dp" android:fontFamily="sans-serif" android:gravity="start|top" diff --git a/app/src/main/res/layout/walkthrough_activity.xml b/app/src/main/res/layout/walkthrough_activity.xml index 114fd74982c..d4c26c4a22f 100644 --- a/app/src/main/res/layout/walkthrough_activity.xml +++ b/app/src/main/res/layout/walkthrough_activity.xml @@ -37,7 +37,7 @@ android:contentDescription="@string/back_button" android:focusable="true" android:onClick="@{(v) -> presenter.moveToPreviousPage(viewModel.currentProgress)}" - android:src="@drawable/ic_arrow_back_white_24dp" + app:srcCompat="@drawable/ic_arrow_back_white_24dp" android:tint="@color/grey" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/walkthrough_final_fragment.xml b/app/src/main/res/layout/walkthrough_final_fragment.xml index 75d1ef649a9..6bcc514b99a 100644 --- a/app/src/main/res/layout/walkthrough_final_fragment.xml +++ b/app/src/main/res/layout/walkthrough_final_fragment.xml @@ -27,7 +27,7 @@ android:layout_width="180dp" android:layout_height="180dp" android:layout_marginTop="32dp" - android:src="@drawable/ic_portrait_onboarding_0" + app:srcCompat="@drawable/ic_portrait_onboarding_0" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/walkthrough_final_title_text_view" /> diff --git a/app/src/main/res/layout/walkthrough_welcome_fragment.xml b/app/src/main/res/layout/walkthrough_welcome_fragment.xml index 002c9d57959..8f915dd3f0f 100644 --- a/app/src/main/res/layout/walkthrough_welcome_fragment.xml +++ b/app/src/main/res/layout/walkthrough_welcome_fragment.xml @@ -58,7 +58,7 @@ android:layout_width="180dp" android:layout_height="180dp" android:layout_marginTop="32dp" - android:src="@drawable/ic_portrait_onboarding_0" + app:srcCompat="@drawable/ic_portrait_onboarding_0" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/walkthrough_welcome_description_text_view" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6b271c3c3a9..16a1d20e97a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -88,7 +88,7 @@ @drawable/previous_next_state_image_view_background @string/previous_state_description 12dp - @drawable/ic_arrow_back_oppia_dark_blue_24dp + @drawable/ic_arrow_back_oppia_dark_blue_24dp