From 40aa0d081cf47dd4e6fe5d101c6ad65499defafb Mon Sep 17 00:00:00 2001 From: Danilo Santos Nascimento Date: Thu, 11 Jun 2020 22:23:07 -0300 Subject: [PATCH] 11/06/2020 TesConcluido - Danilo Santos Nascimento - GFT para Santander --- Bank/.gitignore | 14 ++ Bank/.idea/codeStyles/Project.xml | 122 +++++++++++++ Bank/.idea/codeStyles/codeStyleConfig.xml | 5 + Bank/.idea/gradle.xml | 20 ++ Bank/.idea/misc.xml | 9 + Bank/.idea/runConfigurations.xml | 12 ++ Bank/README.md | 10 + Bank/app/.gitignore | 1 + Bank/app/build.gradle | 61 +++++++ Bank/app/proguard-rules.pro | 21 +++ .../bank/ExampleInstrumentedTest.kt | 24 +++ .../bank/VerificaPrincipais.kt | 96 ++++++++++ Bank/app/src/main/AndroidManifest.xml | 25 +++ .../appdesafioSantander/bank/MainActivity.kt | 12 ++ .../appdesafioSantander/bank/model/Login.kt | 6 + .../bank/model/LoginViewModel.kt | 53 ++++++ .../bank/model/MainViewModel.kt | 5 + .../bank/model/Statement.kt | 11 ++ .../bank/model/StatementsViewModel.kt | 31 ++++ .../bank/model/UserAccount.kt | 11 ++ .../bank/repository/Repository.kt | 71 ++++++++ .../bank/services/ApiData.kt | 29 +++ .../bank/services/ApiService.kt | 9 + .../bank/ui/login/InflaterFragment.kt | 24 +++ .../bank/ui/login/LoginFragment.kt | 62 +++++++ .../bank/ui/login/LoginListener.kt | 11 ++ .../bank/ui/login/LoginValidate.kt | 79 ++++++++ .../ui/statements/AdapterItemsContract.kt | 5 + .../bank/ui/statements/BindingAdapters.kt | 20 ++ .../bank/ui/statements/StatementsAdapter.kt | 41 +++++ .../bank/ui/statements/StatementsFragment.kt | 70 +++++++ .../bank/utils/ViewUtils.kt | 36 ++++ .../bank/utils/VolleySingleton.kt | 19 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++++ Bank/app/src/main/res/drawable/logo.png | Bin 0 -> 4662 bytes Bank/app/src/main/res/drawable/logout.png | Bin 0 -> 519 bytes .../main/res/drawable/rounded_corners_btn.xml | 9 + .../src/main/res/drawable/rounded_input.xml | 11 ++ .../main/res/drawable/rounded_input_error.xml | 11 ++ .../app/src/main/res/layout/activity_main.xml | 22 +++ Bank/app/src/main/res/layout/login.xml | 79 ++++++++ .../src/main/res/layout/statement_item.xml | 75 ++++++++ .../main/res/layout/statements_fragment.xml | 154 ++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes .../app/src/main/res/navigation/nav_graph.xml | 33 ++++ Bank/app/src/main/res/values/colors.xml | 9 + Bank/app/src/main/res/values/strings.xml | 3 + Bank/app/src/main/res/values/styles.xml | 20 ++ .../bank/ExampleUnitTest.kt | 17 ++ Bank/build.gradle | 29 +++ Bank/gradle.properties | 21 +++ Bank/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes Bank/gradle/wrapper/gradle-wrapper.properties | 6 + Bank/gradlew | 172 ++++++++++++++++++ Bank/gradlew.bat | 84 +++++++++ Bank/settings.gradle | 2 + 68 files changed, 1992 insertions(+) create mode 100644 Bank/.gitignore create mode 100644 Bank/.idea/codeStyles/Project.xml create mode 100644 Bank/.idea/codeStyles/codeStyleConfig.xml create mode 100644 Bank/.idea/gradle.xml create mode 100644 Bank/.idea/misc.xml create mode 100644 Bank/.idea/runConfigurations.xml create mode 100644 Bank/README.md create mode 100644 Bank/app/.gitignore create mode 100644 Bank/app/build.gradle create mode 100644 Bank/app/proguard-rules.pro create mode 100644 Bank/app/src/androidTest/java/com/appdesafioSantander/bank/ExampleInstrumentedTest.kt create mode 100644 Bank/app/src/androidTest/java/com/appdesafioSantander/bank/VerificaPrincipais.kt create mode 100644 Bank/app/src/main/AndroidManifest.xml create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/MainActivity.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/model/Login.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/model/LoginViewModel.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/model/MainViewModel.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/model/Statement.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/model/StatementsViewModel.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/model/UserAccount.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/repository/Repository.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiData.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiService.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/InflaterFragment.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/LoginFragment.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/LoginListener.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/LoginValidate.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/statements/AdapterItemsContract.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/statements/BindingAdapters.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/statements/StatementsAdapter.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/ui/statements/StatementsFragment.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/utils/ViewUtils.kt create mode 100644 Bank/app/src/main/java/com/appdesafioSantander/bank/utils/VolleySingleton.kt create mode 100644 Bank/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 Bank/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 Bank/app/src/main/res/drawable/logo.png create mode 100644 Bank/app/src/main/res/drawable/logout.png create mode 100644 Bank/app/src/main/res/drawable/rounded_corners_btn.xml create mode 100644 Bank/app/src/main/res/drawable/rounded_input.xml create mode 100644 Bank/app/src/main/res/drawable/rounded_input_error.xml create mode 100644 Bank/app/src/main/res/layout/activity_main.xml create mode 100644 Bank/app/src/main/res/layout/login.xml create mode 100644 Bank/app/src/main/res/layout/statement_item.xml create mode 100644 Bank/app/src/main/res/layout/statements_fragment.xml create mode 100644 Bank/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 Bank/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 Bank/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 Bank/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 Bank/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 Bank/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 Bank/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 Bank/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 Bank/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 Bank/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 Bank/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 Bank/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 Bank/app/src/main/res/navigation/nav_graph.xml create mode 100644 Bank/app/src/main/res/values/colors.xml create mode 100644 Bank/app/src/main/res/values/strings.xml create mode 100644 Bank/app/src/main/res/values/styles.xml create mode 100644 Bank/app/src/test/java/com/appdesafioSantander/bank/ExampleUnitTest.kt create mode 100644 Bank/build.gradle create mode 100644 Bank/gradle.properties create mode 100644 Bank/gradle/wrapper/gradle-wrapper.jar create mode 100644 Bank/gradle/wrapper/gradle-wrapper.properties create mode 100644 Bank/gradlew create mode 100644 Bank/gradlew.bat create mode 100644 Bank/settings.gradle diff --git a/Bank/.gitignore b/Bank/.gitignore new file mode 100644 index 000000000..603b14077 --- /dev/null +++ b/Bank/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/Bank/.idea/codeStyles/Project.xml b/Bank/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..88ea3aa1e --- /dev/null +++ b/Bank/.idea/codeStyles/Project.xml @@ -0,0 +1,122 @@ + + + + + + + + + +
+ + + + 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/Bank/.idea/codeStyles/codeStyleConfig.xml b/Bank/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..79ee123c2 --- /dev/null +++ b/Bank/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/Bank/.idea/gradle.xml b/Bank/.idea/gradle.xml new file mode 100644 index 000000000..5cd135a06 --- /dev/null +++ b/Bank/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/Bank/.idea/misc.xml b/Bank/.idea/misc.xml new file mode 100644 index 000000000..dfd2c7996 --- /dev/null +++ b/Bank/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/Bank/.idea/runConfigurations.xml b/Bank/.idea/runConfigurations.xml new file mode 100644 index 000000000..7f68460d8 --- /dev/null +++ b/Bank/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/Bank/README.md b/Bank/README.md new file mode 100644 index 000000000..6b21aa8a3 --- /dev/null +++ b/Bank/README.md @@ -0,0 +1,10 @@ +Bom nesse projeto procurei minimizar o desenvolvimento , utilizando a arquitertura Clean Code, al�m AAC, e outros pedidos,em rela��o a teste unitarios ,coloquei um healthcheck e alguns teste de valida��o de email e cpf antes do login para simplificar a entrega, foi utilizado + +- Testes unit�rios - healthcheck e outros +- Tratamentos de erros - Padr�o +- Padr�o de Projeto e boas pr�ticas de Orienta��o a Objetos. - Clean Code +- Google AAC (Android Architecture Components) - Livedata, ViewModel + +Nos teste unitarios utilizei o JUnit, por que � uma ferramenta que j� vem com android studio , para minimizar tempo + + diff --git a/Bank/app/.gitignore b/Bank/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Bank/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Bank/app/build.gradle b/Bank/app/build.gradle new file mode 100644 index 000000000..276714ad1 --- /dev/null +++ b/Bank/app/build.gradle @@ -0,0 +1,61 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + + dataBinding { + enabled = true + } + + + defaultConfig { + applicationId "com.appdesafioSantander.bank" + 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 fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.core:core-ktx:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.13' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2' + implementation 'androidx.navigation:navigation-ui-ktx:2.2.2' + kapt "com.android.databinding:compiler:3.6.2" + implementation "androidx.recyclerview:recyclerview:1.1.0" + implementation "androidx.recyclerview:recyclerview-selection:1.1.0-rc01" + implementation 'androidx.core:core-ktx:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.2.1' + implementation 'androidx.navigation:navigation-ui-ktx:2.2.1' + implementation 'com.google.android.material:material:1.1.0' + implementation 'com.android.volley:volley:1.1.1' + implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.squareup.retrofit2:retrofit:2.5.0' + implementation 'com.squareup.retrofit2:converter-gson:2.5.0' + implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' + +} diff --git a/Bank/app/proguard-rules.pro b/Bank/app/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/Bank/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/Bank/app/src/androidTest/java/com/appdesafioSantander/bank/ExampleInstrumentedTest.kt b/Bank/app/src/androidTest/java/com/appdesafioSantander/bank/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..4aa701ee7 --- /dev/null +++ b/Bank/app/src/androidTest/java/com/appdesafioSantander/bank/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.appdesafioSantander.bank + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.appdesafioSantander.bank", appContext.packageName) + } +} diff --git a/Bank/app/src/androidTest/java/com/appdesafioSantander/bank/VerificaPrincipais.kt b/Bank/app/src/androidTest/java/com/appdesafioSantander/bank/VerificaPrincipais.kt new file mode 100644 index 000000000..daab59884 --- /dev/null +++ b/Bank/app/src/androidTest/java/com/appdesafioSantander/bank/VerificaPrincipais.kt @@ -0,0 +1,96 @@ +package com.appdesafioSantander.bank + +import org.junit.Assert +import org.junit.Test +import java.io.IOException +import java.net.HttpURLConnection +import java.net.URL +import com.appdesafioSantander.bank.services.ApiService.Companion.url +import org.junit.Assert.* +import com.appdesafioSantander.bank.ui.login.LoginValidate + +class VerificaPrincipais { + private val loginValidate = LoginValidate() + @Test + fun getStatusApi(urlPath:String) { + try + { val urlCheck = URL(url) + val conn = urlCheck.openConnection() as HttpURLConnection + conn.setRequestMethod("GET") + conn.connect() + var result:Boolean + if (conn.getResponseCode() === 200) { + result = true + Assert.assertTrue(result) + }else{ + result = false + Assert.assertFalse(result) + } + } + catch (e: IOException) { + throw RuntimeException(e) + } + } + + @Test + fun IsCPF() { + val cpf = "99774374088" + assertTrue(loginValidate.isCPF(cpf)) + } + + @Test + fun IsNotCPF() { + val cpf = "85565478951" + assertFalse(loginValidate.isCPF(cpf)) + } + + @Test + fun IsEmail() { + val email = "email@gmail.com" + assertTrue( loginValidate.validEmail(email)) + } + @Test + fun IsNotEmail() { + val email = "emailgmail.com" + + assertFalse(loginValidate.validEmail(email)) + } + + @Test + fun IsNotUpperCase() { + val user = "user" + assertFalse(loginValidate.validUpperCase(user)) + } + + @Test + fun validUpperCase_IsUpperCase() { + val user = "User" + assertTrue(loginValidate.validUpperCase(user)) + } + + @Test + fun IsNotSpecialCharacter() { + val user = "user" + assertFalse(loginValidate.validSpecialCharacter(user)) + } + + @Test + fun IsSpecialCharacter() { + val user = "user_@" + assertTrue(loginValidate.validSpecialCharacter(user)) + } + + @Test + fun IsAlphaNumeric() { + val user = "user545!@" + assertFalse(loginValidate.validAlphaNumeric(user)) + } + + @Test + fun IsNotAlphaNumeric() { + val user = "user" + assertTrue(loginValidate.validAlphaNumeric(user)) + } + + +} \ No newline at end of file diff --git a/Bank/app/src/main/AndroidManifest.xml b/Bank/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..b284f13fe --- /dev/null +++ b/Bank/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/MainActivity.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/MainActivity.kt new file mode 100644 index 000000000..aa3f78de6 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/MainActivity.kt @@ -0,0 +1,12 @@ +package com.appdesafioSantander.bank + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class MainActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/model/Login.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/Login.kt new file mode 100644 index 000000000..4758e9283 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/Login.kt @@ -0,0 +1,6 @@ +package com.appdesafioSantander.bank.model + +data class Login( + val userAccount: UserAccount, + val error: Map +) \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/model/LoginViewModel.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/LoginViewModel.kt new file mode 100644 index 000000000..c002e5c24 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/LoginViewModel.kt @@ -0,0 +1,53 @@ +package com.appdesafioSantander.bank.model + +import android.view.View +import android.widget.EditText +import androidx.lifecycle.ViewModel +import com.appdesafioSantander.bank.repository.Repository +import com.appdesafioSantander.bank.ui.login.LoginListener +import com.appdesafioSantander.bank.ui.login.LoginValidate +import com.appdesafioSantander.bank.R + + +class LoginViewModel : ViewModel() { + var repository: Repository = Repository() + var loginListener: LoginListener? = null + + private val loginValidate = LoginValidate() + + fun onLoginButtonClick(view: View) { + val userInput = view.findViewById(R.id.user_input) + val pswInput = view.findViewById(R.id.password_input) + + loginListener?.onStarted(view) + + if (userInput.text.isEmpty()) { + loginListener?.onFailure(view, "Preencha o nome de usuario") + return + } else if (!loginValidate.validEmail(userInput.text.toString()) + && !loginValidate.isCPF(userInput.text.toString())) { + loginListener?.onFailure(view, "Email ou CPF invalido") + return + } + else if (pswInput.text.isEmpty()) { + loginListener?.onFailure(view, "Preencha a senha") + return + } + else if(!loginValidate.validUpperCase(pswInput.text.toString())){ + loginListener?.onFailure(view, "A senha tem que ter menos uma letra maiúscula") + return + } + else if(!loginValidate.validSpecialCharacter(pswInput.text.toString())){ + loginListener?.onFailure(view, "A senha tem que ter menos um caracter especial") + return + } + else if(!loginValidate.validAlphaNumeric(pswInput.text.toString())){ + loginListener?.onFailure(view, "A senha tem que ter lrtras e números") + return + } + val loginResponse = repository.login( + mapOf("user" to userInput.text.toString(), "password" to pswInput.text.toString()) + ) + loginListener?.onSuccess(view, loginResponse) + } +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/model/MainViewModel.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/MainViewModel.kt new file mode 100644 index 000000000..849eadd9f --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/MainViewModel.kt @@ -0,0 +1,5 @@ +package com.appdesafioSantander.bank.model + +import androidx.lifecycle.ViewModel + +class MainViewModel : ViewModel() \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/model/Statement.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/Statement.kt new file mode 100644 index 000000000..be4531551 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/Statement.kt @@ -0,0 +1,11 @@ +package com.appdesafioSantander.bank.model + +import java.io.Serializable + +data class Statement( + val title: String, + val desc: String, + val date: String, + val valueFormatted: String, + val value: Double +) : Serializable \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/model/StatementsViewModel.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/StatementsViewModel.kt new file mode 100644 index 000000000..f7e47eb36 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/StatementsViewModel.kt @@ -0,0 +1,31 @@ +package com.appdesafioSantander.bank.model + +import androidx.databinding.ObservableArrayList +import androidx.databinding.ObservableBoolean +import androidx.databinding.ObservableField +import androidx.lifecycle.* +import com.appdesafioSantander.bank.repository.Repository + +class StatementsViewModel : ViewModel() { + private var repository: Repository = Repository() + + val statements = ObservableArrayList() + val loadingVisibility = ObservableBoolean(false) + val message = ObservableField() + + fun load() { + loadingVisibility.set(true) + message.set("") + loadingVisibility.set(true) + message.set("") + repository.listAll({ items -> + statements.clear() + statements.addAll(items) + loadingVisibility.set(false) + }, { + message.set("item added") + loadingVisibility.set(false) + }) + } + +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/model/UserAccount.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/UserAccount.kt new file mode 100644 index 000000000..96d7d2d87 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/model/UserAccount.kt @@ -0,0 +1,11 @@ +package com.appdesafioSantander.bank.model + +import java.io.Serializable + +data class UserAccount( + val userId : Int, + val name : String, + val bankAccount : String, + val agency : String, + val balance : Double +) : Serializable \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/repository/Repository.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/repository/Repository.kt new file mode 100644 index 000000000..1c145fed6 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/repository/Repository.kt @@ -0,0 +1,71 @@ +package com.appdesafioSantander.bank.repository + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.appdesafioSantander.services.ApiData +import com.appdesafioSantander.bank.model.Login +import com.appdesafioSantander.bank.model.Statement +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.text.NumberFormat +import java.util.* + +class Repository { + private val responseStatements = MutableLiveData>() + private val loginResponse = MutableLiveData() + + + private fun dateFormat(date: String): String { + val s = date.split("-") + return "${s[2]}/${s[1]}/${s[0]}" + } + + fun listAll(success: (List) -> Unit, failure: () -> Unit) { + val list: MutableList = mutableListOf() + ApiData().getStatements().enqueue(object : Callback> { + override fun onFailure(call: Call>, t: Throwable) { + failure() + } + @RequiresApi(Build.VERSION_CODES.O) + override fun onResponse( + call: Call>, + response: Response> + ) { + val listAny = response.body()?.get("statementList") as List> + listAny.forEach { + val valFormatted = NumberFormat.getCurrencyInstance(Locale("pt", "BR")) + .format(it["value"].toString().toDouble()) + val date = dateFormat(it["date"].toString()) + list.add( + Statement( + it["title"].toString(), + it["desc"].toString(), + date, + "$valFormatted", + it["value"].toString().toDouble() + ) + ) + } + success(list) + } + }) + } + + + fun login(loginData: Map): LiveData { + ApiData().login(loginData).enqueue(object : Callback { + + override fun onFailure(call: Call, t: Throwable) {} + override fun onResponse(call: Call, response: Response) { + if (!response.isSuccessful) { + return + } + loginResponse.value = response.body()!! + } + }) + return loginResponse + } +} diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiData.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiData.kt new file mode 100644 index 000000000..3c66b0a1d --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiData.kt @@ -0,0 +1,29 @@ +package com.appdesafioSantander.services + +import com.appdesafioSantander.bank.model.Login +import com.appdesafioSantander.bank.services.ApiService.Companion.url +import retrofit2.Call +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.* + +interface ApiData { + + @GET("statements/0") + fun getStatements(): Call> + + @Headers("Content-Type: application/json") + @POST("login") + fun login(@Body loginData: Map): Call + + companion object { + operator fun invoke(): ApiData { + return Retrofit.Builder() + .baseUrl(url) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(ApiData::class.java) + } + } +} + diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiService.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiService.kt new file mode 100644 index 000000000..aa5446a07 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/services/ApiService.kt @@ -0,0 +1,9 @@ +package com.appdesafioSantander.bank.services + + +abstract class ApiService{ + companion object { + const val url = "https://bank-app-test.herokuapp.com/api/" + } +} + diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/InflaterFragment.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/InflaterFragment.kt new file mode 100644 index 000000000..ae335bcd9 --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/InflaterFragment.kt @@ -0,0 +1,24 @@ +package com.appdesafioSantander.bank.ui.login + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.appdesafioSantander.bank.R +import com.appdesafioSantander.bank.model.MainViewModel + +class InflaterFragment : Fragment() { + + companion object { + fun newInstance() = InflaterFragment() + } + + private lateinit var viewModel: MainViewModel + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View { + return inflater.inflate(R.layout.activity_main, container, false) + } + +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/LoginFragment.kt b/Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/LoginFragment.kt new file mode 100644 index 000000000..ff0c5bf6c --- /dev/null +++ b/Bank/app/src/main/java/com/appdesafioSantander/bank/ui/login/LoginFragment.kt @@ -0,0 +1,62 @@ +package com.appdesafioSantander.bank.ui.login + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.findNavController +import com.appdesafioSantander.bank.R +import com.appdesafioSantander.bank.model.Login +import com.appdesafioSantander.bank.model.LoginViewModel +import com.appdesafioSantander.bank.utils.ViewUtils + +class LoginFragment : Fragment(), LoginListener { + + lateinit var loginViewModel: LoginViewModel + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) + loginViewModel.loginListener = this + return inflater.inflate(R.layout.login, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val loginBtn = view.findViewById