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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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'