diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..603b14077 --- /dev/null +++ b/.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/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..88ea3aa1e --- /dev/null +++ b/.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/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..79ee123c2 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 000000000..ac6b0aec6 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ 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..37a750962 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 000000000..7f68460d8 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /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..c8d64d25d 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,6 @@ -# Show me the code +# Como Rodar Esse Projeto -Esse repositório contem todo o material necessário para realizar o teste: -- A especificação do layout está na pasta 'bank_app_layout' abrindo o index.html, utilizar os Styles do Android - -- Os dados da Api estão mockados, os exemplos e a especificação dos serviços (login e statements) se encontram no arquivo BankApp.postman_collection.json ( é necessário instalar o postman e importar a colection https://www.getpostman.com/apps) - -![Image of Yaktocat](https://github.com/SantanderTecnologia/TesteiOS/blob/new_test/telas.png) - -### # DESAFIO: - -Na primeira tela teremos um formulario de login, o campo user deve aceitar email ou cpf, -o campo password deve validar se a senha tem pelo menos uma letra maiuscula, um caracter especial e um caracter alfanumérico. -Apos a validação, realizar o login no endpoint https://bank-app-test.herokuapp.com/api/login e exibir os dados de retorno na próxima tela. -O ultimo usuário logado deve ser salvo de forma segura localmente, e exibido na tela de login se houver algum salvo. - -Na segunda tela será exibido os dados formatados do retorno do login e será necessário fazer um segundo request para obter os lançamentos do usuário, no endpoint https://bank-app-test.herokuapp.com/api/statements/{idUser} que retornará uma lista de lançamentos - -### # Avaliação - -Você será avaliado pela usabilidade, por respeitar o design e pela arquitetura do app. É esperado que você consiga explicar as decisões que tomou durante o desenvolvimento através de commits. - -Obrigatórios: - -* Java ou Kotlin -* Material Design -* O app deve funcionar a partir do android 4.4 -* Testes unitários, pode usar a ferramenta que você tem mais experiência, só nos explique o que ele tem de bom. -* Arquitetura a ser utilizada: Android Clean Code (https://github.com/kmmraj/android-clean-code && https://medium.com/@kmmraj/android-clean-code-part-1-c66da6551d1) -* Uso do git. - -### # Observações gerais - -Adicione um arquivo [README.md](http://README.md) com os procedimentos para executar o projeto. -Pedimos que trabalhe sozinho e não divulgue o resultado na internet. - -Faça um fork desse desse repositório em seu Github e ao finalizar nos envie um Pull Request com o resultado, por favor informe por qual empresa você esta se candidatando. - -# Importante: não há prazo de entrega, faça com qualidade! - -# BOA SORTE! +- No Android Studio + - File -> New Project From Version Control + - Usar a URL https://github.com/htnetdz/TesteAndroidv2.git + - Run -> Run 'app' diff --git a/TesteAndroidv2.iml b/TesteAndroidv2.iml new file mode 100644 index 000000000..8021953ed --- /dev/null +++ b/TesteAndroidv2.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file 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..d11cee4ed --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.1" + + defaultConfig { + applicationId "com.example.henriquethomaziteste" + 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' + } + } +} + +dependencies { + implementation 'com.squareup.retrofit2:retrofit:2.6.0' + implementation 'org.greenrobot:eventbus:3.2.0' + implementation("com.squareup.moshi:moshi-kotlin:1.9.3") + implementation("com.squareup.moshi:moshi:1.9.3") + implementation("com.squareup.moshi:moshi-adapters:1.9.3") + implementation 'com.squareup.retrofit2:converter-moshi:2.0.0' + implementation 'com.squareup.retrofit2:converter-gson:2.6.0' + implementation 'com.squareup.retrofit2:converter-simplexml:2.1.0' + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.1.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.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/henriquethomaziteste/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/henriquethomaziteste/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..586ec8dbc --- /dev/null +++ b/app/src/androidTest/java/com/example/henriquethomaziteste/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.henriquethomaziteste + +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.henriquethomaziteste", 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..a56be7502 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/AccountDetailsActivity.kt b/app/src/main/java/com/example/henriquethomaziteste/AccountDetailsActivity.kt new file mode 100644 index 000000000..49bdaa64e --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/AccountDetailsActivity.kt @@ -0,0 +1,60 @@ +package com.example.henriquethomaziteste + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.example.henriquethomaziteste.adapters.StatementListAdapter +import com.example.henriquethomaziteste.apis.bankdata.BankApiManager +import com.example.henriquethomaziteste.apis.bankdata.BankUserData +import com.example.henriquethomaziteste.events.BankStatementsEvent +import com.example.henriquethomaziteste.helper.EventBus +import com.example.henriquethomaziteste.helper.UserDataValidator +import kotlinx.android.synthetic.main.activity_transactions.* + +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import java.util.ArrayList + +class AccountDetailsActivity : AppCompatActivity() { + + private lateinit var userData: BankUserData + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_transactions) + userData = BankApiManager.getUserCredentials(this) + EventBus.register(this) + setupAccountDetails() + setupStatementList() + } + + fun setupAccountDetails(){ + label_user_name.setText(userData.name) + label_accnt_value.setText(userData.bankAccount?.let { + userData.agency?.let { it1 -> + UserDataValidator.formatBankAccount( + it1, + it + ) + } + }) + label_balance_value.setText(UserDataValidator.formatBalance(userData.balance)) + } + + fun setupStatementList(){ + BankApiManager.getStatements(userData.userId.toString()) + } + + fun logout(v: View) { + BankApiManager.clearUserCredentials(this) + finish() + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onStatementsLoaded(event: BankStatementsEvent){ + layout_transactions_list.layoutManager = LinearLayoutManager(this) + layout_transactions_list.adapter = StatementListAdapter(this, event.statements as ArrayList) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/MainActivity.kt b/app/src/main/java/com/example/henriquethomaziteste/MainActivity.kt new file mode 100644 index 000000000..0eb7bbc0d --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/MainActivity.kt @@ -0,0 +1,67 @@ +package com.example.henriquethomaziteste + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.view.View +import android.widget.Toast +import com.example.henriquethomaziteste.apis.bankdata.BankApiManager +import com.example.henriquethomaziteste.events.BankLoginEvent +import com.example.henriquethomaziteste.helper.EventBus +import com.example.henriquethomaziteste.helper.UserDataValidator +import kotlinx.android.synthetic.main.activity_main.* +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class MainActivity : AppCompatActivity() { + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + EventBus.register(this) + setViews() + } + + override fun onDestroy() { + super.onDestroy() + EventBus.unregister(this) + } + + fun setViews(){ + main_button_login.setOnClickListener { + progressBar.visibility = View.VISIBLE + if (UserDataValidator.validateInput(editTextPassword.text.toString())){ + BankApiManager.login(editTextUser.text.toString(), editTextPassword.text.toString()) + } + else { + Toast.makeText(this, "Senha Inválida: Deve conter Maiúsculas, Minúsculas, Caracteres Especiais e números", Toast.LENGTH_LONG).show() + } + + } + + var savedData = BankApiManager.getUserCredentials(this) + + //Se houver dados salvos, recuperar e apresentar + if (!savedData.user.isNullOrBlank() && !savedData.pass.isNullOrBlank()){ + editTextUser.setText(savedData.user) + editTextPassword.setText(savedData.pass) + } + + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onLoginFinished(event: BankLoginEvent){ + progressBar.visibility = View.INVISIBLE + if (!event.error!!){ + event.userData?.let { BankApiManager.storeUserCredentials(this, it, editTextUser.text.toString(), editTextPassword.text.toString()) } + startActivity(Intent(this, AccountDetailsActivity::class.java)) + } + else{ + Toast.makeText(this, "Houve Um Erro No Login", Toast.LENGTH_SHORT).show() + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/adapters/StatementListAdapter.kt b/app/src/main/java/com/example/henriquethomaziteste/adapters/StatementListAdapter.kt new file mode 100644 index 000000000..b16026545 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/adapters/StatementListAdapter.kt @@ -0,0 +1,42 @@ +package com.example.henriquethomaziteste.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.henriquethomaziteste.R +import com.example.henriquethomaziteste.apis.bankdata.BankStatement +import kotlinx.android.synthetic.main.item_balance_transaction.view.* + +class StatementListAdapter(private val context: Context, private val items: ArrayList) : RecyclerView.Adapter(){ + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): StatementListAdapter.StatementHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_balance_transaction, parent, false) + return StatementHolder(view) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onBindViewHolder(holder: StatementListAdapter.StatementHolder, position: Int) { + val item = items[position] + + holder.itemDate.setText(item.date) + holder.itemDesc.setText(item.desc) + holder.itemValue.setText("R$ ${item.value.toBigDecimal().setScale(2).toString().replace(".", ",")}") + holder.itemType.setText(item.title) + } + + inner class StatementHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var itemType = itemView.label_type + var itemDesc = itemView.label_description + var itemValue = itemView.label_valor + var itemDate = itemView.label_date + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankApi.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankApi.kt new file mode 100644 index 000000000..80db20b87 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankApi.kt @@ -0,0 +1,13 @@ +package com.example.henriquethomaziteste.apis.bankdata + +import retrofit2.Call +import retrofit2.http.* + +interface BankApi { + + @POST("login") + fun login(@Body loginData: BankLoginRequest): Call + + @GET("statements/{id}") + fun statements(@Path("id") id: String): Call +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankApiManager.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankApiManager.kt new file mode 100644 index 000000000..0166985ac --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankApiManager.kt @@ -0,0 +1,122 @@ +package com.example.henriquethomaziteste.apis.bankdata + +import android.content.Context +import com.example.henriquethomaziteste.events.BankLoginEvent +import com.example.henriquethomaziteste.events.BankStatementsEvent +import com.example.henriquethomaziteste.helper.EventBus +import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import okhttp3.OkHttpClient +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.moshi.MoshiConverterFactory +import java.security.AccessControlContext +import java.util.concurrent.TimeUnit + +object BankApiManager { + + val PREF_NAME = "bankUser" + + var retrofitClient: Retrofit + get() = getRetrofitInstance("https://bank-app-test.herokuapp.com/api/") + set(value) {} + + var endpoint: BankApi + get() = retrofitClient.create(BankApi::class.java) + set(value) {} + + fun login(user: String, pass: String){ + endpoint.login(BankLoginRequest(user, pass)).enqueue(object: Callback { + override fun onFailure(call: Call, t: Throwable) { + EventBus.post(BankLoginEvent(true, null)) + } + + override fun onResponse( + call: Call, + response: Response + ) { + if (response.body()?.error != null) { + EventBus.post(BankLoginEvent(false, response.body()?.userAccount)) + } + } + + }) + } + + fun getStatements(id: String){ + endpoint.statements(id).enqueue(object: Callback { + override fun onFailure(call: Call, t: Throwable) { + EventBus.post(BankStatementsEvent(true, null)) + } + + override fun onResponse(call: Call, response: Response) { + if (response.body()?.error != null){ + EventBus.post(BankStatementsEvent(false, response.body()?.statementList)) + } + } + + + }) + } + + fun storeUserCredentials(context: Context, data: BankUserData, user: String, pass: String ){ + + val sharedPrefs = context.getSharedPreferences(PREF_NAME, 0) + val editor = sharedPrefs.edit() + + data.userId?.let { editor.putInt("userId", it) } + editor.putString("userName", data.name) + editor.putString("userAgency", data.agency) + editor.putString("userAccount", data.bankAccount) + editor.putFloat("balance", data.balance.toFloat()) + + editor.putString("user", user) + editor.putString("pass", pass) + editor.apply() + + } + + fun getUserCredentials(context: Context): BankUserData{ + + val sharedPrefs = context.getSharedPreferences(PREF_NAME, 0) + if (sharedPrefs != null){ + return (BankUserData( + name = sharedPrefs.getString("userName", ""), + agency = sharedPrefs.getString("userAgency", ""), + bankAccount = sharedPrefs.getString("userAccount", ""), + pass = sharedPrefs.getString("pass", ""), + user = sharedPrefs.getString("user", ""), + balance = sharedPrefs.getFloat("balance", 0.0F).toDouble() + )) + } + else{ + return BankUserData() + } + } + + fun clearUserCredentials (context: Context){ + val sharedPrefs = context.getSharedPreferences(PREF_NAME, 0) + val editor = sharedPrefs.edit() + editor.clear() + editor.apply() + } + + fun getRetrofitInstance(path: String): Retrofit { + + var client = OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS).build() + + return Retrofit.Builder() + .client(client) + .baseUrl(path) + .addConverterFactory( + MoshiConverterFactory.create( + Moshi.Builder() + .add(KotlinJsonAdapterFactory()) + .build()).asLenient()) + .build() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankLoginRequest.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankLoginRequest.kt new file mode 100644 index 000000000..d167384d9 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankLoginRequest.kt @@ -0,0 +1,8 @@ +package com.example.henriquethomaziteste.apis.bankdata + +data class BankLoginRequest( + var user: String? = "", + var password: String? = "" +){ + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankLoginResponse.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankLoginResponse.kt new file mode 100644 index 000000000..67760f342 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankLoginResponse.kt @@ -0,0 +1,9 @@ +package com.example.henriquethomaziteste.apis.bankdata + +data class BankLoginResponse( + + var userAccount: BankUserData? = BankUserData(), + var error: Any? +){ + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankRequest.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankRequest.kt new file mode 100644 index 000000000..0f9d4244d --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankRequest.kt @@ -0,0 +1,4 @@ +package com.example.henriquethomaziteste.apis.bankdata + +class BankRequest { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankResponse.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankResponse.kt new file mode 100644 index 000000000..5e6e5cb0a --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankResponse.kt @@ -0,0 +1,7 @@ +package com.example.henriquethomaziteste.apis.bankdata + +class BankResponse ( + var statementList: MutableList = ArrayList(), + var error: Any? +) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankStatement.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankStatement.kt new file mode 100644 index 000000000..9dafc37c5 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankStatement.kt @@ -0,0 +1,10 @@ +package com.example.henriquethomaziteste.apis.bankdata + +data class BankStatement( + var title: String? = "", + var desc: String? = "", + var date: String? = "", + var value: Double = 0.0 +) { + +} diff --git a/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankUserData.kt b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankUserData.kt new file mode 100644 index 000000000..cb2258963 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/apis/bankdata/BankUserData.kt @@ -0,0 +1,12 @@ +package com.example.henriquethomaziteste.apis.bankdata + +class BankUserData( + var userId: Int? = 0, + var name: String? = "", + var bankAccount: String? = "", + var agency: String? = "", + var balance: Double = 0.0, + var user: String? = "", + var pass: String? = "" +) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/events/BankLoginEvent.kt b/app/src/main/java/com/example/henriquethomaziteste/events/BankLoginEvent.kt new file mode 100644 index 000000000..62aaa22f4 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/events/BankLoginEvent.kt @@ -0,0 +1,9 @@ +package com.example.henriquethomaziteste.events + +import com.example.henriquethomaziteste.apis.bankdata.BankUserData + +class BankLoginEvent( + var error: Boolean? = false, + var userData: BankUserData? = BankUserData() +){ +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/events/BankStatementsEvent.kt b/app/src/main/java/com/example/henriquethomaziteste/events/BankStatementsEvent.kt new file mode 100644 index 000000000..f2a089ede --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/events/BankStatementsEvent.kt @@ -0,0 +1,9 @@ +package com.example.henriquethomaziteste.events + +import com.example.henriquethomaziteste.apis.bankdata.BankStatement + +class BankStatementsEvent( + var error: Boolean? = false, + var statements: MutableList? +) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/helper/EventBus.kt b/app/src/main/java/com/example/henriquethomaziteste/helper/EventBus.kt new file mode 100644 index 000000000..06e43b24a --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/helper/EventBus.kt @@ -0,0 +1,22 @@ +package com.example.henriquethomaziteste.helper + +import org.greenrobot.eventbus.EventBus + + +object EventBus { + + fun post(event: Any) { + EventBus.getDefault().post(event) + } + + fun register(subscriber: Any) { + val eventBus = EventBus.getDefault() + if (!eventBus.isRegistered(subscriber)) eventBus.register(subscriber) + } + + fun unregister(subscriber: Any) { + val eventBus = EventBus.getDefault() + if (eventBus.isRegistered(subscriber)) eventBus.unregister(subscriber) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/henriquethomaziteste/helper/UserDataValidator.kt b/app/src/main/java/com/example/henriquethomaziteste/helper/UserDataValidator.kt new file mode 100644 index 000000000..fd1386186 --- /dev/null +++ b/app/src/main/java/com/example/henriquethomaziteste/helper/UserDataValidator.kt @@ -0,0 +1,31 @@ +package com.example.henriquethomaziteste.helper + + +import java.lang.StringBuilder +import java.text.NumberFormat + +object UserDataValidator { + + fun validateInput(input: String) : Boolean{ + if (!input.matches(Regex(".*[A-Z].*"))) return false + if (!input.matches(Regex(".*[a-z].*"))) return false + if (!input.matches(Regex(".*\\d.*"))) return false + return true + } + + fun formatBankAccount (agency: String, accnt: String): String{ + val builder = StringBuilder(agency) + builder.insert(agency.length - 1, "-") + builder.insert(2, ".") + + return accnt + " / " + builder.toString() + } + + fun formatBalance (value: Double): String{ + + val format = NumberFormat.getCurrencyInstance(); + val currency = format.format(value); + + return "$currency" + } +} \ 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/bank_app_layout/assets/Logo.png b/app/src/main/res/drawable-v24/logo.png similarity index 100% rename from bank_app_layout/assets/Logo.png rename to app/src/main/res/drawable-v24/logo.png diff --git a/bank_app_layout/assets/logout 2.png b/app/src/main/res/drawable-v24/logout2.png similarity index 100% rename from bank_app_layout/assets/logout 2.png rename to app/src/main/res/drawable-v24/logout2.png 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/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 000000000..66bdc8d5d Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/logout2.png b/app/src/main/res/drawable/logout2.png new file mode 100644 index 000000000..de1e4ae3c Binary files /dev/null and b/app/src/main/res/drawable/logout2.png differ diff --git a/app/src/main/res/drawable/shape_bg_dark.xml b/app/src/main/res/drawable/shape_bg_dark.xml new file mode 100644 index 000000000..7fd3c095e --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_dark.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/shape_bg_light.xml b/app/src/main/res/drawable/shape_bg_light.xml new file mode 100644 index 000000000..810446c76 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_light.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/shape_input_outline.xml b/app/src/main/res/drawable/shape_input_outline.xml new file mode 100644 index 000000000..aa801320b --- /dev/null +++ b/app/src/main/res/drawable/shape_input_outline.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..bdbda5c2e --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,76 @@ + + + + + + + + + +