Release 1.1.2 (#878) (#879)

* Shashidhara | Handle no internet on splash screen (#863)

* Sat | <Ch-12343> | Hyperverge Selfie (#864)

* started...

* release 1.1.1

* Shashidhara | Update find ifsc visibility based on bank name validation

* back press issue

* minor changes

* pre populate loan data from edit bank account

* added contract

* selfie hyperverge

* error handlding

* added git sttaus

* added keys into gradle

* added keys into docker file

* intro screen hide after 1st time

* removed instrauction

Co-authored-by: Shashidhara Gopal <shashidhara.gopal@navi.com>

* Feature/feedback on get loan journey (#868)

* started ...

* feedback continue..

* api intgration

* feedback success added, api submit

* Shashidhara | Toggle sticky footer on permissions screen based on login settings (#865)

* Feature/permissions other tasks (#869)

* added feedback on permission screen

* tutorial page skipped

* gps full page skipped

* removed red screen from kyc and enach

* uxcam id and user peroperty

* analytics for submit feedback and api connection timeout

* Feature/bank screen enhancements (#870)

* Shashidhara | Add disclaimer

* Shashidhara | Update edit bank option visibility

* Shashidhara | Remove change bank option on mandate success

* release 1.1.2

* Shashidhara | Add firebase performance (#871)

* spalsh screen changes, feedback keys issue (#872)

* minor changes

* Mukunda | Fixing basic details and work details firebase keys (#873)

* Shashidhara | Add scroll for auto debit screen

* fix (#875)

* Shashidhara | Update edit bank message

* multiple select iusse (#877)

Co-authored-by: Shashidhara Gopal <shashidhara.gopal@navi.com>
Co-authored-by: Mukunda NS <mukunda.ns@navi.com>

Co-authored-by: Shashidhara Gopal <shashidhara.gopal@navi.com>
Co-authored-by: Mukunda NS <mukunda.ns@navi.com>
This commit is contained in:
Satish Prasad
2020-06-22 13:13:08 +05:30
committed by GitHub Enterprise
parent b362070db5
commit c9e4ba0321
21 changed files with 269 additions and 218 deletions

View File

@@ -11,9 +11,10 @@ plugins {
id('maven')
id('com.google.firebase.crashlytics')
id('com.google.gms.google-services')
id('com.google.firebase.firebase-perf')
}
def VERSION_NAME = "1.1.1"
def VERSION_NAME = "1.1.2"
android {
compileSdkVersion 29
@@ -29,7 +30,7 @@ android {
applicationId "com.naviapp"
minSdkVersion 21
targetSdkVersion 29
versionCode 32
versionCode 33
versionName VERSION_NAME
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -261,6 +262,9 @@ dependencies {
// Auto fetch phone number
implementation 'com.google.android.gms:play-services-auth:18.0.0'
// Add the dependency for the Performance Monitoring library
implementation 'com.google.firebase:firebase-perf:19.0.7'
// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'

View File

@@ -147,6 +147,9 @@
<meta-data
android:name="firebase_analytics_collection_deactivated"
android:value="false" />
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />
<!-- for Appsflyer install tracking-->
<receiver

View File

@@ -4,7 +4,6 @@ import androidx.lifecycle.MutableLiveData
import com.naviapp.appupdate.repository.UpdateAppRepository
import com.naviapp.common.BaseVM
import com.naviapp.models.response.AppUpgradeResponse
import kotlinx.coroutines.launch
class UpdateAppVM : BaseVM() {
private val repository by lazy { UpdateAppRepository() }
@@ -12,14 +11,7 @@ class UpdateAppVM : BaseVM() {
val appUpgradeData = MutableLiveData<AppUpgradeResponse>()
val shouldUpdate = MutableLiveData<Boolean>()
fun checkAppUpdate() {
coroutineScope.launch {
val response = repository.checkAppUpdate()
if (response.error == null) {
appUpgradeData.value = response.data
} else {
appUpgradeData.value = null
}
}
fun setData(data: AppUpgradeResponse?) {
appUpgradeData.value = data
}
}

View File

@@ -99,15 +99,16 @@ class FeedbackFragment : BaseBottomSheet(), View.OnClickListener {
val feedbackOption = FeedbackRowItemBinding.inflate(inflater, null, true)
feedbackOption.data = option.desc
feedbackOption.feedbackRb.tag = option.code.orEmpty()
feedbackOption.feedbackRb.setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked && prevSelectedCode != option.code) {
if (isChecked && selectedCode != option.code) {
prevSelectedCode = selectedCode
selectedCode = option.code
handleCheckClick()
if (!isOptionSelected) {
isOptionSelected = true
submitButtonState()
}
prevSelectedCode = selectedCode
selectedCode = option.code
handleCheckClick()
}
}
binding.feedbackDetailLay.feedbackRg.addView(feedbackOption.root)
@@ -157,7 +158,7 @@ class FeedbackFragment : BaseBottomSheet(), View.OnClickListener {
if (isOptionSelected) {
val comment = binding.feedbackDetailLay.commentEt.text?.toString().orEmpty()
val data = FeedbackSubmitData(
selectedCode.orEmpty(),
screen.orEmpty(),
arrayListOf(selectedCode.orEmpty()),
comment
)

View File

@@ -86,10 +86,10 @@ fun getEditAccountData(): GenericWarningResponse {
null,
context.getString(R.string.warning),
listOf(
Action(context.getString(R.string.cancel)),
Action(context.getString(R.string.confirm))
Action(context.getString(R.string.confirm)),
Action(context.getString(R.string.cancel))
),
listOf(Field(context.getString(R.string.verify_bank_account_again), null, null))
null
)
}

View File

@@ -8,6 +8,8 @@ package com.naviapp.firebasedb
const val SELFIE = "SELFIE"
const val CUSTOMER_DETAILS = "CUSTOMER_DETAILS"
const val BASIC_DETAILS = "BASIC_DETAILS"
const val WORK_DETAILS = "WORK_DETAILS"
const val PAN_DETAILS = "PAN_DETAILS"
const val INIT_REPAYMENT = "INIT_REPAYMENT"
const val REPAYMENT_CONFIRMATION = "REPAYMENT_CONFIRMATION"

View File

@@ -48,6 +48,8 @@ class FirebaseDataHelper {
SELFIE -> "UPLOAD_SELFIE"
LOAN_AGREEMENT_CREATE -> "CREATE_LOAN_AGREEMENT"
CUSTOMER_DETAILS -> "UPDATE_CUSTOMER_DETAILS"
BASIC_DETAILS -> "UPDATE_BASIC_DETAILS"
WORK_DETAILS -> "UPDATE_WORK_DETAILS"
PAN_DETAILS -> "UPDATE_PAN_DETAILS"
INIT_REPAYMENT -> "INITIATE_REPAYMENT"
REPAYMENT_CONFIRMATION -> "REPAYMENT_CONFIRMATION"

View File

@@ -472,12 +472,12 @@ class BankDetailsAutoDebitFragment : BaseFragment(), View.OnClickListener {
private fun handleEditAccountClick() {
naviAnalyticsEventTracker.onEditAccountTap()
val primaryAction = View.OnClickListener {
naviAnalyticsEventTracker.onCancelButtonTap()
}
val secondaryAction = View.OnClickListener {
naviAnalyticsEventTracker.onConfirmButtonTap()
navigateToBankDetailsScreen()
}
val secondaryAction = View.OnClickListener {
naviAnalyticsEventTracker.onCancelButtonTap()
}
try {
val waringDialog =
ActionWarningFragment.getInstance(

View File

@@ -16,7 +16,7 @@ object FeedbackPageType {
const val WORK_DETAILS_PAGE = "WORK_DETAILS_PAGE"
const val PAN_DETAILS_PAGE = "PAN_DETAILS_PAGE"
const val LOAN_OFFER_PAGE = "LOAN_OFFER_PAGE"
const val KYC_PAGE = "PERMISSIONS_PAGE"
const val KYC_PAGE = "KYC_PAGE"
const val BANK_DETAILS_PAGE = "BANK_DETAILS_PAGE"
const val AUTO_DEBIT_PAGE = "AUTO_DEBIT_PAGE"
const val LOAN_AGREEMENT_PAGE = "LOAN_AGREEMENT_PAGE"

View File

@@ -11,5 +11,5 @@ import com.google.gson.annotations.SerializedName
data class FeedbackSubmitData(
@SerializedName("pageCode") val collect: String? = null,
@SerializedName("feedbackCodes") val feedbackCodesList: ArrayList<String>? = null,
@SerializedName("comments") val comments: String? = null
@SerializedName("comment") val comments: String? = null
)

View File

@@ -1,10 +1,12 @@
package com.naviapp.models
import com.google.gson.annotations.SerializedName
import com.naviapp.models.response.AppUpgradeResponse
data class LoginSettings(
@SerializedName("warning") val warning: Warning? = null,
@SerializedName("features") val features: List<Feature>? = null
@SerializedName("features") val features: List<Feature>? = null,
@SerializedName("appUpgradeSettings") val appUpgradeSettings: AppUpgradeResponse? = null
)
data class Warning(

View File

@@ -24,6 +24,7 @@ import com.naviapp.network.ApiErrorTagType
import com.naviapp.permission.activities.PermissionActivity
import com.naviapp.pushnotification.NotificationHandler
import com.naviapp.registration.navigator.RegistrationNavigator
import com.naviapp.registration.viewmodel.ConfigVM
import com.naviapp.registration.viewmodel.RegistrationVM
import com.naviapp.sharedpref.PreferenceManager
import com.naviapp.tutorial.TutorialActivity
@@ -42,9 +43,11 @@ class SplashActivity : BaseActivity() {
private lateinit var binding: ActivitySplashScreenBinding
private val registrationVM by lazy { ViewModelProvider(this).get(RegistrationVM::class.java) }
private val configVM by lazy { ViewModelProvider(this).get(ConfigVM::class.java) }
private var startTime = 0L
private val navigator by lazy { RegistrationNavigator() }
private var handler: Handler? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -58,7 +61,10 @@ class SplashActivity : BaseActivity() {
init()
initObservers()
loginSettings()
checkDevice()
}
private fun loginSettings() {
configVM.fetchLoginSettings()
}
private fun loginSettings() {
@@ -75,7 +81,11 @@ class SplashActivity : BaseActivity() {
}
}
private val noInternetListener = View.OnClickListener { checkDevice() }
private val noInternetListener = View.OnClickListener {
if (observeRedirectionStatus()) {
registrationVM.getRedirectStatus()
}
}
private fun initErrors() {
initError(
@@ -90,10 +100,13 @@ class SplashActivity : BaseActivity() {
private fun observeRedirectionStatus(): Boolean {
val sessionToken = PreferenceManager.getStringPreference(SESSION_TOKEN)
if (sessionToken.isNullOrBlank()) {
navigateToNextScreen()
navigateToNextScreen(getDelayBeforeTransition())
return false
}
NotificationHandler.handleFcmToken()
return true
}
private fun observeRedirectStatus() {
registrationVM.redirectPage.observeNullable(this) { data ->
hideLoader()
data?.let {
@@ -102,22 +115,35 @@ class SplashActivity : BaseActivity() {
navigateToNextScreen()
}
}
return true
}
private fun initObservers() {
loginSettingsObserver()
checkDeviceObserver()
appUpdateObserver()
if (isRegisteredUser()) {
NotificationHandler.handleFcmToken()
observeRedirectStatus()
} else {
navigateToNextScreen()
}
}
private fun loginSettingsObserver() {
registrationVM.loginSettings.observeNonNull(this) { loginSettings ->
loginSettings.features?.forEach {
PreferenceManager.setBooleanPreference(
it.name.orEmpty(),
it.enabled.orFalse()
)
configVM.loginSettings.observeNullable(this) {
it?.let { loginSetting ->
loginSetting.features?.forEach {
PreferenceManager.setBooleanPreference(
it.name.orEmpty(),
it.enabled.orFalse()
)
}
loginSetting.appUpgradeSettings?.let {
appUpgradeVM.setData(it)
}
} ?: run {
if (observeRedirectionStatus()) {
registrationVM.getRedirectStatus()
}
}
}
}
@@ -132,44 +158,30 @@ class SplashActivity : BaseActivity() {
}
}
private fun checkDevice() {
getDeviceIdentifier().let {
registrationVM.checkDevice(it)
}
}
private fun checkDeviceObserver() {
registrationVM.isBlacklisted.observeNullable(this) { isBlocked ->
isBlocked?.let {
if (it) {
toast(R.string.service_not_available)
} else {
appUpgradeVM.checkAppUpdate()
}
} ?: run {
appUpgradeVM.checkAppUpdate()
}
}
}
/***
* observeError fun is for handling error cases. eg : no network, server error, etc
* **/
private fun navigateToNextScreen() {
Handler().postDelayed({
val nextActivityClass = destination()
val intent = Intent(this, nextActivityClass)
intent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
)
if (nextActivityClass == TutorialActivity::class.java) {
startActivity(intent, getSharedTransitionBundle())
} else {
startActivity(intent)
}
delayFinish()
}, getDelayBeforeTransition())
private fun navigateToNextScreen(duration: Long = SPLASH_MAX_DELAY) {
handler?.removeCallbacksAndMessages(null)
handler = Handler()
handler?.postDelayed({
startNextActivity()
}, duration)
}
private fun startNextActivity() {
val nextActivityClass = destination()
val intent = Intent(this, nextActivityClass)
intent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
)
if (nextActivityClass == TutorialActivity::class.java) {
startActivity(intent, getSharedTransitionBundle())
} else {
startActivity(intent)
}
delayFinish()
}
private fun getDelayBeforeTransition(): Long {
@@ -187,13 +199,21 @@ class SplashActivity : BaseActivity() {
private fun destination(): Class<out AppCompatActivity> {
return when {
// isFirstTimeUser() -> TutorialActivity::class.java
!(PreferenceManager.getBooleanPreference(PERMISSION_SCREEN_SHOWN)
.orFalse()) -> PermissionActivity::class.java
// isFirstTimeUser() -> TutorialActivity::class.java
isPermissionScreenNeeded() -> PermissionActivity::class.java
else -> RegistrationActivity::class.java
}
}
private fun isRegisteredUser(): Boolean {
val sessionToken = PreferenceManager.getStringPreference(SESSION_TOKEN)
return !sessionToken.isNullOrBlank()
}
private fun isPermissionScreenNeeded(): Boolean {
return !(PreferenceManager.getBooleanPreference(PERMISSION_SCREEN_SHOWN).orFalse())
}
private fun isFirstTimeUser(): Boolean {
return PreferenceManager.getBooleanPreference(NOT_FIRST_TIME_USER).not()
}
@@ -204,5 +224,6 @@ class SplashActivity : BaseActivity() {
companion object {
private const val SPLASH_DELAY = 1000L
private const val TAG = "SPLASH_ACTIVITY"
private const val SPLASH_MAX_DELAY = 10000L
}
}

View File

@@ -0,0 +1,37 @@
/*
* *
* * Copyright (c) 2020 . All rights reserved @Navi
*
*/
package com.naviapp.registration.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.naviapp.common.BaseVM
import com.naviapp.models.LoginSettings
import com.naviapp.registration.repositories.RegisterRepository
import kotlinx.coroutines.launch
import timber.log.Timber
class ConfigVM : BaseVM(false) {
private val registerRepository = RegisterRepository()
private val _loginSettings = MutableLiveData<LoginSettings>()
val loginSettings: LiveData<LoginSettings>
get() = _loginSettings
fun fetchLoginSettings() {
coroutineScope.launch {
val response = registerRepository.fetchLoginSettings()
Timber.tag("LOGIN SETTINGS").i("$response")
if (response.error == null) {
_loginSettings.value = response.data
} else {
_loginSettings.value = null
}
}
}
}

View File

@@ -11,7 +11,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.naviapp.common.BaseVM
import com.naviapp.firebasedb.FirebaseStatusType
import com.naviapp.models.LoginSettings
import com.naviapp.models.RedirectPageStatus
import com.naviapp.models.request.LoginRequest
import com.naviapp.models.request.OtpRequest
@@ -55,10 +54,6 @@ class RegistrationVM : BaseVM() {
val privacyPolicy: LiveData<String>
get() = _privacyPolicy
private val _loginSettings = MutableLiveData<LoginSettings>()
val loginSettings: LiveData<LoginSettings>
get() = _loginSettings
private val _isBlacklisted = MutableLiveData<Boolean>()
val isBlacklisted: LiveData<Boolean>
get() = _isBlacklisted
@@ -148,16 +143,6 @@ class RegistrationVM : BaseVM() {
}
}
fun fetchLoginSettings() {
coroutineScope.launch {
val response = registerRepository.fetchLoginSettings()
Timber.tag("LOGIN SETTINGS").i("$response")
if (response.error == null) {
_loginSettings.value = response.data
}
}
}
fun checkDevice(deviceId: String) {
Timber.i("Device Id $deviceId")
val registerRequest = RegisterRequest(deviceId, Constants.CHANNEL_ID)

View File

@@ -39,10 +39,13 @@ class SelfieVerificationHelper {
else
HVFaceConfig.LivenessMode.NONE
)
/*
if (introShownCount < MAX_NO_SLEFIE_INTRO)
hvFaceConfig.isShouldShowInstructionPage = it.showInstructionsPage.orFalse()
else
hvFaceConfig.isShouldShowInstructionPage = false
*/
if (it.faceCaptureTitle.isNullOrBlank().not())
hvFaceConfig.faceCaptureTitle = it.faceCaptureTitle
@@ -59,7 +62,7 @@ class SelfieVerificationHelper {
} ?: run {
hvFaceConfig.setLivenessMode(HVFaceConfig.LivenessMode.TEXTURELIVENESS)
hvFaceConfig.isShouldShowInstructionPage = false
// hvFaceConfig.isShouldShowInstructionPage = false
}
val completionCallback =

View File

@@ -24,11 +24,7 @@ import com.naviapp.common.navigator.ScreenNavigator
import com.naviapp.dashboard.listeners.FragmentInterchangeListener
import com.naviapp.databinding.UserProfileFragmentBinding
import com.naviapp.errors.activities.ErrorActivity
import com.naviapp.firebasedb.CUSTOMER_DETAILS
import com.naviapp.firebasedb.FirebaseDataHelper
import com.naviapp.firebasedb.FirebaseDataReceiveListener
import com.naviapp.firebasedb.FirebaseResponse
import com.naviapp.firebasedb.FirebaseStatusType
import com.naviapp.firebasedb.*
import com.naviapp.models.UserDetail
import com.naviapp.network.ApiErrorTagType
import com.naviapp.network.ApiErrorTagType.PROFILE_DETAILS_UPLOAD
@@ -157,7 +153,7 @@ class ProfileFragment : BaseFragment(), View.OnClickListener,
initFirebaseDataReceiver(
lifecycle,
firebaseDataReceiveListener,
CUSTOMER_DETAILS,
BASIC_DETAILS,
requestId,
notificationPath
)

View File

@@ -21,11 +21,7 @@ import com.naviapp.common.navigator.ScreenNavigator
import com.naviapp.dashboard.listeners.FragmentInterchangeListener
import com.naviapp.databinding.WorkFragmentBinding
import com.naviapp.errors.activities.ErrorActivity
import com.naviapp.firebasedb.CUSTOMER_DETAILS
import com.naviapp.firebasedb.FirebaseDataHelper
import com.naviapp.firebasedb.FirebaseDataReceiveListener
import com.naviapp.firebasedb.FirebaseResponse
import com.naviapp.firebasedb.FirebaseStatusType
import com.naviapp.firebasedb.*
import com.naviapp.models.UserDetail
import com.naviapp.models.response.EmploymentTypeResponse
import com.naviapp.network.ApiErrorTagType.WORK_DETAILS_UPLOAD
@@ -155,7 +151,7 @@ class WorkFragment : BaseFragment(), View.OnClickListener, View.OnKeyListener,
initFirebaseDataReceiver(
lifecycle,
firebaseDataReceiveListener,
CUSTOMER_DETAILS,
WORK_DETAILS,
requestId,
notificationPath
)

View File

@@ -2,122 +2,127 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/container_margin"
android:clipChildren="false"
android:clipToPadding="false">
android:layout_height="match_parent">
<include
android:id="@+id/bank_disclaimer_view"
layout="@layout/bank_disclaimer_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/bank_details_tv"
style="@style/TitleFontStyle2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bank_disclaimer_view" />
<ImageView
android:id="@+id/bank_name_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_20"
android:adjustViewBounds="true"
android:src="@drawable/ic_bank_icon_svg"
android:transitionName="@string/bank_name_logo_transition"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bank_details_tv" />
<TextView
android:id="@+id/bank_name_tv"
style="@style/FormElementFontStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_dp_12"
android:transitionName="@string/bank_name_transition"
app:layout_constraintBottom_toBottomOf="@id/bank_name_iv"
app:layout_constraintStart_toEndOf="@id/bank_name_iv"
app:layout_constraintTop_toTopOf="@id/bank_name_iv" />
<ImageView
android:id="@+id/account_number_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_20"
android:adjustViewBounds="true"
android:src="@drawable/ic_bank_account_number_svg"
android:transitionName="@string/account_number_logo_transition"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bank_name_iv" />
<TextView
android:id="@+id/account_number_tv"
style="@style/FormElementFontStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_dp_12"
android:transitionName="@string/account_number_transition"
app:layout_constraintBottom_toBottomOf="@id/account_number_iv"
app:layout_constraintStart_toEndOf="@id/account_number_iv"
app:layout_constraintTop_toTopOf="@id/account_number_iv" />
<TextView
android:id="@+id/verified_badge"
style="@style/BadgeStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_dp_8"
android:background="@drawable/bg_rounded_rect_gray"
android:backgroundTint="@color/green"
android:paddingStart="@dimen/layout_dp_8"
android:paddingTop="@dimen/layout_dp_4"
android:paddingEnd="@dimen/layout_dp_8"
android:paddingBottom="@dimen/layout_dp_4"
android:text="@string/verified"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/account_number_tv"
app:layout_constraintStart_toEndOf="@id/account_number_tv"
app:layout_constraintTop_toTopOf="@id/account_number_tv" />
<TextView
android:id="@+id/edit_account_tv"
style="@style/LinkRed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_22"
android:text="@string/change_bank"
app:layout_constraintStart_toStartOf="@id/account_number_iv"
app:layout_constraintTop_toBottomOf="@id/account_number_tv" />
<View
android:id="@+id/divider"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/layout_dp_32"
android:background="?android:attr/listDivider"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/edit_account_tv" />
android:layout_height="match_parent"
android:layout_margin="@dimen/container_margin"
android:clipChildren="false"
android:clipToPadding="false">
<include
android:id="@+id/auto_debit_layout"
layout="@layout/auto_debit_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_32"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider" />
</androidx.constraintlayout.widget.ConstraintLayout>
<include
android:id="@+id/bank_disclaimer_view"
layout="@layout/bank_disclaimer_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/bank_details_tv"
style="@style/TitleFontStyle2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bank_disclaimer_view" />
<ImageView
android:id="@+id/bank_name_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_20"
android:adjustViewBounds="true"
android:src="@drawable/ic_bank_icon_svg"
android:transitionName="@string/bank_name_logo_transition"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bank_details_tv" />
<TextView
android:id="@+id/bank_name_tv"
style="@style/FormElementFontStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_dp_12"
android:transitionName="@string/bank_name_transition"
app:layout_constraintBottom_toBottomOf="@id/bank_name_iv"
app:layout_constraintStart_toEndOf="@id/bank_name_iv"
app:layout_constraintTop_toTopOf="@id/bank_name_iv" />
<ImageView
android:id="@+id/account_number_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_20"
android:adjustViewBounds="true"
android:src="@drawable/ic_bank_account_number_svg"
android:transitionName="@string/account_number_logo_transition"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bank_name_iv" />
<TextView
android:id="@+id/account_number_tv"
style="@style/FormElementFontStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_dp_12"
android:transitionName="@string/account_number_transition"
app:layout_constraintBottom_toBottomOf="@id/account_number_iv"
app:layout_constraintStart_toEndOf="@id/account_number_iv"
app:layout_constraintTop_toTopOf="@id/account_number_iv" />
<TextView
android:id="@+id/verified_badge"
style="@style/BadgeStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_dp_8"
android:background="@drawable/bg_rounded_rect_gray"
android:backgroundTint="@color/green"
android:paddingStart="@dimen/layout_dp_8"
android:paddingTop="@dimen/layout_dp_4"
android:paddingEnd="@dimen/layout_dp_8"
android:paddingBottom="@dimen/layout_dp_4"
android:text="@string/verified"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/account_number_tv"
app:layout_constraintStart_toEndOf="@id/account_number_tv"
app:layout_constraintTop_toTopOf="@id/account_number_tv" />
<TextView
android:id="@+id/edit_account_tv"
style="@style/LinkRed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_22"
android:text="@string/change_bank"
app:layout_constraintStart_toStartOf="@id/account_number_iv"
app:layout_constraintTop_toBottomOf="@id/account_number_tv" />
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/layout_dp_32"
android:background="?android:attr/listDivider"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/edit_account_tv" />
<include
android:id="@+id/auto_debit_layout"
layout="@layout/auto_debit_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_32"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</layout>

View File

@@ -28,6 +28,7 @@
android:layout_marginEnd="@dimen/layout_dp_32"
android:clipChildren="false"
android:clipToPadding="false"
android:clickable="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

View File

@@ -403,7 +403,7 @@
<string name="same_bank_account_will_be_used_to_get_loan_to_setup_auto_debit">Same bank account will be used to get loan &amp; to setup auto-debit of EMIs</string>
<string name="change_bank">Change Bank?</string>
<string name="feedback_submit_hint">Leave a feedback…(optional)</string>
<string name="feedback_title">It seems your are leaving!</string>
<string name="feedback_title">It seems you are leaving!</string>
<string name="feedback_subtitle">What went wrong?</string>
<string name="close">Close</string>
<string name="feedback_submitted_desc">Thank you for sharing the \nfeedback with us.</string>

View File

@@ -17,6 +17,7 @@ buildscript {
// Add the Crashlytics Gradle plugin.
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0-beta04'
classpath 'com.google.firebase:perf-plugin:1.3.1'
}
}