diff --git a/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 00000000..f7031c98 Binary files /dev/null and b/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock differ diff --git a/.gradle/7.1/dependencies-accessors/gc.properties b/.gradle/7.1/dependencies-accessors/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/7.1/executionHistory/executionHistory.bin b/.gradle/7.1/executionHistory/executionHistory.bin new file mode 100644 index 00000000..03d40d0a Binary files /dev/null and b/.gradle/7.1/executionHistory/executionHistory.bin differ diff --git a/.gradle/7.1/executionHistory/executionHistory.lock b/.gradle/7.1/executionHistory/executionHistory.lock new file mode 100644 index 00000000..1e5aec3e Binary files /dev/null and b/.gradle/7.1/executionHistory/executionHistory.lock differ diff --git a/.gradle/7.1/fileChanges/last-build.bin b/.gradle/7.1/fileChanges/last-build.bin new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/.gradle/7.1/fileChanges/last-build.bin differ diff --git a/.gradle/7.1/fileHashes/fileHashes.bin b/.gradle/7.1/fileHashes/fileHashes.bin new file mode 100644 index 00000000..1ff95471 Binary files /dev/null and b/.gradle/7.1/fileHashes/fileHashes.bin differ diff --git a/.gradle/7.1/fileHashes/fileHashes.lock b/.gradle/7.1/fileHashes/fileHashes.lock new file mode 100644 index 00000000..43192d96 Binary files /dev/null and b/.gradle/7.1/fileHashes/fileHashes.lock differ diff --git a/.gradle/7.1/fileHashes/resourceHashesCache.bin b/.gradle/7.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 00000000..df428dba Binary files /dev/null and b/.gradle/7.1/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/7.1/gc.properties b/.gradle/7.1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 00000000..3a7d1541 Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 00000000..ed866bef --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sat Jul 24 00:51:41 BRT 2021 +gradle.version=7.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 00000000..36382257 Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock new file mode 100644 index 00000000..f5f70e15 Binary files /dev/null and b/.gradle/checksums/checksums.lock differ diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin new file mode 100644 index 00000000..f6da0fa8 Binary files /dev/null and b/.gradle/checksums/md5-checksums.bin differ diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin new file mode 100644 index 00000000..54c28949 Binary files /dev/null and b/.gradle/checksums/sha1-checksums.bin differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..23c01cdc --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +desafio-android \ No newline at end of file diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 00000000..d741ae20 --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,51 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..fb7f4a8a --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..526b4c25 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml b/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml new file mode 100644 index 00000000..42cb599c --- /dev/null +++ b/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_activity_activity_ktx_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_activity_activity_ktx_1_1_0_aar.xml new file mode 100644 index 00000000..84dd2579 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_activity_activity_ktx_1_1_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml b/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml new file mode 100644 index 00000000..74437d76 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml new file mode 100644 index 00000000..0eb8b4ac --- /dev/null +++ b/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml new file mode 100644 index 00000000..63d7f8c0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml new file mode 100644 index 00000000..33f6ecce --- /dev/null +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml b/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml new file mode 100644 index 00000000..22084152 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml new file mode 100644 index 00000000..129861ef --- /dev/null +++ b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml new file mode 100644 index 00000000..33943191 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml new file mode 100644 index 00000000..336544db --- /dev/null +++ b/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml b/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml new file mode 100644 index 00000000..eafc05e9 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_collection_collection_ktx_1_1_0.xml b/.idea/libraries/Gradle__androidx_collection_collection_ktx_1_1_0.xml new file mode 100644 index 00000000..5183afac --- /dev/null +++ b/.idea/libraries/Gradle__androidx_collection_collection_ktx_1_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_0_4_aar.xml b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_0_4_aar.xml new file mode 100644 index 00000000..46d9df13 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_0_4_aar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_2_0_4.xml b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_2_0_4.xml new file mode 100644 index 00000000..cba1dae0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_2_0_4.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml new file mode 100644 index 00000000..4a9d1ed3 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_core_core_1_6_0_aar.xml b/.idea/libraries/Gradle__androidx_core_core_1_6_0_aar.xml new file mode 100644 index 00000000..ca8b8032 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_core_core_1_6_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_core_core_ktx_1_6_0_aar.xml b/.idea/libraries/Gradle__androidx_core_core_ktx_1_6_0_aar.xml new file mode 100644 index 00000000..d81911a5 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_core_core_ktx_1_6_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml new file mode 100644 index 00000000..ed40df56 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_customview_customview_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_customview_customview_1_1_0_aar.xml new file mode 100644 index 00000000..5186697b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_customview_customview_1_1_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_databinding_databinding_adapters_7_1_0_alpha04_aar.xml b/.idea/libraries/Gradle__androidx_databinding_databinding_adapters_7_1_0_alpha04_aar.xml new file mode 100644 index 00000000..967fe4b4 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_databinding_databinding_adapters_7_1_0_alpha04_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_databinding_databinding_common_7_1_0_alpha04.xml b/.idea/libraries/Gradle__androidx_databinding_databinding_common_7_1_0_alpha04.xml new file mode 100644 index 00000000..cea5c4b2 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_databinding_databinding_common_7_1_0_alpha04.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_databinding_databinding_ktx_7_1_0_alpha04_aar.xml b/.idea/libraries/Gradle__androidx_databinding_databinding_ktx_7_1_0_alpha04_aar.xml new file mode 100644 index 00000000..eb7c0025 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_databinding_databinding_ktx_7_1_0_alpha04_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_databinding_databinding_runtime_7_1_0_alpha04_aar.xml b/.idea/libraries/Gradle__androidx_databinding_databinding_runtime_7_1_0_alpha04_aar.xml new file mode 100644 index 00000000..58e6663e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_databinding_databinding_runtime_7_1_0_alpha04_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_databinding_viewbinding_7_1_0_alpha04_aar.xml b/.idea/libraries/Gradle__androidx_databinding_viewbinding_7_1_0_alpha04_aar.xml new file mode 100644 index 00000000..c0dcdfe0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_databinding_viewbinding_7_1_0_alpha04_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml new file mode 100644 index 00000000..e5b49202 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_1_0_aar.xml new file mode 100644 index 00000000..41e0543f --- /dev/null +++ b/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml new file mode 100644 index 00000000..278ae444 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_exifinterface_exifinterface_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_exifinterface_exifinterface_1_0_0_aar.xml new file mode 100644 index 00000000..026ec671 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_exifinterface_exifinterface_1_0_0_aar.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml b/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml new file mode 100644 index 00000000..f5606986 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_fragment_fragment_ktx_1_2_4_aar.xml b/.idea/libraries/Gradle__androidx_fragment_fragment_ktx_1_2_4_aar.xml new file mode 100644 index 00000000..6b7a7e8c --- /dev/null +++ b/.idea/libraries/Gradle__androidx_fragment_fragment_ktx_1_2_4_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_hilt_hilt_common_1_0_0_alpha02_aar.xml b/.idea/libraries/Gradle__androidx_hilt_hilt_common_1_0_0_alpha02_aar.xml new file mode 100644 index 00000000..bf89f293 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_hilt_hilt_common_1_0_0_alpha02_aar.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_hilt_hilt_lifecycle_viewmodel_1_0_0_alpha02_aar.xml b/.idea/libraries/Gradle__androidx_hilt_hilt_lifecycle_viewmodel_1_0_0_alpha02_aar.xml new file mode 100644 index 00000000..0ee09904 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_hilt_hilt_lifecycle_viewmodel_1_0_0_alpha02_aar.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml new file mode 100644 index 00000000..9f8172a0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml new file mode 100644 index 00000000..d344242a --- /dev/null +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml new file mode 100644 index 00000000..986feb6c --- /dev/null +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml new file mode 100644 index 00000000..1f01389d --- /dev/null +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml new file mode 100644 index 00000000..a1e19120 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_extensions_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_extensions_2_2_0_aar.xml new file mode 100644 index 00000000..194465bf --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_extensions_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml new file mode 100644 index 00000000..2f0c0460 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml new file mode 100644 index 00000000..2d5bb1fd --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml new file mode 100644 index 00000000..ee97e7c1 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml new file mode 100644 index 00000000..ea7cb672 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_process_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_process_2_2_0_aar.xml new file mode 100644 index 00000000..0ef476b2 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_process_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml new file mode 100644 index 00000000..9a7086df --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_2_0_aar.xml new file mode 100644 index 00000000..cafa5b69 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_service_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_service_2_2_0_aar.xml new file mode 100644 index 00000000..2b724e2e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_service_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml new file mode 100644 index 00000000..27f634be --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml new file mode 100644 index 00000000..a748bc49 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml new file mode 100644 index 00000000..dd1276af --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml new file mode 100644 index 00000000..6d77cf1f --- /dev/null +++ b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml new file mode 100644 index 00000000..346b0009 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml new file mode 100644 index 00000000..fc4f2a91 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_common_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_common_2_3_0_aar.xml new file mode 100644 index 00000000..5f4575c7 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_common_2_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_common_ktx_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_common_ktx_2_3_0_aar.xml new file mode 100644 index 00000000..a3fd0ecd --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_common_ktx_2_3_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_fragment_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_fragment_2_3_0_aar.xml new file mode 100644 index 00000000..1aad998d --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_fragment_2_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_fragment_ktx_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_fragment_ktx_2_3_0_aar.xml new file mode 100644 index 00000000..bcda396b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_fragment_ktx_2_3_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_2_3_0_aar.xml new file mode 100644 index 00000000..fb1b9f38 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_2_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_ktx_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_ktx_2_3_0_aar.xml new file mode 100644 index 00000000..4c039199 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_ktx_2_3_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_ui_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_ui_2_3_0_aar.xml new file mode 100644 index 00000000..daef3bd9 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_ui_2_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_navigation_navigation_ui_ktx_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_navigation_navigation_ui_ktx_2_3_0_aar.xml new file mode 100644 index 00000000..39f264c5 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_navigation_navigation_ui_ktx_2_3_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_paging_paging_common_3_0_0_alpha05.xml b/.idea/libraries/Gradle__androidx_paging_paging_common_3_0_0_alpha05.xml new file mode 100644 index 00000000..7a3adc21 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_paging_paging_common_3_0_0_alpha05.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_paging_paging_common_ktx_3_0_0_alpha05.xml b/.idea/libraries/Gradle__androidx_paging_paging_common_ktx_3_0_0_alpha05.xml new file mode 100644 index 00000000..b4ee1a94 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_paging_paging_common_ktx_3_0_0_alpha05.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_paging_paging_runtime_3_0_0_alpha05_aar.xml b/.idea/libraries/Gradle__androidx_paging_paging_runtime_3_0_0_alpha05_aar.xml new file mode 100644 index 00000000..4edffaf8 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_paging_paging_runtime_3_0_0_alpha05_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml new file mode 100644 index 00000000..3c3fdc62 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_2_0_alpha04_aar.xml b/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_2_0_alpha04_aar.xml new file mode 100644 index 00000000..494b869c --- /dev/null +++ b/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_2_0_alpha04_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_common_2_3_0.xml b/.idea/libraries/Gradle__androidx_room_room_common_2_3_0.xml new file mode 100644 index 00000000..7725bbe2 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_common_2_3_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_ktx_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_room_room_ktx_2_3_0_aar.xml new file mode 100644 index 00000000..902da28f --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_ktx_2_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_migration_2_3_0.xml b/.idea/libraries/Gradle__androidx_room_room_migration_2_3_0.xml new file mode 100644 index 00000000..a9140470 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_migration_2_3_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_runtime_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_room_room_runtime_2_3_0_aar.xml new file mode 100644 index 00000000..72a182bd --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_runtime_2_3_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_testing_2_3_0_aar.xml b/.idea/libraries/Gradle__androidx_room_room_testing_2_3_0_aar.xml new file mode 100644 index 00000000..dc4a7aef --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_testing_2_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml new file mode 100644 index 00000000..e55e11e0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml new file mode 100644 index 00000000..760f3609 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_sqlite_sqlite_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_sqlite_sqlite_2_1_0_aar.xml new file mode 100644 index 00000000..86182b40 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_sqlite_sqlite_2_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_sqlite_sqlite_framework_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_sqlite_sqlite_framework_2_1_0_aar.xml new file mode 100644 index 00000000..450b259b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_sqlite_sqlite_framework_2_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml new file mode 100644 index 00000000..66aa81bc --- /dev/null +++ b/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml new file mode 100644 index 00000000..de867a82 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml new file mode 100644 index 00000000..4b4e3972 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml new file mode 100644 index 00000000..70d46dd7 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml b/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml new file mode 100644 index 00000000..5d100510 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml new file mode 100644 index 00000000..53eeaa7b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml new file mode 100644 index 00000000..7aec6d48 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml new file mode 100644 index 00000000..c39e5bce --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml b/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml new file mode 100644 index 00000000..76905ef5 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_transition_transition_1_3_0_aar.xml b/.idea/libraries/Gradle__androidx_transition_transition_1_3_0_aar.xml new file mode 100644 index 00000000..b813feb7 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_transition_transition_1_3_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml new file mode 100644 index 00000000..fb66158d --- /dev/null +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml new file mode 100644 index 00000000..207005a3 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml new file mode 100644 index 00000000..a8abca92 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml new file mode 100644 index 00000000..ab62c74f --- /dev/null +++ b/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml new file mode 100644 index 00000000..a1bcee04 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_annotations_4_11_0.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_annotations_4_11_0.xml new file mode 100644 index 00000000..2b22cc61 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_annotations_4_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_disklrucache_4_11_0.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_disklrucache_4_11_0.xml new file mode 100644 index 00000000..779f89c4 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_disklrucache_4_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_gifdecoder_4_11_0_aar.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_gifdecoder_4_11_0_aar.xml new file mode 100644 index 00000000..1dcb8c9a --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_gifdecoder_4_11_0_aar.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_glide_4_11_0_aar.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_glide_4_11_0_aar.xml new file mode 100644 index 00000000..c230a6cb --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_glide_4_11_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_android_material_material_1_4_0_aar.xml b/.idea/libraries/Gradle__com_google_android_material_material_1_4_0_aar.xml new file mode 100644 index 00000000..a18cd7e9 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_android_material_material_1_4_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_auto_value_auto_value_annotations_1_6_3.xml b/.idea/libraries/Gradle__com_google_auto_value_auto_value_annotations_1_6_3.xml new file mode 100644 index 00000000..9f84cac2 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_auto_value_auto_value_annotations_1_6_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_1.xml b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_1.xml new file mode 100644 index 00000000..9e7fcf0e --- /dev/null +++ b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml new file mode 100644 index 00000000..a96d7252 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_6.xml b/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_6.xml new file mode 100644 index 00000000..45500a27 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_dagger_dagger_2_28.xml b/.idea/libraries/Gradle__com_google_dagger_dagger_2_28.xml new file mode 100644 index 00000000..45a5d4da --- /dev/null +++ b/.idea/libraries/Gradle__com_google_dagger_dagger_2_28.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_dagger_dagger_lint_aar_2_28_aar.xml b/.idea/libraries/Gradle__com_google_dagger_dagger_lint_aar_2_28_aar.xml new file mode 100644 index 00000000..c6d35c0e --- /dev/null +++ b/.idea/libraries/Gradle__com_google_dagger_dagger_lint_aar_2_28_aar.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_dagger_hilt_android_2_28_alpha_aar.xml b/.idea/libraries/Gradle__com_google_dagger_hilt_android_2_28_alpha_aar.xml new file mode 100644 index 00000000..70f6cc92 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_dagger_hilt_android_2_28_alpha_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_errorprone_error_prone_annotations_2_3_3.xml b/.idea/libraries/Gradle__com_google_errorprone_error_prone_annotations_2_3_3.xml new file mode 100644 index 00000000..38333bb0 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_errorprone_error_prone_annotations_2_3_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_guava_failureaccess_1_0_1.xml b/.idea/libraries/Gradle__com_google_guava_failureaccess_1_0_1.xml new file mode 100644 index 00000000..aeb2fc76 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_guava_failureaccess_1_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_guava_guava_28_1_android.xml b/.idea/libraries/Gradle__com_google_guava_guava_28_1_android.xml new file mode 100644 index 00000000..703e775d --- /dev/null +++ b/.idea/libraries/Gradle__com_google_guava_guava_28_1_android.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml b/.idea/libraries/Gradle__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml new file mode 100644 index 00000000..11f8cce0 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_j2objc_j2objc_annotations_1_3.xml b/.idea/libraries/Gradle__com_google_j2objc_j2objc_annotations_1_3.xml new file mode 100644 index 00000000..7a61cf90 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_j2objc_j2objc_annotations_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_truth_truth_1_0_1.xml b/.idea/libraries/Gradle__com_google_truth_truth_1_0_1.xml new file mode 100644 index 00000000..6eabfed6 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_truth_truth_1_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_googlecode_java_diff_utils_diffutils_1_3_0.xml b/.idea/libraries/Gradle__com_googlecode_java_diff_utils_diffutils_1_3_0.xml new file mode 100644 index 00000000..2eaf7e5e --- /dev/null +++ b/.idea/libraries/Gradle__com_googlecode_java_diff_utils_diffutils_1_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml b/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml new file mode 100644 index 00000000..662b001e --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_14_9.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_14_9.xml new file mode 100644 index 00000000..2a641760 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_14_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okio_okio_1_17_2.xml b/.idea/libraries/Gradle__com_squareup_okio_okio_1_17_2.xml new file mode 100644 index 00000000..f0b1401e --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okio_okio_1_17_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_9_0.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_9_0.xml new file mode 100644 index 00000000..875aaf31 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_9_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_9_0.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_9_0.xml new file mode 100644 index 00000000..024309ca --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_9_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_annotation_jsr250_api_1_0.xml b/.idea/libraries/Gradle__javax_annotation_jsr250_api_1_0.xml new file mode 100644 index 00000000..0183c179 --- /dev/null +++ b/.idea/libraries/Gradle__javax_annotation_jsr250_api_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml new file mode 100644 index 00000000..62012eaf --- /dev/null +++ b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_12.xml b/.idea/libraries/Gradle__junit_junit_4_12.xml new file mode 100644 index 00000000..6c078d62 --- /dev/null +++ b/.idea/libraries/Gradle__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_13_2.xml b/.idea/libraries/Gradle__junit_junit_4_13_2.xml new file mode 100644 index 00000000..c2cb45da --- /dev/null +++ b/.idea/libraries/Gradle__junit_junit_4_13_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_9_3.xml b/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_9_3.xml new file mode 100644 index 00000000..5d69462f --- /dev/null +++ b/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_9_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_9_3.xml b/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_9_3.xml new file mode 100644 index 00000000..398f5428 --- /dev/null +++ b/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_9_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_checkerframework_checker_compat_qual_2_5_5.xml b/.idea/libraries/Gradle__org_checkerframework_checker_compat_qual_2_5_5.xml new file mode 100644 index 00000000..b5116553 --- /dev/null +++ b/.idea/libraries/Gradle__org_checkerframework_checker_compat_qual_2_5_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_codehaus_mojo_animal_sniffer_annotations_1_18.xml b/.idea/libraries/Gradle__org_codehaus_mojo_animal_sniffer_annotations_1_18.xml new file mode 100644 index 00000000..5a17a384 --- /dev/null +++ b/.idea/libraries/Gradle__org_codehaus_mojo_animal_sniffer_annotations_1_18.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 00000000..09cf23d1 --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml new file mode 100644 index 00000000..1a77dd83 --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml new file mode 100644 index 00000000..3d45e8e9 --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml new file mode 100644 index 00000000..1fa0fa9f --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_5_21.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_5_21.xml new file mode 100644 index 00000000..04307c06 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_5_21.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_parcelize_runtime_1_5_21.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_parcelize_runtime_1_5_21.xml new file mode 100644 index 00000000..0bb2c2ae --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_parcelize_runtime_1_5_21.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_5_21.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_5_21.xml new file mode 100644 index 00000000..0c679e8b --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_5_21.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_5_21.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_5_21.xml new file mode 100644 index 00000000..70c248df --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_5_21.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_5_21.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_5_21.xml new file mode 100644 index 00000000..ce352f3e --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_5_21.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_5_21.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_5_21.xml new file mode 100644 index 00000000..433044fa --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_5_21.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_4_1.xml b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_4_1.xml new file mode 100644 index 00000000..87640dce --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_4_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_4_1.xml b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_4_1.xml new file mode 100644 index 00000000..0d5e8b00 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_4_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jsoup_jsoup_1_13_1.xml b/.idea/libraries/Gradle__org_jsoup_jsoup_1_13_1.xml new file mode 100644 index 00000000..1a85cc9d --- /dev/null +++ b/.idea/libraries/Gradle__org_jsoup_jsoup_1_13_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_mockito_mockito_core_2_23_4.xml b/.idea/libraries/Gradle__org_mockito_mockito_core_2_23_4.xml new file mode 100644 index 00000000..26dddc08 --- /dev/null +++ b/.idea/libraries/Gradle__org_mockito_mockito_core_2_23_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_objenesis_objenesis_2_6.xml b/.idea/libraries/Gradle__org_objenesis_objenesis_2_6.xml new file mode 100644 index 00000000..325842cd --- /dev/null +++ b/.idea/libraries/Gradle__org_objenesis_objenesis_2_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..f8e8fb31 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..c6f4800b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/desafio-android.app.iml b/.idea/modules/app/desafio-android.app.iml new file mode 100644 index 00000000..ffed97a5 --- /dev/null +++ b/.idea/modules/app/desafio-android.app.iml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/desafio-android.iml b/.idea/modules/desafio-android.iml new file mode 100644 index 00000000..28107cec --- /dev/null +++ b/.idea/modules/desafio-android.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml new file mode 100644 index 00000000..60d95653 --- /dev/null +++ b/.idea/navEditor.xml @@ -0,0 +1,69 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index c0193b60..364bf1ca 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,36 @@ -# Desafio Android - -O desafio consiste em criar uma Wiki de Star Wars onde Ă© mostrada uma lista de personagens e o usuĂĄrio pode favoritar alguns deles. É recomendado a utilização de Kotlin ou Java no projeto. - -O candidato deve dar **fork** neste repositĂłrio e apĂłs o termino do desenvolvimento, realizar um **pull request** para anĂĄlise do time. Em casos especiais o candidato tambem pode enviar o projeto compactado para hugo@popcode.com.br. Prefira vĂĄrios commits durante o projeto invĂ©s de um unico commit no final. - -A documentação das APIs que serĂŁo utilizadas no desafio estĂŁo disponĂ­veis nos links abaixo: - -http://swapi.dev/ - -http://docs.starwarsfavorites.apiary.io/# - -### Lista de Personagens - -Para obter os personagens, sua aplicação deverĂĄ utilizar o recurso `people` da Swapi (documentação disponĂ­vel no topo do documento). A aplicação deve exibir todos os 87 personagens e permitir pesquisar o personagem pelo nome. Sugerimos exibir as primeiras pĂĄginas enquanto carrega as outras, em um formato de scroll infinito. - -A lista de itens deve exibir as seguintes informaçÔes: -+ Nome [name] -+ Altura [height] -+ Genero [gender] -+ Peso [mass] - -Os dados devem ser salvos em banco de dados local para acesso offline e atualizados sempre que a tela for aberta. - -### Detalhes do Personagem - -Ao clicar em um item da lista o seu app deve mostrar as informaçÔes abaixo: - -+ name -+ height -+ mass -+ hair_color -+ skin_color -+ eye_color -+ birth_year -+ gender -+ Nome do Planeta Natal -+ Nome da EspĂ©cie - -A busca pelo nome do planeta e da espĂ©cie deve ser feita em paralelo. - -### Favoritos - -Na lista e nos detalhes deve ser possĂ­vel adicionar e remover um personagem a sua lista de favoritos. Tambem deve ser possĂ­vel filtrar quais personagens foram favoritados na lista principal. - -##### Adição e Remoção de Favoritos - -URL BASE: http://private-782d3-starwarsfavorites.apiary-mock.com/ - -Ao adicionar um favorito a aplicação deve fazer um request para a api starwarsfavorites (documentação disponĂ­vel no topo do documento). -A aplicação deve: -+ Exibir a mensagem de retorno da API em caso de sucesso ou erro. -+ Reenviar a requisição da prĂłxima vez que o app for aberto em caso de erro. -+ Salvar no banco de dados local quais personagens foram favoritados. -+ Tratar a remoção de favoritos apenas no banco de dados local. - -Em metade das requisiçÔes enviadas para a api starwarsfavorites a aplicação deve adicionar o header `Prefer` com o valor `status=400`. - -P.S.: O candidato deve escolher o ID. - ---- -#### LICENSE -``` -MIT License - -Copyright (c) 2017 Popcode Mobile Solutions - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` +# Desafio Android - StarWars + +## Layout mobile + + +# Tecnologias utilizadas + +## Back-end +- Kotlin + +## Recursos & Libs +- Fragment +- Navigation +- RecyclerView +- Retrofit +- LiveData +- Room Components +- Dagger - Hilt +- Coroutines +- Lifecycle +- Gson +- Paging 3 +- View Binding + +## Funcionalidades +✔ Listagem dos Personagens +✔ Detalhe dos Personagens +✔ Adição e Remoção dos Favoritos Local +✔ Adição dos Favoritos para API +✔ Filtro dos Favoritos +✔ Retorno da API Favorite +✔ Pesquisa dos Personagens pelo nome + +# Autor + +Bruno Freitas Araujo diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..b18e80b1 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,95 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' + id 'kotlin-parcelize' + id 'androidx.navigation.safeargs.kotlin' + id 'dagger.hilt.android.plugin' +} + +android { + compileSdk 30 + + defaultConfig { + applicationId "com.example.desafio_android" + minSdk 21 + targetSdk 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + + buildFeatures { + dataBinding = true + viewBinding = true + } + +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + testImplementation "com.google.truth:truth:1.0.1" + testImplementation "org.mockito:mockito-core:2.23.4" + + implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" + + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + + implementation "androidx.room:room-runtime:2.3.0" + kapt "androidx.room:room-compiler:2.3.0" + implementation "androidx.room:room-ktx:2.3.0" + androidTestImplementation "androidx.room:room-testing:2.3.0" + + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1' + + implementation "androidx.paging:paging-runtime:3.0.0-alpha05" + + implementation 'com.google.code.gson:gson:2.8.6' + + implementation 'org.jsoup:jsoup:1.13.1' + + implementation "com.github.bumptech.glide:glide:4.11.0" + + implementation "androidx.navigation:navigation-fragment-ktx:2.3.0" + implementation "androidx.navigation:navigation-ui-ktx:2.3.0" + + implementation 'androidx.recyclerview:recyclerview:1.1.0' + + implementation 'com.google.dagger:hilt-android:2.28-alpha' + kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha' + + implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02" + kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02" + + implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" + +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/desafio_android/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/desafio_android/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..055eb051 --- /dev/null +++ b/app/src/androidTest/java/com/example/desafio_android/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.desafio_android + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.desafio_android", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..af497051 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/api/RequestApi.kt b/app/src/main/java/com/example/desafio_android/data/api/RequestApi.kt new file mode 100644 index 00000000..3bbba6d2 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/api/RequestApi.kt @@ -0,0 +1,34 @@ +package com.example.desafio_android.data.api + +import com.example.desafio_android.data.model.ApiFavoriteResponse +import com.example.desafio_android.data.model.PeopleResponse +import com.example.desafio_android.data.model.Planet +import com.example.desafio_android.data.model.Specie +import com.example.desafio_android.util.Constants.Companion.BASE_URL_FAVORITE +import retrofit2.Response +import retrofit2.http.* + +interface RequestApi { + + @GET("people") + suspend fun getPeople( + @Query("page") page: Int + ): Response + + @GET("people") + suspend fun searchPeople( + @Query("search") search: String + ): Response + + @GET + suspend fun getNamePlanet(@Url url: String): Response + + @GET + suspend fun getNameSpecies(@Url url: String): Response + + @POST(BASE_URL_FAVORITE + "favorite/{id}") + suspend fun addFavoriteApi( + @Path("id") id: String + ): Response + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/db/AppDBFavorite.kt b/app/src/main/java/com/example/desafio_android/data/db/AppDBFavorite.kt new file mode 100644 index 00000000..9761f03c --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/db/AppDBFavorite.kt @@ -0,0 +1,18 @@ +package com.example.desafio_android.data.db + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.TypeConverters + +@Database( + entities = [FavoritePeople::class], + version = 1, + exportSchema = false +) + +@TypeConverters(TypeConverts::class) +abstract class AppDBFavorite : RoomDatabase() { + + abstract fun getFavoriteDao(): FavoriteDao + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/db/FavoriteDao.kt b/app/src/main/java/com/example/desafio_android/data/db/FavoriteDao.kt new file mode 100644 index 00000000..21304aad --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/db/FavoriteDao.kt @@ -0,0 +1,23 @@ +package com.example.desafio_android.data.db + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.example.desafio_android.data.model.People + +@Dao +interface FavoriteDao { + + @Insert + suspend fun addToFavorite(people: FavoritePeople) + + @Query("SELECT people FROM favorite_people") + fun getFavorites(): LiveData> + + @Query("SELECT count(*) FROM favorite_people WHERE favorite_people.nome = :namePeople") + suspend fun checkPeople(namePeople: String): Int + + @Query("DELETE FROM favorite_people WHERE favorite_people.people = :people") + suspend fun removeFromFavorite(people: People) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/db/FavoritePeople.kt b/app/src/main/java/com/example/desafio_android/data/db/FavoritePeople.kt new file mode 100644 index 00000000..3dc6cc1e --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/db/FavoritePeople.kt @@ -0,0 +1,18 @@ +package com.example.desafio_android.data.db + +import android.os.Parcelable +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.example.desafio_android.data.model.People +import kotlinx.android.parcel.Parcelize +import java.io.Serializable + +@Entity(tableName = "favorite_people") +@Parcelize +data class FavoritePeople( + var nome: String, + var people: People, +) : Serializable, Parcelable { + @PrimaryKey(autoGenerate = true) + var id: Int = 0 +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/db/TypeConverts.kt b/app/src/main/java/com/example/desafio_android/data/db/TypeConverts.kt new file mode 100644 index 00000000..f46b36ee --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/db/TypeConverts.kt @@ -0,0 +1,23 @@ +package com.example.desafio_android.data.db + +import androidx.room.TypeConverter +import com.example.desafio_android.data.model.People +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class TypeConverts { + + var gson = Gson() + + @TypeConverter + fun peopleToString(people: People): String { + return gson.toJson(people) + } + + @TypeConverter + fun stringToPeople(data: String): People { + val listType = object : TypeToken() {}.type + return gson.fromJson(data, listType) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/model/ApiFavoriteResponse.kt b/app/src/main/java/com/example/desafio_android/data/model/ApiFavoriteResponse.kt new file mode 100644 index 00000000..b79f2c2f --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/model/ApiFavoriteResponse.kt @@ -0,0 +1,14 @@ +package com.example.desafio_android.data.model + +import com.google.gson.annotations.SerializedName + +data class ApiFavoriteResponse( + @SerializedName("error") + val error: String, + @SerializedName("error_message") + val errorMessage: String, + @SerializedName("message") + val message: String, + @SerializedName("status") + val status: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/model/People.kt b/app/src/main/java/com/example/desafio_android/data/model/People.kt new file mode 100644 index 00000000..d28b0cad --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/model/People.kt @@ -0,0 +1,41 @@ +package com.example.desafio_android.data.model + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +@Parcelize +data class People( + @SerializedName("birth_year") + val birthYear: String, + @SerializedName("created") + val created: String, + @SerializedName("edited") + val edited: String, + @SerializedName("eye_color") + val eyeColor: String, + @SerializedName("films") + val films: List, + @SerializedName("gender") + val gender: String, + @SerializedName("hair_color") + val hairColor: String, + @SerializedName("height") + val height: String, + @SerializedName("homeworld") + val homeworld: String, + @SerializedName("mass") + val mass: String, + @SerializedName("name") + val name: String, + @SerializedName("skin_color") + val skinColor: String, + @SerializedName("species") + val species: List, + @SerializedName("starships") + val starships: List, + @SerializedName("url") + val url: String, + @SerializedName("vehicles") + val vehicles: List +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/model/PeopleResponse.kt b/app/src/main/java/com/example/desafio_android/data/model/PeopleResponse.kt new file mode 100644 index 00000000..76e9d71d --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/model/PeopleResponse.kt @@ -0,0 +1,14 @@ +package com.example.desafio_android.data.model + +import com.google.gson.annotations.SerializedName + +data class PeopleResponse( + @SerializedName("count") + val count: Int, + @SerializedName("next") + val next: String, + @SerializedName("previous") + val previous: Any, + @SerializedName("results") + val people: List +) \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/model/Planet.kt b/app/src/main/java/com/example/desafio_android/data/model/Planet.kt new file mode 100644 index 00000000..96521616 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/model/Planet.kt @@ -0,0 +1,8 @@ +package com.example.desafio_android.data.model + +import com.google.gson.annotations.SerializedName + +data class Planet( + @SerializedName("name") + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/model/Specie.kt b/app/src/main/java/com/example/desafio_android/data/model/Specie.kt new file mode 100644 index 00000000..b4a845e8 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/model/Specie.kt @@ -0,0 +1,8 @@ +package com.example.desafio_android.data.model + +import com.google.gson.annotations.SerializedName + +data class Specie( + @SerializedName("name") + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/paging/PeoplePagingSource.kt b/app/src/main/java/com/example/desafio_android/data/paging/PeoplePagingSource.kt new file mode 100644 index 00000000..93457c36 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/paging/PeoplePagingSource.kt @@ -0,0 +1,44 @@ +package com.example.desafio_android.data.paging + +import android.net.Uri +import androidx.paging.PagingSource +import com.example.desafio_android.data.api.RequestApi +import com.example.desafio_android.data.model.People +import retrofit2.HttpException +import java.io.IOException + +private const val PAGE_INDEX = 1 + +class PeoplePagingSource( + private val requestApi: RequestApi, + private val search: String? +) : PagingSource() { + override suspend fun load(params: LoadParams): LoadResult { + + return try { + val pagePosition = params.key ?: PAGE_INDEX + + val response = if (search != null) requestApi.searchPeople(search) else + requestApi.getPeople(pagePosition) + + var nextPagerNumber: Int? = null + + if (response.body()?.next != null) { + val uri = Uri.parse(response.body()!!.next) + val nextPageQuery = uri.getQueryParameter("page") + nextPagerNumber = nextPageQuery?.toInt() + } + + LoadResult.Page( + data = response.body()!!.people, + prevKey = if (pagePosition == PAGE_INDEX) null else pagePosition - 1, + nextKey = nextPagerNumber + ) + + } catch (e: IOException) { + LoadResult.Error(e) + } catch (e: HttpException) { + LoadResult.Error(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/data/repository/Repository.kt b/app/src/main/java/com/example/desafio_android/data/repository/Repository.kt new file mode 100644 index 00000000..ee50e739 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/data/repository/Repository.kt @@ -0,0 +1,94 @@ +package com.example.desafio_android.data.repository + +import androidx.lifecycle.liveData +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.PagingData +import com.example.desafio_android.data.api.RequestApi +import com.example.desafio_android.data.db.FavoriteDao +import com.example.desafio_android.data.db.FavoritePeople +import com.example.desafio_android.data.model.People +import com.example.desafio_android.data.paging.PeoplePagingSource +import com.example.desafio_android.util.Resultado +import dagger.hilt.android.scopes.ActivityRetainedScoped +import kotlinx.coroutines.flow.Flow +import java.net.ConnectException +import javax.inject.Inject + +@ActivityRetainedScoped +class Repository @Inject constructor( + private val requestApi: RequestApi, + private val favoriteDao: FavoriteDao +) { + + fun getPeople(): Flow> { + return Pager( + config = PagingConfig( + pageSize = 5, + maxSize = 20, + enablePlaceholders = false + ), + pagingSourceFactory = { PeoplePagingSource(requestApi, null) } + ).flow + } + + fun searchPeople(search: String): Flow> { + return Pager( + config = PagingConfig( + pageSize = 5, + maxSize = 20, + enablePlaceholders = false + ), + pagingSourceFactory = { PeoplePagingSource(requestApi, search) } + ).flow + } + + suspend fun getNamePlanet(url: String) = liveData { + try { + val resposta = requestApi.getNamePlanet(url) + if (resposta.isSuccessful) { + emit(Resultado.Sucesso(dado = resposta.body())) + } else { + emit(Resultado.Erro(exception = Exception("Falha ao carregar nome"))) + } + } catch (e: ConnectException) { + emit(Resultado.Erro(exception = Exception("Falha na comunicação com a API"))) + } catch (e: Exception) { + emit(Resultado.Erro(exception = e)) + } + } + + suspend fun getNameSpecie(url: String) = liveData { + try { + val resposta = requestApi.getNameSpecies(url) + if (resposta.isSuccessful) { + emit(Resultado.Sucesso(dado = resposta.body())) + } else { + emit(Resultado.Erro(exception = Exception("Falha ao carregar nome"))) + } + } catch (e: ConnectException) { + emit(Resultado.Erro(exception = Exception("Falha na comunicação com a API"))) + } catch (e: Exception) { + emit(Resultado.Erro(exception = e)) + } + } + + suspend fun addFavoriteApi(id: String) = liveData { + val resposta = requestApi.addFavoriteApi(id) + if (resposta.code() == 201) { + emit(Resultado.Sucesso(dado = resposta.body()!!.message)) + } else if (resposta.code() == 400) { + emit(Resultado.Sucesso(dado = resposta.body()!!.errorMessage)) + } else { + emit(Resultado.Erro(exception = Exception("Falha na comunicação com a API"))) + } + } + + suspend fun addToFavorite(name: String, people: People) = + favoriteDao.addToFavorite(FavoritePeople(name, people)) + + fun getFavorites() = favoriteDao.getFavorites() + suspend fun checkPeople(people: People) = favoriteDao.checkPeople(people.name) + suspend fun removeFromFavorite(people: People) = favoriteDao.removeFromFavorite(people) + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/MyApplication.kt b/app/src/main/java/com/example/desafio_android/ui/MyApplication.kt new file mode 100644 index 00000000..ad3d2a31 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/MyApplication.kt @@ -0,0 +1,8 @@ +package com.example.desafio_android.ui + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class MyApplication : Application() { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/di/AppModule.kt b/app/src/main/java/com/example/desafio_android/ui/di/AppModule.kt new file mode 100644 index 00000000..e20b10bd --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/di/AppModule.kt @@ -0,0 +1,71 @@ +package com.example.desafio_android.ui.di + +import android.content.Context +import androidx.room.Room +import com.example.desafio_android.data.api.RequestApi +import com.example.desafio_android.data.db.AppDBFavorite +import com.example.desafio_android.util.Constants.Companion.BASE_URL +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.android.qualifiers.ApplicationContext +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.util.concurrent.TimeUnit +import javax.inject.Singleton + +@Module +@InstallIn(ApplicationComponent::class) +object AppModule { + + @Singleton + @Provides + fun provideFavMovieDatabase( + @ApplicationContext app: Context + ) = Room.databaseBuilder( + app, + AppDBFavorite::class.java, + "people_db" + ).build() + + @Singleton + @Provides + fun provideFavPeopleDao(db: AppDBFavorite) = db.getFavoriteDao() + + @Singleton + @Provides + fun providerHttpClient(): OkHttpClient { + return OkHttpClient.Builder() + .readTimeout(15, TimeUnit.SECONDS) + .connectTimeout(15, TimeUnit.SECONDS) + .build() + } + + @Singleton + @Provides + fun provideConverterFactory(): GsonConverterFactory { + return GsonConverterFactory.create() + } + + @Singleton + @Provides + fun provideRetrofitInstance( + okHttpClient: OkHttpClient, + gsonConverterFactory: GsonConverterFactory + ): Retrofit { + return Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory(gsonConverterFactory) + .build() + } + + @Singleton + @Provides + fun providerApiService(retrofit: Retrofit): RequestApi { + return retrofit.create(RequestApi::class.java) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/MainActivity.kt b/app/src/main/java/com/example/desafio_android/ui/main/MainActivity.kt new file mode 100644 index 00000000..d427c5c8 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/MainActivity.kt @@ -0,0 +1,35 @@ +package com.example.desafio_android.ui.main + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.NavController +import androidx.navigation.findNavController +import androidx.navigation.ui.setupActionBarWithNavController +import com.example.desafio_android.R +import com.example.desafio_android.databinding.ActivityMainBinding +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { + + private lateinit var navController: NavController + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + setSupportActionBar(binding.customToolbar) + + navController = findNavController(R.id.fragmentContainerView) + + setSupportActionBar(binding.customToolbar) + setupActionBarWithNavController(navController) + + } + + override fun onSupportNavigateUp(): Boolean { + return navController.navigateUp() || super.onSupportNavigateUp() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/adapter/ListFavoriteAdapter.kt b/app/src/main/java/com/example/desafio_android/ui/main/adapter/ListFavoriteAdapter.kt new file mode 100644 index 00000000..072b6b86 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/adapter/ListFavoriteAdapter.kt @@ -0,0 +1,56 @@ +package com.example.desafio_android.ui.main.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.navigation.findNavController +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.desafio_android.R +import com.example.desafio_android.data.model.People +import com.example.desafio_android.databinding.RowPeopleBinding +import com.example.desafio_android.ui.main.view.ListFavoriteDirections + +class ListFavoriteAdapter : + ListAdapter(DiffUtilCallback) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder { + val binding = + RowPeopleBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ListViewHolder(binding) + } + + override fun onBindViewHolder(holder: ListFavoriteAdapter.ListViewHolder, position: Int) { + holder.bind(getItem(position)) + } + + inner class ListViewHolder(private val bindind: RowPeopleBinding) : + RecyclerView.ViewHolder(bindind.root) { + + fun bind(people: People) { + bindind.apply { + nomePersonagem.text = people.name + alturaPersonagem.text = people.height + " " + + alturaPersonagem.context.getString(R.string.cm) + generoPersonagem.text = people.gender + pesoPersonagem.text = people.mass + " " + + pesoPersonagem.context.getString(R.string.kg) + + rowPeople.setOnClickListener { + val action = ListFavoriteDirections.actionListFavoriteToDetailsFragment(people) + rowPeople.findNavController().navigate(action) + } + + + } + } + } +} + +private object DiffUtilCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: People, newItem: People): Boolean = + oldItem.name == newItem.name + + override fun areContentsTheSame(oldItem: People, newItem: People): Boolean = + oldItem == newItem +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/adapter/PeopleAdapter.kt b/app/src/main/java/com/example/desafio_android/ui/main/adapter/PeopleAdapter.kt new file mode 100644 index 00000000..7c709b35 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/adapter/PeopleAdapter.kt @@ -0,0 +1,61 @@ +package com.example.desafio_android.ui.main.adapter + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.navigation.findNavController +import androidx.paging.PagingDataAdapter +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import com.example.desafio_android.R +import com.example.desafio_android.data.model.People +import com.example.desafio_android.databinding.RowPeopleBinding +import com.example.desafio_android.ui.main.view.PeopleFragmentDirections + +class PeopleAdapter : PagingDataAdapter(COMPARATOR) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RowPeopleBinding.inflate(layoutInflater, parent, false) + return MyViewHolder(binding) + } + + override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + val currentItem = getItem(position) + if (currentItem != null) { + holder.bind(currentItem) + } + } + + inner class MyViewHolder(private val binding: RowPeopleBinding) : + RecyclerView.ViewHolder(binding.root) { + + @SuppressLint("SetTextI18n") + fun bind(people: People) { + binding.apply { + nomePersonagem.text = people.name + alturaPersonagem.text = people.height + " " + + alturaPersonagem.context.getString(R.string.cm) + generoPersonagem.text = people.gender + pesoPersonagem.text = people.mass + " " + + pesoPersonagem.context.getString(R.string.kg) + + rowPeople.setOnClickListener { + val action = + PeopleFragmentDirections.actionPeopleFragmentToDetailsFragment(people) + rowPeople.findNavController().navigate(action) + } + } + } + } + + companion object { + private val COMPARATOR = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: People, newItem: People): Boolean = + oldItem.name == newItem.created + + override fun areContentsTheSame(oldItem: People, newItem: People): Boolean = + oldItem == newItem + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/view/DetailsFragment.kt b/app/src/main/java/com/example/desafio_android/ui/main/view/DetailsFragment.kt new file mode 100644 index 00000000..e8ffc470 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/view/DetailsFragment.kt @@ -0,0 +1,183 @@ +package com.example.desafio_android.ui.main.view + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.navArgs +import com.example.desafio_android.R +import com.example.desafio_android.data.model.People +import com.example.desafio_android.databinding.FragmentDetailsBinding +import com.example.desafio_android.ui.main.viewmodel.DetailsViewModel +import com.example.desafio_android.util.Resultado +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class DetailsFragment : Fragment() { + + val detailsViewModel: DetailsViewModel by viewModels() + + private val args by navArgs() + + lateinit var _bindingDetails: FragmentDetailsBinding + val bindingDetails: FragmentDetailsBinding get() = _bindingDetails + + var isToggleChecked = false + + @SuppressLint("SetTextI18n") + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + _bindingDetails = FragmentDetailsBinding.inflate(inflater, container, false) + + val people = args.people + + actionToggleButton(people) + verifyPeople(people) + + getNomePlaneta(people) + getNomeEspecie(people) + setupTextView(people) + + return bindingDetails.root + + } + + private fun verifyPeople(people: People) { + lifecycleScope.launch { + val countFavorite = detailsViewModel.checkPeople(people) + if (countFavorite > 0) { + bindingDetails.toggleFavorite.isChecked = true + isToggleChecked = true + } else { + bindingDetails.toggleFavorite.isChecked = false + isToggleChecked = false + } + } + } + + private fun actionToggleButton(people: People) { + bindingDetails.toggleFavorite.setOnClickListener { + isToggleChecked = !isToggleChecked + if (isToggleChecked) { + detailsViewModel.addFavorite(people) + addFavoriteApi(people.name) + } else { + detailsViewModel.removeFromFavorite(people) + Toast.makeText(context, getString(R.string.RemovidoComSucesso), Toast.LENGTH_LONG) + .show() + } + bindingDetails.toggleFavorite.isChecked = isToggleChecked + } + } + + private fun addFavoriteApi(id: String) { + bindingDetails.apply { + lifecycleScope.launch { + detailsViewModel.addFavoriteApi(id) + .observe(viewLifecycleOwner) { resposta -> + when (resposta) { + is Resultado.Sucesso -> { + Toast.makeText(context, resposta.dado, Toast.LENGTH_LONG).show() + } + is Resultado.Erro -> { + Toast.makeText( + context, resposta.exception.message.toString(), + Toast.LENGTH_LONG + ).show() + } + } + } + } + } + } + + @SuppressLint("SetTextI18n") + fun getNomePlaneta(people: People) { + bindingDetails.apply { + lifecycleScope.launch { + detailsViewModel.getNamePlanet(people.homeworld) + .observe(viewLifecycleOwner) { resposta -> + when (resposta) { + is Resultado.Sucesso -> { + nomeDoPlanetaNatalDetails.text = nomeDoPlanetaNatalDetails.context + .getString(R.string.PlanetaNatal) + " " + resposta.dado!!.name + } + is Resultado.Erro -> { + nomeDoPlanetaNatalDetails.text = + resposta.exception.message.toString() + } + } + } + } + } + } + + @SuppressLint("SetTextI18n") + private fun getNomeEspecie(people: People) { + bindingDetails.apply { + lifecycleScope.launch { + if (!people.species.isEmpty()) { + detailsViewModel.getNameSpecie(people.species.get(0)) + .observe(viewLifecycleOwner) { resposta -> + when (resposta) { + is Resultado.Sucesso -> { + nomeDaEspecieDetails.text = nomeDaEspecieDetails.context + .getString(R.string.NomeSpecie) + " " + resposta.dado!!.name + } + is Resultado.Erro -> { + nomeDaEspecieDetails.text = + resposta.exception.message.toString() + } + } + } + } else { + bindingDetails.nomeDaEspecieDetails.text = nomeDaEspecieDetails.context + .getString(R.string.NomeSpecie) + " " + getString(R.string.SemInformacao) + } + } + } + } + + @SuppressLint("SetTextI18n") + fun setupTextView(people: People) { + bindingDetails.apply { + nomePersonagemDetails.text = people.name + alturaPersonagemDetails.text = + alturaPersonagemDetails.context.getString(R.string.Altura) + " " + + people.height + " " + alturaPersonagemDetails.context.getString(R.string.cm) + + pesoPersonagemDetails.text = + pesoPersonagemDetails.context.getString(R.string.Peso) + " " + people.mass + " " + + pesoPersonagemDetails.context.getString( + R.string.kg + ) + + hairColorDetails.text = + hairColorDetails.context.getString(R.string.CorDoCabelo) + " " + people.hairColor + + skinColorDetails.text = + skinColorDetails.context.getString(R.string.CorDaPele) + " " + people.skinColor + + eyeColorDetails.text = + eyeColorDetails.context.getString(R.string.CorDosOlhos) + " " + people.eyeColor + + birthYearDetails.text = + birthYearDetails.context.getString(R.string.AnoDeNascimento) + " " + people.birthYear + + genderPersonagemDetails.text = + genderPersonagemDetails.context.getString(R.string.Genero) + " " + people.gender + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/view/ListFavorite.kt b/app/src/main/java/com/example/desafio_android/ui/main/view/ListFavorite.kt new file mode 100644 index 00000000..dee77cdf --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/view/ListFavorite.kt @@ -0,0 +1,53 @@ +package com.example.desafio_android.ui.main.view + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.example.desafio_android.databinding.FragmentListFavoriteBinding +import com.example.desafio_android.ui.main.adapter.ListFavoriteAdapter +import com.example.desafio_android.ui.main.viewmodel.ListFavoriteViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class ListFavorite : Fragment() { + + val adapterListFavorite by lazy { ListFavoriteAdapter() } + + val listFavoriteViewModel: ListFavoriteViewModel by viewModels() + + lateinit var _bindingFavorite: FragmentListFavoriteBinding + val bindingFavorite: FragmentListFavoriteBinding get() = _bindingFavorite + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + _bindingFavorite = FragmentListFavoriteBinding.inflate(inflater, container, false) + + setupRecyclerView() + + getFavorites() + + return bindingFavorite.root + } + + private fun getFavorites() { + listFavoriteViewModel.getFavorites.observe(viewLifecycleOwner) { people -> + adapterListFavorite.submitList(people) + if (people.isEmpty()) { + bindingFavorite.imageViewClear.isVisible = true + } + } + } + + private fun setupRecyclerView() { + bindingFavorite.recyclerFavorite.adapter = adapterListFavorite + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/view/PeopleFragment.kt b/app/src/main/java/com/example/desafio_android/ui/main/view/PeopleFragment.kt new file mode 100644 index 00000000..78f16eaf --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/view/PeopleFragment.kt @@ -0,0 +1,101 @@ +package com.example.desafio_android.ui.main.view + +import android.graphics.Color +import android.os.Bundle +import android.view.* +import android.widget.SearchView +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController +import androidx.paging.LoadState +import com.example.desafio_android.R +import com.example.desafio_android.databinding.FragmentPeopleBinding +import com.example.desafio_android.ui.main.adapter.PeopleAdapter +import com.example.desafio_android.ui.main.viewmodel.PeopleViewModel +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + + +@AndroidEntryPoint +class PeopleFragment : Fragment() { + + val adapter by lazy { PeopleAdapter() } + + val peopleViewModel: PeopleViewModel by viewModels() + + lateinit var _bindingPeople: FragmentPeopleBinding + val bindingMovie: FragmentPeopleBinding get() = _bindingPeople + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + _bindingPeople = FragmentPeopleBinding.inflate(inflater, container, false) + + setupRecyclerView() + + requestGetPeople() + + loadState() + + setHasOptionsMenu(true) + + return bindingMovie.root + + } + + private fun setupRecyclerView() { + bindingMovie.recyclerPeople.adapter = adapter + } + + private fun requestGetPeople() { + lifecycleScope.launch { + peopleViewModel.people.observe(viewLifecycleOwner) { people -> + adapter.submitData(viewLifecycleOwner.lifecycle, people) + } + } + } + + private fun loadState() { + adapter.addLoadStateListener { loadState -> + bindingMovie.progressBar.isVisible = loadState.source.refresh is LoadState.Loading + } + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_toolbar, menu) + + val search = menu.findItem(R.id.searchPeople) + val searchView = search.actionView as androidx.appcompat.widget.SearchView + searchView.setBackgroundColor(Color.WHITE) + + searchView.queryHint = getString(R.string.pesquise_um_personagem) + + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener, + androidx.appcompat.widget.SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + return false + } + + override fun onQueryTextChange(newText: String?): Boolean { + if (newText != null) { + peopleViewModel.searchPeople(newText) + } + return false + } + + }) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId === R.id.filter) { + findNavController().navigate(R.id.action_peopleFragment_to_listFavorite) + } + return super.onOptionsItemSelected(item) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/DetailsViewModel.kt b/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/DetailsViewModel.kt new file mode 100644 index 00000000..78b6c314 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/DetailsViewModel.kt @@ -0,0 +1,43 @@ +package com.example.desafio_android.ui.main.viewmodel + +import android.app.Application +import androidx.hilt.lifecycle.ViewModelInject +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.viewModelScope +import com.example.desafio_android.data.model.People +import com.example.desafio_android.data.model.Planet +import com.example.desafio_android.data.model.Specie +import com.example.desafio_android.data.repository.Repository +import com.example.desafio_android.util.Resultado +import kotlinx.coroutines.launch + +class DetailsViewModel @ViewModelInject constructor( + private val repository: Repository, + application: Application +) : AndroidViewModel(application) { + + suspend fun getNamePlanet(url: String): LiveData> = + repository.getNamePlanet(url) + + suspend fun getNameSpecie(url: String): LiveData> = + repository.getNameSpecie(url) + + + fun addFavorite(people: People) { + viewModelScope.launch { + repository.addToFavorite(people.name, people) + } + } + + suspend fun checkPeople(people: People) = repository.checkPeople(people) + + fun removeFromFavorite(people: People) { + viewModelScope.launch { + repository.removeFromFavorite(people) + } + } + + suspend fun addFavoriteApi(id: String): LiveData> = + repository.addFavoriteApi(id) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/ListFavoriteViewModel.kt b/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/ListFavoriteViewModel.kt new file mode 100644 index 00000000..f96562a2 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/ListFavoriteViewModel.kt @@ -0,0 +1,15 @@ +package com.example.desafio_android.ui.main.viewmodel + +import android.app.Application +import androidx.hilt.lifecycle.ViewModelInject +import androidx.lifecycle.AndroidViewModel +import com.example.desafio_android.data.repository.Repository + +class ListFavoriteViewModel @ViewModelInject constructor( + private val repository: Repository, + application: Application +) : AndroidViewModel(application) { + + val getFavorites = repository.getFavorites() + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/PeopleViewModel.kt b/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/PeopleViewModel.kt new file mode 100644 index 00000000..252e8b3c --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/ui/main/viewmodel/PeopleViewModel.kt @@ -0,0 +1,38 @@ +package com.example.desafio_android.ui.main.viewmodel + +import android.app.Application +import androidx.hilt.Assisted +import androidx.hilt.lifecycle.ViewModelInject +import androidx.lifecycle.* +import androidx.paging.PagingData +import androidx.paging.cachedIn +import com.example.desafio_android.data.model.People +import com.example.desafio_android.data.repository.Repository + +class PeopleViewModel @ViewModelInject constructor( + private val repository: Repository, + application: Application, + @Assisted state: SavedStateHandle +) : AndroidViewModel(application) { + + companion object { + private const val CURRENT_QUERY = "current_query" + private const val EMPTY_QUERY = "" + } + + var peopleFavorite: LiveData> = MutableLiveData() + + private val currentQuery = state.getLiveData(CURRENT_QUERY, EMPTY_QUERY) + val people = currentQuery.switchMap { query -> + if (!query.isEmpty()) { + repository.searchPeople(query).asLiveData() + } else { + repository.getPeople().cachedIn(viewModelScope).asLiveData() + } + } + + fun searchPeople(search: String) { + currentQuery.value = search + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/util/Constants.kt b/app/src/main/java/com/example/desafio_android/util/Constants.kt new file mode 100644 index 00000000..5037314d --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/util/Constants.kt @@ -0,0 +1,8 @@ +package com.example.desafio_android.util + +class Constants { + companion object { + const val BASE_URL = "https://swapi.dev/api/" + const val BASE_URL_FAVORITE = "http://private-782d3-starwarsfavorites.apiary-mock.com/" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafio_android/util/Resultado.kt b/app/src/main/java/com/example/desafio_android/util/Resultado.kt new file mode 100644 index 00000000..1dd3cd39 --- /dev/null +++ b/app/src/main/java/com/example/desafio_android/util/Resultado.kt @@ -0,0 +1,6 @@ +package com.example.desafio_android.util + +sealed class Resultado { + data class Sucesso(val dado: T?) : Resultado() + data class Erro(val exception: Exception) : Resultado() +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_search.xml b/app/src/main/res/drawable-v24/ic_search.xml new file mode 100644 index 00000000..e2dd96c6 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_search.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/favorite_toggle.xml b/app/src/main/res/drawable/favorite_toggle.xml new file mode 100644 index 00000000..8466f214 --- /dev/null +++ b/app/src/main/res/drawable/favorite_toggle.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/filter.xml b/app/src/main/res/drawable/filter.xml new file mode 100644 index 00000000..7f4c28bd --- /dev/null +++ b/app/src/main/res/drawable/filter.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_clear.xml b/app/src/main/res/drawable/ic_clear.xml new file mode 100644 index 00000000..6a1fcb30 --- /dev/null +++ b/app/src/main/res/drawable/ic_clear.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_favorite_blue.xml b/app/src/main/res/drawable/ic_favorite_blue.xml new file mode 100644 index 00000000..3cc3eb48 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_blue.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_favorite_gray.xml b/app/src/main/res/drawable/ic_favorite_gray.xml new file mode 100644 index 00000000..b13fe8e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_gray.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/icon.png b/app/src/main/res/drawable/icon.png new file mode 100644 index 00000000..a0d4bdc1 Binary files /dev/null and b/app/src/main/res/drawable/icon.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..acc60196 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml new file mode 100644 index 00000000..9e116ebf --- /dev/null +++ b/app/src/main/res/layout/fragment_details.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_list_favorite.xml b/app/src/main/res/layout/fragment_list_favorite.xml new file mode 100644 index 00000000..3880193e --- /dev/null +++ b/app/src/main/res/layout/fragment_list_favorite.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_people.xml b/app/src/main/res/layout/fragment_people.xml new file mode 100644 index 00000000..cc3f3080 --- /dev/null +++ b/app/src/main/res/layout/fragment_people.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/row_people.xml b/app/src/main/res/layout/row_people.xml new file mode 100644 index 00000000..3d4be2fa --- /dev/null +++ b/app/src/main/res/layout/row_people.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_toolbar.xml b/app/src/main/res/menu/menu_toolbar.xml new file mode 100644 index 00000000..e23c1eff --- /dev/null +++ b/app/src/main/res/menu/menu_toolbar.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 00000000..c209e78e Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 00000000..b2dfe3d1 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 00000000..4f0f1d64 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 00000000..62b611da Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 00000000..948a3070 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..1b9a6956 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 00000000..28d4b77f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9287f508 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 00000000..aa7d6427 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9126ae37 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/navigation/my_navigation.xml b/app/src/main/res/navigation/my_navigation.xml new file mode 100644 index 00000000..6b8b0f21 --- /dev/null +++ b/app/src/main/res/navigation/my_navigation.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..8b5a7882 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..bde3ec3d --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,23 @@ + + + #4B4B4B + #4B4B4B + #4B4B4B + + #FFFFFF + #57bbbc + #F9F9F9 + #ebe9d7 + #748383 + #4B4B4B + #383743 + #151B20 + #ee4c77 + #1a0e49 + #000000 + #D3F85145 + #FF4646 + #FFC114 + #00C980 + #5AB26E + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..0ec25288 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,30 @@ + + StarWars + + + STARWARS + + + Pesquisar + Filtrar + + + Pesquise um personagem + + + Planeta Natal: + EspĂ©cie: + cm + kg + Altura: + Peso: + Cor do Cabelo: + Cor da Pele: + Cor dos Olhos: + Ano de Nascimento: + GĂȘnero: + n/a + Removido com Sucesso + Carregando . . . + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..216ff4e4 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/test/java/com/example/desafio_android/ExampleUnitTest.kt b/app/src/test/java/com/example/desafio_android/ExampleUnitTest.kt new file mode 100644 index 00000000..58b0533f --- /dev/null +++ b/app/src/test/java/com/example/desafio_android/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.example.desafio_android + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..51b8ef70 --- /dev/null +++ b/build.gradle @@ -0,0 +1,17 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:7.1.0-alpha04' + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21' + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5" + classpath "com.google.dagger:hilt-android-gradle-plugin:2.28-alpha" + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..ad372da8 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,25 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..e708b1c0 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e28f5502 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Jul 24 00:42:06 BRT 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/local.properties b/local.properties new file mode 100644 index 00000000..c41f3741 --- /dev/null +++ b/local.properties @@ -0,0 +1,10 @@ +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file should *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/home/bruno/Android/Sdk \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..8d46b6ff --- /dev/null +++ b/settings.gradle @@ -0,0 +1,9 @@ +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "desafio-android" +include ':app'