Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: Migrate CreateNewCenterFragment to Jetpack Compose #2088

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.Icon
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults
Expand All @@ -18,6 +18,7 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.mifos.core.designsystem.theme.BluePrimary
Expand All @@ -33,22 +34,24 @@ import com.mifos.core.designsystem.theme.White
fun MifosOutlinedTextField(
value: TextFieldValue,
onValueChange: (TextFieldValue) -> Unit,
modifier: Modifier = Modifier,
maxLines: Int = 1,
singleLine: Boolean = true,
icon: ImageVector? = null,
label: Int,
visualTransformation: VisualTransformation = VisualTransformation.None,
trailingIcon: @Composable (() -> Unit)? = null,
error: Int?
error: Int?,
readOnly: Boolean = false,
padding: Dp = 16.dp
) {

OutlinedTextField(
value = value,
onValueChange = onValueChange,
label = { Text(stringResource(id = label)) },
modifier = Modifier
modifier = modifier
.fillMaxWidth()
.padding(start = 16.dp, end = 16.dp),
.padding(horizontal = padding),
leadingIcon = if (icon != null) {
{
Icon(
Expand Down Expand Up @@ -78,6 +81,7 @@ fun MifosOutlinedTextField(
color = MaterialTheme.colorScheme.error
)
}
}
},
readOnly = readOnly
)
}
3 changes: 3 additions & 0 deletions mifosng-android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ dependencies {
implementation(project(":core:datastore"))
implementation(project(":core:network"))
implementation(project(":core:common"))
implementation(project(":core:designsystem"))

// Multidex dependency
implementation("androidx.multidex:multidex:2.0.1")
Expand Down Expand Up @@ -255,4 +256,6 @@ dependencies {
// ViewModel utilities for Compose
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")
implementation("androidx.hilt:hilt-navigation-compose:1.1.0")
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0")

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,229 +5,29 @@
package com.mifos.mifosxdroid.online.createnewcenter

import android.os.Bundle
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import com.mifos.core.data.CenterPayload
import com.mifos.core.objects.organisation.Office
import com.mifos.core.objects.response.SaveResponse
import com.mifos.exceptions.InvalidTextInputException
import com.mifos.exceptions.RequiredFieldException
import com.mifos.exceptions.ShortOfLengthException
import com.mifos.mifosxdroid.R
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import com.mifos.mifosxdroid.core.MifosBaseFragment
import com.mifos.mifosxdroid.databinding.FragmentCreateNewCenterBinding
import com.mifos.utils.DatePickerConstrainType
import com.mifos.utils.FragmentConstants
import com.mifos.utils.MifosResponseHandler
import com.mifos.utils.ValidationUtil
import com.mifos.utils.getDatePickerDialog
import com.mifos.utils.getTodayFormatted
import dagger.hilt.android.AndroidEntryPoint
import java.text.SimpleDateFormat
import java.time.Instant
import java.util.Locale

/**
* Created by nellyk on 1/22/2016.
*/

@AndroidEntryPoint
class CreateNewCenterFragment : MifosBaseFragment() {

private lateinit var binding: FragmentCreateNewCenterBinding

var officeId: Int? = 0
var result = true

private lateinit var viewModel: CreateNewCenterViewModel

private var activationDateString: String? = null
private val officeNameIdHashMap = HashMap<String, Int>()

private var activationDate: Instant = Instant.now()
private val submissionDatePickerDialog by lazy {
getDatePickerDialog(activationDate, DatePickerConstrainType.ONLY_FUTURE_DAYS) {
val formattedDate = SimpleDateFormat("dd MM yyyy", Locale.getDefault()).format(it)
activationDate = Instant.ofEpochMilli(it)
binding.activateDateFieldContainer.editText?.setText(formattedDate)
}
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentCreateNewCenterBinding.inflate(inflater, container, false)
viewModel = ViewModelProvider(this)[CreateNewCenterViewModel::class.java]
inflateOfficeSpinner()
inflateActivationDate()
//client active checkbox onCheckedListener

viewModel.createNewCenterUiState.observe(viewLifecycleOwner) {
when (it) {
is CreateNewCenterUiState.CenterCreatedSuccessfully -> {
showProgressbar(false)
centerCreatedSuccessfully(it.saveResponse)
}

is CreateNewCenterUiState.ShowFetchingError -> {
showProgressbar(false)
showFetchingError(it.message)
}

is CreateNewCenterUiState.ShowFetchingErrorString -> {
showProgressbar(false)
showFetchingError(it.message)
}

is CreateNewCenterUiState.ShowOffices -> {
showProgressbar(false)
showOffices(it.offices)
}

is CreateNewCenterUiState.ShowProgressbar -> showProgressbar(true)
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
CreateNewCenterScreen()
}
}

return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.cbCenterActiveStatus.setOnCheckedChangeListener { compoundButton, isChecked ->
if (isChecked) {
binding.activateDateFieldContainer.visibility = View.VISIBLE
activationDateString = binding.activateDateFieldContainer.editText?.text.toString()
} else {
binding.activateDateFieldContainer.visibility = View.GONE
}
}
binding.btnSubmit.setOnClickListener {
val centerPayload = CenterPayload()
centerPayload.name = binding.etCenterName.editableText.toString()
centerPayload.active = binding.cbCenterActiveStatus.isChecked
centerPayload.activationDate = activationDateString
centerPayload.officeId = officeId
centerPayload.dateFormat = "dd MMMM yyyy"
centerPayload.locale = "en"
initiateCenterCreation(centerPayload)
}

binding.activateDateFieldContainer.setEndIconOnClickListener {
submissionDatePickerDialog.show(
requireActivity().supportFragmentManager,
FragmentConstants.DFRAG_DATE_PICKER
)
}
}

//inflating office list spinner
private fun inflateOfficeSpinner() {
viewModel.loadOffices()
}

private fun initiateCenterCreation(centerPayload: CenterPayload) {
if (isCenterNameValid) {
viewModel.createCenter(centerPayload)
}
}

private fun inflateActivationDate() {
binding.activateDateFieldContainer.editText?.setText(getTodayFormatted())
}

private val isCenterNameValid: Boolean
get() {
result = true
try {
if (TextUtils.isEmpty(binding.etCenterName.editableText.toString())) {
throw RequiredFieldException(
resources.getString(R.string.center_name),
resources.getString(R.string.error_cannot_be_empty)
)
}
if (binding.etCenterName.editableText.toString()
.trim { it <= ' ' }.length < 4 && binding.etCenterName
.editableText.toString().trim { it <= ' ' }.isNotEmpty()
) {
throw ShortOfLengthException(resources.getString(R.string.center_name), 4)
}
if (!ValidationUtil.isNameValid(binding.etCenterName.editableText.toString())) {
throw InvalidTextInputException(
resources.getString(R.string.center_name),
resources.getString(R.string.error_should_contain_only),
InvalidTextInputException.TYPE_ALPHABETS
)
}
} catch (e: InvalidTextInputException) {
e.notifyUserWithToast(activity)
result = false
} catch (e: ShortOfLengthException) {
e.notifyUserWithToast(activity)
result = false
} catch (e: RequiredFieldException) {
e.notifyUserWithToast(activity)
result = false
}
return result
}

private fun showOffices(offices: List<Office>) {
val officeList: MutableList<String> = ArrayList()
if (offices != null) {
for (office in offices) {
if (office != null) {
office.name?.let { officeList.add(it) }
}
if (office != null) {
officeNameIdHashMap[office.name!!] = office.id!!
}
}
}
officeList.sort()

binding.officeListField.setSimpleItems(officeList.toTypedArray())

binding.officeListField.setOnItemClickListener { adapterView, view, relativePosition, l ->
val index = officeList.indexOf(adapterView.getItemAtPosition(relativePosition))
officeId = officeNameIdHashMap[officeList[index]]
if (officeId != -1) {
} else {
Toast.makeText(
activity, getString(R.string.error_select_office), Toast.LENGTH_SHORT
).show()
}
}
}

private fun centerCreatedSuccessfully(saveResponse: SaveResponse?) {
Toast.makeText(
activity, "Center " + MifosResponseHandler.response,
Toast.LENGTH_LONG
).show()
requireActivity().supportFragmentManager.popBackStack()
}

private fun showFetchingError(errorMessage: Int) {
Toast.makeText(activity, errorMessage, Toast.LENGTH_SHORT).show()
}

private fun showFetchingError(s: String?) {
Toast.makeText(activity, s, Toast.LENGTH_SHORT).show()
}

private fun showProgressbar(show: Boolean) {
if (show) {
binding.llCenter.visibility = View.GONE
showMifosProgressBar()
} else {
binding.llCenter.visibility = View.VISIBLE
hideMifosProgressBar()
}
}
}
Loading
Loading