diff --git a/core/analytics/src/main/java/org/mifos/mobilewallet/mifospay/core/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/org/mifos/mobilewallet/mifospay/core/analytics/AnalyticsEvent.kt index 191548ae..e3825afe 100644 --- a/core/analytics/src/main/java/org/mifos/mobilewallet/mifospay/core/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/org/mifos/mobilewallet/mifospay/core/analytics/AnalyticsEvent.kt @@ -15,8 +15,10 @@ data class AnalyticsEvent( val extras: List = emptyList(), ) { // Standard analytics types. - object Types { - const val SCREEN_VIEW = "screen_view" // (extras: SCREEN_NAME) + class Types { + companion object { + const val SCREEN_VIEW = "screen_view" // (extras: SCREEN_NAME) + } } /** @@ -32,7 +34,9 @@ data class AnalyticsEvent( data class Param(val key: String, val value: String) // Standard parameter keys. - object ParamKeys { - const val SCREEN_NAME = "screen_name" + class ParamKeys { + companion object { + const val SCREEN_NAME = "screen_name" + } } } diff --git a/core/data/src/main/java/org/mifos/mobilewallet/core/util/TimeZoneMonitor.kt b/core/data/src/main/java/org/mifos/mobilewallet/core/util/TimeZoneMonitor.kt index e403ce8d..5f576aa5 100644 --- a/core/data/src/main/java/org/mifos/mobilewallet/core/util/TimeZoneMonitor.kt +++ b/core/data/src/main/java/org/mifos/mobilewallet/core/util/TimeZoneMonitor.kt @@ -65,8 +65,7 @@ internal class TimeZoneBroadcastMonitor @Inject constructor( } } - /* If there isn't a zoneId in the intent, fallback to the systemDefault, - which should also reflect the change */ + // If there isn't a zoneId in the intent, fallback to the systemDefault, which should also reflect the change trySend(zoneIdFromIntent ?: TimeZone.currentSystemDefault()) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7012b63e..973480e7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -61,7 +61,6 @@ androidxTracing = "1.3.0-alpha02" coil = "2.6.0" androidxMetrics = "1.0.0-beta01" androidxBrowser = "1.8.0" -sheets_compose_dialogs_core = "1.3.0" [libraries] androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityVersion" } @@ -140,8 +139,7 @@ coil-kt-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = " coil-kt-svg = { group = "io.coil-kt", name = "coil-svg", version.ref = "coil" } androidx-metrics = { group = "androidx.metrics", name = "metrics-performance", version.ref = "androidxMetrics" } androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "androidxBrowser" } -sheets-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs",name = "core",version.ref = "sheets_compose_dialogs_core"} -sheets-compose-dialogs-calender = { group = "com.maxkeppeler.sheets-compose-dialogs",name = "calendar",version.ref = "sheets_compose_dialogs_core"} + # Dependencies of the included build-logic android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } diff --git a/mifospay/build.gradle.kts b/mifospay/build.gradle.kts index 640922fa..dc9f18f8 100644 --- a/mifospay/build.gradle.kts +++ b/mifospay/build.gradle.kts @@ -96,9 +96,6 @@ dependencies { implementation("androidx.compose.material:material:1.6.0") implementation(libs.compose.country.code.picker) // remove after moving auth code to module - //calender for date picking - implementation(libs.sheets.compose.dialogs.core) - implementation(libs.sheets.compose.dialogs.calender) // ViewModel implementation(libs.androidx.lifecycle.ktx) diff --git a/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/presenter/KYCLevel1ViewModel.kt b/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/presenter/KYCLevel1ViewModel.kt deleted file mode 100644 index 9903bae9..00000000 --- a/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/presenter/KYCLevel1ViewModel.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.mifos.mobilewallet.mifospay.kyc.presenter - -import androidx.lifecycle.ViewModel -import com.mifos.mobilewallet.model.entity.kyc.KYCLevel1Details -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import org.mifos.mobilewallet.core.base.UseCase -import org.mifos.mobilewallet.core.base.UseCaseHandler -import org.mifos.mobilewallet.core.domain.usecase.kyc.UploadKYCLevel1Details -import org.mifos.mobilewallet.mifospay.data.local.LocalRepository -import javax.inject.Inject - -@HiltViewModel -class KYCLevel1ViewModel @Inject constructor( - private val mUseCaseHandler: UseCaseHandler, - private val mLocalRepository: LocalRepository, - private val uploadKYCLevel1DetailsUseCase: UploadKYCLevel1Details -) : ViewModel() { - - private val _kyc1uiState = - MutableStateFlow(KYCLevel1UiState.Empty) - val kyc1uiState: StateFlow = _kyc1uiState - - fun submitData( - fname: String, lname: String, address1: String, address2: String, - phoneno: String, dob: String - ) { - val kycLevel1Details = - KYCLevel1Details( - fname, lname, address1, - address2, phoneno, dob, "1" - ) - - uploadKYCLevel1DetailsUseCase.walletRequestValues = UploadKYCLevel1Details.RequestValues( - mLocalRepository.clientDetails.clientId.toInt(), - kycLevel1Details - ) - val requestValues = uploadKYCLevel1DetailsUseCase.walletRequestValues - mUseCaseHandler.execute(uploadKYCLevel1DetailsUseCase, requestValues, - object : UseCase.UseCaseCallback { - override fun onSuccess(response: UploadKYCLevel1Details.ResponseValue) { - _kyc1uiState.value = KYCLevel1UiState.Success - } - - override fun onError(message: String) { - _kyc1uiState.value = KYCLevel1UiState.Error - } - } - ) - } -} - -sealed interface KYCLevel1UiState { - data object Empty : KYCLevel1UiState - data object Success : KYCLevel1UiState - data object Error : KYCLevel1UiState -} \ No newline at end of file diff --git a/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Fragment.kt b/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Fragment.kt index 95650ee4..0524f083 100644 --- a/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Fragment.kt +++ b/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Fragment.kt @@ -1,43 +1,142 @@ package org.mifos.mobilewallet.mifospay.kyc.ui +import android.app.DatePickerDialog +import android.app.DatePickerDialog.OnDateSetListener import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.ViewCompositionStrategy +import android.widget.Button +import android.widget.EditText +import butterknife.BindView +import butterknife.ButterKnife +import butterknife.OnClick +import com.hbb20.CountryCodePicker import dagger.hilt.android.AndroidEntryPoint +import org.mifos.mobilewallet.mifospay.R import org.mifos.mobilewallet.mifospay.base.BaseFragment -import org.mifos.mobilewallet.mifospay.theme.MifosTheme +import org.mifos.mobilewallet.mifospay.kyc.KYCContract +import org.mifos.mobilewallet.mifospay.kyc.KYCContract.KYCLevel1View +import org.mifos.mobilewallet.mifospay.kyc.presenter.KYCLevel1Presenter +import org.mifos.mobilewallet.mifospay.common.Constants +import org.mifos.mobilewallet.mifospay.utils.Toaster +import org.mifos.mobilewallet.mifospay.utils.Utils.hideSoftKeyboard +import java.text.SimpleDateFormat +import java.util.Calendar +import javax.inject.Inject /** * Created by ankur on 17/May/2018 */ @AndroidEntryPoint -class KYCLevel1Fragment : BaseFragment() { +class KYCLevel1Fragment : BaseFragment(), KYCLevel1View { + @JvmField + @Inject + var mPresenter: KYCLevel1Presenter? = null + var mKYCLevel1Presenter: KYCContract.KYCLevel1Presenter? = null + + @JvmField + @BindView(R.id.et_fname) + var etFname: EditText? = null + + @JvmField + @BindView(R.id.et_lname) + var etLname: EditText? = null + + @JvmField + @BindView(R.id.et_address1) + var etAddress1: EditText? = null + + @JvmField + @BindView(R.id.et_address2) + var etAddress2: EditText? = null + + @JvmField + @BindView(R.id.ccp_code) + var ccpPhonecode: CountryCodePicker? = null + + @JvmField + @BindView(R.id.et_mobile_number) + var etMobileNumber: EditText? = null + + @JvmField + @BindView(R.id.et_dob) + var etDOB: EditText? = null + + @JvmField + @BindView(R.id.btn_submit) + var btnSubmit: Button? = null + var date: OnDateSetListener? = null + private lateinit var myCalendar: Calendar override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - return ComposeView(requireContext()).apply { - setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) - setContent { - MifosTheme { - KYCLevel1Screen( - navigateBack = { goBack() } - ) - } - } + ): View? { + val rootView = inflater.inflate(R.layout.fragment_kyc_lvl1, container, false) + ButterKnife.bind(this, rootView) + mPresenter!!.attachView(this) + //setToolbarTitle(Constants.KYC_REGISTRATION_LEVEL_1); + myCalendar = Calendar.getInstance() + date = OnDateSetListener { view, year, monthOfYear, dayOfMonth -> + myCalendar.set(Calendar.YEAR, year) + myCalendar.set(Calendar.MONTH, monthOfYear) + myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth) + val myFormat = Constants.DD_MM_YY + val sdf = SimpleDateFormat(myFormat) + etDOB!!.setText(sdf.format(myCalendar.getTime())) } + ccpPhonecode!!.registerCarrierNumberEditText(etMobileNumber) + ccpPhonecode!!.setCustomMasterCountries(null) + return rootView } - fun goBack() { + @OnClick(R.id.et_dob) + fun onClickDOB() { + myCalendar + ?.get(Calendar.YEAR)?.let { + DatePickerDialog( + requireContext(), date, it, myCalendar!![Calendar.MONTH], + myCalendar!![Calendar.DAY_OF_MONTH] + ).show() + } + } + + @OnClick(R.id.btn_submit) + fun onClickSubmit() { + showProgressDialog(Constants.PLEASE_WAIT) + val fname = etFname!!.text.toString().trim { it <= ' ' } + val lname = etLname!!.text.toString().trim { it <= ' ' } + val address1 = etAddress1!!.text.toString().trim { it <= ' ' } + val address2 = etAddress2!!.text.toString().trim { it <= ' ' } + val phoneno = ccpPhonecode!!.fullNumber + val dob = etDOB!!.text.toString().trim { it <= ' ' } + mKYCLevel1Presenter!!.submitData(fname, lname, address1, address2, phoneno, dob) + hideSoftKeyboard(requireActivity()) + } + + override fun showToast(s: String?) { + Toaster.show(view, s) + } + + public override fun showProgressDialog(message: String?) { + super.showProgressDialog(message) + } + + override fun hideProgressDialog() { + super.hideProgressDialog() + } + + override fun goBack() { val intent = requireActivity().intent requireActivity().finish() startActivity(intent) } + override fun setPresenter(presenter: KYCContract.KYCLevel1Presenter?) { + mKYCLevel1Presenter = presenter + } + companion object { @JvmStatic fun newInstance(): KYCLevel1Fragment { diff --git a/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Screen.kt b/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Screen.kt deleted file mode 100644 index e6ac7ea7..00000000 --- a/mifospay/src/main/java/org/mifos/mobilewallet/mifospay/kyc/ui/KYCLevel1Screen.kt +++ /dev/null @@ -1,264 +0,0 @@ -package org.mifos.mobilewallet.mifospay.kyc.ui - -import android.content.Context -import android.widget.Toast -import androidx.compose.foundation.border -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.material.TextFieldDefaults -import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState -import com.maxkeppeler.sheets.calendar.CalendarDialog -import com.maxkeppeler.sheets.calendar.models.CalendarConfig -import com.maxkeppeler.sheets.calendar.models.CalendarSelection -import com.maxkeppeler.sheets.calendar.models.CalendarStyle -import com.togitech.ccp.component.TogiCountryCodePicker -import org.mifos.mobilewallet.mifospay.R -import org.mifos.mobilewallet.mifospay.designsystem.component.MifosOutlinedTextField -import org.mifos.mobilewallet.mifospay.kyc.presenter.KYCLevel1UiState -import org.mifos.mobilewallet.mifospay.kyc.presenter.KYCLevel1ViewModel -import org.mifos.mobilewallet.mifospay.theme.MifosTheme -import java.time.format.DateTimeFormatter - - -@Composable -fun KYCLevel1Screen( - viewModel: KYCLevel1ViewModel = hiltViewModel(), - navigateBack: () -> Unit -) { - val context = LocalContext.current - val kyc1uiState by viewModel.kyc1uiState.collectAsStateWithLifecycle() - - KYCLevel1Screen( - context = context, - uiState = kyc1uiState, - submitData = { fname, lname,address1, address2, - phoneno, dob -> - viewModel.submitData( - fname.trim { it <= ' ' }, - lname.trim { it <= ' ' }, - address1.trim { it <= ' ' }, - address2.trim { it <= ' ' }, - phoneno.trim { it <= ' ' }, - dob.trim { it <= ' ' } - ) - }, - navigateBack = navigateBack - ) -} - - -@Composable -fun KYCLevel1Screen( - context:Context, - uiState: KYCLevel1UiState, - submitData: (String, String,String,String,String,String) -> Unit, - navigateBack:() -> Unit -) { - - when(uiState){ - KYCLevel1UiState.Empty -> { - Kyc1Form( - modifier = Modifier, - submitData = submitData - ) - } - - KYCLevel1UiState.Error -> { - Toast.makeText(context, stringResource(R.string.error_adding_KYC_Level_1_details),Toast.LENGTH_SHORT).show() - navigateBack.invoke() - } - - KYCLevel1UiState.Success -> { - Toast.makeText(context, stringResource(R.string.successkyc1),Toast.LENGTH_SHORT).show() - navigateBack.invoke() - } - } -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun Kyc1Form( - modifier:Modifier, - submitData: (String, String,String,String,String,String) -> Unit -){ - - var firstName by remember { mutableStateOf("") } - var lastName by remember { mutableStateOf("") } - var address1 by remember { mutableStateOf("") } - var address2 by remember { mutableStateOf("") } - var mobileNumber by remember { mutableStateOf("") } - var dateOfBirth by remember { mutableStateOf("") } - val dateState = rememberUseCaseState() - val dateFormatter = DateTimeFormatter.ofPattern(stringResource(R.string.date_format)) - - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - ) { - Spacer(modifier = Modifier.height(20.dp)) - MifosOutlinedTextField( - modifier = modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - value = firstName, - onValueChange = { - firstName = it - }, - label = R.string.first_name, - ) - MifosOutlinedTextField( - modifier = modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - value = lastName, - onValueChange = { - lastName = it - }, - label = R.string.last_name, - ) - MifosOutlinedTextField( - modifier = modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - value = address1, - onValueChange = { - address1 = it - }, - label = R.string.address_line_1, - ) - MifosOutlinedTextField( - modifier = modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - value = address2, - onValueChange = { - address2 = it - }, - label = R.string.address_line_2, - ) - - Box ( - modifier = Modifier - .padding(vertical = 7.dp) - ){ - val keyboardController = LocalSoftwareKeyboardController.current - TogiCountryCodePicker( - modifier = Modifier, - shape = RoundedCornerShape(3.dp), - colors = TextFieldDefaults.outlinedTextFieldColors( - focusedBorderColor = MaterialTheme.colorScheme.primary - ), - onValueChange = { (code, phone), isValid -> - if (isValid){ - mobileNumber = code + phone - } - }, - label = { - Text(stringResource(id = R.string.phone_number)) }, - keyboardActions = KeyboardActions { keyboardController?.hide() } - ) - } - - CalendarDialog( - state = dateState, - config = CalendarConfig( - monthSelection = true, - yearSelection = true, - style = CalendarStyle.MONTH - ), - selection = CalendarSelection.Date{ date -> - dateOfBirth = dateFormatter.format(date) - } - ) - - Box( - modifier = Modifier - .fillMaxWidth() - .height(70.dp) - .padding(vertical = 9.dp) - .clickable { dateState.show() } - .border( - width = 1.dp, - color = Color.Black - ) - .padding(12.dp) - .clip(shape = RoundedCornerShape(8.dp)) - ) { - Text( - text = dateOfBirth.ifEmpty { stringResource(R.string.select_dob) }, - style = MaterialTheme.typography.bodyLarge - ) - } - Button( - onClick = { - submitData( - firstName, - lastName, - address1, - address2, - mobileNumber, - dateOfBirth - )}, - modifier = Modifier - .align(Alignment.CenterHorizontally) - .padding(vertical = 7.dp), - ) { - Text(text = stringResource(R.string.submit)) - } - } -} - -@Preview(showBackground = true) -@Composable -fun Kyc1FormPreview(){ - MifosTheme { - val context = LocalContext.current - KYCLevel1Screen(context,uiState=KYCLevel1UiState.Empty,submitData = { _, _, _, _, _, _ ->},navigateBack = {}) - } -} - -@Preview(showBackground = true) -@Composable -fun Kyc1PreviewWithError(){ - MifosTheme { - val context = LocalContext.current - KYCLevel1Screen(context,uiState=KYCLevel1UiState.Error,submitData = { _, _, _, _, _, _ ->},navigateBack = {}) - } -} - -@Preview(showBackground = true) -@Composable -fun Kyc1FormPreviewWithSuccess(){ - MifosTheme { - val context = LocalContext.current - KYCLevel1Screen(context,uiState=KYCLevel1UiState.Success,submitData = { _, _, _, _, _, _ ->},navigateBack = {}) - } -} \ No newline at end of file diff --git a/mifospay/src/main/res/values/strings.xml b/mifospay/src/main/res/values/strings.xml index f86ec4cf..ed048c0e 100644 --- a/mifospay/src/main/res/values/strings.xml +++ b/mifospay/src/main/res/values/strings.xml @@ -303,10 +303,6 @@ Deleted Successfully Couldn\'t fetch KYC details. Please try again. Loading - dd-MM-yyyy - Select Date of Birth - Error adding KYC Level 1 details. - KYC Level 1 details added.