diff --git a/BankApp/.idea/.gitignore b/BankApp/.idea/.gitignore
new file mode 100644
index 000000000..5c98b4288
--- /dev/null
+++ b/BankApp/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/BankApp/.idea/.name b/BankApp/.idea/.name
new file mode 100644
index 000000000..12cd6dc87
--- /dev/null
+++ b/BankApp/.idea/.name
@@ -0,0 +1 @@
+Bank App
\ No newline at end of file
diff --git a/BankApp/.idea/assetWizardSettings.xml b/BankApp/.idea/assetWizardSettings.xml
new file mode 100644
index 000000000..37c417a7e
--- /dev/null
+++ b/BankApp/.idea/assetWizardSettings.xml
@@ -0,0 +1,326 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/caches/build_file_checksums.ser b/BankApp/.idea/caches/build_file_checksums.ser
new file mode 100644
index 000000000..fe88c82f1
Binary files /dev/null and b/BankApp/.idea/caches/build_file_checksums.ser differ
diff --git a/BankApp/.idea/codeStyles/Project.xml b/BankApp/.idea/codeStyles/Project.xml
new file mode 100644
index 000000000..3cc336b93
--- /dev/null
+++ b/BankApp/.idea/codeStyles/Project.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/codeStyles/codeStyleConfig.xml b/BankApp/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 000000000..79ee123c2
--- /dev/null
+++ b/BankApp/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/compiler.xml b/BankApp/.idea/compiler.xml
new file mode 100644
index 000000000..ca954db43
--- /dev/null
+++ b/BankApp/.idea/compiler.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/gradle.xml b/BankApp/.idea/gradle.xml
new file mode 100644
index 000000000..caca2f309
--- /dev/null
+++ b/BankApp/.idea/gradle.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/jarRepositories.xml b/BankApp/.idea/jarRepositories.xml
new file mode 100644
index 000000000..a5f05cd8c
--- /dev/null
+++ b/BankApp/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml
new file mode 100644
index 000000000..19981c548
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml b/BankApp/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml
new file mode 100644
index 000000000..b2158ac95
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_2_0_aar.xml
new file mode 100644
index 000000000..553024c87
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_2_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_2_0_aar.xml
new file mode 100644
index 000000000..0aac26e87
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml b/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml
new file mode 100644
index 000000000..220841523
--- /dev/null
+++ b/BankApp/.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/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml
new file mode 100644
index 000000000..62babfe75
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml
new file mode 100644
index 000000000..648375606
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml
new file mode 100644
index 000000000..914d233f6
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml b/BankApp/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml
new file mode 100644
index 000000000..eafc05e94
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml
new file mode 100644
index 000000000..9b9c75bb3
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml b/BankApp/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml
new file mode 100644
index 000000000..e040f45de
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml
new file mode 100644
index 000000000..793edd40f
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml
new file mode 100644
index 000000000..c157cb7a8
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_core_core_ktx_1_3_2_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_core_core_ktx_1_3_2_aar.xml
new file mode 100644
index 000000000..deeefd94b
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_core_core_ktx_1_3_2_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml
new file mode 100644
index 000000000..1fb37b399
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml
new file mode 100644
index 000000000..83525ff97
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml
new file mode 100644
index 000000000..015936f19
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml
new file mode 100644
index 000000000..0c3c74cc0
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml
new file mode 100644
index 000000000..cf7fe7edf
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml
new file mode 100644
index 000000000..9354d4462
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_2_0.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_2_0.xml
new file mode 100644
index 000000000..f7d64790e
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_2_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml
new file mode 100644
index 000000000..6ab311e64
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml
new file mode 100644
index 000000000..bf4df0746
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml
new file mode 100644
index 000000000..9df72daa6
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_2_0_aar.xml
new file mode 100644
index 000000000..b34dd2c2f
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml
new file mode 100644
index 000000000..07627154a
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml
new file mode 100644
index 000000000..54d1bea6a
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml
new file mode 100644
index 000000000..dff2b83f6
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml
new file mode 100644
index 000000000..53732c0d3
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_2_0_aar.xml
new file mode 100644
index 000000000..fbadb59d8
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml
new file mode 100644
index 000000000..5a9173288
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml
new file mode 100644
index 000000000..2d539e5a7
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml
new file mode 100644
index 000000000..fab8f5cf5
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml
new file mode 100644
index 000000000..476d06c2d
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml
new file mode 100644
index 000000000..597b5a297
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_core_1_3_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_core_1_3_0_aar.xml
new file mode 100644
index 000000000..ffccc5d66
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_core_1_3_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml
new file mode 100644
index 000000000..81b3e0d7a
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_3_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_3_0_aar.xml
new file mode 100644
index 000000000..07ba31924
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_3_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml
new file mode 100644
index 000000000..61a5c5bbb
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_3_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_3_0_aar.xml
new file mode 100644
index 000000000..dd9d1baab
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_3_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml
new file mode 100644
index 000000000..4f3f8d195
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_2_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_2_aar.xml
new file mode 100644
index 000000000..723de081b
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_2_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml
new file mode 100644
index 000000000..0b4b08a24
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_monitor_1_3_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_monitor_1_3_0_aar.xml
new file mode 100644
index 000000000..44a965a77
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_monitor_1_3_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml
new file mode 100644
index 000000000..a39577ede
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_test_runner_1_3_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_test_runner_1_3_0_aar.xml
new file mode 100644
index 000000000..514293e32
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_test_runner_1_3_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml
new file mode 100644
index 000000000..7d668b059
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml
new file mode 100644
index 000000000..0b2a6102c
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml
new file mode 100644
index 000000000..37bfc64a0
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml
new file mode 100644
index 000000000..95c45cb6f
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml
new file mode 100644
index 000000000..81f44194c
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml b/BankApp/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml
new file mode 100644
index 000000000..b866755d4
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml b/BankApp/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml
new file mode 100644
index 000000000..16f5543df
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml b/BankApp/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml
new file mode 100644
index 000000000..2b834ea2f
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_6.xml b/BankApp/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_6.xml
new file mode 100644
index 000000000..45500a27e
--- /dev/null
+++ b/BankApp/.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/BankApp/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml b/BankApp/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml
new file mode 100644
index 000000000..662b001e8
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_4_8_0.xml b/BankApp/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_4_8_0.xml
new file mode 100644
index 000000000..87938c91d
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_4_8_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_8_0.xml b/BankApp/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_8_0.xml
new file mode 100644
index 000000000..0e146bce8
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_8_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_squareup_okio_okio_2_7_0.xml b/BankApp/.idea/libraries/Gradle__com_squareup_okio_okio_2_7_0.xml
new file mode 100644
index 000000000..751ae6b1d
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_squareup_okio_okio_2_7_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_6_0.xml b/BankApp/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_6_0.xml
new file mode 100644
index 000000000..93d9e0ca9
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_6_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_6_0.xml b/BankApp/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_6_0.xml
new file mode 100644
index 000000000..35c1a30db
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_6_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__io_mockk_mockk_1_10_0.xml b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_1_10_0.xml
new file mode 100644
index 000000000..5e3864770
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__io_mockk_mockk_android_1_10_0_aar.xml b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_android_1_10_0_aar.xml
new file mode 100644
index 000000000..727ac4603
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_android_1_10_0_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__io_mockk_mockk_common_1_10_0.xml b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_common_1_10_0.xml
new file mode 100644
index 000000000..8b30ae603
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_common_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__io_mockk_mockk_dsl_1_10_0.xml b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_dsl_1_10_0.xml
new file mode 100644
index 000000000..3ab49226f
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_dsl_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__io_mockk_mockk_dsl_jvm_1_10_0.xml b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_dsl_jvm_1_10_0.xml
new file mode 100644
index 000000000..b34aa9e8e
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__io_mockk_mockk_dsl_jvm_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml b/BankApp/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml
new file mode 100644
index 000000000..62012eaf8
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__junit_junit_4_12.xml b/BankApp/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 000000000..6c078d62b
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__junit_junit_4_13.xml b/BankApp/.idea/libraries/Gradle__junit_junit_4_13.xml
new file mode 100644
index 000000000..6d52cfa43
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__junit_junit_4_13.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml b/BankApp/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml
new file mode 100644
index 000000000..fbe96970d
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 000000000..09cf23d1b
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml b/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml
new file mode 100644
index 000000000..1a77dd835
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml b/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml
new file mode 100644
index 000000000..3d45e8e99
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 000000000..4f32fdef2
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_72.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_72.xml
new file mode 100644
index 000000000..7929d635f
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_72.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml
new file mode 100644
index 000000000..682479859
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_72.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_72.xml
new file mode 100644
index 000000000..be1749dd1
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_72.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_72.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_72.xml
new file mode 100644
index 000000000..45e02cd79
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_72.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_3_0.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_3_0.xml
new file mode 100644
index 000000000..d2fd50f70
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_1_3_6.xml b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_1_3_6.xml
new file mode 100644
index 000000000..f9c7f370c
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_1_3_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_koin_koin_android_2_0_1_aar.xml b/BankApp/.idea/libraries/Gradle__org_koin_koin_android_2_0_1_aar.xml
new file mode 100644
index 000000000..a90f5589d
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_koin_koin_android_2_0_1_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_koin_koin_androidx_scope_2_0_1_aar.xml b/BankApp/.idea/libraries/Gradle__org_koin_koin_androidx_scope_2_0_1_aar.xml
new file mode 100644
index 000000000..3b01fe506
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_koin_koin_androidx_scope_2_0_1_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_koin_koin_androidx_viewmodel_2_0_1_aar.xml b/BankApp/.idea/libraries/Gradle__org_koin_koin_androidx_viewmodel_2_0_1_aar.xml
new file mode 100644
index 000000000..43edadc85
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_koin_koin_androidx_viewmodel_2_0_1_aar.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/libraries/Gradle__org_koin_koin_core_2_0_1.xml b/BankApp/.idea/libraries/Gradle__org_koin_koin_core_2_0_1.xml
new file mode 100644
index 000000000..b10538d14
--- /dev/null
+++ b/BankApp/.idea/libraries/Gradle__org_koin_koin_core_2_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/misc.xml b/BankApp/.idea/misc.xml
new file mode 100644
index 000000000..892046b8c
--- /dev/null
+++ b/BankApp/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/modules.xml b/BankApp/.idea/modules.xml
new file mode 100644
index 000000000..c096babc7
--- /dev/null
+++ b/BankApp/.idea/modules.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/modules/Bank_App.iml b/BankApp/.idea/modules/Bank_App.iml
new file mode 100644
index 000000000..5a9a88b45
--- /dev/null
+++ b/BankApp/.idea/modules/Bank_App.iml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/modules/app/Bank_App.app.iml b/BankApp/.idea/modules/app/Bank_App.app.iml
new file mode 100644
index 000000000..ab3fa0e47
--- /dev/null
+++ b/BankApp/.idea/modules/app/Bank_App.app.iml
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/modules/data/Bank_App.data.iml b/BankApp/.idea/modules/data/Bank_App.data.iml
new file mode 100644
index 000000000..58a40b6b0
--- /dev/null
+++ b/BankApp/.idea/modules/data/Bank_App.data.iml
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/modules/domain/Bank_App.domain.iml b/BankApp/.idea/modules/domain/Bank_App.domain.iml
new file mode 100644
index 000000000..b72e9d6fa
--- /dev/null
+++ b/BankApp/.idea/modules/domain/Bank_App.domain.iml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/runConfigurations.xml b/BankApp/.idea/runConfigurations.xml
new file mode 100644
index 000000000..7f68460d8
--- /dev/null
+++ b/BankApp/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/.idea/vcs.xml b/BankApp/.idea/vcs.xml
new file mode 100644
index 000000000..6c0b86358
--- /dev/null
+++ b/BankApp/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/build.gradle b/BankApp/app/build.gradle
new file mode 100644
index 000000000..473e6805c
--- /dev/null
+++ b/BankApp/app/build.gradle
@@ -0,0 +1,47 @@
+apply plugin: 'com.android.application'
+
+apply plugin: 'kotlin-android'
+
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 29
+ buildToolsVersion "29.0.2"
+ defaultConfig {
+ applicationId "com.example.bankapp"
+ minSdkVersion 19
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ implementation project(path: ':domain')
+ implementation project(path: ':data')
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation "org.koin:koin-androidx-scope:$koin_version"
+ implementation "org.koin:koin-androidx-viewmodel:$koin_version"
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.core:core-ktx:1.2.0'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
+
+ implementation 'androidx.cardview:cardview:1.0.0'
+ testImplementation 'junit:junit:4.13'
+ testImplementation "io.mockk:mockk:1.10.0"
+ androidTestImplementation "io.mockk:mockk-android:1.10.0"
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
+}
diff --git a/BankApp/app/build/generated/source/buildConfig/debug/com/example/bankapp/BuildConfig.java b/BankApp/app/build/generated/source/buildConfig/debug/com/example/bankapp/BuildConfig.java
new file mode 100644
index 000000000..b3364519a
--- /dev/null
+++ b/BankApp/app/build/generated/source/buildConfig/debug/com/example/bankapp/BuildConfig.java
@@ -0,0 +1,12 @@
+/**
+ * Automatically generated file. DO NOT MODIFY
+ */
+package com.example.bankapp;
+
+public final class BuildConfig {
+ public static final boolean DEBUG = Boolean.parseBoolean("true");
+ public static final String APPLICATION_ID = "com.example.bankapp";
+ public static final String BUILD_TYPE = "debug";
+ public static final int VERSION_CODE = 1;
+ public static final String VERSION_NAME = "1.0";
+}
diff --git a/BankApp/app/proguard-rules.pro b/BankApp/app/proguard-rules.pro
new file mode 100644
index 000000000..f1b424510
--- /dev/null
+++ b/BankApp/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
diff --git a/BankApp/app/src/main/AndroidManifest.xml b/BankApp/app/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..c7b518270
--- /dev/null
+++ b/BankApp/app/src/main/AndroidManifest.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/ic_launcher-playstore.png b/BankApp/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 000000000..e5e2d2a5a
Binary files /dev/null and b/BankApp/app/src/main/ic_launcher-playstore.png differ
diff --git a/BankApp/app/src/main/ic_logo-playstore.png b/BankApp/app/src/main/ic_logo-playstore.png
new file mode 100644
index 000000000..0da188ea1
Binary files /dev/null and b/BankApp/app/src/main/ic_logo-playstore.png differ
diff --git a/BankApp/app/src/main/ic_logout-playstore.png b/BankApp/app/src/main/ic_logout-playstore.png
new file mode 100644
index 000000000..e603e7c33
Binary files /dev/null and b/BankApp/app/src/main/ic_logout-playstore.png differ
diff --git a/BankApp/app/src/main/java/com/example/bankapp/BankApp.kt b/BankApp/app/src/main/java/com/example/bankapp/BankApp.kt
new file mode 100644
index 000000000..99c080d32
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/BankApp.kt
@@ -0,0 +1,25 @@
+package com.example.bankapp
+
+import android.app.Application
+import com.example.bankapp.di.AppModules
+import org.koin.android.ext.koin.androidContext
+import org.koin.core.context.startKoin
+
+class BankApp : Application() {
+
+ override fun onCreate() {
+
+ super.onCreate()
+ setupKoin()
+
+ }
+
+ private fun setupKoin() {
+ startKoin {
+ androidContext(this@BankApp)
+ modules(
+ AppModules.getModules()
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/di/AppModules.kt b/BankApp/app/src/main/java/com/example/bankapp/di/AppModules.kt
new file mode 100644
index 000000000..bc560dd6d
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/di/AppModules.kt
@@ -0,0 +1,13 @@
+package com.example.bankapp.di
+
+import com.example.bankapp.di.modules.*
+import org.koin.core.module.Module
+
+object AppModules {
+ fun getModules() : List = listOf(
+ UiModules,
+ NetworkingModules,
+ DomainModules,
+ UtilModules
+ )
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/di/modules/DomainModules.kt b/BankApp/app/src/main/java/com/example/bankapp/di/modules/DomainModules.kt
new file mode 100644
index 000000000..02c1a85fe
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/di/modules/DomainModules.kt
@@ -0,0 +1,10 @@
+package com.example.bankapp.di.modules
+
+import com.example.domain.usecases.ListStatementsUseCase
+import com.example.domain.usecases.PerformLoginUseCase
+import org.koin.dsl.module
+
+internal val DomainModules = module {
+ factory { ListStatementsUseCase(repository = get()) }
+ factory { PerformLoginUseCase(repository = get()) }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/di/modules/NetworkingModules.kt b/BankApp/app/src/main/java/com/example/bankapp/di/modules/NetworkingModules.kt
new file mode 100644
index 000000000..f0769d543
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/di/modules/NetworkingModules.kt
@@ -0,0 +1,13 @@
+package com.example.bankapp.di.modules
+
+import com.example.data.networking.BankApi
+import com.example.data.networking.base.ApiClient
+import com.example.data.repositories.BankRepository
+import com.example.domain.repositories.IBankRepository
+import org.koin.dsl.bind
+import org.koin.dsl.module
+
+internal val NetworkingModules = module {
+ single { ApiClient.createService(BankApi::class.java) }
+ factory { BankRepository(get()) } bind IBankRepository::class
+}
diff --git a/BankApp/app/src/main/java/com/example/bankapp/di/modules/UiModules.kt b/BankApp/app/src/main/java/com/example/bankapp/di/modules/UiModules.kt
new file mode 100644
index 000000000..b7d8148a1
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/di/modules/UiModules.kt
@@ -0,0 +1,11 @@
+package com.example.bankapp.di.modules
+
+import com.example.bankapp.ui.login.LoginViewModel
+import com.example.bankapp.ui.statements.MainViewModel
+import org.koin.androidx.viewmodel.dsl.viewModel
+import org.koin.dsl.module
+
+val UiModules = module {
+ viewModel { LoginViewModel(get(), get()) }
+ viewModel { MainViewModel(get(), get()) }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/di/modules/UtilModules.kt b/BankApp/app/src/main/java/com/example/bankapp/di/modules/UtilModules.kt
new file mode 100644
index 000000000..0a47b4f1a
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/di/modules/UtilModules.kt
@@ -0,0 +1,10 @@
+package com.example.bankapp.di.modules
+
+import com.example.bankapp.util.SessionManager
+import org.koin.dsl.module
+
+internal val UtilModules = module {
+ single {
+ SessionManager(get())
+ }
+}
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/BaseActivity.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/BaseActivity.kt
new file mode 100644
index 000000000..13d203708
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/BaseActivity.kt
@@ -0,0 +1,109 @@
+package com.example.bankapp.ui
+
+import android.content.res.Resources
+import android.view.View
+import android.view.WindowManager
+import androidx.appcompat.app.AppCompatActivity
+import com.example.bankapp.R
+import com.example.bankapp.ui.dialogs.DialogBuilder
+import com.example.domain.base.ExceptionTag
+import com.example.domain.excecoes.UseCaseException
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import java.util.concurrent.TimeoutException
+
+abstract class BaseActivity : AppCompatActivity() {
+ open var viewProgressBar: View? = null
+
+ private fun showLoading() {
+ window?.setFlags(
+ WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
+ WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+ )
+ viewProgressBar?.visibility = View.VISIBLE
+ }
+
+ private fun hideLoading() {
+ window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
+ viewProgressBar?.visibility = View.GONE
+ }
+
+ protected open fun exibirDialogErroPadrao(
+ mensagem: String? = null,
+ excecao: Exception? = null,
+ acaoBotao: (() -> Unit)? = null
+ ) {
+ val mensagemDialog = obterMensagemDialogErro(mensagem, excecao)
+
+ DialogBuilder(this).exibirDialogPadrao(
+ getString(R.string.erro),
+ mensagemDialog,
+ acaoBotao
+ )
+ }
+
+ private fun obterMensagemDialogErro(
+ mensagem: String?,
+ excecao: Exception?
+ ): String {
+ return if (mensagem.isNullOrBlank()) {
+ if (excecao != null) {
+ obterMensagemDialogErroPorExcecao(excecao)
+ } else {
+ getString(R.string.erro_nao_identificado)
+ }
+ } else {
+ mensagem
+ }
+ }
+
+ private fun obterMensagemDialogErroPorExcecao(
+ excecao: Exception
+ ): String {
+ return when {
+ excecao::class.java == Resources.NotFoundException::class.java ->
+ getString(R.string.erro_not_found)
+ excecao::class.java == TimeoutException::class.java ->
+ getString(R.string.erro_timeout)
+ excecao::class.java == UseCaseException::class.java -> {
+ val executor = excecao as UseCaseException
+ when {
+
+ executor.exceptionTag == ExceptionTag.REALIZAR_LOGIN ->
+ getString(R.string.erro_realizar_login)
+ executor.exceptionTag == ExceptionTag.LISTAR_STATEMENTS_POR_USUARIO ->
+ getString(R.string.erro_empresa_id)
+ else -> getString(R.string.erro_nao_identificado)
+ }
+ }
+ else -> getString(R.string.erro_nao_identificado)
+ }
+ }
+
+ protected fun doAsyncWork(
+ work: suspend () -> Unit,
+ acaoBotaoDialogErro: (() -> Unit)? = null,
+ mostrarLoading: Boolean = true
+ ) {
+ GlobalScope.launch {
+ try {
+ if (mostrarLoading) {
+ runOnUiThread {
+ showLoading()
+ }
+ }
+ work()
+ } catch (e: java.lang.Exception) {
+ runOnUiThread {
+ exibirDialogErroPadrao(excecao = e, acaoBotao = acaoBotaoDialogErro)
+ }
+ } finally {
+ if (mostrarLoading) {
+ runOnUiThread {
+ hideLoading()
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/adapters/StatementsAdapter.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/adapters/StatementsAdapter.kt
new file mode 100644
index 000000000..6dc0ef6b1
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/adapters/StatementsAdapter.kt
@@ -0,0 +1,51 @@
+package com.example.bankapp.ui.adapters
+
+import android.content.Context
+import android.graphics.Color
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.bankapp.R
+import com.example.bankapp.util.Converters
+import com.example.domain.entities.Statement
+import kotlinx.android.synthetic.main.statement_item.view.*
+import kotlin.math.absoluteValue
+
+class StatementsAdapter(private val statements: List, private val context: Context) :
+ RecyclerView.Adapter() {
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): StatementsAdapter.ViewHolder {
+ val view = LayoutInflater.from(context).inflate(R.layout.statement_item, parent, false)
+ return ViewHolder(view)
+ }
+
+ override fun getItemCount(): Int {
+ return statements.size
+ }
+
+ override fun onBindViewHolder(holder: StatementsAdapter.ViewHolder, position: Int) {
+ val statement = statements[position]
+
+ holder.let {
+ holder.dataEmissaoTextView.text = Converters().converterDataddMMyyyy(statement.data!!)
+ holder.tituloTextView.apply {
+ text = statement.titulo
+ if (statement.valor!! < 0) this.setTextColor(Color.parseColor("#ff4d4d"))
+ else this.setTextColor(Color.parseColor("#32ff7e"))
+ }
+ holder.descricaoTextView.text = statement.descricao
+ holder.valorTextView.text =
+ Converters().convertToCurrency(statement.valor!!.absoluteValue)
+ }
+ }
+
+ class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val dataEmissaoTextView = itemView.textview_dataEmissao
+ val descricaoTextView = itemView.textview_descricao
+ val tituloTextView = itemView.textview_titulo
+ val valorTextView = itemView.textview_valor
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/dialogs/DialogBuilder.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/dialogs/DialogBuilder.kt
new file mode 100644
index 000000000..a328b8cff
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/dialogs/DialogBuilder.kt
@@ -0,0 +1,41 @@
+package com.example.bankapp.ui.dialogs
+
+import android.content.Context
+import com.example.bankapp.R
+
+class DialogBuilder(val context: Context) {
+
+ fun exibirDialogPadrao(
+ titulo: String?,
+ mensagem: String,
+ acaoBotaoOk: (() -> Unit)? = null
+ ) {
+ OneButtonDialog(
+ context,
+ titulo,
+ formatarMensagem(mensagem),
+ context.getString(R.string.ok)
+ ) {acaoBotaoOk?.invoke()}.show()
+ }
+
+ fun exibirDialogUmBotao(
+ titulo: String?,
+ mensagem: String,
+ titleOkCall: String,
+ okCall: () -> Unit
+ ) {
+ OneButtonDialog(
+ context,
+ titulo,
+ formatarMensagem(mensagem),
+ titleOkCall
+ ) { okCall() }.show()
+ }
+
+
+
+
+ private fun formatarMensagem(mensagem: String): String {
+ return mensagem.replace("\\\\n", "\n")
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/dialogs/OneButtonDialog.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/dialogs/OneButtonDialog.kt
new file mode 100644
index 000000000..fbf024213
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/dialogs/OneButtonDialog.kt
@@ -0,0 +1,40 @@
+package com.example.bankapp.ui.dialogs
+
+import android.app.Dialog
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.view.ViewGroup
+import android.view.WindowManager
+import com.example.bankapp.R
+import kotlinx.android.synthetic.main.base_dialog_um_botao.*
+
+class OneButtonDialog(
+ context: Context,
+ titulo: String?,
+ mensagem: String,
+ textoBotaoPositivo: String,
+ val acaoBotaoPositivo: () -> Unit
+) : Dialog(context) {
+
+ init {
+ setContentView(R.layout.base_dialog_um_botao)
+ setCancelable(false)
+
+ window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+
+ val lp = WindowManager.LayoutParams()
+ lp.copyFrom(window!!.attributes)
+ lp.width = ViewGroup.LayoutParams.MATCH_PARENT
+ window?.attributes = lp
+
+ textoTitulo.text = titulo ?: ""
+ textoMensagem.text = mensagem
+
+ botaoPositivo.text = textoBotaoPositivo
+ botaoPositivo.setOnClickListener {
+ dismiss()
+ acaoBotaoPositivo()
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/login/LoginActivity.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/login/LoginActivity.kt
new file mode 100644
index 000000000..130dc1726
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/login/LoginActivity.kt
@@ -0,0 +1,154 @@
+package com.example.bankapp.ui.login
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.SystemClock
+import android.text.Editable
+import android.text.TextWatcher
+import androidx.lifecycle.Observer
+import com.example.bankapp.R
+import com.example.bankapp.ui.BaseActivity
+import com.example.bankapp.ui.dialogs.DialogBuilder
+import com.example.bankapp.ui.statements.MainActivity
+import com.example.bankapp.util.SessionManager
+import kotlinx.android.synthetic.main.activity_login.*
+import org.koin.android.ext.android.get
+import org.koin.androidx.viewmodel.ext.android.viewModel
+
+class LoginActivity : BaseActivity() {
+ private var mUltimoClickBotaoLogin = 0L
+ private val loginViewModel: LoginViewModel by viewModel()
+ private val sessionManager: SessionManager = get()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_login)
+ setupObservers()
+ setupListeners()
+ }
+
+ private fun setupObservers() {
+ configurarObserverLoginResposta()
+ }
+
+ private fun configurarObserverLoginResposta() {
+ loginViewModel.loginResposta.observe(this, Observer {
+ it?.let { resposta ->
+ if (resposta.contaUsuario?.id != null) {
+ sessionManager.salvarInformacoesUsuario(
+ id = resposta.contaUsuario!!.id,
+ agencia = resposta.contaUsuario!!.agencia,
+ conta = resposta.contaUsuario!!.conta,
+ nome = resposta.contaUsuario!!.nome,
+ saldo = resposta.contaUsuario!!.saldo
+ )
+
+ val statementsIntent = Intent(this, MainActivity::class.java)
+ startActivity(statementsIntent)
+ finish()
+ } else {
+ exibirMensagemErroLogin(mensagem = resposta.error?.mensagem!!)
+ }
+ }
+ })
+ }
+
+ private fun setupListeners() {
+ configurarEditTexts()
+ configurarProgressBar()
+ botao_efetuar_login.setOnClickListener {
+ if (SystemClock.elapsedRealtime() - mUltimoClickBotaoLogin > 1000) {
+ mUltimoClickBotaoLogin = SystemClock.elapsedRealtime()
+ if (loginViewModel.usuarioValido(loginViewModel.usuario.value) && loginViewModel.senhaValida(
+ loginViewModel.senha.value
+ )
+ ) {
+ resetErrors()
+ efetuarLogin(
+ usuario = loginViewModel.usuario.value!!,
+ senha = loginViewModel.senha.value!!
+ )
+ } else {
+ configurarErrosSenha(loginViewModel.senha.value)
+ configurarErrosUsuario(loginViewModel.usuario.value)
+ }
+ }
+
+ }
+ }
+
+ private fun configurarEditTexts() {
+ input_usuario.addTextChangedListener(object : TextWatcher {
+ override fun afterTextChanged(editavel: Editable?) {
+ }
+
+ override fun beforeTextChanged(valor: CharSequence?, p1: Int, p2: Int, p3: Int) {
+ }
+
+ override fun onTextChanged(valor: CharSequence?, p1: Int, p2: Int, p3: Int) {
+ valor?.let {
+ when (valor.isBlank()) {
+ false -> loginViewModel.usuario.postValue(valor.toString())
+ else -> {
+ }
+ }
+ }
+ }
+ })
+ input_senha.addTextChangedListener(object : TextWatcher {
+ override fun afterTextChanged(editavel: Editable?) {}
+
+ override fun beforeTextChanged(valor: CharSequence?, p1: Int, p2: Int, p3: Int) {}
+
+ override fun onTextChanged(valor: CharSequence?, p1: Int, p2: Int, p3: Int) {
+ valor?.let {
+ when (valor.isBlank()) {
+ false -> loginViewModel.senha.postValue(valor.toString())
+ else -> Unit
+ }
+ }
+ }
+ })
+ }
+
+ fun efetuarLogin(usuario: String, senha: String) {
+ doAsyncWork(work = {
+ loginViewModel.realizarLogin(
+ usuario = usuario,
+ senha = senha
+ )
+ })
+ }
+
+ private fun configurarProgressBar() {
+ viewProgressBar = progressBar
+ }
+
+ private fun exibirMensagemErroLogin(mensagem: String) {
+ DialogBuilder(this).exibirDialogUmBotao(
+ getString(R.string.erro),
+ mensagem,
+ getString(R.string.ok)
+ ) { }
+ }
+
+ private fun configurarErrosUsuario(valor: String?) {
+ input_usuario.error = when (valor.isNullOrBlank()) {
+ true -> "Campo de usuário não pode estar em branco."
+ false -> if (!loginViewModel.usuarioValido(valor)) "O usuário deve conter um email ou CPF válido."
+ else ""
+ }
+ }
+
+ private fun configurarErrosSenha(valor: String?) {
+ input_senha.error = when (valor.isNullOrBlank()) {
+ true -> "Senha não pode estar em branco."
+ false -> if (!loginViewModel.senhaValida(valor)) "A senha deve conter pelo menos uma letra maiúscula."
+ else ""
+ }
+ }
+
+ private fun resetErrors() {
+ input_usuario.error = null
+ input_senha.error = null
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/login/LoginViewModel.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/login/LoginViewModel.kt
new file mode 100644
index 000000000..f03907018
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/login/LoginViewModel.kt
@@ -0,0 +1,47 @@
+package com.example.bankapp.ui.login
+
+import android.app.Application
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.example.domain.entities.LoginRequisicao
+import com.example.domain.entities.LoginResposta
+import com.example.domain.usecases.PerformLoginUseCase
+
+class LoginViewModel(private val loginUseCase: PerformLoginUseCase, val app: Application) :
+ ViewModel() {
+ val usuario = MutableLiveData()
+ val senha = MutableLiveData()
+ val loginResposta: MutableLiveData by lazy {
+ MutableLiveData()
+ }
+
+ suspend fun realizarLogin(usuario: String, senha: String) {
+ val params =
+ PerformLoginUseCase.Parametros(LoginRequisicao(usuario = usuario, senha = senha))
+ val resposta = loginUseCase.execute(params)
+
+ loginResposta.postValue(resposta)
+ }
+
+
+ fun usuarioValido(valor : String?): Boolean {
+ return when(valor.isNullOrBlank()){
+ false -> {
+ when (valor.matches("-?\\d+(\\.\\d+)?".toRegex())) {
+ true -> valor.length == 11
+ false -> valor!!.contains("@") && valor.contains(".com")
+ }
+ }
+ true -> false
+ }
+ }
+
+ fun senhaValida(valor: String?): Boolean {
+ if(valor.isNullOrBlank()) return false
+
+ for (character in valor!!) {
+ if (character.isUpperCase()) return true
+ }
+ return false
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/statements/MainActivity.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/statements/MainActivity.kt
new file mode 100644
index 000000000..599312834
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/statements/MainActivity.kt
@@ -0,0 +1,96 @@
+package com.example.bankapp.ui.statements
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.example.bankapp.R
+import com.example.bankapp.ui.BaseActivity
+import com.example.bankapp.ui.adapters.StatementsAdapter
+import com.example.bankapp.ui.login.LoginActivity
+import com.example.bankapp.util.Constants
+import com.example.bankapp.util.Converters
+import com.example.bankapp.util.Mask
+import com.example.bankapp.util.SessionManager
+import com.example.domain.entities.Statement
+import kotlinx.android.synthetic.main.activity_main.*
+import org.koin.android.ext.android.get
+import org.koin.androidx.viewmodel.ext.android.viewModel
+
+class MainActivity : BaseActivity() {
+ private val sessionManager: SessionManager = get()
+ private val mainViewModel: MainViewModel by viewModel()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ when (sessionManager.retornarUsuario()!!.id != Constants.Parametros.CODIGO_ID_VAZIO) {
+ true -> {
+ setContentView(R.layout.activity_main)
+ setUserInformation()
+ setupObservers()
+ setupListeners()
+ }
+ else -> {
+ val loginIntent = Intent(this, LoginActivity::class.java)
+ startActivity(loginIntent)
+ finish()
+ }
+ }
+ }
+
+ private fun setUserInformation() {
+ mainViewModel.contaUsuario.value = sessionManager.retornarUsuario()
+ }
+
+ private fun setupObservers() {
+ mainViewModel.listaStatements.observe(this, Observer {
+ it?.let {
+ if (it.listaStatements!!.isNotEmpty()) configurarStatementsRecyclerView(it.listaStatements)
+ else setupEmptyList()
+ }
+ })
+
+ mainViewModel.contaUsuario.observe(this, Observer { contaUsuario ->
+ textview_nome.text = contaUsuario?.nome
+ textview_conta.text =
+ "${contaUsuario?.conta} / ${Mask().addMask(contaUsuario?.agencia!!, "##.######-#")}"
+ textview_saldo.text = Converters().convertToCurrency(contaUsuario?.saldo!!)
+
+ listStatements(idUsuario = contaUsuario!!.id!!)
+ })
+ }
+
+ fun setupListeners() {
+ viewProgressBar = progressBar
+ logout_button.setOnClickListener {
+ realizarLogout()
+ }
+
+ }
+
+ private fun configurarStatementsRecyclerView(listaStatements: List?) {
+ val statementsRecyclerView = recyclerview_statements
+ statementsRecyclerView.visibility = View.VISIBLE
+ statementsRecyclerView.adapter = StatementsAdapter(listaStatements!!, application)
+ val layoutManager = LinearLayoutManager(application)
+ statementsRecyclerView.layoutManager = layoutManager
+ }
+
+ private fun setupEmptyList() {
+
+ recyclerview_statements.visibility = View.GONE
+ textview_semResultados.visibility = View.VISIBLE
+ }
+
+ private fun listStatements(idUsuario: Int) {
+ doAsyncWork(work = { mainViewModel.listarStatements(idUsuario = idUsuario) })
+ }
+
+ fun realizarLogout() {
+ sessionManager.limparDados()
+ val loginIntent = Intent(this, LoginActivity::class.java)
+ startActivity(loginIntent)
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/ui/statements/MainViewModel.kt b/BankApp/app/src/main/java/com/example/bankapp/ui/statements/MainViewModel.kt
new file mode 100644
index 000000000..79e2a6a31
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/ui/statements/MainViewModel.kt
@@ -0,0 +1,25 @@
+package com.example.bankapp.ui.statements
+
+import android.app.Application
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.example.domain.entities.ContaUsuario
+import com.example.domain.entities.ListaStatements
+import com.example.domain.usecases.ListStatementsUseCase
+
+class MainViewModel(
+ private val listStatementsUseCase: ListStatementsUseCase,
+ val app: Application
+) : ViewModel() {
+ val contaUsuario = MutableLiveData()
+ val listaStatements: MutableLiveData by lazy {
+ MutableLiveData()
+ }
+
+ suspend fun listarStatements(idUsuario: Int?) {
+ val params = ListStatementsUseCase.Parametros(id = idUsuario!!)
+ val resposta = listStatementsUseCase.execute(params)
+
+ listaStatements.postValue(resposta)
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/util/Constants.kt b/BankApp/app/src/main/java/com/example/bankapp/util/Constants.kt
new file mode 100644
index 000000000..6399cbdc0
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/util/Constants.kt
@@ -0,0 +1,12 @@
+package com.example.bankapp.util
+
+object Constants {
+ object Parametros{
+ const val ID : String = "ID"
+ const val BANK_ACCOUNT : String = "BANK_ACCOUNT"
+ const val NAME : String = "NAME"
+ const val AGENCY : String = "AGENCY"
+ const val BALANCE : String = "BALANCE"
+ const val CODIGO_ID_VAZIO : Int = -1
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/util/Converters.kt b/BankApp/app/src/main/java/com/example/bankapp/util/Converters.kt
new file mode 100644
index 000000000..9e4df2720
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/util/Converters.kt
@@ -0,0 +1,23 @@
+package com.example.bankapp.util
+
+import java.text.NumberFormat
+import java.text.SimpleDateFormat
+import java.util.*
+
+class Converters {
+ fun converterDataddMMyyyy(data: String): String {
+
+ val parser = SimpleDateFormat("yyyy-MM-dd")
+ val formatter = SimpleDateFormat("dd/MM/yyyy")
+
+ return formatter.format(parser.parse(data))
+ }
+
+ fun convertToCurrency(valor: Double): String {
+ val formatter = NumberFormat.getCurrencyInstance()
+ formatter.maximumFractionDigits = 2
+ formatter.currency = Currency.getInstance(Locale("pt", "BR"))
+
+ return formatter.format(valor)
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/util/Mask.kt b/BankApp/app/src/main/java/com/example/bankapp/util/Mask.kt
new file mode 100644
index 000000000..9a6ad2524
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/util/Mask.kt
@@ -0,0 +1,21 @@
+package com.example.bankapp.util
+
+class Mask {
+ fun addMask(textoAFormatar: String, mask: String): String? {
+ var formatado: String? = ""
+ var i = 0
+ for (m in mask.toCharArray()) {
+ if (m != '#') {
+ formatado += m
+ continue
+ }
+ formatado += try {
+ textoAFormatar[i]
+ } catch (e: Exception) {
+ break
+ }
+ i++
+ }
+ return formatado
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/java/com/example/bankapp/util/SessionManager.kt b/BankApp/app/src/main/java/com/example/bankapp/util/SessionManager.kt
new file mode 100644
index 000000000..c73c221ee
--- /dev/null
+++ b/BankApp/app/src/main/java/com/example/bankapp/util/SessionManager.kt
@@ -0,0 +1,52 @@
+package com.example.bankapp.util
+
+import android.app.Application
+import android.content.SharedPreferences
+import com.example.domain.entities.ContaUsuario
+
+class SessionManager(val app: Application) {
+ val sharedPreferences: String = "shared_preferences"
+
+ fun limparDados() {
+ val sharedPrefs: SharedPreferences = app.getSharedPreferences(sharedPreferences, 0)
+
+ val editor: SharedPreferences.Editor = sharedPrefs.edit()
+
+ editor.clear()
+ editor.apply()
+ }
+
+ fun salvarInformacoesUsuario(
+ id: Int?,
+ nome: String?,
+ conta: String?,
+ agencia: String?,
+ saldo: Double?
+ ) {
+ val sharedPrefs: SharedPreferences = app.getSharedPreferences(sharedPreferences, 0)
+ val editor = sharedPrefs.edit()
+ editor.putString(Constants.Parametros.NAME, nome)
+ editor.putString(Constants.Parametros.BANK_ACCOUNT, conta)
+ editor.putString(Constants.Parametros.AGENCY, agencia)
+ editor.putFloat(Constants.Parametros.BALANCE, saldo!!.toFloat())
+ editor.putInt(Constants.Parametros.ID, id!!)
+ editor.apply()
+ }
+
+ fun retornarUsuario(): ContaUsuario? {
+ val sharedPrefs: SharedPreferences = app.getSharedPreferences(sharedPreferences, 0)
+ val idUsuario = sharedPrefs.getInt(Constants.Parametros.ID, -1)
+ val conta = sharedPrefs.getString(Constants.Parametros.BANK_ACCOUNT, "")
+ val agencia = sharedPrefs.getString(Constants.Parametros.AGENCY, "")
+ val nome = sharedPrefs.getString(Constants.Parametros.NAME, "")
+ val saldo = sharedPrefs.getFloat(Constants.Parametros.BALANCE, 0.0f)
+
+ return ContaUsuario(
+ id = idUsuario,
+ conta = conta,
+ agencia = agencia,
+ nome = nome,
+ saldo = saldo.toDouble()
+ )
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/botao_formulario.xml b/BankApp/app/src/main/res/drawable/botao_formulario.xml
new file mode 100644
index 000000000..a685e156e
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/botao_formulario.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/botao_formulario_desabilitado.xml b/BankApp/app/src/main/res/drawable/botao_formulario_desabilitado.xml
new file mode 100644
index 000000000..3bf40cfab
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/botao_formulario_desabilitado.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/botao_formulario_habilitado.xml b/BankApp/app/src/main/res/drawable/botao_formulario_habilitado.xml
new file mode 100644
index 000000000..fb06dc630
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/botao_formulario_habilitado.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/dialog_background.xml b/BankApp/app/src/main/res/drawable/dialog_background.xml
new file mode 100644
index 000000000..294a18e6f
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/dialog_background.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/edit_text_background.xml b/BankApp/app/src/main/res/drawable/edit_text_background.xml
new file mode 100644
index 000000000..b537fc073
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/edit_text_background.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/ic_launcher_foreground.xml b/BankApp/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 000000000..a3d60f79e
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/drawable/ic_logo_background.xml b/BankApp/app/src/main/res/drawable/ic_logo_background.xml
new file mode 100644
index 000000000..ca3826a46
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/ic_logo_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BankApp/app/src/main/res/drawable/ic_logout_background.xml b/BankApp/app/src/main/res/drawable/ic_logout_background.xml
new file mode 100644
index 000000000..ca3826a46
--- /dev/null
+++ b/BankApp/app/src/main/res/drawable/ic_logout_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BankApp/app/src/main/res/font/roboto_light.xml b/BankApp/app/src/main/res/font/roboto_light.xml
new file mode 100644
index 000000000..28fbc0d77
--- /dev/null
+++ b/BankApp/app/src/main/res/font/roboto_light.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/BankApp/app/src/main/res/font/roboto_medium.xml b/BankApp/app/src/main/res/font/roboto_medium.xml
new file mode 100644
index 000000000..59df90bc8
--- /dev/null
+++ b/BankApp/app/src/main/res/font/roboto_medium.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/BankApp/app/src/main/res/layout/activity_login.xml b/BankApp/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 000000000..a2ef6a4d2
--- /dev/null
+++ b/BankApp/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/layout/activity_main.xml b/BankApp/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000..1627679bc
--- /dev/null
+++ b/BankApp/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/layout/base_dialog_um_botao.xml b/BankApp/app/src/main/res/layout/base_dialog_um_botao.xml
new file mode 100644
index 000000000..60fc5a6ea
--- /dev/null
+++ b/BankApp/app/src/main/res/layout/base_dialog_um_botao.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/layout/progress_dialog.xml b/BankApp/app/src/main/res/layout/progress_dialog.xml
new file mode 100644
index 000000000..b19751617
--- /dev/null
+++ b/BankApp/app/src/main/res/layout/progress_dialog.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/layout/statement_item.xml b/BankApp/app/src/main/res/layout/statement_item.xml
new file mode 100644
index 000000000..495b3f3e1
--- /dev/null
+++ b/BankApp/app/src/main/res/layout/statement_item.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..7353dbd1f
--- /dev/null
+++ b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..7353dbd1f
--- /dev/null
+++ b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logo.xml b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logo.xml
new file mode 100644
index 000000000..38d66407d
--- /dev/null
+++ b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logo.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logo_round.xml b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logo_round.xml
new file mode 100644
index 000000000..38d66407d
--- /dev/null
+++ b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logo_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logout.xml b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logout.xml
new file mode 100644
index 000000000..9a9a0e503
--- /dev/null
+++ b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logout.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logout_round.xml b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logout_round.xml
new file mode 100644
index 000000000..9a9a0e503
--- /dev/null
+++ b/BankApp/app/src/main/res/mipmap-anydpi-v26/ic_logout_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_launcher.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..1b98f244f
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 000000000..18a4d689e
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_logo.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_logo.png
new file mode 100644
index 000000000..1dcb3bcbc
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_logo.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_logo_foreground.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_logo_foreground.png
new file mode 100644
index 000000000..abb98a299
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_logo_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_logo_round.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_logo_round.png
new file mode 100644
index 000000000..ae962457f
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_logo_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_logout.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_logout.png
new file mode 100644
index 000000000..5a8bb7f49
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_logout.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_logout_foreground.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_logout_foreground.png
new file mode 100644
index 000000000..4cccb9c84
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_logout_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-hdpi/ic_logout_round.png b/BankApp/app/src/main/res/mipmap-hdpi/ic_logout_round.png
new file mode 100644
index 000000000..4998fa720
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-hdpi/ic_logout_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_launcher.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..97ef27216
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 000000000..8ec3ab06e
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_logo.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_logo.png
new file mode 100644
index 000000000..2cf1ba039
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_logo.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_logo_foreground.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_logo_foreground.png
new file mode 100644
index 000000000..c9618d791
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_logo_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_logo_round.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_logo_round.png
new file mode 100644
index 000000000..eccba5dd9
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_logo_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_logout.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_logout.png
new file mode 100644
index 000000000..0d9997583
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_logout.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_logout_foreground.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_logout_foreground.png
new file mode 100644
index 000000000..89c17bbd4
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_logout_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-mdpi/ic_logout_round.png b/BankApp/app/src/main/res/mipmap-mdpi/ic_logout_round.png
new file mode 100644
index 000000000..5afea8904
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-mdpi/ic_logout_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..d86b4aca2
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..6656d4028
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo.png
new file mode 100644
index 000000000..c226d5ac6
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo_foreground.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo_foreground.png
new file mode 100644
index 000000000..09327e511
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo_round.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo_round.png
new file mode 100644
index 000000000..1cc781629
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logo_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout.png
new file mode 100644
index 000000000..b6732b9c4
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout_foreground.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout_foreground.png
new file mode 100644
index 000000000..4691dbba1
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout_round.png b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout_round.png
new file mode 100644
index 000000000..63cee4c30
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xhdpi/ic_logout_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..fea97fee3
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..5d64ab3f8
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo.png
new file mode 100644
index 000000000..c1c423ea3
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo_foreground.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo_foreground.png
new file mode 100644
index 000000000..c85c3a85c
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo_round.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo_round.png
new file mode 100644
index 000000000..e9654d19b
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logo_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout.png
new file mode 100644
index 000000000..1e2e48adc
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout_foreground.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout_foreground.png
new file mode 100644
index 000000000..c862bffb1
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout_round.png b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout_round.png
new file mode 100644
index 000000000..f5fa9c564
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxhdpi/ic_logout_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..36b8a5e3a
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..0b62e2130
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo.png
new file mode 100644
index 000000000..fdae5655a
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo_foreground.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo_foreground.png
new file mode 100644
index 000000000..ddb3924fe
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo_round.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo_round.png
new file mode 100644
index 000000000..b0f7b60c7
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logo_round.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout.png
new file mode 100644
index 000000000..b920b00bd
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout_foreground.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout_foreground.png
new file mode 100644
index 000000000..bb4fe14f2
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout_foreground.png differ
diff --git a/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout_round.png b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout_round.png
new file mode 100644
index 000000000..2aba05faa
Binary files /dev/null and b/BankApp/app/src/main/res/mipmap-xxxhdpi/ic_logout_round.png differ
diff --git a/BankApp/app/src/main/res/values/colors.xml b/BankApp/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000..d0e2a0255
--- /dev/null
+++ b/BankApp/app/src/main/res/values/colors.xml
@@ -0,0 +1,13 @@
+
+
+ #3B49EE
+ #3B48EE
+ #A8B4C4
+ #485465
+ #A8B4C4
+ #00000000
+ #FFC7F1E1
+ #FFFFFF
+ #ff4d4d
+ #32ff7e
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/values/dimens.xml b/BankApp/app/src/main/res/values/dimens.xml
new file mode 100644
index 000000000..1bd9a6fa1
--- /dev/null
+++ b/BankApp/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 8dp
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/values/font_certs.xml b/BankApp/app/src/main/res/values/font_certs.xml
new file mode 100644
index 000000000..d2226ac01
--- /dev/null
+++ b/BankApp/app/src/main/res/values/font_certs.xml
@@ -0,0 +1,17 @@
+
+
+
+ - @array/com_google_android_gms_fonts_certs_dev
+ - @array/com_google_android_gms_fonts_certs_prod
+
+
+ -
+ MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
+
+
+
+ -
+ MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
+
+
+
diff --git a/BankApp/app/src/main/res/values/ic_launcher_background.xml b/BankApp/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 000000000..4e823a09e
--- /dev/null
+++ b/BankApp/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #3DDC84
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/values/ic_logo_background.xml b/BankApp/app/src/main/res/values/ic_logo_background.xml
new file mode 100644
index 000000000..67b6ee5de
--- /dev/null
+++ b/BankApp/app/src/main/res/values/ic_logo_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/BankApp/app/src/main/res/values/preloaded_fonts.xml b/BankApp/app/src/main/res/values/preloaded_fonts.xml
new file mode 100644
index 000000000..ed25d98b2
--- /dev/null
+++ b/BankApp/app/src/main/res/values/preloaded_fonts.xml
@@ -0,0 +1,7 @@
+
+
+
+ - @font/roboto_light
+ - @font/roboto_medium
+
+
diff --git a/BankApp/app/src/main/res/values/strings.xml b/BankApp/app/src/main/res/values/strings.xml
new file mode 100644
index 000000000..6e68b13a7
--- /dev/null
+++ b/BankApp/app/src/main/res/values/strings.xml
@@ -0,0 +1,23 @@
+
+ Bank App
+ Email
+ Senha
+ entrar
+ Erro!
+ Não foi possível identificar o erro.
+ Não foi possível encontrar o conteúdo desejado.
+ A conexão excedeu o tempo limite.
+ As credenciais fornecidas aparentam estar incorretas. Tente novamente.
+ Ocorreu um erro ao buscar a empresa específica.
+ Ocorreu um erro ao tentar listar as empresas.
+ Ok
+ Algo de errado não está certo, meu amigo
+ Clique na busca para iniciar.
+ Procurar por empresas...
+ Carregando
+ Não foi possível encontrar resultados correspondentes a sua busca.
+ As credenciais de login estão desatualizadas. Efetue o login novamente.
+ You need to sign in or sign up before continuing.
+ Usuário
+ Recentes
+
diff --git a/BankApp/app/src/main/res/values/styles.xml b/BankApp/app/src/main/res/values/styles.xml
new file mode 100644
index 000000000..3ce1cf77c
--- /dev/null
+++ b/BankApp/app/src/main/res/values/styles.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #CCFFFFFF
+
+
diff --git a/BankApp/app/src/test/java/com/example/bankapp/LoginTest.kt b/BankApp/app/src/test/java/com/example/bankapp/LoginTest.kt
new file mode 100644
index 000000000..a48f6c15a
--- /dev/null
+++ b/BankApp/app/src/test/java/com/example/bankapp/LoginTest.kt
@@ -0,0 +1,202 @@
+package com.example.bankapp
+
+import android.app.Application
+import com.example.bankapp.ui.login.LoginViewModel
+import com.example.data.networking.BankApi
+import com.example.data.repositories.BankRepository
+import com.example.domain.entities.ContaUsuario
+import com.example.domain.entities.Erro
+import com.example.domain.entities.LoginRequisicao
+import com.example.domain.entities.LoginResposta
+import com.example.domain.usecases.PerformLoginUseCase
+import io.mockk.coEvery
+import io.mockk.coVerify
+import io.mockk.every
+import io.mockk.mockk
+import junit.framework.Assert.assertEquals
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+
+class LoginTest {
+ private val loginRequisicaoMock = mockk()
+ private val applicationMock = mockk()
+ private val bankApi = mockk()
+
+ private val IBankRepositoryMock by lazy {
+ BankRepository(bankApi)
+ }
+ private val performLoginUseCaseMock = mockk()
+
+ private val viewModel by lazy {
+ LoginViewModel(performLoginUseCaseMock, applicationMock)
+ }
+
+ @Test
+ fun verificarSenhaNula() {
+
+ every { loginRequisicaoMock.senha } returns null
+ assertEquals(false, viewModel.senhaValida(loginRequisicaoMock.senha))
+ }
+
+ @Test
+ fun verificarSenhaEmBranco() {
+
+ every { loginRequisicaoMock.senha } returns ""
+ assertEquals(false, viewModel.senhaValida(loginRequisicaoMock.senha))
+ }
+
+ @Test
+ fun verificarSenhaInvalida() {
+
+ every { loginRequisicaoMock.senha } returns "teste"
+ assertEquals(false, viewModel.senhaValida(loginRequisicaoMock.senha))
+ }
+
+ @Test
+ fun verificarSenhaValida() {
+
+ every { loginRequisicaoMock.senha } returns "Teste@1"
+ assertEquals(true, viewModel.senhaValida(loginRequisicaoMock.senha))
+ }
+
+ @Test
+ fun verificarUsuarioNulo() {
+
+ every { loginRequisicaoMock.usuario } returns null
+ assertEquals(false, viewModel.usuarioValido(loginRequisicaoMock.usuario))
+ }
+
+ @Test
+ fun verificarUsuarioEmBranco() {
+
+ every { loginRequisicaoMock.usuario } returns ""
+ assertEquals(false, viewModel.usuarioValido(loginRequisicaoMock.usuario))
+ }
+
+ @Test
+ fun verificarUsuarioEmailValido() {
+
+ every { loginRequisicaoMock.usuario } returns "teste@bank.com"
+ assertEquals(true, viewModel.usuarioValido(loginRequisicaoMock.usuario))
+ }
+
+ @Test
+ fun verificarUsuarioEmailInValido() {
+ every { loginRequisicaoMock.usuario } returns "testebank.com"
+ assertEquals(false, viewModel.usuarioValido(loginRequisicaoMock.usuario))
+ }
+
+ @Test
+ fun verificarUsuarioCPFValido() {
+
+ every { loginRequisicaoMock.usuario } returns "02095039307"
+ assertEquals(true, viewModel.usuarioValido(loginRequisicaoMock.usuario))
+ }
+
+ @Test
+ fun verificarUsuarioCPFInValido() {
+
+ every { loginRequisicaoMock.usuario } returns "02095039307343434"
+ assertEquals(false, viewModel.usuarioValido(loginRequisicaoMock.usuario))
+ }
+
+ @Test
+ fun verificarResultadoSemErroLogin() {
+
+ coEvery {
+ performLoginUseCaseMock.execute(
+ PerformLoginUseCase.Parametros(
+ LoginRequisicao(
+ usuario = "lorenzo_moreira@hotmail.com.br",
+ senha = "Teste@1"
+ )
+ )
+
+ )
+ } returns LoginResposta(
+ ContaUsuario(
+ id = 1,
+ nome = "José da Silva Teste",
+ conta = "205032323",
+ agencia = "2050",
+ saldo = 1000.0
+ ), null
+ )
+
+ val resposta = runBlocking {
+ performLoginUseCaseMock.execute(
+ PerformLoginUseCase.Parametros(
+ LoginRequisicao(
+ usuario = "lorenzo_moreira@hotmail.com.br",
+ senha = "Teste@1"
+ )
+ )
+
+ )
+ }
+
+
+ coVerify {
+ performLoginUseCaseMock.execute(
+ PerformLoginUseCase.Parametros(
+ LoginRequisicao(
+ usuario = "lorenzo_moreira@hotmail.com.br",
+ senha = "Teste@1"
+ )
+ )
+
+ )
+ }
+
+ assertEquals(1, resposta?.contaUsuario?.id)
+ assertEquals(true, resposta?.error == null)
+
+ }
+
+ @Test
+ fun verificarResultadoComErroLogin() {
+
+ coEvery {
+ performLoginUseCaseMock.execute(
+ PerformLoginUseCase.Parametros(
+ LoginRequisicao(
+ usuario = "lorenzo_moreira@hotmail.com.br",
+ senha = null
+ )
+ )
+
+ )
+ } returns LoginResposta(
+ null, Erro(53, "Senha ou usuário incorretos.")
+ )
+
+ val resposta = runBlocking {
+ performLoginUseCaseMock.execute(
+ PerformLoginUseCase.Parametros(
+ LoginRequisicao(
+ usuario = "lorenzo_moreira@hotmail.com.br",
+ senha = null
+ )
+ )
+
+ )
+ }
+
+
+ coVerify {
+ performLoginUseCaseMock.execute(
+ PerformLoginUseCase.Parametros(
+ LoginRequisicao(
+ usuario = "lorenzo_moreira@hotmail.com.br",
+ senha = null
+ )
+ )
+
+ )
+ }
+
+ assertEquals(true, resposta?.contaUsuario == null)
+ assertEquals(true, resposta?.error?.codigo == 53)
+
+ }
+}
\ No newline at end of file
diff --git a/BankApp/app/src/test/java/com/example/bankapp/StatementsTest.kt b/BankApp/app/src/test/java/com/example/bankapp/StatementsTest.kt
new file mode 100644
index 000000000..47636ee03
--- /dev/null
+++ b/BankApp/app/src/test/java/com/example/bankapp/StatementsTest.kt
@@ -0,0 +1,72 @@
+package com.example.bankapp
+
+import com.example.domain.entities.Erro
+import com.example.domain.entities.ListaStatements
+import com.example.domain.entities.Statement
+import com.example.domain.repositories.IBankRepository
+import com.example.domain.usecases.ListStatementsUseCase
+import io.mockk.coEvery
+import io.mockk.mockk
+import junit.framework.Assert.assertEquals
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+
+class StatementsTest {
+
+ private val listStatementsUseCaseMock: ListStatementsUseCase = mockk()
+
+ @Test
+ fun listarStatementsSemErro() {
+ coEvery { listStatementsUseCaseMock.execute(ListStatementsUseCase.Parametros(1)) } returns
+ ListaStatements(
+ erro = null,
+ listaStatements = listOf(
+ Statement(
+ titulo = "Pagamento",
+ descricao = "Conta de luz",
+ valor = 1000.0,
+ data = "2019-08-23"
+ ),
+ Statement(
+ titulo = "Pagamento",
+ descricao = "Conta de luz",
+ valor = 1000.0,
+ data = "2019-08-23"
+ ),
+ Statement(
+ titulo = "Pagamento",
+ descricao = "Conta de luz",
+ valor = 1000.0,
+ data = "2019-08-23"
+ )
+ )
+ )
+
+ val resposta = runBlocking {
+ listStatementsUseCaseMock.execute(
+ ListStatementsUseCase.Parametros(1)
+ )
+ }
+
+ assertEquals(true, resposta.listaStatements!!.isNotEmpty())
+ assertEquals(true, resposta.erro == null)
+ }
+
+ @Test
+ fun listarStatementsComErro() {
+ coEvery { listStatementsUseCaseMock.execute(ListStatementsUseCase.Parametros(-1)) } returns
+ ListaStatements(
+ erro = Erro(codigo = 53, mensagem = "Usuário não encontrado"),
+ listaStatements = null
+ )
+
+ val resposta = runBlocking {
+ listStatementsUseCaseMock.execute(
+ ListStatementsUseCase.Parametros(-1)
+ )
+ }
+
+ assertEquals(true, resposta.erro!!.codigo == 53)
+ assertEquals(true, resposta.listaStatements == null)
+ }
+}
\ No newline at end of file
diff --git a/BankApp/build.gradle b/BankApp/build.gradle
new file mode 100644
index 000000000..778fd48c9
--- /dev/null
+++ b/BankApp/build.gradle
@@ -0,0 +1,31 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ ext.kotlin_version = '1.3.72'
+ ext.koin_version = '2.0.1'
+ ext.work_version = "2.3.2"
+ ext.room_version = "2.2.4"
+ repositories {
+ google()
+ jcenter()
+
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.0.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/BankApp/data/build.gradle b/BankApp/data/build.gradle
new file mode 100644
index 000000000..2b90f1ff0
--- /dev/null
+++ b/BankApp/data/build.gradle
@@ -0,0 +1,46 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+android {
+ compileSdkVersion 29
+ buildToolsVersion "29.0.2"
+
+
+ defaultConfig {
+ minSdkVersion 19
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles 'consumer-rules.pro'
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+}
+
+dependencies {
+ implementation project(path: ':domain')
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'androidx.core:core-ktx:1.3.2'
+ implementation "org.koin:koin-androidx-scope:$koin_version"
+ implementation 'com.squareup.okhttp3:okhttp:4.8.0'
+ api 'com.google.code.gson:gson:2.8.6'
+ implementation 'com.squareup.retrofit2:retrofit:2.6.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.8.0'
+
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
+
+ testImplementation 'junit:junit:4.13'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+}
diff --git a/BankApp/data/build/generated/source/buildConfig/debug/com/example/data/BuildConfig.java b/BankApp/data/build/generated/source/buildConfig/debug/com/example/data/BuildConfig.java
new file mode 100644
index 000000000..e9b8ba90b
--- /dev/null
+++ b/BankApp/data/build/generated/source/buildConfig/debug/com/example/data/BuildConfig.java
@@ -0,0 +1,12 @@
+/**
+ * Automatically generated file. DO NOT MODIFY
+ */
+package com.example.data;
+
+public final class BuildConfig {
+ public static final boolean DEBUG = Boolean.parseBoolean("true");
+ public static final String LIBRARY_PACKAGE_NAME = "com.example.data";
+ public static final String BUILD_TYPE = "debug";
+ public static final int VERSION_CODE = 1;
+ public static final String VERSION_NAME = "1.0";
+}
diff --git a/BankApp/data/consumer-rules.pro b/BankApp/data/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/BankApp/data/manifests/AndroidManifest.xml b/BankApp/data/manifests/AndroidManifest.xml
new file mode 100644
index 000000000..cf430e63b
--- /dev/null
+++ b/BankApp/data/manifests/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+ /
+
\ No newline at end of file
diff --git a/BankApp/data/proguard-rules.pro b/BankApp/data/proguard-rules.pro
new file mode 100644
index 000000000..f1b424510
--- /dev/null
+++ b/BankApp/data/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
diff --git a/BankApp/data/src/main/AndroidManifest.xml b/BankApp/data/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..04034f4ca
--- /dev/null
+++ b/BankApp/data/src/main/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/model/ContaUsuarioData.kt b/BankApp/data/src/main/java/com/example/data/model/ContaUsuarioData.kt
new file mode 100644
index 000000000..324d1338a
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/model/ContaUsuarioData.kt
@@ -0,0 +1,20 @@
+package com.example.data.model
+
+import com.example.domain.entities.ContaUsuario
+import com.google.gson.annotations.SerializedName
+
+data class ContaUsuarioData(
+ @SerializedName("userId")
+ val id: Int?,
+ @SerializedName("name")
+ val nome: String?,
+ @SerializedName("bankAccount")
+ val conta: String?,
+ @SerializedName("agency")
+ val agencia: String?,
+ @SerializedName("balance")
+ val saldo: Double?
+)
+
+fun ContaUsuarioData.toModel() =
+ ContaUsuario(id = id, nome = nome, conta = conta, agencia = agencia, saldo = saldo)
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/model/ErroData.kt b/BankApp/data/src/main/java/com/example/data/model/ErroData.kt
new file mode 100644
index 000000000..b94746728
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/model/ErroData.kt
@@ -0,0 +1,14 @@
+package com.example.data.model
+
+import com.example.domain.entities.Erro
+import com.google.gson.annotations.SerializedName
+
+data class ErroData(
+ @SerializedName("code")
+ val codigo: Int?,
+ @SerializedName("message")
+ val mensagem: String?
+)
+
+fun ErroData.toModel() =
+ Erro(codigo = codigo, mensagem = mensagem)
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/model/ListaStatementsData.kt b/BankApp/data/src/main/java/com/example/data/model/ListaStatementsData.kt
new file mode 100644
index 000000000..f9dac02be
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/model/ListaStatementsData.kt
@@ -0,0 +1,17 @@
+package com.example.data.model
+
+import com.example.domain.entities.ListaStatements
+import com.google.gson.annotations.SerializedName
+
+data class ListaStatementsData(
+ @SerializedName("statementList")
+ val listaStatements: List?,
+ @SerializedName("error")
+ val erro: ErroData?
+)
+
+fun ListaStatementsData.toModel() =
+ ListaStatements(
+ listaStatements = listaStatements?.map { it.toModel() },
+ erro = erro?.toModel()
+ )
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/model/LoginRequisicaoData.kt b/BankApp/data/src/main/java/com/example/data/model/LoginRequisicaoData.kt
new file mode 100644
index 000000000..5a0a38a56
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/model/LoginRequisicaoData.kt
@@ -0,0 +1,10 @@
+package com.example.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class LoginRequisicaoData(
+ @SerializedName("user")
+ val usuario: String?,
+ @SerializedName("password")
+ val senha: String
+)
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/model/LoginRespostaData.kt b/BankApp/data/src/main/java/com/example/data/model/LoginRespostaData.kt
new file mode 100644
index 000000000..49da5d63f
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/model/LoginRespostaData.kt
@@ -0,0 +1,14 @@
+package com.example.data.model
+
+import com.example.domain.entities.LoginResposta
+import com.google.gson.annotations.SerializedName
+
+data class LoginRespostaData(
+ @SerializedName("userAccount")
+ val contaUsuario: ContaUsuarioData,
+ @SerializedName("error")
+ val erro: ErroData
+)
+
+fun LoginRespostaData.toModel() =
+ LoginResposta(contaUsuario.toModel(), erro.toModel())
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/model/StatementData.kt b/BankApp/data/src/main/java/com/example/data/model/StatementData.kt
new file mode 100644
index 000000000..45fb5069e
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/model/StatementData.kt
@@ -0,0 +1,19 @@
+package com.example.data.model
+
+import com.example.domain.entities.Statement
+import com.google.gson.annotations.SerializedName
+
+data class StatementData(
+ @SerializedName("title")
+ val titulo: String?,
+ @SerializedName("desc")
+ val descricao: String?,
+ @SerializedName("date")
+ val data: String?,
+ @SerializedName("value")
+ val valor: Double?
+)
+
+fun StatementData.toModel() =
+ Statement(titulo = titulo, descricao = descricao, data = data, valor = valor)
+
diff --git a/BankApp/data/src/main/java/com/example/data/networking/BankApi.kt b/BankApp/data/src/main/java/com/example/data/networking/BankApi.kt
new file mode 100644
index 000000000..c9d792caf
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/BankApi.kt
@@ -0,0 +1,18 @@
+package com.example.data.networking
+
+import com.example.data.model.ListaStatementsData
+import com.example.data.model.LoginRequisicaoData
+import com.example.data.model.LoginRespostaData
+import retrofit2.Call
+import retrofit2.http.Body
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Path
+
+interface BankApi {
+ @POST("login")
+ fun realizarLogin(@Body loginRequisicaoData: LoginRequisicaoData): Call
+
+ @GET("statements/{id}")
+ fun listarStatementsPorUsuario(@Path("id") id: Int?): Call
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/ApiClient.kt b/BankApp/data/src/main/java/com/example/data/networking/base/ApiClient.kt
new file mode 100644
index 000000000..27c2fba35
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/ApiClient.kt
@@ -0,0 +1,47 @@
+package com.example.data.networking.base
+
+import com.example.data.util.Constants.ApiParameters.DEV_HOST
+import com.example.data.util.Constants.ApiParameters.TIMEOUT_SECONDS
+import okhttp3.Interceptor
+import okhttp3.OkHttpClient
+import okhttp3.Response
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import java.util.concurrent.TimeUnit
+
+object ApiClient {
+ private var retrofit: Retrofit? = null
+
+ private val client: Retrofit
+ get() {
+ if (retrofit == null) {
+ val httpClient = OkHttpClient.Builder()
+ httpClient.readTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
+ httpClient.callTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
+
+ httpClient.addInterceptor(object : Interceptor {
+ override fun intercept(chain: Interceptor.Chain): Response {
+
+ val request = chain.request().newBuilder().build()
+ return chain.proceed(request)
+ }
+ })
+
+ val logging = HttpLoggingInterceptor()
+ logging.level = HttpLoggingInterceptor.Level.BODY
+ httpClient.addInterceptor(logging)
+
+ retrofit = Retrofit.Builder()
+ .baseUrl(DEV_HOST)
+ .addConverterFactory(GsonConverterFactory.create(GsonUtil.gsonDefault))
+ .client(httpClient.build())
+ .build()
+ }
+ return retrofit as Retrofit
+ }
+
+ fun createService(serviceClass: Class): S {
+ return client.create(serviceClass)
+ }
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/GsonUtil.kt b/BankApp/data/src/main/java/com/example/data/networking/base/GsonUtil.kt
new file mode 100644
index 000000000..4c5a2e45c
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/GsonUtil.kt
@@ -0,0 +1,18 @@
+package com.example.data.networking.base
+
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.JsonSyntaxException
+import com.google.gson.reflect.TypeToken
+
+object GsonUtil {
+ private const val apiDateFormat = "yyyy-MM-dd'T'HH:mm:ss"
+ val gsonDefault: Gson = GsonBuilder()
+ .setDateFormat(apiDateFormat)
+ .create()
+
+ @Throws(JsonSyntaxException::class)
+ inline fun fromJson(json: String): T {
+ return gsonDefault.fromJson(json, object : TypeToken() {}.type)
+ }
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/RequestManager.kt b/BankApp/data/src/main/java/com/example/data/networking/base/RequestManager.kt
new file mode 100644
index 000000000..266cc930a
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/RequestManager.kt
@@ -0,0 +1,33 @@
+package com.example.data.networking.base
+
+import android.content.res.Resources
+import com.example.data.networking.base.exceptions.ApiException
+import com.example.data.networking.base.exceptions.RepositoryException
+import com.example.data.networking.base.exceptions.SuccessWithNullReturnException
+import retrofit2.Response
+import java.util.concurrent.TimeoutException
+
+object RequestManager {
+ @Throws(RepositoryException::class)
+ fun getResponse(response: Response): T {
+ return getNullableResponse(response) ?: throw SuccessWithNullReturnException()
+ }
+
+ @Throws(RepositoryException::class)
+ fun getNullableResponse(response: Response): T? {
+ if (response.isSuccessful) {
+ return response.body()
+ } else {
+ when (response.code()) {
+ 404 -> throw Resources.NotFoundException()
+ 504 -> throw TimeoutException()
+ }
+ val message = try {
+ "There was an error while trying to process the request."
+ } catch (e: Exception) {
+ response.message()
+ }
+ throw ApiException(message)
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/RetryInterceptor.kt b/BankApp/data/src/main/java/com/example/data/networking/base/RetryInterceptor.kt
new file mode 100644
index 000000000..0bcffdad6
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/RetryInterceptor.kt
@@ -0,0 +1,32 @@
+package com.example.data.networking.base
+
+import okhttp3.Interceptor
+import okhttp3.Request
+import okhttp3.Response
+
+class RetryInterceptor : Interceptor {
+
+ override fun intercept(chain: Interceptor.Chain): Response {
+ val request = chain.request()
+ val response = chain.proceed(request)
+ if (!responseOkay(response.code)) {
+ response.close()
+ return retryCall(request, chain, 0)
+ }
+ return response
+ }
+
+ private fun retryCall(request: Request, chain: Interceptor.Chain, retryNumber: Int): Response {
+ val newRequest = request.newBuilder().build()
+ var another = chain.proceed(newRequest)
+ if ((responseOkay(another.code)) && (retryNumber < 3)) {
+ another.close()
+ another = retryCall(newRequest, chain, retryNumber + 1)
+ }
+ return another
+ }
+}
+
+fun responseOkay(code: Int): Boolean {
+ return code >= 200 && code < 300
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/ApiException.kt b/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/ApiException.kt
new file mode 100644
index 000000000..a9b73e02b
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/ApiException.kt
@@ -0,0 +1,6 @@
+package com.example.data.networking.base.exceptions
+
+open class ApiException(
+ mensagem: String? = null,
+ causa: Throwable? = null
+) : Exception(mensagem ?: causa?.message, causa)
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/RepositoryException.kt b/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/RepositoryException.kt
new file mode 100644
index 000000000..3d7ceb488
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/RepositoryException.kt
@@ -0,0 +1,15 @@
+package com.example.data.networking.base.exceptions
+
+import com.example.data.util.LogManager
+
+open class RepositoryException(
+ tag: String,
+ mensagem: String? = null,
+ complemento: String? = null,
+ causa: Throwable? = null
+) :
+ Exception(mensagem ?: causa?.message, causa) {
+ init {
+ LogManager.logarErro(tag, mensagem, complemento, causa)
+ }
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/SuccessWithNullReturnException.kt b/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/SuccessWithNullReturnException.kt
new file mode 100644
index 000000000..9e3da420f
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/networking/base/exceptions/SuccessWithNullReturnException.kt
@@ -0,0 +1,6 @@
+package com.example.data.networking.base.exceptions
+
+class SuccessWithNullReturnException(
+ message: String? = null,
+ cause: Throwable? = null
+) : ApiException(message, cause)
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/repositories/BankRepository.kt b/BankApp/data/src/main/java/com/example/data/repositories/BankRepository.kt
new file mode 100644
index 000000000..6b32a15a7
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/repositories/BankRepository.kt
@@ -0,0 +1,58 @@
+package com.example.data.repositories
+
+import com.example.data.networking.BankApi
+import com.example.data.networking.base.RequestManager
+import com.example.data.networking.base.exceptions.ApiException
+import com.example.data.networking.base.exceptions.RepositoryException
+import com.example.data.model.LoginRequisicaoData
+import com.example.data.model.toModel
+import com.example.domain.entities.ListaStatements
+import com.example.domain.entities.LoginRequisicao
+import com.example.domain.entities.LoginResposta
+import com.example.domain.repositories.IBankRepository
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+
+class BankRepository(private val api: BankApi) : IBankRepository {
+
+ private val TAG: String = "FALHA_REPOSITORIO_EMPRESAS"
+ override suspend fun realizarLogin(loginRequisicao: LoginRequisicao): LoginResposta? {
+ return withContext(Dispatchers.IO) {
+ try {
+ val resposta = RequestManager.getResponse(
+ api.realizarLogin(
+ LoginRequisicaoData(loginRequisicao.usuario, loginRequisicao.senha!!)
+ ).execute()
+ )
+
+ resposta.toModel()
+
+ } catch (excecao: ApiException) {
+ val mensagem = "Falha ao efetuar login com os seguintes parâmetros."
+ val complemento =
+ "Parametros: ${loginRequisicao.usuario}. Exceção: ${excecao}."
+ throw RepositoryException(TAG, mensagem, complemento, excecao)
+ }
+ }
+ }
+
+ override suspend fun listarSatements(id: Int?): ListaStatements {
+ return withContext(Dispatchers.IO) {
+ try {
+ val resposta = RequestManager.getResponse(
+ api.listarStatementsPorUsuario(
+ id = id
+ ).execute()
+ )
+
+ resposta.toModel()
+
+ } catch (excecao: ApiException) {
+ val mensagem = "Falha ao resgatar statements."
+ val complemento =
+ "Parametros: id do usuario: ${id}. Exceção: ${excecao}."
+ throw RepositoryException(TAG, mensagem, complemento, excecao)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/util/Constants.kt b/BankApp/data/src/main/java/com/example/data/util/Constants.kt
new file mode 100644
index 000000000..ba82819ef
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/util/Constants.kt
@@ -0,0 +1,9 @@
+package com.example.data.util
+
+class Constants {
+ object ApiParameters {
+
+ const val DEV_HOST = "https://bank-app-test.herokuapp.com/api/"
+ const val TIMEOUT_SECONDS: Long = 300
+ }
+}
\ No newline at end of file
diff --git a/BankApp/data/src/main/java/com/example/data/util/LogManager.kt b/BankApp/data/src/main/java/com/example/data/util/LogManager.kt
new file mode 100644
index 000000000..a1d61cd48
--- /dev/null
+++ b/BankApp/data/src/main/java/com/example/data/util/LogManager.kt
@@ -0,0 +1,21 @@
+package com.example.data.util
+
+import android.util.Log
+
+class LogManager {
+ companion object {
+ fun logarErro(
+ tag: String,
+ mensagem: String? = null,
+ complemento: String? = null,
+ excecao: Throwable? = null
+ ) {
+ val mensagemErro = "${mensagem ?: excecao?.message ?: ""} ${complemento ?: ""}"
+ if (excecao != null) {
+ Log.e(tag, mensagemErro, excecao)
+ } else {
+ Log.e(tag, mensagemErro)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/domain/.gitignore b/BankApp/domain/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/BankApp/domain/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/BankApp/domain/build.gradle b/BankApp/domain/build.gradle
new file mode 100644
index 000000000..4b8089c34
--- /dev/null
+++ b/BankApp/domain/build.gradle
@@ -0,0 +1,10 @@
+apply plugin: 'java-library'
+apply plugin: 'kotlin'
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
+
+sourceCompatibility = "1.7"
+targetCompatibility = "1.7"
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/base/ExceptionTag.kt b/BankApp/domain/src/main/java/com/example/domain/base/ExceptionTag.kt
new file mode 100644
index 000000000..1d86620b3
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/base/ExceptionTag.kt
@@ -0,0 +1,7 @@
+package com.example.domain.base
+
+enum class ExceptionTag(val valor: String) {
+ NAO_IDENTIFICADO("NAO_IDENTIFICADO"),
+ REALIZAR_LOGIN("REALIZAR_LOGIN"),
+ LISTAR_STATEMENTS_POR_USUARIO("LISTAR_STATEMENTS_POR_USUARIO")
+}
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/base/IUseCase.kt b/BankApp/domain/src/main/java/com/example/domain/base/IUseCase.kt
new file mode 100644
index 000000000..88dc88de4
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/base/IUseCase.kt
@@ -0,0 +1,9 @@
+package com.example.domain.base
+
+interface IUseCase {
+ suspend fun execute(parameters: Params): T
+}
+
+interface IUseCaseNoResponse {
+ suspend fun execute(parameters: Params)
+}
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/base/UseCaseErrorManager.kt b/BankApp/domain/src/main/java/com/example/domain/base/UseCaseErrorManager.kt
new file mode 100644
index 000000000..5d1f95156
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/base/UseCaseErrorManager.kt
@@ -0,0 +1,18 @@
+package com.example.domain.base
+
+import com.example.domain.excecoes.UseCaseException
+import java.util.concurrent.TimeoutException
+
+class UseCaseErrorManager {
+ companion object {
+ @Throws(Exception::class)
+ fun tratarExcecao(
+ exceptionTag: ExceptionTag = ExceptionTag.NAO_IDENTIFICADO,
+ excecao: Exception
+ ) = when (excecao::class.java) {
+ TimeoutException::class.java ->
+ excecao
+ else -> UseCaseException(exceptionTag, excecao.message)
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/entities/ContaUsuario.kt b/BankApp/domain/src/main/java/com/example/domain/entities/ContaUsuario.kt
new file mode 100644
index 000000000..1ed7730e8
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/entities/ContaUsuario.kt
@@ -0,0 +1,10 @@
+package com.example.domain.entities
+
+data class ContaUsuario(
+ val id: Int?,
+ val nome: String?,
+ val conta: String?,
+ val agencia: String?,
+ val saldo: Double?
+
+)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/entities/Erro.kt b/BankApp/domain/src/main/java/com/example/domain/entities/Erro.kt
new file mode 100644
index 000000000..606b9fb25
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/entities/Erro.kt
@@ -0,0 +1,6 @@
+package com.example.domain.entities
+
+data class Erro(
+ val codigo: Int?,
+ val mensagem: String?
+)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/entities/ListaStatements.kt b/BankApp/domain/src/main/java/com/example/domain/entities/ListaStatements.kt
new file mode 100644
index 000000000..9acc78486
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/entities/ListaStatements.kt
@@ -0,0 +1,6 @@
+package com.example.domain.entities
+
+data class ListaStatements(
+ val listaStatements: List?,
+ val erro : Erro?
+)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/entities/LoginRequisicao.kt b/BankApp/domain/src/main/java/com/example/domain/entities/LoginRequisicao.kt
new file mode 100644
index 000000000..1721f2f86
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/entities/LoginRequisicao.kt
@@ -0,0 +1,6 @@
+package com.example.domain.entities
+
+data class LoginRequisicao(
+ val usuario: String?,
+ val senha: String?
+)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/entities/LoginResposta.kt b/BankApp/domain/src/main/java/com/example/domain/entities/LoginResposta.kt
new file mode 100644
index 000000000..d75f0ff9f
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/entities/LoginResposta.kt
@@ -0,0 +1,6 @@
+package com.example.domain.entities
+
+data class LoginResposta(
+ val contaUsuario: ContaUsuario?,
+ val error: Erro?
+)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/entities/Statement.kt b/BankApp/domain/src/main/java/com/example/domain/entities/Statement.kt
new file mode 100644
index 000000000..ff4f3b7b5
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/entities/Statement.kt
@@ -0,0 +1,8 @@
+package com.example.domain.entities
+
+data class Statement(
+ val titulo: String?,
+ val descricao: String?,
+ val data: String?,
+ val valor: Double?
+)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/excecoes/UseCaseException.kt b/BankApp/domain/src/main/java/com/example/domain/excecoes/UseCaseException.kt
new file mode 100644
index 000000000..eccb378c3
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/excecoes/UseCaseException.kt
@@ -0,0 +1,9 @@
+package com.example.domain.excecoes
+
+import com.example.domain.base.ExceptionTag
+
+open class UseCaseException(
+ val exceptionTag: ExceptionTag = ExceptionTag.NAO_IDENTIFICADO,
+ val mensagem: String? = null,
+ causa: Throwable? = null
+) : Exception(mensagem ?: causa?.message, causa)
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/repositories/IBankRepository.kt b/BankApp/domain/src/main/java/com/example/domain/repositories/IBankRepository.kt
new file mode 100644
index 000000000..98422f742
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/repositories/IBankRepository.kt
@@ -0,0 +1,10 @@
+package com.example.domain.repositories
+
+import com.example.domain.entities.ListaStatements
+import com.example.domain.entities.LoginRequisicao
+import com.example.domain.entities.LoginResposta
+
+interface IBankRepository {
+ suspend fun realizarLogin(loginRequisicao: LoginRequisicao): LoginResposta?
+ suspend fun listarSatements(id: Int?): ListaStatements
+}
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/usecases/ListStatementsUseCase.kt b/BankApp/domain/src/main/java/com/example/domain/usecases/ListStatementsUseCase.kt
new file mode 100644
index 000000000..21b5ce11b
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/usecases/ListStatementsUseCase.kt
@@ -0,0 +1,24 @@
+package com.example.domain.usecases
+
+import com.example.domain.base.ExceptionTag
+import com.example.domain.base.IUseCase
+import com.example.domain.base.UseCaseErrorManager
+import com.example.domain.entities.ListaStatements
+import com.example.domain.repositories.IBankRepository
+
+class ListStatementsUseCase(private val repository: IBankRepository) :
+ IUseCase {
+ data class Parametros(val id: Int)
+
+ override suspend fun execute(parameters: Parametros): ListaStatements {
+ try {
+ val resposta = repository.listarSatements(parameters.id)
+ return resposta
+ } catch (excecao: Exception) {
+ throw UseCaseErrorManager.tratarExcecao(
+ ExceptionTag.LISTAR_STATEMENTS_POR_USUARIO,
+ excecao
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/domain/src/main/java/com/example/domain/usecases/PerformLoginUseCase.kt b/BankApp/domain/src/main/java/com/example/domain/usecases/PerformLoginUseCase.kt
new file mode 100644
index 000000000..5ea79acb7
--- /dev/null
+++ b/BankApp/domain/src/main/java/com/example/domain/usecases/PerformLoginUseCase.kt
@@ -0,0 +1,25 @@
+package com.example.domain.usecases
+
+import com.example.domain.base.ExceptionTag
+import com.example.domain.base.IUseCase
+import com.example.domain.base.UseCaseErrorManager
+import com.example.domain.entities.LoginRequisicao
+import com.example.domain.entities.LoginResposta
+import com.example.domain.repositories.IBankRepository
+
+class PerformLoginUseCase(private val repository: IBankRepository) :
+ IUseCase {
+ data class Parametros(val loginRequisicao: LoginRequisicao)
+
+ override suspend fun execute(parameters: Parametros): LoginResposta? {
+ try {
+ val resposta = repository.realizarLogin(parameters.loginRequisicao)
+ return resposta
+ } catch (excecao: Exception) {
+ throw UseCaseErrorManager.tratarExcecao(
+ ExceptionTag.REALIZAR_LOGIN,
+ excecao
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/BankApp/gradle.properties b/BankApp/gradle.properties
new file mode 100644
index 000000000..23339e0df
--- /dev/null
+++ b/BankApp/gradle.properties
@@ -0,0 +1,21 @@
+# 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=-Xmx1536m
+# 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
diff --git a/BankApp/gradle/wrapper/gradle-wrapper.properties b/BankApp/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..e5be49744
--- /dev/null
+++ b/BankApp/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,4 @@
+#Wed Jul 15 14:58:52 BOT 2020
+package=br.com.hermespardini.coletadomiciliar.Activitys;
+import=a
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/BankApp/local.properties b/BankApp/local.properties
new file mode 100644
index 000000000..89683ef51
--- /dev/null
+++ b/BankApp/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=C\:\\Users\\loren\\AppData\\Local\\Android\\Sdk
diff --git a/BankApp/settings.gradle b/BankApp/settings.gradle
new file mode 100644
index 000000000..482cd5701
--- /dev/null
+++ b/BankApp/settings.gradle
@@ -0,0 +1,3 @@
+include ':domain'
+include ':app', ':data'
+rootProject.name='Bank App'
diff --git a/README2.md b/README2.md
new file mode 100644
index 000000000..61a92c6a7
--- /dev/null
+++ b/README2.md
@@ -0,0 +1,20 @@
+# Bank App
+
+Um projeto montado utilizando Android Nativo e, especificamente a linguagem Kotlin, para agregar os últimos gastos de uma determinada conta bancária de forma simples e intuitiva.
+
+[](https://semver.org)
+
+## Instruções
+Para rodar o aplicativo, é necessário ter o Android Studio e uma SDK Android; a versão de SDK mínima para rodar este app é a 19, e a máxima é a 29. Ap
+
+ - Para rodar o aplicativo, é necessário ter o Android Studio e uma SDK Android; a versão de SDK mínima para rodar este app é a 19, e a máxima é a 29.
+ - Após ter os requisitos mínimos e rodar pela primeira vez, será promptada uma tela de login, onde será necessário ter um usuário de acesso e uma senha; Como os conteúdos de API estão mockados, não há problema algum em inserir um e-mail ou CPF qualquer, desde que ambos sejam válidos no mundo real. A senha deve possuir pelo menos uma letra maiúscula para ser aceita.
+ - Entrando na página principal com os últimos gastos, será possível fazer scroll dos itens e, se for desejável sair, há um botão de logout no canto superior direito, que irá redirecionar o usuário de volta para a tela de login.
+## Pacotes
+ - [Koin](https://insert-koin.io/): Pacote utilizado para injeção de dependências, utilizado principalmente pela facilidade de integração com ViewModels;
+ - [Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html) : Pacote que visa deixar requisições assíncronas em Kotlin mais leves e com um nível de concorrência mais sofisticado;
+ - [JUnit](https://junit.org/junit5/): Framework de testes unitários que é a base de testagem de aplicativos desenvolvidos em Android Nativo;
+ - [MockK](https://mockk.io/): Ferramenta complementar de testes unitários para mockagem de dados e chamadas assíncronas, utilizadas neste projeto por sua integração nativa com Coroutines;
+ - [OkHttp](https://square.github.io/okhttp/): Utilizado para facilitar o controle de chamadas HTTP e mockagem de servidores dentro do aplicativo;
+ - [Retrofit](https://square.github.io/retrofit/): Cliente de chamadas HTTP, notável pela facilidade em sua montagem e desserialização de objetos;
+ - [Gson](https://github.com/google/gson): Ferramenta que, através de anotações e reflections dentro do Android, permite serializar e desserializar entre objetos e arquivos JSON.