diff --git a/Bank/.gitignore b/Bank/.gitignore new file mode 100644 index 000000000..aa724b770 --- /dev/null +++ b/Bank/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/Bank/.idea/.gitignore b/Bank/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/Bank/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Bank/.idea/compiler.xml b/Bank/.idea/compiler.xml new file mode 100644 index 000000000..b589d56e9 --- /dev/null +++ b/Bank/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Bank/.idea/deploymentTargetDropDown.xml b/Bank/.idea/deploymentTargetDropDown.xml new file mode 100644 index 000000000..3c051256c --- /dev/null +++ b/Bank/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Bank/.idea/gradle.xml b/Bank/.idea/gradle.xml new file mode 100644 index 000000000..ae388c2a5 --- /dev/null +++ b/Bank/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/Bank/.idea/kotlinc.xml b/Bank/.idea/kotlinc.xml new file mode 100644 index 000000000..2b8a50fc2 --- /dev/null +++ b/Bank/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Bank/.idea/misc.xml b/Bank/.idea/misc.xml new file mode 100644 index 000000000..8978d23db --- /dev/null +++ b/Bank/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/Bank/.idea/vcs.xml b/Bank/.idea/vcs.xml new file mode 100644 index 000000000..6c0b86358 --- /dev/null +++ b/Bank/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Bank/app/.gitignore b/Bank/app/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/Bank/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Bank/app/build.gradle.kts b/Bank/app/build.gradle.kts new file mode 100644 index 000000000..80e6a96a1 --- /dev/null +++ b/Bank/app/build.gradle.kts @@ -0,0 +1,64 @@ +import org.jetbrains.kotlin.storage.CacheResetOnProcessCanceled.enabled + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "com.jisellemartins.bank" + compileSdk = 33 + + defaultConfig { + applicationId = "com.jisellemartins.bank" + minSdk = 21 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + //noinspection DataBindingWithoutKapt + dataBinding = true + } + +} + +dependencies { + + implementation("androidx.core:core-ktx:1.9.0") + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.9.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + testImplementation("junit:junit:4.13.2") + testImplementation ("androidx.test:core:1.0.0") + testImplementation ("org.mockito:mockito-core:1.10.19") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + implementation ("io.insert-koin:koin-android:3.4.3") + implementation ("com.squareup.retrofit2:retrofit:2.9.0") + implementation ("com.google.code.gson:gson:2.10.1") + implementation("com.squareup.retrofit2:converter-gson:2.2.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") +} \ No newline at end of file diff --git a/Bank/app/proguard-rules.pro b/Bank/app/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/Bank/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Bank/app/release/app-release.apk b/Bank/app/release/app-release.apk new file mode 100644 index 000000000..065e71745 Binary files /dev/null and b/Bank/app/release/app-release.apk differ diff --git a/Bank/app/release/output-metadata.json b/Bank/app/release/output-metadata.json new file mode 100644 index 000000000..97cd867ff --- /dev/null +++ b/Bank/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.jisellemartins.bank", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/Bank/app/src/androidTest/java/com/jisellemartins/bank/ExampleInstrumentedTest.kt b/Bank/app/src/androidTest/java/com/jisellemartins/bank/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..a05685b49 --- /dev/null +++ b/Bank/app/src/androidTest/java/com/jisellemartins/bank/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.jisellemartins.bank + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.jisellemartins.bank", appContext.packageName) + } +} \ No newline at end of file diff --git a/Bank/app/src/main/AndroidManifest.xml b/Bank/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..85a28201c --- /dev/null +++ b/Bank/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/BankAplication.kt b/Bank/app/src/main/java/com/jisellemartins/bank/BankAplication.kt new file mode 100644 index 000000000..486863564 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/BankAplication.kt @@ -0,0 +1,18 @@ +package com.jisellemartins.bank + +import android.app.Application +import com.jisellemartins.bank.di.moduleGlobal +import org.koin.android.ext.koin.androidContext +import org.koin.android.ext.koin.androidLogger +import org.koin.core.context.GlobalContext + +class BankAplication:Application() { + override fun onCreate() { + super.onCreate() + GlobalContext.startKoin { + androidLogger() + androidContext(this@BankAplication) + modules(moduleGlobal) + } + } +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/di/ModuleGlobal.kt b/Bank/app/src/main/java/com/jisellemartins/bank/di/ModuleGlobal.kt new file mode 100644 index 000000000..a1f1018b1 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/di/ModuleGlobal.kt @@ -0,0 +1,18 @@ +package com.jisellemartins.bank.di + +import com.jisellemartins.bank.repositories.BankRepository +import com.jisellemartins.bank.service.BankService +import com.jisellemartins.bank.service.service +import com.jisellemartins.bank.viewmodel.LoginViewModel +import com.jisellemartins.bank.viewmodel.StatementsViewModel +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module +import retrofit2.Retrofit + +val moduleGlobal = module { + single { service.api } + single { get().create(BankService::class.java)} + single { BankRepository(get()) } + viewModel{ LoginViewModel(get())} + viewModel{ StatementsViewModel(get()) } +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/extensions/LiveDataExtension.kt b/Bank/app/src/main/java/com/jisellemartins/bank/extensions/LiveDataExtension.kt new file mode 100644 index 000000000..f4fdb8cce --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/extensions/LiveDataExtension.kt @@ -0,0 +1,6 @@ +package com.jisellemartins.bank.extensions + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData + +fun MutableLiveData.toLiveData() = this as LiveData \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/model/Credencials.kt b/Bank/app/src/main/java/com/jisellemartins/bank/model/Credencials.kt new file mode 100644 index 000000000..dba268dba --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/model/Credencials.kt @@ -0,0 +1,6 @@ +package com.jisellemartins.bank.model + + data class Credencials( + val user: String = "", + val password: String = "" + ) \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/model/DetailsUser.kt b/Bank/app/src/main/java/com/jisellemartins/bank/model/DetailsUser.kt new file mode 100644 index 000000000..3b90ec574 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/model/DetailsUser.kt @@ -0,0 +1,10 @@ +package com.jisellemartins.bank.model + +class DetailsUser( + var id: String, + var loginId: String, + var account: String, + var balance: Int, + var user: User, + var statementsList: List +) \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/model/Login.kt b/Bank/app/src/main/java/com/jisellemartins/bank/model/Login.kt new file mode 100644 index 000000000..afa0b5bc0 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/model/Login.kt @@ -0,0 +1,9 @@ +package com.jisellemartins.bank.model + +class Login ( + var user:String = "", + var password:String = "" +) + + + diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/model/Statements.kt b/Bank/app/src/main/java/com/jisellemartins/bank/model/Statements.kt new file mode 100644 index 000000000..71a2335b7 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/model/Statements.kt @@ -0,0 +1,8 @@ +package com.jisellemartins.bank.model + +class Statements ( + var type:String, + var title:String, + var value: Double, + var date: String +) \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/model/User.kt b/Bank/app/src/main/java/com/jisellemartins/bank/model/User.kt new file mode 100644 index 000000000..c4b648184 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/model/User.kt @@ -0,0 +1,7 @@ +package com.jisellemartins.bank.model + +class User ( + var id:String, + var user: String, + var message: String +) \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/network/Output.kt b/Bank/app/src/main/java/com/jisellemartins/bank/network/Output.kt new file mode 100644 index 000000000..058ba71df --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/network/Output.kt @@ -0,0 +1,9 @@ +package com.jisellemartins.bank.network + +sealed class Output { + data class Success(val data: T?) : Output() + data class Loading(val data: T? = null) : Output() + data class Error(val data: T? = null) : Output() + data class ErrorT(val error: Throwable) : Output() + object NetworkError : Output() +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/repositories/BankRepository.kt b/Bank/app/src/main/java/com/jisellemartins/bank/repositories/BankRepository.kt new file mode 100644 index 000000000..8b72f1917 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/repositories/BankRepository.kt @@ -0,0 +1,62 @@ +package com.jisellemartins.bank.repositories + +import com.jisellemartins.bank.model.DetailsUser +import com.jisellemartins.bank.model.Login +import com.jisellemartins.bank.model.User +import com.jisellemartins.bank.network.Output +import com.jisellemartins.bank.service.BankService +import kotlinx.coroutines.flow.flow +import retrofit2.Response +import java.util.Objects + +class BankRepository constructor( + private val service: BankService +) { + + + /* suspend fun postLogin(login: Login): Output { + val response = service.postLogin(login) + + if (response.isSuccessful) { + return Output.Success(response.body()) + } + return Output.NetworkError + }*/ + + suspend fun postLogin(login: Login) = flow { + emit(Output.Loading()) + val response = service.postLogin(login) + + if (response.isSuccessful) { + emit(Output.Success(response.body())) + } else { + emit(Output.NetworkError) + } + + } + + suspend fun getDetailsUser(idUser: String) = flow { + emit(Output.Loading()) + // utilizando o idUser mockado pq o dados sao fakes + val response = service.getDetailsUser("2") + + if (response.isSuccessful) { + emit(Output.Success(response.body()?.get(0))) + + } else { + emit(Output.NetworkError) + } + + } + + /*suspend fun getDetailsUser(idUser:String): DetailsUser? { + val response = service.getDetailsUser(idUser) + + if (response.isSuccessful) { + return response.body()?.get(0) + } + return null + }*/ + + +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/service/BankService.kt b/Bank/app/src/main/java/com/jisellemartins/bank/service/BankService.kt new file mode 100644 index 000000000..d11338b31 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/service/BankService.kt @@ -0,0 +1,18 @@ +package com.jisellemartins.bank.service + +import com.jisellemartins.bank.model.DetailsUser +import com.jisellemartins.bank.model.Login +import com.jisellemartins.bank.model.User +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Path + +interface BankService { + @POST("api/bank/login") + suspend fun postLogin(@Body login: Login): Response + + @GET("api/bank/login/{idUser}/statements") + suspend fun getDetailsUser(@Path("idUser")idUser:String): Response> +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/service/RetrofitService.kt b/Bank/app/src/main/java/com/jisellemartins/bank/service/RetrofitService.kt new file mode 100644 index 000000000..9f77e6f3e --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/service/RetrofitService.kt @@ -0,0 +1,13 @@ +package com.jisellemartins.bank.service + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +object service { + val api + get() = Retrofit.Builder() + .baseUrl("https://651f39d044a3a8aa476987bb.mockapi.io/") + .addConverterFactory(GsonConverterFactory.create()).build() + + val bankService = api.create(BankService::class.java) +} diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/ui/adapter/ListStatementsAdapter.kt b/Bank/app/src/main/java/com/jisellemartins/bank/ui/adapter/ListStatementsAdapter.kt new file mode 100644 index 000000000..7d931bb12 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/ui/adapter/ListStatementsAdapter.kt @@ -0,0 +1,37 @@ +package com.jisellemartins.bank.ui.adapter + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.jisellemartins.bank.databinding.ItemListBinding +import com.jisellemartins.bank.model.Statements + +class ListStatementsAdapter(private val statements: List) : + RecyclerView.Adapter() { + + class ViewHolder(binding: ItemListBinding) : RecyclerView.ViewHolder(binding.root) { + val textType = binding.textType + val textTitle = binding.textTitle + val textValue = binding.textValue + val textDate = binding.textDate + } + + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { + val binding = + ItemListBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + + return ViewHolder(binding) + } + + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + viewHolder.textType.text = statements[position].type + viewHolder.textTitle.text = statements[position].title + viewHolder.textValue.text = "R$ " + statements[position].value.toString() + viewHolder.textDate.text = statements[position].date + } + override fun getItemCount() = statements.size +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/ui/screens/LoginActivity.kt b/Bank/app/src/main/java/com/jisellemartins/bank/ui/screens/LoginActivity.kt new file mode 100644 index 000000000..ef1733aaa --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/ui/screens/LoginActivity.kt @@ -0,0 +1,72 @@ +package com.jisellemartins.bank.ui.screens + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.jisellemartins.bank.R +import com.jisellemartins.bank.databinding.ActivityLoginBinding +import com.jisellemartins.bank.model.Credencials +import com.jisellemartins.bank.model.Login +import com.jisellemartins.bank.network.Output +import com.jisellemartins.bank.viewmodel.LoginViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel + +class LoginActivity : AppCompatActivity() { + val loginViewModel: LoginViewModel by viewModel() + private lateinit var binding: ActivityLoginBinding + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityLoginBinding.inflate(layoutInflater) + setContentView(binding.root) + binding.credencials = Credencials() + + + loginViewModel.loginLiveData.observe(this) { + binding.isloading = false + when (it) { + is Output.Success -> { + if (!it.data?.id.equals("0")) { + createPersistence(it.data?.id.toString()) + val intent = Intent(this, StatementsActivity::class.java) + + startActivity(intent) + } else { + it.data?.message?.let { message -> showToast(message, this) } + } + } + is Output.Error ->{ + it.data?.message?.let { message -> showToast(message, this) } + } + is Output.ErrorT -> { + it.error.message?.let { error -> showToast(error, this) } + + } + else -> binding.isloading = true + } + } + binding.apply { + btnLogin.setOnClickListener { + credencials?.apply { + loginViewModel.checkFields(Login(binding.editTextUser.text.toString(), binding.editTextPassword.text.toString())) + } + } + } + } + + fun showToast(message: String, context: Context) { + Toast.makeText(context, message, Toast.LENGTH_LONG).show() + } + + fun createPersistence(idUser:String){ + val sharedPreference = getSharedPreferences(getString(R.string.data_bank),Context.MODE_PRIVATE) + var editor = sharedPreference.edit() + editor.putString(getString(R.string.idUser),idUser) + editor.commit() + } + + +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/ui/screens/StatementsActivity.kt b/Bank/app/src/main/java/com/jisellemartins/bank/ui/screens/StatementsActivity.kt new file mode 100644 index 000000000..c3ac4d549 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/ui/screens/StatementsActivity.kt @@ -0,0 +1,65 @@ +package com.jisellemartins.bank.ui.screens + +import android.content.Context +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import com.jisellemartins.bank.R +import com.jisellemartins.bank.databinding.ActivityStatementsBinding +import com.jisellemartins.bank.model.Statements +import com.jisellemartins.bank.network.Output +import com.jisellemartins.bank.ui.adapter.ListStatementsAdapter +import com.jisellemartins.bank.viewmodel.StatementsViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel + + +class StatementsActivity : AppCompatActivity() { + + val statementsViewModel: StatementsViewModel by viewModel() + private lateinit var binding: ActivityStatementsBinding + private lateinit var adapter: ListStatementsAdapter + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityStatementsBinding.inflate(layoutInflater) + setContentView(binding.root) + + statementsViewModel.statementsLiveData.observe(this) { + binding.isloading = false + when (it) { + is Output.Success -> { + if (!it.data?.id.equals("0")) { + binding.textUser.text = it.data?.user?.user + binding.textAccount.text = it.data?.account + binding.textBalance.text = "R$ " + it.data?.balance.toString() + ",00" + initRecycleView(it.data?.statementsList ?: emptyList()) + } else { + showToast("Não foi possível carregar os dados", this) + } + } + is Output.Error ->{ + showToast("Não foi possível carregar os dados", this) + } + is Output.ErrorT -> { + it.error.message?.let { error -> showToast(error, this) } + + } + else -> binding.isloading = true + } + } + + val sharedPreference = getSharedPreferences(getString(R.string.data_bank), Context.MODE_PRIVATE) + val s = sharedPreference.getString(getString(R.string.idUser), "") + statementsViewModel.getDetails(s.toString()) + + } + + private fun initRecycleView(statements: List) { + adapter = ListStatementsAdapter(statements) + binding.listStatements.adapter = adapter + binding.listStatements.layoutManager = LinearLayoutManager(this) + } + fun showToast(message: String, context: Context) { + Toast.makeText(context, message, Toast.LENGTH_LONG).show() + } +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/utils/CpfUtil.kt b/Bank/app/src/main/java/com/jisellemartins/bank/utils/CpfUtil.kt new file mode 100644 index 000000000..c00b20e1e --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/utils/CpfUtil.kt @@ -0,0 +1,71 @@ +package com.jisellemartins.bank.utils + +class CpfUtil { + companion object { + + fun myValidateCPF(cpf: String): Boolean { + val cpfClean = cpf.replace(".", "").replace("-", "") + + + if (cpfClean.length != 11) + return false + + + try { + val number = cpfClean.toLong() + } catch (e: Exception) { + return false + } + + + var dvCurrent10 = cpfClean.substring(9, 10).toInt() + var dvCurrent11 = cpfClean.substring(10, 11).toInt() + + + val cpfNineFirst = IntArray(9) + var i = 9 + while (i > 0) { + cpfNineFirst[i - 1] = cpfClean.substring(i - 1, i).toInt() + i-- + } + + var sumProductNine = IntArray(9) + var weight = 10 + var position = 0 + while (weight >= 2) { + sumProductNine[position] = weight * cpfNineFirst[position] + weight-- + position++ + } + + var dvForTenthDigit = sumProductNine.sum() % 11 + dvForTenthDigit = 11 - dvForTenthDigit //rule for tenth digit + if (dvForTenthDigit > 9) + dvForTenthDigit = 0 + if (dvForTenthDigit != dvCurrent10) + return false + + + var cpfTenFirst = cpfNineFirst.copyOf(10) + cpfTenFirst[9] = dvCurrent10 + + var sumProductTen = IntArray(10) + var w = 11 + var p = 0 + while (w >= 2) { + sumProductTen[p] = w * cpfTenFirst[p] + w-- + p++ + } + + var dvForeleventhDigit = sumProductTen.sum() % 11 + dvForeleventhDigit = 11 - dvForeleventhDigit + if (dvForeleventhDigit > 9) + dvForeleventhDigit = 0 + if (dvForeleventhDigit != dvCurrent11) + return false + + return true + } + } +} \ No newline at end of file diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/utils/EmailUtil.kt b/Bank/app/src/main/java/com/jisellemartins/bank/utils/EmailUtil.kt new file mode 100644 index 000000000..112625b5b --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/utils/EmailUtil.kt @@ -0,0 +1,14 @@ +package com.jisellemartins.bank.utils + +import androidx.core.util.PatternsCompat + +class EmailUtil { + + companion object{ + fun CharSequence?.isValidEmail() = + !isNullOrEmpty() && PatternsCompat.EMAIL_ADDRESS.matcher(this).matches() + } + +} + + diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/viewmodel/LoginViewModel.kt b/Bank/app/src/main/java/com/jisellemartins/bank/viewmodel/LoginViewModel.kt new file mode 100644 index 000000000..0ecff0980 --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/viewmodel/LoginViewModel.kt @@ -0,0 +1,64 @@ +package com.jisellemartins.bank.viewmodel + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.jisellemartins.bank.extensions.toLiveData +import com.jisellemartins.bank.model.Login +import com.jisellemartins.bank.model.User +import com.jisellemartins.bank.network.Output +import com.jisellemartins.bank.repositories.BankRepository +import com.jisellemartins.bank.utils.CpfUtil +import com.jisellemartins.bank.utils.EmailUtil +import com.jisellemartins.bank.utils.EmailUtil.Companion.isValidEmail +import kotlinx.coroutines.launch + +class LoginViewModel(private val repository: BankRepository) : ViewModel() { + private val _loginLiveData = MutableLiveData>() + val loginLiveData = _loginLiveData.toLiveData() + + + fun login(login: Login) { + viewModelScope.launch { + repository.postLogin(login).collect { + _loginLiveData.value = it + } + } + } + + fun checkFields(login: Login) { + if (login.user.isBlank() || login.password.isBlank()) { + _loginLiveData.value = Output.Error(User("0", "", "Os campos não podem ser vazios")) + } else { + checkUser(login) + } + } + + fun checkUser(login: Login) { + if (login.user.isValidEmail() || CpfUtil.myValidateCPF(login.user)) { + checkPassword(login) + } else _loginLiveData.value = Output.Error(User("0", "", "Email ou CPF inválido")) + } + + fun checkPassword(login: Login) { + if (login.password.contains("[A-Z]".toRegex())) { + if (login.password.contains("[0-9]".toRegex())) { + if (login.password.contains("[!\"#$%&'()*+,-./:;\\\\<=>?@\\[\\]^_`{|}~]".toRegex())) { + login(login) + } else _loginLiveData.value = Output.Error( + User( + "0", + "", + "A senha precisa ter ao menos um caractere especial" + ) + ) + } else _loginLiveData.value = + Output.Error(User("0", "", "A senha precisa ter ao menos um número")) + + } else _loginLiveData.value = + Output.Error(User("0", "", "A senha precisa ter ao menos uma letra maiúscula")) + + } +} + + diff --git a/Bank/app/src/main/java/com/jisellemartins/bank/viewmodel/StatementsViewModel.kt b/Bank/app/src/main/java/com/jisellemartins/bank/viewmodel/StatementsViewModel.kt new file mode 100644 index 000000000..5a111267b --- /dev/null +++ b/Bank/app/src/main/java/com/jisellemartins/bank/viewmodel/StatementsViewModel.kt @@ -0,0 +1,24 @@ +package com.jisellemartins.bank.viewmodel + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.jisellemartins.bank.extensions.toLiveData +import com.jisellemartins.bank.model.DetailsUser +import com.jisellemartins.bank.network.Output +import com.jisellemartins.bank.repositories.BankRepository +import kotlinx.coroutines.launch + +class StatementsViewModel(private val repository: BankRepository) : ViewModel() { + private val _statementsLiveData = MutableLiveData>() + val statementsLiveData = _statementsLiveData.toLiveData() + + fun getDetails(idUser: String) { + viewModelScope.launch { + repository.getDetailsUser(idUser).collect { + _statementsLiveData.value = it + } + } + } + +} \ No newline at end of file diff --git a/Bank/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Bank/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..2b068d114 --- /dev/null +++ b/Bank/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Bank/app/src/main/res/drawable/button_background.xml b/Bank/app/src/main/res/drawable/button_background.xml new file mode 100644 index 000000000..44c9fa599 --- /dev/null +++ b/Bank/app/src/main/res/drawable/button_background.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/Bank/app/src/main/res/drawable/edittext_background.xml b/Bank/app/src/main/res/drawable/edittext_background.xml new file mode 100644 index 000000000..8ca0cac3e --- /dev/null +++ b/Bank/app/src/main/res/drawable/edittext_background.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/Bank/app/src/main/res/drawable/ic_launcher_background.xml b/Bank/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..07d5da9cb --- /dev/null +++ b/Bank/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bank/app/src/main/res/drawable/item_background.xml b/Bank/app/src/main/res/drawable/item_background.xml new file mode 100644 index 000000000..a9f877d36 --- /dev/null +++ b/Bank/app/src/main/res/drawable/item_background.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/Bank/app/src/main/res/drawable/logo.png b/Bank/app/src/main/res/drawable/logo.png new file mode 100644 index 000000000..66bdc8d5d Binary files /dev/null and b/Bank/app/src/main/res/drawable/logo.png differ diff --git a/Bank/app/src/main/res/drawable/logout_icon.png b/Bank/app/src/main/res/drawable/logout_icon.png new file mode 100644 index 000000000..de1e4ae3c Binary files /dev/null and b/Bank/app/src/main/res/drawable/logout_icon.png differ diff --git a/Bank/app/src/main/res/layout/activity_login.xml b/Bank/app/src/main/res/layout/activity_login.xml new file mode 100644 index 000000000..156c080c6 --- /dev/null +++ b/Bank/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + +