diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..aa724b770 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.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 +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 000000000..63f113573 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +AppBank Santander - Accenture Talent Acquisition \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 000000000..61a9130cd --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 000000000..9d38be257 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 000000000..a5f05cd8c --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..19aa6a555 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml new file mode 100644 index 000000000..8ec256a5d --- /dev/null +++ b/.idea/render.experimental.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index bd73feb5f..a426c4274 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ +# Instalação + +Passos para instalação do app: +1 - Clonar do repositório https://github.com/hthenrique/TesteAndroidv2---Accenture-Talent-Acquisition através do git ou no próprio Android Studio. +2 - Se não clonou o repositório pelo Android Studio, abrir o Android Studio e procurar pela pasta do projeto no diretório salvo e abrir o prjeto. +3 - Após o projeto estar aberto no Android Studio executar o Aplicativo em um dispositivo fisíco ou emulador. Para isso vá da Aba "Run" e depois clicar na opção "Run 'App'" + + # Show me the code Esse repositório contem todo o material necessário para realizar o teste: diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 000000000..f28e81780 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,47 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.example.appbanksantander_accenturetalentacquisition" + minSdkVersion 19 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.6.0' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/appbanksantander_accenturetalentacquisition/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/appbanksantander_accenturetalentacquisition/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..29ff19cc6 --- /dev/null +++ b/app/src/androidTest/java/com/example/appbanksantander_accenturetalentacquisition/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.appbanksantander_accenturetalentacquisition + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.appbanksantander_accenturetalentacquisition", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..1690ca35b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/ApiClient.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/ApiClient.kt new file mode 100644 index 000000000..c82b37c4b --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/ApiClient.kt @@ -0,0 +1,24 @@ +package com.example.appbanksantander_accenturetalentacquisition.API + +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class ApiClient { + + private var BASE_URL = "https://bank-app-test.herokuapp.com/" + private var retrofit: Retrofit? = null + + val gson: Gson = GsonBuilder().create() + + fun getClient(): Retrofit{ + if (retrofit == null){ + retrofit = Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build() + } + return this.retrofit!! + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/RequestApi.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/RequestApi.kt new file mode 100644 index 000000000..0ff6fa5e6 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/RequestApi.kt @@ -0,0 +1,50 @@ +package com.example.appbanksantander_accenturetalentacquisition.API + +import android.content.Context +import android.widget.Toast +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementModel +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementResponse +import com.example.appbanksantander_accenturetalentacquisition.Model.UserAccountModel +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class RequestApi(private val context: Context?): ServiceApi { + val apiClient: ApiClient = ApiClient() + val retrofitEndPoint = apiClient.getClient().create(RetrofitEndPoint::class.java) + val responseOK: Int = 200 + + override fun getAccountInfo(callback: ServiceApi.ServiceApiCallbackUser) { + val callLogin = retrofitEndPoint.loginUser() + callLogin.enqueue(object: Callback { + override fun onResponse(call: Call, response: Response) { + if (response.code() == responseOK){ + val userAccountModel: UserAccountModel = response.body()!! + callback.loaded(userAccountModel) + }else{ + Toast.makeText(context, "Error Account: " + response.code().toString(), Toast.LENGTH_SHORT).show() + } + } + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText(context, "Error Account: " + t.toString(), Toast.LENGTH_SHORT).show() + } + }) + } + + override fun getStatement(callback: ServiceApi.ServiceApiCallbackStatement) { + val callStatement = retrofitEndPoint.getStatements() + callStatement.enqueue(object: Callback{ + override fun onResponse(call: Call, response: Response) { + if (response.code() == responseOK){ + val statementModel: List = response.body()!!.statementListResult + callback.loaded(statementModel) + }else{ + Toast.makeText(context, "Error Statement: " + response.code().toString(), Toast.LENGTH_SHORT).show() + } + } + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText(context, "Error Statement: " + t.toString(), Toast.LENGTH_LONG).show() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/RetrofitEndPoint.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/RetrofitEndPoint.kt new file mode 100644 index 000000000..0dc39a7c7 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/RetrofitEndPoint.kt @@ -0,0 +1,18 @@ +package com.example.appbanksantander_accenturetalentacquisition.API + + +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementResponse +import com.example.appbanksantander_accenturetalentacquisition.Model.UserAccountModel +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +interface RetrofitEndPoint { + + @POST ("api/login") + fun loginUser(): Call + + @GET("api/statements/1") + fun getStatements(): Call +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/ServiceApi.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/ServiceApi.kt new file mode 100644 index 000000000..670cc386d --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/API/ServiceApi.kt @@ -0,0 +1,16 @@ +package com.example.appbanksantander_accenturetalentacquisition.API + +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementModel +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementResponse +import com.example.appbanksantander_accenturetalentacquisition.Model.UserAccountModel + +interface ServiceApi { + interface ServiceApiCallbackUser{ + fun loaded(userAccount: UserAccountModel) + } + interface ServiceApiCallbackStatement{ + fun loaded(statement: List) + } + fun getAccountInfo(callback: ServiceApiCallbackUser) + fun getStatement(callback: ServiceApiCallbackStatement) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/StatementModel.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/StatementModel.kt new file mode 100644 index 000000000..327f360e2 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/StatementModel.kt @@ -0,0 +1,21 @@ +package com.example.appbanksantander_accenturetalentacquisition.Model + +import com.google.gson.annotations.SerializedName + +class StatementModel { + + @SerializedName("title") + var title: String = "" + + @SerializedName("desc") + var description: String = "" + + @SerializedName("date") + var date: String = "" + + @SerializedName("value") + var value: Float = 0.0F + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/StatementResponse.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/StatementResponse.kt new file mode 100644 index 000000000..4ae2be212 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/StatementResponse.kt @@ -0,0 +1,11 @@ +package com.example.appbanksantander_accenturetalentacquisition.Model + +import com.google.gson.annotations.SerializedName +import retrofit2.http.Field + +class StatementResponse { + + @field:SerializedName("statementList") + lateinit var statementListResult: List + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/UserAccountModel.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/UserAccountModel.kt new file mode 100644 index 000000000..1a4370676 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Model/UserAccountModel.kt @@ -0,0 +1,22 @@ +package com.example.appbanksantander_accenturetalentacquisition.Model + +import com.google.gson.annotations.SerializedName + +class UserAccountModel { + + @SerializedName("userId") + var userId: Int = 0 + + @SerializedName("name") + var name: String = "" + + @SerializedName("bankAccount") + var bankAccount: String = "" + + @SerializedName("agency") + var agency: String = "" + + @SerializedName("balance") + var balance: Int = 0 + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Login/LoginContract.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Login/LoginContract.kt new file mode 100644 index 000000000..b651e560f --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Login/LoginContract.kt @@ -0,0 +1,14 @@ +package com.example.appbanksantander_accenturetalentacquisition.Presenter.Login + +import com.example.appbanksantander_accenturetalentacquisition.Model.UserAccountModel + +interface LoginContract { + interface View{ + fun UserDetails(userAccountModel: UserAccountModel) + } + interface UserActionListener{ + fun loadUser() + fun saveUser(user: String) + fun verifyUser(): String + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Login/LoginPresenter.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Login/LoginPresenter.kt new file mode 100644 index 000000000..3a6e6bb4c --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Login/LoginPresenter.kt @@ -0,0 +1,46 @@ +package com.example.appbanksantander_accenturetalentacquisition.Presenter.Login + +import android.content.Context +import android.content.SharedPreferences +import com.example.appbanksantander_accenturetalentacquisition.API.RequestApi +import com.example.appbanksantander_accenturetalentacquisition.API.ServiceApi +import com.example.appbanksantander_accenturetalentacquisition.Model.UserAccountModel + +class LoginPresenter(accountView: LoginContract.View?, private val context: Context?): + LoginContract.UserActionListener { + val serviceApi: ServiceApi + val myAccountView: LoginContract.View? + + init { + serviceApi = RequestApi(context) + myAccountView = accountView + } + + override fun loadUser() { + serviceApi.getAccountInfo(object: ServiceApi.ServiceApiCallbackUser{ + override fun loaded(userAccount: UserAccountModel) { + myAccountView?.UserDetails(userAccount!!) + } + }) + } + + override fun saveUser(user: String) { + val sharedPreferences: SharedPreferences = context!!.getSharedPreferences("login", Context.MODE_PRIVATE) + val editor: SharedPreferences.Editor = sharedPreferences.edit() + editor.putBoolean("haveUser", true) + editor.putString("user", user) + editor.apply() + } + + override fun verifyUser(): String { + var haveUserAccount = "" + val sharedPreferences: SharedPreferences = context!!.getSharedPreferences("login", Context.MODE_PRIVATE) + sharedPreferences.getBoolean("haveUser", false) + if (sharedPreferences.contains("haveUser")){ + haveUserAccount = sharedPreferences.getString("user", "").toString() + return haveUserAccount + } + return haveUserAccount + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Main/MainContract.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Main/MainContract.kt new file mode 100644 index 000000000..7e1b8af88 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Main/MainContract.kt @@ -0,0 +1,13 @@ +package com.example.appbanksantander_accenturetalentacquisition.Presenter.Main + +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementModel + +interface MainContract { + interface View{ + fun showStatement(statement: List) + } + + interface UserLoads{ + fun loadStatement(userId: Int) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Main/MainPresenter.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Main/MainPresenter.kt new file mode 100644 index 000000000..85b59a355 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Presenter/Main/MainPresenter.kt @@ -0,0 +1,25 @@ +package com.example.appbanksantander_accenturetalentacquisition.Presenter.Main + +import android.content.Context +import com.example.appbanksantander_accenturetalentacquisition.API.RequestApi +import com.example.appbanksantander_accenturetalentacquisition.API.ServiceApi +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementModel +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementResponse + +class MainPresenter(statementView: MainContract.View?, context: Context): MainContract.UserLoads { + val serviceApi: ServiceApi + val myStatementView: MainContract.View? + + init { + serviceApi = RequestApi(context) + myStatementView = statementView + } + + override fun loadStatement(userId: Int) { + serviceApi.getStatement(object: ServiceApi.ServiceApiCallbackStatement{ + override fun loaded(statement: List) { + myStatementView?.showStatement(statement) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Utils/Adapters/StatementAdapter.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Utils/Adapters/StatementAdapter.kt new file mode 100644 index 000000000..5085afae9 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Utils/Adapters/StatementAdapter.kt @@ -0,0 +1,47 @@ +package com.example.appbanksantander_accenturetalentacquisition.Utils.Adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementModel +import com.example.appbanksantander_accenturetalentacquisition.R +import java.util.zip.Inflater + +class StatementAdapter(var statement: List, val context: Context): RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater: LayoutInflater = LayoutInflater.from(context) + val view: View = inflater.inflate(R.layout.item_stratement_list, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val statements: StatementModel = statement.get(position) + val currency = "R$ " + holder.operationTitleTxt.text = statements.title + holder.operationDateTxt.text = statements.date + holder.descriptionTxt.text = statements.description + holder.operationValueTxt.text = currency + statements.value.toString() + } + + override fun getItemCount(): Int { + return statement.size + } + + fun setList(statementList: List){ + val moreList = ArrayList() + moreList.addAll(statementList) + statement = moreList + notifyDataSetChanged() + } + + class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + val operationTitleTxt: TextView = itemView.findViewById(R.id.operationTitleTxt) + val operationDateTxt: TextView = itemView.findViewById(R.id.operationDateTxt) + val descriptionTxt: TextView = itemView.findViewById(R.id.descriptionTxt) + val operationValueTxt: TextView = itemView.findViewById(R.id.operationValueTxt) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Utils/Validation.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Utils/Validation.kt new file mode 100644 index 000000000..d33b7fb86 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/Utils/Validation.kt @@ -0,0 +1,72 @@ +package com.example.appbanksantander_accenturetalentacquisition.Utils + + +import java.util.regex.Matcher +import java.util.regex.Pattern + +class Validation { + + fun verifyUser(user: String): Boolean{ + val isCpf = isCPF(user) + val isEmail = isEmail(user) + + if (isCpf){ + return true + } + if (isEmail){ + return true + } + return false + } + + fun verifyPassword(password: String): Boolean{ + val regex = "(?=.*[}{#,.^?~=+\\-_\\/*\\-+.\\|])(?=.*[a-zA-Z])(?=.*[0-9]).{8,}" + val pattern: Pattern = Pattern.compile(regex) + val matcher: Matcher = pattern.matcher(password) + + val minimumChar = 6 + if (password.length < minimumChar){ + return false + } + return matcher.matches() + } + + fun isEmail(user: String): Boolean { + val emailRegex = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+" + if (user.isNotEmpty()) + if (user.matches(emailRegex.toRegex())){ + return true + } + return false + } + + fun isCPF(cpf: String): Boolean { + val digit11 = 11 + val digit10 = 10 + + if (cpf.isEmpty()){ + return false + } + if (cpf.contains("^[a-Z]")){ + return false + } + val numbers = arrayListOf() + + cpf.filter { + it.isDigit() + }.forEach { + numbers.add(it.toString().toInt()) + } + + if (numbers.size != digit11){ + return false + } + if (numbers.size > digit11){ + return false + } + if (numbers.size < digit10){ + return false + } + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/View/LoginActiviy.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/View/LoginActiviy.kt new file mode 100644 index 000000000..1eaba7c72 --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/View/LoginActiviy.kt @@ -0,0 +1,89 @@ +package com.example.appbanksantander_accenturetalentacquisition.View + +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Button +import android.widget.EditText +import android.widget.ProgressBar +import androidx.appcompat.app.AppCompatActivity +import com.example.appbanksantander_accenturetalentacquisition.MainActivity +import com.example.appbanksantander_accenturetalentacquisition.Model.UserAccountModel +import com.example.appbanksantander_accenturetalentacquisition.Presenter.Login.LoginContract +import com.example.appbanksantander_accenturetalentacquisition.Presenter.Login.LoginPresenter +import com.example.appbanksantander_accenturetalentacquisition.R +import com.example.appbanksantander_accenturetalentacquisition.Utils.Validation + +class LoginActiviy : AppCompatActivity(), LoginContract.View { + lateinit var userEditText: EditText + lateinit var passwordEditText: EditText + lateinit var loginButton: Button + lateinit var loginListener: LoginContract.UserActionListener + lateinit var validation: Validation + lateinit var progressLoadingUser: ProgressBar + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_login) + + loginListener = LoginPresenter(this, this) + validation = Validation() + + userEditText = findViewById(R.id.userEditText) + passwordEditText = findViewById(R.id.passwordEditText) + progressLoadingUser = findViewById(R.id.progressLoadingUser) + loginButton = findViewById(R.id.loginButton) + + verifyUserSaved() + + loginButton.setOnClickListener { + initMainScreen() + } + + } + + private fun initMainScreen() { + val user = userEditText.text.toString().trim() + val password = passwordEditText.text.toString().trim() + + val isUserValid = validation.verifyUser(user) + val isPasswordValid = validation.verifyPassword(password) + + if (!isUserValid) { + userEditText.error = getString(R.string.invalidUser) + }else{ + if (!isPasswordValid){ + passwordEditText.error = getString(R.string.invalidPassword) + }else{ + loginButton.isEnabled = false + saveUser() + loginListener.loadUser() + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + progressLoadingUser.outlineAmbientShadowColor = getColor(R.color.primary) + } + progressLoadingUser.visibility = View.VISIBLE + } + } + } + + private fun saveUser() { + val user = userEditText.text.toString().trim() + loginListener.saveUser(user) + } + + private fun verifyUserSaved() { + val user = loginListener.verifyUser() + userEditText.setText(user) + } + + override fun UserDetails(userAccountModel: UserAccountModel) { + val intent = Intent(this, MainActivity::class.java) + intent.putExtra("userId", userAccountModel.userId) + intent.putExtra("name", userAccountModel.name) + intent.putExtra("bankAccount", userAccountModel.bankAccount) + intent.putExtra("agency", userAccountModel.agency) + intent.putExtra("balance", userAccountModel.balance) + startActivity(intent) + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/View/MainActivity.kt b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/View/MainActivity.kt new file mode 100644 index 000000000..4b55b982e --- /dev/null +++ b/app/src/main/java/com/example/appbanksantander_accenturetalentacquisition/View/MainActivity.kt @@ -0,0 +1,71 @@ +package com.example.appbanksantander_accenturetalentacquisition + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.widget.Button +import android.widget.EditText +import android.widget.ImageButton +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.appbanksantander_accenturetalentacquisition.Model.StatementModel +import com.example.appbanksantander_accenturetalentacquisition.Presenter.Main.MainContract +import com.example.appbanksantander_accenturetalentacquisition.Presenter.Main.MainPresenter +import com.example.appbanksantander_accenturetalentacquisition.Utils.Adapters.StatementAdapter +import com.example.appbanksantander_accenturetalentacquisition.View.LoginActiviy + +class MainActivity : AppCompatActivity(), MainContract.View { + lateinit var statementListener: MainContract.UserLoads + lateinit var statementList: RecyclerView + lateinit var statementAdapter: StatementAdapter + lateinit var nameUserTxt: TextView + lateinit var accountUserTxt: TextView + lateinit var balanceTxt: TextView + lateinit var logoutButton: Button + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + val userId = intent!!.extras!!.getInt("userId") + val nameUser = intent!!.extras!!.getString("name") + val bankAccount = intent!!.extras!!.getString("bankAccount") + val agency = intent!!.extras!!.getString("agency") + val balance = intent!!.extras!!.getInt("balance") + + statementList = findViewById(R.id.statementList) + nameUserTxt = findViewById(R.id.nameUserTxt) + accountUserTxt = findViewById(R.id.accountUserTxt) + balanceTxt = findViewById(R.id.balanceTxt) + logoutButton = findViewById(R.id.logoutButton) + + statementListener = MainPresenter(this, this) + + statementListener.loadStatement(userId) + + val account = bankAccount + "/" + agency + val cents = ",00" + val currency = "R$ " + + nameUserTxt.setText(nameUser) + accountUserTxt.setText(account) + balanceTxt.setText(currency + balance.toString() + cents) + + val initialCapacity = 0 + statementAdapter = StatementAdapter(ArrayList(initialCapacity),this) + + statementList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + statementList.adapter = statementAdapter + + logoutButton.setOnClickListener { + val intent = Intent(this, LoginActiviy::class.java) + startActivity(intent) + finish() + } + } + + override fun showStatement(statement: List) { + statementAdapter.setList(statement) + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..2b068d114 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_edittext.xml b/app/src/main/res/drawable/background_edittext.xml new file mode 100644 index 000000000..4f0f5cad8 --- /dev/null +++ b/app/src/main/res/drawable/background_edittext.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_pattern.xml b/app/src/main/res/drawable/background_pattern.xml new file mode 100644 index 000000000..1902a8061 --- /dev/null +++ b/app/src/main/res/drawable/background_pattern.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml b/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml new file mode 100644 index 000000000..c3220f4ff --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..07d5da9cb --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 000000000..b80152093 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + +