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..42d66cb8a
--- /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..af0bbdde1
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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..35eb1ddfb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Bank_App.postman_collection.json b/Bank_App.postman_collection.json
deleted file mode 100644
index 53882a1c6..000000000
--- a/Bank_App.postman_collection.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
- "info": {
- "_postman_id": "b90c97e1-4261-4a34-a348-a0604f0264a7",
- "name": "Bank App",
- "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
- },
- "item": [
- {
- "name": "Login",
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Content-Type",
- "name": "Content-Type",
- "value": "application/x-www-form-urlencoded",
- "type": "text"
- }
- ],
- "body": {
- "mode": "urlencoded",
- "urlencoded": [
- {
- "key": "user",
- "value": "test_user",
- "type": "text"
- },
- {
- "key": "password",
- "value": "Test@1",
- "type": "text"
- }
- ]
- },
- "url": {
- "raw": "https://bank-app-test.herokuapp.com/api/login",
- "protocol": "https",
- "host": [
- "bank-app-test",
- "herokuapp",
- "com"
- ],
- "path": [
- "api",
- "login"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Statements",
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Content-Type",
- "name": "Content-Type",
- "value": "application/x-www-form-urlencoded",
- "type": "text"
- }
- ],
- "body": {
- "mode": "urlencoded",
- "urlencoded": [
- {
- "key": "user",
- "value": "4",
- "type": "text"
- },
- {
- "key": "password",
- "value": "asdfa",
- "type": "text"
- }
- ]
- },
- "url": {
- "raw": "https://bank-app-test.herokuapp.com/api/statements/1",
- "protocol": "https",
- "host": [
- "bank-app-test",
- "herokuapp",
- "com"
- ],
- "path": [
- "api",
- "statements",
- "1"
- ]
- }
- },
- "response": []
- }
- ]
-}
\ No newline at end of file
diff --git a/README.md b/README.md
index bd73feb5f..74e92ff87 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,3 @@
-# Show me the code
+# Desafio Android - Luis Claudio Monteoliva
-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)
-
-
-
-### # 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!
+Não ha necessidades de instalação de qualquer biblioteca, foi utilizado gestão de independência de bibliotecas diretamente no Gradle
\ No newline at end of file
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 2f7efbeab..000000000
--- a/_config.yml
+++ /dev/null
@@ -1 +0,0 @@
-theme: jekyll-theme-minimal
\ 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..51377c6f7
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,50 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 29
+
+ defaultConfig {
+ applicationId "br.com.testeandroidv2"
+ minSdkVersion 21
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ debug {
+ debuggable true
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: "libs", include: ["*.jar"])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testImplementation 'junit:junit:4.12'
+
+ implementation 'com.google.android.material:material:1.1.0'
+
+ // AndroidX
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'androidx.core:core-ktx:1.3.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+
+ // AnroidX test
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test:runner:1.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+
+ // GSON
+ implementation 'com.google.code.gson:gson:2.8.6'
+}
\ 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/br/com/testeandroidv2/ExampleInstrumentedTest.kt b/app/src/androidTest/java/br/com/testeandroidv2/ExampleInstrumentedTest.kt
new file mode 100644
index 000000000..617b9efd3
--- /dev/null
+++ b/app/src/androidTest/java/br/com/testeandroidv2/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package br.com.testeandroidv2
+
+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("br.com.testeandroidv2", 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..65406086e
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/bean/LoginBean.kt b/app/src/main/java/br/com/testeandroidv2/model/bean/LoginBean.kt
new file mode 100644
index 000000000..df2a60ef9
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/bean/LoginBean.kt
@@ -0,0 +1,12 @@
+package br.com.testeandroidv2.model.bean
+
+import android.os.Parcelable
+
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class LoginBean(val userId: Int,
+ val name: String,
+ val bankAccount: String,
+ val agency: String,
+ val balance: Double) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/enums/Endpoints.kt b/app/src/main/java/br/com/testeandroidv2/model/enums/Endpoints.kt
new file mode 100644
index 000000000..d1eb1fe1b
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/enums/Endpoints.kt
@@ -0,0 +1,8 @@
+package br.com.testeandroidv2.model.enums
+
+enum class Endpoints(private val endpoint: String) {
+ LOGIN("/login"),
+ STATEMENTS("/statements/{0}");
+
+ fun endpoint(): String = endpoint
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/login/Model.kt b/app/src/main/java/br/com/testeandroidv2/model/login/Model.kt
new file mode 100644
index 000000000..a25fb926f
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/login/Model.kt
@@ -0,0 +1,54 @@
+package br.com.testeandroidv2.model.login
+
+import org.json.JSONObject
+import org.json.JSONException
+
+import br.com.testeandroidv2.model.bean.LoginBean
+import br.com.testeandroidv2.model.enums.Endpoints
+import br.com.testeandroidv2.presenter.login.MVP
+import br.com.testeandroidv2.utils.Constantes
+import br.com.testeandroidv2.utils.http.HttpAction
+import br.com.testeandroidv2.utils.http.HttpCallBack
+import br.com.testeandroidv2.utils.http.HttpResponse
+import br.com.testeandroidv2.utils.http.HttpStatus
+
+class Model(private val presenter: MVP.Presenter): MVP.Model {
+
+ override fun loadLogin(user: String, password: String) {
+ presenter.showProgressBar(true)
+
+ val wsEndpoint: String = Endpoints.LOGIN.endpoint()
+ val baseUrl: String = Constantes.baseURL + wsEndpoint
+ val jsonBody = "user=$user&password=$password"
+
+ val action = HttpAction(presenter.context)
+ action.addHeader("Content-Type", "application/x-www-form-urlencoded")
+ action.addHeader("Cache-Control","no-cache")
+ action.send(HttpStatus.POST,
+ baseUrl,
+ jsonBody,
+ object : HttpCallBack {
+ override fun onResponse(response: HttpResponse?) {
+ try {
+ val json = JSONObject(response?.message)
+ val account = JSONObject(json.getString("userAccount"))
+ val loginBean = LoginBean(
+ account.getInt("userId"),
+ account.getString("name"),
+ account.getString("bankAccount"),
+ account.getString("agency"),
+ account.getDouble("balance")
+ )
+
+ presenter.updateData(loginBean)
+ presenter.showProgressBar(false)
+ }
+ catch (je: JSONException) {}
+ }
+
+ override fun onError(response: HttpResponse?) {
+ presenter.showProgressBar(false)
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/statements/Model.kt b/app/src/main/java/br/com/testeandroidv2/model/statements/Model.kt
new file mode 100644
index 000000000..dc3790209
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/statements/Model.kt
@@ -0,0 +1,42 @@
+package br.com.testeandroidv2.model.statements
+
+import java.text.MessageFormat
+
+import com.google.gson.Gson
+
+import br.com.testeandroidv2.model.enums.Endpoints
+import br.com.testeandroidv2.model.statements.gson.Statement
+import br.com.testeandroidv2.presenter.statements.MVP
+import br.com.testeandroidv2.utils.Constantes
+import br.com.testeandroidv2.utils.http.HttpAction
+import br.com.testeandroidv2.utils.http.HttpCallBack
+import br.com.testeandroidv2.utils.http.HttpResponse
+import br.com.testeandroidv2.utils.http.HttpStatus
+
+class Model(private val presenter: MVP.Presenter): MVP.Model {
+
+ override fun loadList(userId: Int) {
+ presenter.showProgressBar(true)
+
+ val wsEndpoint: String = Endpoints.STATEMENTS.endpoint()
+ val baseUrl: String = Constantes.baseURL + MessageFormat.format(wsEndpoint, userId.toString())
+
+ val action = HttpAction(presenter.context)
+ action.send(
+ HttpStatus.GET,
+ baseUrl,
+ null,
+ object : HttpCallBack {
+ override fun onResponse(response: HttpResponse?) {
+ val result: Statement = Gson().fromJson(response?.message, Statement::class.java)
+
+ presenter.updateListRecycler(result.statementList)
+ presenter.showProgressBar(false)
+ }
+
+ override fun onError(response: HttpResponse?) {
+ presenter.showProgressBar(false)
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/statements/gson/Error.kt b/app/src/main/java/br/com/testeandroidv2/model/statements/gson/Error.kt
new file mode 100644
index 000000000..80c53e899
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/statements/gson/Error.kt
@@ -0,0 +1,7 @@
+package br.com.testeandroidv2.model.statements.gson
+
+import android.os.Parcelable
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class Error(val code: Int? = null, var message: String? = null) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/statements/gson/Statement.kt b/app/src/main/java/br/com/testeandroidv2/model/statements/gson/Statement.kt
new file mode 100644
index 000000000..a4a30d0c1
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/statements/gson/Statement.kt
@@ -0,0 +1,13 @@
+package br.com.testeandroidv2.model.statements.gson
+
+import android.os.Parcelable
+
+import com.google.gson.annotations.Expose
+import com.google.gson.annotations.SerializedName
+
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class Statement(@SerializedName("statementList") @Expose var statementList: MutableList? = null,
+ @SerializedName("error") @Expose var error: Error? = null
+) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/model/statements/gson/StatementList.kt b/app/src/main/java/br/com/testeandroidv2/model/statements/gson/StatementList.kt
new file mode 100644
index 000000000..ce1183659
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/model/statements/gson/StatementList.kt
@@ -0,0 +1,15 @@
+package br.com.testeandroidv2.model.statements.gson
+
+import android.os.Parcelable
+
+import com.google.gson.annotations.Expose
+import com.google.gson.annotations.SerializedName
+
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class StatementList(@SerializedName("title") @Expose var title: String? = null,
+ @SerializedName("desc") @Expose var desc: String? = null,
+ @SerializedName("date") @Expose var date: String? = null,
+ @SerializedName("value") @Expose var value: Double? = null
+) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/presenter/login/MVP.kt b/app/src/main/java/br/com/testeandroidv2/presenter/login/MVP.kt
new file mode 100644
index 000000000..d6701f2c5
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/presenter/login/MVP.kt
@@ -0,0 +1,24 @@
+package br.com.testeandroidv2.presenter.login
+
+import android.content.Context
+
+import br.com.testeandroidv2.model.bean.LoginBean
+
+class MVP {
+ interface Model {
+ fun loadLogin(user: String, password: String)
+ }
+
+ interface Presenter {
+ val context: Context
+ fun setView(view: View)
+ fun showProgressBar(status: Boolean)
+ fun loadLogin(user: String, password: String)
+ fun updateData(loginBean: LoginBean)
+ }
+
+ interface View {
+ fun showProgressBar(visible: Int)
+ fun updateData(loginBean: LoginBean)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/presenter/login/Presenter.kt b/app/src/main/java/br/com/testeandroidv2/presenter/login/Presenter.kt
new file mode 100644
index 000000000..16eefe941
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/presenter/login/Presenter.kt
@@ -0,0 +1,30 @@
+package br.com.testeandroidv2.presenter.login
+
+import android.content.Context
+import android.view.View
+import br.com.testeandroidv2.model.bean.LoginBean
+
+import br.com.testeandroidv2.model.login.Model
+
+class Presenter : MVP.Presenter {
+ private lateinit var view: MVP.View
+
+ private val model: MVP.Model = Model(this)
+
+ override val context: Context
+ get() = view as Context
+
+ override fun setView(view: MVP.View) { this.view = view }
+ override fun showProgressBar(status: Boolean) {
+ val visible: Int = if (status) View.VISIBLE else View.GONE
+ view.showProgressBar(visible)
+ }
+
+ override fun loadLogin(user: String, password: String) {
+ model.loadLogin(user, password)
+ }
+
+ override fun updateData(loginBean: LoginBean) {
+ view.updateData(loginBean)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/presenter/statements/MVP.kt b/app/src/main/java/br/com/testeandroidv2/presenter/statements/MVP.kt
new file mode 100644
index 000000000..876d47e17
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/presenter/statements/MVP.kt
@@ -0,0 +1,24 @@
+package br.com.testeandroidv2.presenter.statements
+
+import android.content.Context
+import br.com.testeandroidv2.model.statements.gson.StatementList
+
+class MVP {
+ interface Model {
+ fun loadList(userId: Int)
+ }
+
+ interface Presenter {
+ val context: Context
+ val items: MutableList
+ fun setView(view: View)
+ fun showProgressBar(status: Boolean)
+ fun loadList(userId: Int)
+ fun updateListRecycler(list: MutableList?)
+ }
+
+ interface View {
+ fun showProgressBar(visible: Int)
+ fun updateListRecycler()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/presenter/statements/Presenter.kt b/app/src/main/java/br/com/testeandroidv2/presenter/statements/Presenter.kt
new file mode 100644
index 000000000..816485fbb
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/presenter/statements/Presenter.kt
@@ -0,0 +1,35 @@
+package br.com.testeandroidv2.presenter.statements
+
+import android.content.Context
+import android.view.View
+
+import br.com.testeandroidv2.model.statements.Model
+import br.com.testeandroidv2.model.statements.gson.StatementList
+
+class Presenter : MVP.Presenter {
+ private lateinit var view: MVP.View
+
+ private val model: Model = Model(this)
+ private var list: MutableList = emptyList().toMutableList()
+
+ override val context: Context
+ get() = view as Context
+ override val items: MutableList
+ get() = list
+
+ override fun setView(view: MVP.View) { this.view = view }
+ override fun showProgressBar(status: Boolean) {
+ val visible: Int = if (status) View.VISIBLE else View.GONE
+ view.showProgressBar(visible)
+ }
+
+ override fun loadList(userId: Int) {
+ model.loadList(userId)
+ }
+
+ override fun updateListRecycler(list: MutableList?) {
+ this.list.clear()
+ this.list.addAll(list!!)
+ view.updateListRecycler()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/Constantes.kt b/app/src/main/java/br/com/testeandroidv2/utils/Constantes.kt
new file mode 100644
index 000000000..26de9fb74
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/Constantes.kt
@@ -0,0 +1,7 @@
+package br.com.testeandroidv2.utils
+
+interface Constantes {
+ companion object {
+ const val baseURL: String = "https://bank-app-test.herokuapp.com/api"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/Utils.kt b/app/src/main/java/br/com/testeandroidv2/utils/Utils.kt
new file mode 100644
index 000000000..b46833464
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/Utils.kt
@@ -0,0 +1,113 @@
+package br.com.testeandroidv2.utils
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
+import android.os.Build
+import java.math.RoundingMode
+import java.text.DecimalFormat
+import java.text.DecimalFormatSymbols
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+
+object Utils {
+ fun setStringConfig(context: Context, key: String, value: String) {
+ var settings: SharedPreferences = context.getSharedPreferences("config", Context.MODE_PRIVATE)
+ var editor: SharedPreferences.Editor = settings.edit()
+ editor.putString(key, value)
+ editor.apply()
+ }
+
+ fun getStringConfig(context: Context, key: String?) : String? {
+ var config: SharedPreferences = context.getSharedPreferences("config", Context.MODE_PRIVATE)
+ return config.getString(key, "")
+ }
+
+ @Suppress("DEPRECATION")
+ fun isInternetConnect(context: Context): Boolean {
+ var result = false
+ val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ cm?.run {
+ cm.getNetworkCapabilities(cm.activeNetwork)?.run {
+ result = when {
+ hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
+ hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
+ hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
+ else -> false
+ }
+ }
+ }
+ }
+ else {
+ cm?.run {
+ cm.activeNetworkInfo?.run {
+ if (type == ConnectivityManager.TYPE_WIFI) {
+ result = true
+ }
+ else if (type == ConnectivityManager.TYPE_MOBILE) {
+ result = true
+ }
+ }
+ }
+ }
+ return result
+ }
+
+ fun formatDecimal(number: Double?): String? {
+ val locale = Locale("pt", "BR")
+ val df = DecimalFormat("###,##0.00", DecimalFormatSymbols(locale))
+ df.roundingMode = RoundingMode.FLOOR
+ return df.format(number)
+ }
+
+ fun isValidPassword(password: String) : Boolean {
+ val caracter = ".*[A-Z].*".toRegex()
+ val number = ".*[0-9].*".toRegex()
+ val special = ".*[#&\$*%@!].*".toRegex()
+
+ if (!caracter.matches(password)) { return false }
+ if (!number.matches(password)) { return false }
+ else if (!special.matches(password)) { return false }
+
+ return true
+ }
+
+ fun formatDate(date: String?): String? {
+ val f0 = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
+ val f1 = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
+
+ try {
+ val c = GregorianCalendar(Locale.getDefault())
+ c.time = f0.parse(date)
+ return f1.format(c.time)
+ }
+ catch (pe: ParseException) {
+ }
+ return ""
+ }
+
+ fun getAgency(value: String): String? {
+ val total = value.length
+ var campo1 = ""
+ var campo2 = ""
+ var campo3 = ""
+ for (c in 0 until total) {
+ val character = value[c].toString()
+ if (c < 2) {
+ campo1 += character
+ }
+ else if (c < total - 1) {
+ campo2 += character
+ }
+ else {
+ campo3 += character
+ }
+ }
+ return "$campo1.$campo2-$campo3"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/UtilsAnimation.kt b/app/src/main/java/br/com/testeandroidv2/utils/UtilsAnimation.kt
new file mode 100644
index 000000000..964a69b62
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/UtilsAnimation.kt
@@ -0,0 +1,21 @@
+package br.com.testeandroidv2.utils
+
+import androidx.appcompat.app.AppCompatActivity
+
+import br.com.testeandroidv2.R
+
+object UtilsAnimation {
+ /**
+ * Method to animate activity Left to Right
+ */
+ fun leftToRight(activity: AppCompatActivity) {
+ activity.overridePendingTransition(R.anim.lefttoright, R.anim.stable)
+ }
+
+ /**
+ * Method to animate activity Right to Left
+ */
+ fun rightToLeft(activity: AppCompatActivity) {
+ activity.overridePendingTransition(R.anim.righttoleft, R.anim.stable)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/Http.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/Http.kt
new file mode 100644
index 000000000..b9c0b5052
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/Http.kt
@@ -0,0 +1,171 @@
+package br.com.testeandroidv2.utils.http
+
+import java.io.*
+import java.net.HttpURLConnection
+import java.net.MalformedURLException
+import java.net.SocketTimeoutException
+import java.net.URL
+
+class Http(private val requestParams: MutableList?,
+ private val headerParams: MutableList?) {
+
+ companion object {
+ private const val DEFAULT_CHARSET = "UTF-8"
+ private const val SIXTY_SECONDS = 60000
+ }
+
+ fun sendGet(sendUrl: String?): HttpResponse? {
+ return send(sendUrl, null, HttpStatus.GET)
+ }
+
+ fun sendPost(sendUrl: String?, jsonBody: String?): HttpResponse? {
+ return send(sendUrl, jsonBody, HttpStatus.POST)
+ }
+
+ private fun send(sendUrl: String?, jsonBody: String?, method: Int?): HttpResponse? {
+ var result: HttpResponse? = null
+ var urlToRead: String? = sendUrl
+
+ val rd: BufferedReader
+ val start: Long = System.currentTimeMillis()
+ var connResponseMessage = ""
+ try {
+ // inicia
+ var line: String?
+ var urlParameters = ""
+ var sepa = if (method == HttpStatus.GET) { "?" } else { "" }
+ var requestMethod: String = when (method) {
+ HttpStatus.GET -> "GET"
+ HttpStatus.POST -> "POST"
+ HttpStatus.PUT -> "PUT"
+ HttpStatus.DELETE -> "DELETE"
+ else -> ""
+ }
+
+ if (requestMethod.isEmpty()) { return errorResponse() }
+
+ // verifica os params
+ requestParams?.forEach {
+ val linha = "${it.nome}=${it.valor}"
+ urlParameters += if (urlParameters.isNotEmpty()) { "&$linha" } else { "$sepa$linha" }
+ }
+
+ // incrementa a URL
+ if (urlParameters.isNotEmpty() && method == HttpStatus.GET) { urlToRead += urlParameters }
+
+ // realiza a conexao
+ val conn = URL(urlToRead).openConnection() as HttpURLConnection
+ conn.requestMethod = requestMethod
+ conn.doInput = true
+ conn.useCaches = false
+ conn.readTimeout = SIXTY_SECONDS
+ conn.connectTimeout = SIXTY_SECONDS
+
+ if (method == HttpStatus.POST) { conn.doOutput = true }
+
+ // verifica os headers
+ headerParams?.forEach { conn.setRequestProperty(it.nome, it.valor) }
+
+ if (method == HttpStatus.POST) {
+ // send data
+ val wr = DataOutputStream(conn.outputStream)
+
+ // parametrs
+ if (urlParameters.isNotEmpty()) {
+ wr.write(urlParameters.toByteArray(charset(DEFAULT_CHARSET)))
+ }
+
+ // JSON Object
+ if (jsonBody != null) {
+ wr.write(jsonBody.toByteArray(charset(DEFAULT_CHARSET)))
+ }
+
+ // flush send data
+ wr.flush()
+ wr.close()
+ }
+
+ // initialize InputStream
+ val input: InputStream
+
+ // status response
+ val codeStatus = conn.responseCode
+ connResponseMessage = conn.responseMessage
+
+ // verify status
+ input = if (codeStatus == HttpURLConnection.HTTP_OK ||
+ codeStatus == HttpURLConnection.HTTP_CREATED) {
+ conn.inputStream
+ }
+ else { conn.errorStream }
+
+ // seta o BufferReader
+ rd = BufferedReader(InputStreamReader(input, DEFAULT_CHARSET))
+
+ // message
+ var message: String? = ""
+
+ // percorre o arquivo e retorna o result
+ while (rd.readLine().also { line = it } != null) {
+ message += line
+ }
+
+ // set Result
+ result = HttpResponse()
+ result.codeHttp = codeStatus
+ result.codeError = 0
+ result.message = message
+ result.status = "OK"
+
+ // fecha o BufferedReader
+ rd.close()
+ conn.disconnect()
+ }
+ catch (me: MalformedURLException) {
+ connResponseMessage = "MalformedURLException: " + me.message
+ }
+ catch (ue: UnsupportedEncodingException) {
+ connResponseMessage = "UnsupportedEncodingException: " + ue.message
+ }
+ catch (ie: IOException) {
+ if (ie is SocketTimeoutException) {
+ result = HttpResponse()
+ result.codeHttp = HttpURLConnection.HTTP_CLIENT_TIMEOUT
+ result.codeError = 99
+ result.message = ""
+ result.status = "ERROR"
+ }
+ else {
+ connResponseMessage = "IOException: " + ie.message
+ }
+ }
+
+ if (result == null) {
+ result = HttpResponse()
+ result.codeHttp = HttpURLConnection.HTTP_BAD_REQUEST
+ result.codeError = 99
+ result.message = ""
+ result.status = "ERROR"
+ }
+
+ // calcula o tempo em milesegundos
+ val finish: Long = System.currentTimeMillis()
+ val total: Long = finish - start
+
+ // set Response
+ result.timeFinish = total
+ result.messageResponse = connResponseMessage
+
+ // retorna
+ return result
+ }
+
+ private fun errorResponse(): HttpResponse {
+ val response = HttpResponse()
+ response.codeHttp = HttpURLConnection.HTTP_BAD_REQUEST
+ response.codeError = 99
+ response.message = "Method invalid"
+ response.status = "Error"
+ return response
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/HttpAction.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpAction.kt
new file mode 100644
index 000000000..9a004d6a4
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpAction.kt
@@ -0,0 +1,43 @@
+package br.com.testeandroidv2.utils.http
+
+import java.net.HttpURLConnection
+import android.content.Context
+import org.json.JSONObject
+
+import br.com.testeandroidv2.utils.Utils
+
+class HttpAction(private val context: Context) {
+ private val requestParams: MutableList = emptyList().toMutableList()
+ private val headerParams: MutableList = emptyList().toMutableList()
+
+ fun add(name: String?, value: String?) { requestParams.add(HttpParams(name, value)) }
+ fun addHeader(name: String?, value: String?) { headerParams.add(HttpParams(name, value)) }
+
+ fun send(method: Int, urlSend: String, jsonBody: String?, callBack: HttpCallBack) {
+ if (!Utils.isInternetConnect(context)) {
+ callBack.onResponse(errorResponse())
+ return
+ }
+
+ HttpTask(
+ context,
+ method,
+ headerParams,
+ requestParams,
+ jsonBody,
+ object : HttpCallBack {
+ override fun onResponse(response: HttpResponse?) { callBack.onResponse(response) }
+ override fun onError(response: HttpResponse?) { callBack.onError(response) }
+ }
+ ).execute(urlSend)
+ }
+
+ private fun errorResponse(): HttpResponse {
+ val response = HttpResponse()
+ response.codeHttp = HttpURLConnection.HTTP_BAD_REQUEST
+ response.codeError = 99
+ response.message = "Internet Error"
+ response.status = "Error"
+ return response
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/HttpCallBack.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpCallBack.kt
new file mode 100644
index 000000000..e7a5fe222
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpCallBack.kt
@@ -0,0 +1,6 @@
+package br.com.testeandroidv2.utils.http
+
+interface HttpCallBack {
+ fun onResponse(response: HttpResponse?)
+ fun onError(response: HttpResponse?)
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/HttpParams.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpParams.kt
new file mode 100644
index 000000000..11e21f621
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpParams.kt
@@ -0,0 +1,7 @@
+package br.com.testeandroidv2.utils.http
+
+import android.os.Parcelable
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class HttpParams(var nome: String? = null, var valor: String? = null) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/HttpResponse.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpResponse.kt
new file mode 100644
index 000000000..aa6f76b49
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpResponse.kt
@@ -0,0 +1,13 @@
+package br.com.testeandroidv2.utils.http
+
+import android.os.Parcelable
+
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class HttpResponse(var codeHttp: Int = 0,
+ var codeError: Int = 0,
+ var message: String? = null,
+ var status: String? = null,
+ var timeFinish: Long = 0,
+ var messageResponse: String? = null) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/HttpStatus.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpStatus.kt
new file mode 100644
index 000000000..00b9afdf7
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpStatus.kt
@@ -0,0 +1,10 @@
+package br.com.testeandroidv2.utils.http
+
+interface HttpStatus {
+ companion object {
+ const val GET = 1
+ const val POST = 2
+ const val PUT = 3
+ const val DELETE = 4
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/utils/http/HttpTask.kt b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpTask.kt
new file mode 100644
index 000000000..562e05a53
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/utils/http/HttpTask.kt
@@ -0,0 +1,53 @@
+package br.com.testeandroidv2.utils.http
+
+import java.net.HttpURLConnection
+import android.content.Context
+import android.os.AsyncTask
+
+import br.com.testeandroidv2.R
+
+class HttpTask(private val context: Context,
+ private val method: Int,
+ private val headerParams: MutableList?,
+ private val requestParams: MutableList?,
+ private val jsonBody: String?,
+ private val callBack: HttpCallBack?) : AsyncTask() {
+
+ override fun doInBackground(vararg params: String?): HttpResponse? {
+ val sendUrl: String? = params[0]
+ val http = Http(requestParams, headerParams)
+ return when (method) {
+ HttpStatus.GET -> http.sendGet(sendUrl)
+ HttpStatus.POST -> http.sendPost(sendUrl, jsonBody)
+ HttpStatus.PUT -> null
+ HttpStatus.DELETE -> null
+ else -> null
+ }
+ }
+
+ override fun onPostExecute(response: HttpResponse?) {
+ if (callBack != null && response != null) {
+ val codeHttp = response.codeHttp
+
+ if (codeHttp == HttpURLConnection.HTTP_OK ||
+ codeHttp == HttpURLConnection.HTTP_CREATED) {
+ if (response.status == "ERROR") {
+ callBack.onError(response)
+ }
+ else {
+ callBack.onResponse(response)
+ }
+ }
+ else {
+ if (codeHttp == HttpURLConnection.HTTP_CLIENT_TIMEOUT) {
+ response.message = context.getString(R.string.conection_error)
+ }
+
+ callBack.onError(response)
+ }
+ }
+ else {
+ callBack!!.onError(response)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/view/DefaultActivity.kt b/app/src/main/java/br/com/testeandroidv2/view/DefaultActivity.kt
new file mode 100644
index 000000000..53c0ffa9c
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/view/DefaultActivity.kt
@@ -0,0 +1,62 @@
+package br.com.testeandroidv2.view
+
+import android.app.Activity
+import android.content.DialogInterface
+import android.view.KeyEvent
+
+import androidx.appcompat.app.ActionBar
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.Toolbar
+
+import br.com.testeandroidv2.R
+import br.com.testeandroidv2.utils.UtilsAnimation
+import br.com.testeandroidv2.view.listener.OnCallback
+
+abstract class DefaultActivity : AppCompatActivity() {
+ private var actionBar: ActionBar? = null
+ private var mToolbar: Toolbar? = null
+
+ fun setupToolBar(resource: Int) {
+ mToolbar = findViewById(resource)
+ setSupportActionBar(mToolbar)
+ actionBar = supportActionBar
+ }
+
+ fun setActionBarHome() { actionBar?.setHomeButtonEnabled(true) }
+ fun setActionBarHomeButton() { actionBar?.setDisplayHomeAsUpEnabled(true) }
+
+ fun setActionBarNotHome() { actionBar?.setHomeButtonEnabled(false) }
+ fun setActionBarNotHomeButton() { actionBar?.setDisplayHomeAsUpEnabled(false) }
+
+ fun setActionBarTitle(title: String) { actionBar?.title = title }
+ fun setActionBarTitle(title: Int) { actionBar?.title = getString(title) }
+
+ fun setActionBarSubTitle(title: String) { actionBar?.subtitle = title }
+ fun setActionBarSubTitle(title: Int) { actionBar?.subtitle = getString(title) }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ back(Activity.RESULT_CANCELED)
+ true
+ }
+ else {
+ super.onKeyDown(keyCode, event)
+ }
+ }
+
+ fun animLeftToRight() { UtilsAnimation.leftToRight(this) }
+ fun animRightToLeft() { UtilsAnimation.rightToLeft(this) }
+
+ fun msgBox(msg: String, callback: OnCallback) {
+ val dialog = AlertDialog.Builder(this, R.style.AlertDialogTheme)
+ dialog.setMessage(msg)
+ dialog.setCancelable(false)
+ dialog.setPositiveButton("OK") { dialog1: DialogInterface?, whichButton: Int ->
+ callback.onSuccess()
+ }
+ dialog.create().show()
+ }
+
+ abstract fun back(resultCode: Int)
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/view/LoginActivity.kt b/app/src/main/java/br/com/testeandroidv2/view/LoginActivity.kt
new file mode 100644
index 000000000..967b0a77b
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/view/LoginActivity.kt
@@ -0,0 +1,117 @@
+package br.com.testeandroidv2.view
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.method.PasswordTransformationMethod
+import android.view.View
+import android.view.inputmethod.EditorInfo
+import android.widget.Button
+
+import com.google.android.material.textfield.TextInputEditText
+import com.google.android.material.textfield.TextInputLayout
+
+import br.com.testeandroidv2.R
+import br.com.testeandroidv2.model.bean.LoginBean
+import br.com.testeandroidv2.presenter.login.MVP
+import br.com.testeandroidv2.presenter.login.Presenter
+import br.com.testeandroidv2.utils.Utils
+import br.com.testeandroidv2.view.components.Progress
+import br.com.testeandroidv2.view.listener.OnCallback
+
+class LoginActivity : DefaultActivity(), MVP.View {
+ private lateinit var progress: Progress
+ private lateinit var btnLoginEnter: Button
+ private lateinit var userLogin: TextInputEditText
+ private lateinit var passLogin: TextInputEditText
+ private lateinit var presenter: MVP.Presenter
+ private lateinit var passLoginInput: TextInputLayout
+ private lateinit var userLoginInput: TextInputLayout
+
+ private var enableText: Boolean = false
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(R.layout.activity_login)
+
+ progress = findViewById(R.id.progressLogin)
+ progress.hide()
+
+ userLoginInput = findViewById(R.id.userLoginInput)
+ passLoginInput = findViewById(R.id.passLoginInput)
+ userLogin = findViewById(R.id.userLogin)
+ passLogin = findViewById(R.id.passLogin)
+ passLogin.setOnEditorActionListener{ textView, actionId, keyEvent ->
+ when(actionId) {
+ EditorInfo.IME_ACTION_DONE -> {
+ enter()
+ false
+ }
+ else -> false
+ }
+ }
+
+ btnLoginEnter = findViewById(R.id.btnLoginEnter)
+ btnLoginEnter.setOnClickListener { enter() }
+
+ presenter = Presenter()
+ presenter.setView(this)
+ }
+
+ private fun setupPasswordToggleView(field: TextInputEditText, enable: Boolean) {
+ passLogin.transformationMethod = when(enable) {
+ true -> null
+ false -> PasswordTransformationMethod()
+ else -> PasswordTransformationMethod()
+ }
+ }
+
+ private fun enter() {
+ val user: String = userLogin.editableText.toString()
+ val password: String = passLogin.editableText.toString()
+
+ if (user.isEmpty()) {
+ userLoginInput.error = getString(R.string.login_error1)
+ return
+ }
+ else if (user.isEmpty()) {
+ passLoginInput.error = getString(R.string.login_error2)
+ return
+ }
+ else if (!Utils.isValidPassword(password)) {
+ msgBox(getString(R.string.login_error3), object : OnCallback {
+ override fun onSuccess() {}
+ })
+ return
+ }
+
+ presenter.loadLogin(user, password)
+ }
+
+ private fun statements(loginBean: LoginBean) {
+ val bundle = Bundle()
+ bundle.putParcelable("LOGIN_DATA", loginBean)
+
+ val intent = Intent(this, StatementsActivity::class.java)
+ intent.putExtras(bundle)
+
+ startActivity(intent)
+ finish()
+ animRightToLeft()
+ }
+
+ override fun showProgressBar(visible: Int) {
+ when(visible) {
+ View.VISIBLE -> progress.show()
+ View.GONE -> progress.hide()
+ }
+ }
+
+ override fun updateData(loginBean: LoginBean) {
+ msgBox(getString(R.string.login_ok), object : OnCallback {
+ override fun onSuccess() { statements(loginBean) }
+ })
+ }
+
+ override fun back(resultCode: Int) { finish() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/view/StatementsActivity.kt b/app/src/main/java/br/com/testeandroidv2/view/StatementsActivity.kt
new file mode 100644
index 000000000..3c0407ede
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/view/StatementsActivity.kt
@@ -0,0 +1,106 @@
+package br.com.testeandroidv2.view
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.os.Handler
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import android.widget.TextView
+
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+
+import br.com.testeandroidv2.R
+import br.com.testeandroidv2.model.bean.LoginBean
+import br.com.testeandroidv2.presenter.statements.Presenter
+import br.com.testeandroidv2.presenter.statements.MVP
+import br.com.testeandroidv2.utils.Utils
+import br.com.testeandroidv2.view.adapter.ItemAdapter
+import br.com.testeandroidv2.view.components.Progress
+
+class StatementsActivity : DefaultActivity(), MVP.View {
+ private lateinit var progress: Progress
+ private lateinit var accountNumber: TextView
+ private lateinit var accountSaldo: TextView
+ private lateinit var presenter: MVP.Presenter
+ private lateinit var adapter: ItemAdapter
+ private lateinit var rv: RecyclerView
+
+ private var loginBean: LoginBean? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(R.layout.activity_statements)
+
+ val bundle: Bundle? = intent.extras
+ if (bundle != null) {
+ loginBean = bundle.getParcelable("LOGIN_DATA")
+ }
+
+ setupToolBar(R.id.toolbar)
+ setActionBarTitle(loginBean!!.name)
+ setActionBarSubTitle("")
+
+ progress = findViewById(R.id.progress)
+ progress.hide()
+
+ accountNumber = findViewById(R.id.accountNumber)
+ accountSaldo = findViewById(R.id.accountSaldo)
+
+ accountNumber.text = loginBean!!.bankAccount + " / " + Utils.getAgency(loginBean!!.agency)
+ accountSaldo.text = "R$" + Utils.formatDecimal(loginBean!!.balance)
+
+ presenter = Presenter()
+ presenter.setView(this)
+ presenter.loadList(loginBean!!.userId)
+
+ Handler().postDelayed({ onLoad() }, 100)
+ }
+
+ private fun onLoad() {
+ val layoutManager = LinearLayoutManager(this)
+ layoutManager.orientation = LinearLayoutManager.VERTICAL
+
+ adapter = ItemAdapter(presenter.items)
+
+ rv = findViewById(R.id.rv)
+ rv.setHasFixedSize(true)
+ rv.layoutManager = layoutManager
+ rv.adapter = adapter
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ menuInflater.inflate(R.menu.main, menu)
+ return true
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ return when(item.itemId) {
+ R.id.action_logout -> {
+ back(Activity.RESULT_OK)
+ true
+ }
+ else -> super.onOptionsItemSelected(item)
+ }
+ }
+
+ override fun showProgressBar(visible: Int) {
+ when(visible) {
+ View.VISIBLE -> progress.show()
+ View.GONE -> progress.hide()
+ }
+ }
+
+ override fun updateListRecycler() {
+ adapter.notifyDataSetChanged()
+ }
+
+ override fun back(resultCode: Int) {
+ startActivity(Intent(this, LoginActivity::class.java))
+ finish()
+ animLeftToRight()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/view/adapter/ItemAdapter.kt b/app/src/main/java/br/com/testeandroidv2/view/adapter/ItemAdapter.kt
new file mode 100644
index 000000000..36d84905f
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/view/adapter/ItemAdapter.kt
@@ -0,0 +1,46 @@
+package br.com.testeandroidv2.view.adapter
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+
+import androidx.recyclerview.widget.RecyclerView
+
+import br.com.testeandroidv2.R
+import br.com.testeandroidv2.model.statements.gson.StatementList
+import br.com.testeandroidv2.utils.Utils
+
+class ItemAdapter(private val list: MutableList) : RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val view = LayoutInflater
+ .from(parent.context)
+ .inflate(R.layout.item, parent, false)
+ return ViewHolder(view)
+ }
+
+ override fun getItemCount(): Int = list.size
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val item: StatementList = getItem(position)
+
+ holder.apply {
+ itemColumn1.text = item.title
+ itemColumn2.text = item.desc
+ itemColumn3.text = Utils.formatDate(item.date)
+ itemColumn4.text = "R$" + Utils.formatDecimal(item.value)
+ }
+ }
+
+ fun getItem(position: Int): StatementList = list[position]
+
+ class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
+ val itemColumn1: TextView = itemView.findViewById(R.id.itemColumn1)
+ val itemColumn2: TextView = itemView.findViewById(R.id.itemColumn2)
+ val itemColumn3: TextView = itemView.findViewById(R.id.itemColumn3)
+ val itemColumn4: TextView = itemView.findViewById(R.id.itemColumn4)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/view/components/Progress.kt b/app/src/main/java/br/com/testeandroidv2/view/components/Progress.kt
new file mode 100644
index 000000000..b211a512e
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/view/components/Progress.kt
@@ -0,0 +1,32 @@
+package br.com.testeandroidv2.view.components
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.LinearLayout
+import androidx.core.content.ContextCompat
+
+import br.com.testeandroidv2.R
+
+class Progress(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
+ lateinit var view: View
+
+ init {
+ start(context, attrs)
+ }
+
+ private fun start(context: Context, attrs: AttributeSet) {
+ // seta o Background
+ setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent))
+
+ // pega o inflater
+ val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
+
+ // pega a View
+ view = inflater.inflate(R.layout.progress, this)
+ }
+
+ fun show() { view.visibility = View.VISIBLE }
+ fun hide() { view.visibility = View.GONE }
+}
\ No newline at end of file
diff --git a/app/src/main/java/br/com/testeandroidv2/view/listener/OnCallback.kt b/app/src/main/java/br/com/testeandroidv2/view/listener/OnCallback.kt
new file mode 100644
index 000000000..90d801033
--- /dev/null
+++ b/app/src/main/java/br/com/testeandroidv2/view/listener/OnCallback.kt
@@ -0,0 +1,5 @@
+package br.com.testeandroidv2.view.listener
+
+interface OnCallback {
+ fun onSuccess()
+}
\ No newline at end of file
diff --git a/app/src/main/res/anim/lefttoright.xml b/app/src/main/res/anim/lefttoright.xml
new file mode 100644
index 000000000..d0b1d9f76
--- /dev/null
+++ b/app/src/main/res/anim/lefttoright.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/righttoleft.xml b/app/src/main/res/anim/righttoleft.xml
new file mode 100644
index 000000000..ca2976d5e
--- /dev/null
+++ b/app/src/main/res/anim/righttoleft.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/stable.xml b/app/src/main/res/anim/stable.xml
new file mode 100644
index 000000000..bcbe4235a
--- /dev/null
+++ b/app/src/main/res/anim/stable.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ 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/bank.xml b/app/src/main/res/drawable/bank.xml
new file mode 100644
index 000000000..533165c3a
--- /dev/null
+++ b/app/src/main/res/drawable/bank.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/box.xml b/app/src/main/res/drawable/box.xml
new file mode 100644
index 000000000..027a06f51
--- /dev/null
+++ b/app/src/main/res/drawable/box.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_ok.xml b/app/src/main/res/drawable/btn_ok.xml
new file mode 100644
index 000000000..179638fef
--- /dev/null
+++ b/app/src/main/res/drawable/btn_ok.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_ok_off.xml b/app/src/main/res/drawable/btn_ok_off.xml
new file mode 100644
index 000000000..471115a5d
--- /dev/null
+++ b/app/src/main/res/drawable/btn_ok_off.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_ok_on.xml b/app/src/main/res/drawable/btn_ok_on.xml
new file mode 100644
index 000000000..d659046c1
--- /dev/null
+++ b/app/src/main/res/drawable/btn_ok_on.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
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/text_input_box_stroke.xml b/app/src/main/res/drawable/text_input_box_stroke.xml
new file mode 100644
index 000000000..00c5088a4
--- /dev/null
+++ b/app/src/main/res/drawable/text_input_box_stroke.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
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..b74969343
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login_fields.xml b/app/src/main/res/layout/activity_login_fields.xml
new file mode 100644
index 000000000..e645781ae
--- /dev/null
+++ b/app/src/main/res/layout/activity_login_fields.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_statements.xml b/app/src/main/res/layout/activity_statements.xml
new file mode 100644
index 000000000..d83fd736b
--- /dev/null
+++ b/app/src/main/res/layout/activity_statements.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_bar.xml b/app/src/main/res/layout/app_bar.xml
new file mode 100644
index 000000000..626200c0e
--- /dev/null
+++ b/app/src/main/res/layout/app_bar.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item.xml b/app/src/main/res/layout/item.xml
new file mode 100644
index 000000000..e93c23799
--- /dev/null
+++ b/app/src/main/res/layout/item.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/progress.xml b/app/src/main/res/layout/progress.xml
new file mode 100644
index 000000000..d68d9a46a
--- /dev/null
+++ b/app/src/main/res/layout/progress.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
new file mode 100644
index 000000000..6407ebf2b
--- /dev/null
+++ b/app/src/main/res/menu/main.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..eca70cfe5
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..eca70cfe5
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..a571e6009
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 000000000..61da551c5
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..c41dd2853
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 000000000..db5080a75
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_logout.webp b/app/src/main/res/mipmap-mdpi/ic_logout.webp
new file mode 100644
index 000000000..e863abc8e
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_logout.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..6dba46dab
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..da31a871c
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..15ac68172
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..b216f2d31
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..f25a41974
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..e96783ccc
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000..83f353018
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,13 @@
+
+
+ #3B49EE
+ #3B49EE
+ #A8B4C4
+ #FEFEFE
+ #FFFFFF
+ #803B49EE
+ #95000000
+ #A8B4C4
+ #485465
+ #A8B4C4
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 000000000..20d3a5325
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,24 @@
+
+ TesteAndroidv2
+ Aguarde…
+ ERRO
+ Falha de conexão. Por favor, tente novamente mais tarde.
+
+
+ Bank
+ User
+ Password
+ Login
+ O campo User deve ser digitado
+ O campo Password deve ser digitado
+ A senha deve ter pelo menos uma letra maiuscula, um caracter especial e um caracter alfanumérico
+ Login realizado com sucesso
+
+
+ Conta
+ Saldo
+ Recentes
+ R$1.000,00
+ Logut
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 000000000..a375a7923
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/test/java/br/com/testeandroidv2/ExampleUnitTest.kt b/app/src/test/java/br/com/testeandroidv2/ExampleUnitTest.kt
new file mode 100644
index 000000000..92791fcc0
--- /dev/null
+++ b/app/src/test/java/br/com/testeandroidv2/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package br.com.testeandroidv2
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@0.5x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@0.5x.png
deleted file mode 100644
index 53a1cdeb7..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@1x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@1x.png
deleted file mode 100644
index fb33afda6..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@1x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@2x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@2x.png
deleted file mode 100644
index 5f7313021..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@2x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@3x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@3x.png
deleted file mode 100644
index 1eda7465e..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/3817562E-CBB6-4CAD-BBCF-FD468BAA446F@3x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@0.5x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@0.5x.png
deleted file mode 100644
index b79e2ecfb..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@1x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@1x.png
deleted file mode 100644
index b961132ed..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@1x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@2x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@2x.png
deleted file mode 100644
index a9483ea0f..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@2x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@3x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@3x.png
deleted file mode 100644
index af2a6f7bb..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/B27D4452-A3F9-4F53-991A-9E914520B88A@3x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@0.5x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@0.5x.png
deleted file mode 100644
index 08ae82bd9..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@1x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@1x.png
deleted file mode 100644
index 66948cabd..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@1x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@2x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@2x.png
deleted file mode 100644
index 0d20e8026..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@2x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@3x.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@3x.png
deleted file mode 100644
index 8d42293ac..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/CA2B476F-0F1E-42F9-B119-2A2B3380A4D4@3x.png and /dev/null differ
diff --git a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/artboard.png b/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/artboard.png
deleted file mode 100644
index 20c1aa4bb..000000000
Binary files a/bank_app_layout/83F6DA3D-9F1B-4816-92B9-A74AAED40206/artboard.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@0.5x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@0.5x.png
deleted file mode 100644
index fed7233bc..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@1x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@1x.png
deleted file mode 100644
index 5899f020f..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@1x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@2x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@2x.png
deleted file mode 100644
index 2315098f8..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@2x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@3x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@3x.png
deleted file mode 100644
index e47f46018..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/39D04EF6-4A67-4ED6-A6AC-624922CFD8A1@3x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@0.5x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@0.5x.png
deleted file mode 100644
index 242c3fdaf..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@1x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@1x.png
deleted file mode 100644
index 23ff4626f..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@1x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@2x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@2x.png
deleted file mode 100644
index 35d07a14f..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@2x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@3x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@3x.png
deleted file mode 100644
index 97b68a58f..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805@3x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@0.5x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@0.5x.png
deleted file mode 100644
index 117de969e..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@1x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@1x.png
deleted file mode 100644
index 5ff77a675..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@1x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@2x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@2x.png
deleted file mode 100644
index 73b2edbac..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@2x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@3x.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@3x.png
deleted file mode 100644
index beba6c0cf..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/68A7CB4F-8C7B-480B-B544-271AB428EE8A@3x.png and /dev/null differ
diff --git a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/artboard.png b/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/artboard.png
deleted file mode 100644
index 9befa0cc5..000000000
Binary files a/bank_app_layout/CCA3949D-B416-466A-8949-425E5DCD35B5/artboard.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@0.5x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@0.5x.png
deleted file mode 100644
index 10ad360f4..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@1x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@1x.png
deleted file mode 100644
index 5fbb12417..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@1x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@2x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@2x.png
deleted file mode 100644
index fde4b9b75..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@2x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@3x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@3x.png
deleted file mode 100644
index af0e0ac72..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/05376719-28C6-4537-A0B4-097E3C72AB41@3x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@0.5x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@0.5x.png
deleted file mode 100644
index ec991238a..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@1x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@1x.png
deleted file mode 100644
index 7307b9e13..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@1x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@2x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@2x.png
deleted file mode 100644
index 1178f890d..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@2x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@3x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@3x.png
deleted file mode 100644
index f0d400bea..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/372B9348-D602-4A3B-8E91-A66250670461@3x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@0.5x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@0.5x.png
deleted file mode 100644
index 5066a058b..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@1x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@1x.png
deleted file mode 100644
index 831e7bb47..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@1x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@2x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@2x.png
deleted file mode 100644
index d857b805a..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@2x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@3x.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@3x.png
deleted file mode 100644
index d91b98e6d..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/D78AA366-D361-4FA8-AACE-0B91A0581654@3x.png and /dev/null differ
diff --git a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/artboard.png b/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/artboard.png
deleted file mode 100644
index 2acdd074b..000000000
Binary files a/bank_app_layout/D66AAA24-D61F-44D2-8D53-8B219D009DBF/artboard.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@0.5x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@0.5x.png
deleted file mode 100644
index 535dafe15..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@1x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@1x.png
deleted file mode 100644
index 466ef1c09..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@1x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@2x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@2x.png
deleted file mode 100644
index cb118e91b..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@2x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@3x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@3x.png
deleted file mode 100644
index a650b8199..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/CDEBC6CD-73C4-47CB-B879-8A426D8163E1@3x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@0.5x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@0.5x.png
deleted file mode 100644
index de8e4b18f..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@0.5x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@1x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@1x.png
deleted file mode 100644
index d720a4f0d..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@1x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@2x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@2x.png
deleted file mode 100644
index 9f57e7902..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@2x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@3x.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@3x.png
deleted file mode 100644
index fee69c198..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/E3013759-B45A-4E98-8B34-278A50F98591@3x.png and /dev/null differ
diff --git a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/artboard.png b/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/artboard.png
deleted file mode 100644
index c620ef44d..000000000
Binary files a/bank_app_layout/E822A087-B20C-42DD-8665-FE03A4AA8211/artboard.png and /dev/null differ
diff --git a/bank_app_layout/assets/Logo.png b/bank_app_layout/assets/Logo.png
deleted file mode 100644
index 66bdc8d5d..000000000
Binary files a/bank_app_layout/assets/Logo.png and /dev/null differ
diff --git a/bank_app_layout/assets/logout 2.png b/bank_app_layout/assets/logout 2.png
deleted file mode 100644
index de1e4ae3c..000000000
Binary files a/bank_app_layout/assets/logout 2.png and /dev/null differ
diff --git a/bank_app_layout/data.js b/bank_app_layout/data.js
deleted file mode 100644
index a692702f5..000000000
--- a/bank_app_layout/data.js
+++ /dev/null
@@ -1 +0,0 @@
-var pageData = {"exportEveryLayer":1,"sketchName":"","language":"en","I18N":{"UNIT":"Unit","SIZE":"Size","SHOWSLICE":"Show slices","DRAGTOSAVE":"Drag to desktop to save.","WIDTH":"Width","HEIGHT":"Height","BORDER":"Border","COLOR":"Color","FILLCOLOR":"Fill","RADIUS":"Radius","LAYERTEXT":"Content","FONTSIZE":"Font Size","CODE":"Code","EXPORT":"Export","FORMAT":"Format","EXPORTLAYER":"Export Activity Layer","COPYSUCCESS":"Copy Success","TEXTSHAREDSTYLE":"Text Styles","SHAPESHAREDSTYLE":"Layer Styles"},"pageOrder":["E1DD8600-6E88-4482-9447-55D03DD87354","6774A219-5AFB-46B1-8AD2-8BE278B93378"],"pageData":{"E1DD8600-6E88-4482-9447-55D03DD87354":{"pageId":"E1DD8600-6E88-4482-9447-55D03DD87354","name":"Symbols","artboardId":["D66AAA24-D61F-44D2-8D53-8B219D009DBF","CCA3949D-B416-466A-8949-425E5DCD35B5"]},"6774A219-5AFB-46B1-8AD2-8BE278B93378":{"pageId":"6774A219-5AFB-46B1-8AD2-8BE278B93378","name":"Page%201","artboardId":["E822A087-B20C-42DD-8665-FE03A4AA8211","83F6DA3D-9F1B-4816-92B9-A74AAED40206"]}},"artboard":{"D66AAA24-D61F-44D2-8D53-8B219D009DBF":{"id":"D66AAA24-D61F-44D2-8D53-8B219D009DBF","src":"D66AAA24-D61F-44D2-8D53-8B219D009DBF","name":"Status%20Bar%2FBlack%2F100%25","type":"MSSymbolMaster","x":100,"y":0,"zIndex":0,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"8F28FC9A-816F-4541-8734-BC8EF14D685F","slice":[],"layer":[{"id":"372B9348-D602-4A3B-8E91-A66250670461","src":"372B9348-D602-4A3B-8E91-A66250670461","name":"Battery","type":"MSShapeGroup","x":445,"y":6,"zIndex":1,"width":25,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#030303","border-radius":"1.5px","width":"25px","height":"10px"},"radius":"1.5","background":"#030303"},{"id":"6CE93654-D8D2-4BD3-85AF-C2D9A33E8979","src":"6CE93654-D8D2-4BD3-85AF-C2D9A33E8979","name":"100%25","type":"MSTextLayer","x":409,"y":4,"zIndex":2,"width":33,"height":14,"sharedStyleType":"","sharedStyle":"","html":"100%25","style":{"font-family":"Helvetica","font-size":"12px","color":"#030303","letter-spacing":"0","text-align":"right"}},{"id":"5DE5A561-10FF-40B7-864C-B93F09A30B82","src":"5DE5A561-10FF-40B7-864C-B93F09A30B82","name":"9%3A41%20AM","type":"MSTextLayer","x":263,"y":4,"zIndex":3,"width":49,"height":14,"sharedStyleType":"","sharedStyle":"","html":"9%3A41%20AM","style":{"font-family":"Helvetica","font-size":"12px","color":"#030303","letter-spacing":"0","text-align":"center"}},{"id":"05376719-28C6-4537-A0B4-097E3C72AB41","src":"05376719-28C6-4537-A0B4-097E3C72AB41","name":"Wi-Fi","type":"MSShapeGroup","x":188,"y":6,"zIndex":4,"width":13,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#030303","width":"13px","height":"10px"},"background":"#030303"},{"id":"5B618E12-BBE6-411D-85B1-8668F4646AC1","src":"5B618E12-BBE6-411D-85B1-8668F4646AC1","name":"Carrier","type":"MSTextLayer","x":144,"y":4,"zIndex":5,"width":40,"height":14,"sharedStyleType":"","sharedStyle":"","html":"Sketch","style":{"font-family":"Helvetica","font-size":"12px","color":"#030303","letter-spacing":"0","text-align":"left"}},{"id":"D78AA366-D361-4FA8-AACE-0B91A0581654","src":"D78AA366-D361-4FA8-AACE-0B91A0581654","name":"Mobile%20Signal","type":"MSShapeGroup","x":107,"y":8,"zIndex":6,"width":34,"height":6,"sharedStyleType":"","sharedStyle":"","style":{"background":"#030303","width":"34px","height":"6px"},"background":"#030303"}],"mask":{}},"CCA3949D-B416-466A-8949-425E5DCD35B5":{"id":"CCA3949D-B416-466A-8949-425E5DCD35B5","src":"CCA3949D-B416-466A-8949-425E5DCD35B5","name":"Status%20Bar%2FWhite%2F100%25","type":"MSSymbolMaster","x":100,"y":120,"zIndex":0,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"FC386540-E94F-407E-88AC-44E4621D13CF","slice":[],"layer":[{"id":"68A7CB4F-8C7B-480B-B544-271AB428EE8A","src":"68A7CB4F-8C7B-480B-B544-271AB428EE8A","name":"Battery","type":"MSShapeGroup","x":445,"y":126,"zIndex":1,"width":25,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#ffffff","border-radius":"1.5px","width":"25px","height":"10px"},"radius":"1.5","background":"#ffffff"},{"id":"D4D25776-86EB-4EB6-8037-476B91D3D811","src":"D4D25776-86EB-4EB6-8037-476B91D3D811","name":"100%25","type":"MSTextLayer","x":409,"y":124,"zIndex":2,"width":33,"height":14,"sharedStyleType":"","sharedStyle":"","html":"100%25","style":{"font-family":"Helvetica","font-size":"12px","color":"#ffffff","letter-spacing":"0","text-align":"right"}},{"id":"A14DAE1C-2900-467F-B2EA-41189DAF5B7D","src":"A14DAE1C-2900-467F-B2EA-41189DAF5B7D","name":"9%3A41%20AM","type":"MSTextLayer","x":263,"y":124,"zIndex":3,"width":49,"height":14,"sharedStyleType":"","sharedStyle":"","html":"9%3A41%20AM","style":{"font-family":"Helvetica","font-size":"12px","color":"#ffffff","letter-spacing":"0","text-align":"center"}},{"id":"39D04EF6-4A67-4ED6-A6AC-624922CFD8A1","src":"39D04EF6-4A67-4ED6-A6AC-624922CFD8A1","name":"Wi-Fi","type":"MSShapeGroup","x":188,"y":126,"zIndex":4,"width":13,"height":10,"sharedStyleType":"","sharedStyle":"","style":{"background":"#ffffff","width":"13px","height":"10px"},"background":"#ffffff"},{"id":"FDA2694C-D63C-41E9-A93A-4BF70C3F3364","src":"FDA2694C-D63C-41E9-A93A-4BF70C3F3364","name":"Carrier","type":"MSTextLayer","x":144,"y":124,"zIndex":5,"width":40,"height":14,"sharedStyleType":"","sharedStyle":"","html":"Sketch","style":{"font-family":"Helvetica","font-size":"12px","color":"#ffffff","letter-spacing":"0","text-align":"left"}},{"id":"4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805","src":"4F2CC5EF-170E-45CA-94D1-9BCD2FA4A805","name":"Mobile%20Signal","type":"MSShapeGroup","x":107,"y":128,"zIndex":6,"width":34,"height":6,"sharedStyleType":"","sharedStyle":"","style":{"background":"#ffffff","width":"34px","height":"6px"},"background":"#ffffff"}],"mask":{}},"E822A087-B20C-42DD-8665-FE03A4AA8211":{"id":"E822A087-B20C-42DD-8665-FE03A4AA8211","src":"E822A087-B20C-42DD-8665-FE03A4AA8211","name":"Location","type":"MSArtboardGroup","x":513,"y":55,"zIndex":0,"width":375,"height":667,"sharedStyleType":"","sharedStyle":"","slice":[],"layer":[{"id":"12DBC3B3-F637-40BB-AE47-0B1653A29FFC","src":"12DBC3B3-F637-40BB-AE47-0B1653A29FFC","name":"login","type":"MSTextLayer","x":680,"y":644,"zIndex":0,"width":42,"height":36,"sharedStyleType":"","sharedStyle":"","html":"Login%0A","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#ffffff","letter-spacing":"0.44px","text-align":"left"}},{"id":"A9F8A6FB-8379-4EF3-A6A9-B93581CF3A25","src":"A9F8A6FB-8379-4EF3-A6A9-B93581CF3A25","name":"Password","type":"MSTextLayer","x":543,"y":370,"zIndex":1,"width":69,"height":23,"sharedStyleType":"","sharedStyle":"","html":"Password","style":{"font-family":"HelveticaNeue","font-size":"15px","color":"#a8b4c4","letter-spacing":"0.29px","text-align":"center","line-height":"23px"}},{"id":"4D1D953A-F49D-42D4-AC1B-051E802681E8","src":"4D1D953A-F49D-42D4-AC1B-051E802681E8","name":"User","type":"MSTextLayer","x":543,"y":298,"zIndex":2,"width":33,"height":23,"sharedStyleType":"","sharedStyle":"","html":"User","style":{"font-family":"HelveticaNeue","font-size":"15px","color":"#a8b4c4","letter-spacing":"0.29px","text-align":"center","line-height":"23px"}},{"id":"CDEBC6CD-73C4-47CB-B879-8A426D8163E1","src":"CDEBC6CD-73C4-47CB-B879-8A426D8163E1","name":"Screen%20Shot%202018-10-18%20at%2022.49.51","type":"MSBitmapLayer","x":639,"y":111,"zIndex":3,"width":125,"height":70,"sharedStyleType":"","sharedStyle":""},{"id":"E3013759-B45A-4E98-8B34-278A50F98591","src":"E3013759-B45A-4E98-8B34-278A50F98591","name":"Status%20Bar%2FBlack%2F100%25","type":"MSSymbolInstance","x":513,"y":55,"zIndex":4,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"8F28FC9A-816F-4541-8734-BC8EF14D685F"}],"mask":{}},"83F6DA3D-9F1B-4816-92B9-A74AAED40206":{"id":"83F6DA3D-9F1B-4816-92B9-A74AAED40206","src":"83F6DA3D-9F1B-4816-92B9-A74AAED40206","name":"Currency","type":"MSArtboardGroup","x":988,"y":55,"zIndex":0,"width":375,"height":667,"sharedStyleType":"","sharedStyle":"","slice":[],"layer":[{"id":"09BAE240-CC06-46A5-B01E-A15117109EAC","src":"09BAE240-CC06-46A5-B01E-A15117109EAC","name":"Find%20out%20where","type":"MSTextLayer","x":1127,"y":491,"zIndex":0,"width":118,"height":18,"sharedStyleType":"","sharedStyle":"","html":"Find%20out%20where%20","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#ffffff","letter-spacing":"0.44px","text-align":"left"}},{"id":"2E3D38C9-2ED3-499B-BF39-008733AAE30C","src":"2E3D38C9-2ED3-499B-BF39-008733AAE30C","name":"Market%20rate%3A%201%20USD%20%3D","type":"MSTextLayer","x":1064,"y":420,"zIndex":1,"width":212,"height":17,"sharedStyleType":"","sharedStyle":"","html":"Market%20rate%3A%201%20USD%20%3D%200.8900%20EUR","style":{"font-family":"HelveticaNeue","font-size":"14px","color":"#a8b4c4","text-align":"center"}},{"id":"07B6D69B-B539-432D-A0F1-45428FCF5C13","src":"07B6D69B-B539-432D-A0F1-45428FCF5C13","name":"890%2C10","type":"MSTextLayer","x":1239,"y":351,"zIndex":2,"width":89,"height":33,"sharedStyleType":"","sharedStyle":"","html":"890%2C10","style":{"font-family":"HelveticaNeue-Light","font-size":"28px","color":"#485465","letter-spacing":"0.5px","text-align":"center"}},{"id":"99544A31-44A6-4BAD-B88E-99DDD345E9EA","src":"99544A31-44A6-4BAD-B88E-99DDD345E9EA","name":"1%20EUR%20%3D%201.123%20USD","type":"MSTextLayer","x":1216,"y":331,"zIndex":3,"width":110,"height":14,"sharedStyleType":"","sharedStyle":"","html":"1%20EUR%20%3D%201.123%20USD","style":{"font-family":"HelveticaNeue","font-size":"12px","color":"#a8b4c4","letter-spacing":"0.2px","text-align":"center"}},{"id":"66E60EFF-B648-4673-85F3-323550B705D3","src":"66E60EFF-B648-4673-85F3-323550B705D3","name":"EUR","type":"MSTextLayer","x":1065,"y":356,"zIndex":4,"width":49,"height":29,"sharedStyleType":"","sharedStyle":"","html":"EUR","style":{"font-family":"HelveticaNeue-Light","font-size":"25px","color":"#485465","text-align":"center"}},{"id":"B9A6B04C-614B-4F9E-8BD4-E59A0D050361","src":"B9A6B04C-614B-4F9E-8BD4-E59A0D050361","name":"I%20want","type":"MSTextLayer","x":1024,"y":325,"zIndex":5,"width":44,"height":18,"sharedStyleType":"","sharedStyle":"","html":"I%20want","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#a8b4c4","text-align":"center"}},{"id":"2B156AE2-C7CC-403A-AD6A-8414CCB60279","src":"2B156AE2-C7CC-403A-AD6A-8414CCB60279","name":"1%20000%2C00","type":"MSTextLayer","x":1214,"y":245,"zIndex":6,"width":113,"height":33,"sharedStyleType":"","sharedStyle":"","html":"1%20000%2C00","style":{"font-family":"HelveticaNeue-Light","font-size":"28px","color":"#485465","letter-spacing":"0.5px","text-align":"center"}},{"id":"246AE036-104B-41CF-B0F4-FCAEDF1CFC25","src":"246AE036-104B-41CF-B0F4-FCAEDF1CFC25","name":"1%20USD%20%3D%200.8900%20EUR","type":"MSTextLayer","x":1209,"y":224,"zIndex":7,"width":117,"height":14,"sharedStyleType":"","sharedStyle":"","html":"1%20USD%20%3D%200.8900%20EUR","style":{"font-family":"HelveticaNeue","font-size":"12px","color":"#a8b4c4","letter-spacing":"0.2px","text-align":"center"}},{"id":"3817562E-CBB6-4CAD-BBCF-FD468BAA446F","src":"3817562E-CBB6-4CAD-BBCF-FD468BAA446F","name":"Shape","type":"MSShapeGroup","x":1025,"y":247,"zIndex":8,"width":15,"height":15,"sharedStyleType":"","sharedStyle":"","style":{"background":"#0052b4","width":"15px","height":"15px"},"background":"#0052b4"},{"id":"D8815B79-8031-4DBF-AC66-0A035AD9905D","src":"D8815B79-8031-4DBF-AC66-0A035AD9905D","name":"USD","type":"MSTextLayer","x":1065,"y":248,"zIndex":9,"width":50,"height":29,"sharedStyleType":"","sharedStyle":"","html":"USD","style":{"font-family":"HelveticaNeue-Light","font-size":"25px","color":"#485465","text-align":"center"}},{"id":"4D7068B6-0C46-4E07-A300-CF23125F168C","src":"4D7068B6-0C46-4E07-A300-CF23125F168C","name":"I%20have","type":"MSTextLayer","x":1024,"y":218,"zIndex":10,"width":43,"height":18,"sharedStyleType":"","sharedStyle":"","html":"I%20have","style":{"font-family":"HelveticaNeue","font-size":"16px","color":"#a8b4c4","text-align":"center"}},{"id":"B27D4452-A3F9-4F53-991A-9E914520B88A","src":"B27D4452-A3F9-4F53-991A-9E914520B88A","name":"Shape","type":"MSShapeGroup","x":1016,"y":142,"zIndex":11,"width":11,"height":16,"sharedStyleType":"","sharedStyle":"","style":{"background":"#485465","width":"11px","height":"16px"},"background":"#485465"},{"id":"904C402D-FC98-45E0-9270-068D9717010D","src":"904C402D-FC98-45E0-9270-068D9717010D","name":"Paris%2C%20France","type":"MSTextLayer","x":1042,"y":143,"zIndex":12,"width":100,"height":20,"sharedStyleType":"","sharedStyle":"","html":"Paris%2C%20France","style":{"font-family":"HelveticaNeue","font-size":"17px","color":"#485465","text-align":"center"}},{"id":"4EE21DE4-3DDC-4464-B264-4223F0236C08","src":"4EE21DE4-3DDC-4464-B264-4223F0236C08","name":"Looking%20for%20the%20best","type":"MSTextLayer","x":1012,"y":168,"zIndex":13,"width":284,"height":16,"sharedStyleType":"","sharedStyle":"","html":"Looking%20for%20the%20best%20exchange%20rates%20in%20Paris%3F","style":{"font-family":"HelveticaNeue","font-size":"14px","color":"#a8b4c4","text-align":"center"}},{"id":"45B169DE-B3B5-4D12-B1B3-25F826B339CB","src":"45B169DE-B3B5-4D12-B1B3-25F826B339CB","name":"Currency","type":"MSTextLayer","x":1142,"y":87,"zIndex":14,"width":67,"height":20,"sharedStyleType":"","sharedStyle":"","html":"Currency","style":{"font-family":".SFNSText","font-size":"17px","color":"#ffffff","letter-spacing":"-0.41px","text-align":"center"}},{"id":"CA2B476F-0F1E-42F9-B119-2A2B3380A4D4","src":"CA2B476F-0F1E-42F9-B119-2A2B3380A4D4","name":"Status%20Bar%2FWhite%2F100%25","type":"MSSymbolInstance","x":988,"y":55,"zIndex":15,"width":375,"height":20,"sharedStyleType":"","sharedStyle":"","symbolId":"FC386540-E94F-407E-88AC-44E4621D13CF"}],"mask":{}}}}
\ No newline at end of file
diff --git a/bank_app_layout/index.html b/bank_app_layout/index.html
deleted file mode 100644
index 28125fac2..000000000
--- a/bank_app_layout/index.html
+++ /dev/null
@@ -1,1569 +0,0 @@
-
-
-
-
-
-
- Spec Export - Sketch Measure 2.4
-
-
-
-
-
-
-
diff --git a/bank_app_layout/links/page-1-currency.html b/bank_app_layout/links/page-1-currency.html
deleted file mode 100644
index 5652fa211..000000000
--- a/bank_app_layout/links/page-1-currency.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/bank_app_layout/links/page-1-location.html b/bank_app_layout/links/page-1-location.html
deleted file mode 100644
index 5ca1854a1..000000000
--- a/bank_app_layout/links/page-1-location.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/bank_app_layout/preview/page-1-currency.png b/bank_app_layout/preview/page-1-currency.png
deleted file mode 100644
index d0c171355..000000000
Binary files a/bank_app_layout/preview/page-1-currency.png and /dev/null differ
diff --git a/bank_app_layout/preview/page-1-location.png b/bank_app_layout/preview/page-1-location.png
deleted file mode 100644
index c620ef44d..000000000
Binary files a/bank_app_layout/preview/page-1-location.png and /dev/null differ
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 000000000..71b78e029
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,26 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ ext.kotlin_version = "1.3.72"
+ 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
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 000000000..4d15d015f
--- /dev/null
+++ b/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=-Xmx2048m
+# 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
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..f6b961fd5
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..6f56a7390
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Jun 03 18:26:04 BRT 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 000000000..cccdd3d51
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 000000000..f9553162f
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 000000000..5473ec48b
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+include ':app'
+rootProject.name = "TesteAndroidv2"
\ No newline at end of file