Migrate SleepTimerCustomDialog to compose

This commit is contained in:
Ensar Sarajčić 2023-10-05 08:40:31 +02:00
parent a3e188529d
commit c37ced08a7
3 changed files with 161 additions and 57 deletions

View File

@ -39,7 +39,7 @@ import com.simplemobiletools.commons.models.FAQItem
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.flashlight.BuildConfig import com.simplemobiletools.flashlight.BuildConfig
import com.simplemobiletools.flashlight.R import com.simplemobiletools.flashlight.R
import com.simplemobiletools.flashlight.dialogs.SleepTimerCustomDialog import com.simplemobiletools.flashlight.dialogs.SleepTimerCustomAlertDialog
import com.simplemobiletools.flashlight.extensions.config import com.simplemobiletools.flashlight.extensions.config
import com.simplemobiletools.flashlight.extensions.startAboutActivity import com.simplemobiletools.flashlight.extensions.startAboutActivity
import com.simplemobiletools.flashlight.helpers.* import com.simplemobiletools.flashlight.helpers.*
@ -87,9 +87,25 @@ class MainActivity : ComponentActivity() {
} }
) )
val sleepTimerCustomDialogState = rememberAlertDialogState().apply {
DialogMember {
SleepTimerCustomAlertDialog(
alertDialogState = this,
onConfirmClick = {
if (it > 0) {
pickedSleepTimer(it)
}
},
)
}
}
val sleepTimerDialogState = rememberAlertDialogState().apply { val sleepTimerDialogState = rememberAlertDialogState().apply {
DialogMember { DialogMember {
SleepTimerRadioDialog(alertDialogState = this) SleepTimerRadioDialog(
alertDialogState = this,
customAlertDialogState = sleepTimerCustomDialogState
)
} }
} }
@ -258,7 +274,8 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
private fun SleepTimerRadioDialog( private fun SleepTimerRadioDialog(
alertDialogState: AlertDialogState alertDialogState: AlertDialogState,
customAlertDialogState: AlertDialogState
) { ) {
val items = ArrayList(listOf(10, 30, 60, 5 * 60, 10 * 60, 30 * 60).map { val items = ArrayList(listOf(10, 30, 60, 5 * 60, 10 * 60, 30 * 60).map {
RadioItem(it, secondsToString(it)) RadioItem(it, secondsToString(it))
@ -277,11 +294,7 @@ class MainActivity : ComponentActivity() {
selectedItemId = preferences.lastSleepTimerSeconds, selectedItemId = preferences.lastSleepTimerSeconds,
callback = { callback = {
if (it as Int == -1) { if (it as Int == -1) {
SleepTimerCustomDialog(this) { customAlertDialogState.show()
if (it > 0) {
pickedSleepTimer(it)
}
}
} else if (it > 0) { } else if (it > 0) {
pickedSleepTimer(it) pickedSleepTimer(it)
} }

View File

@ -0,0 +1,140 @@
package com.simplemobiletools.flashlight.dialogs
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.compose.alert_dialog.AlertDialogState
import com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import com.simplemobiletools.commons.compose.extensions.MyDevices
import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.dialogs.dialogBorder
import com.simplemobiletools.commons.dialogs.dialogContainerColor
import com.simplemobiletools.commons.dialogs.dialogElevation
import com.simplemobiletools.commons.dialogs.dialogShape
private val items = listOf(
R.string.minutes_raw,
R.string.seconds_raw,
)
@Composable
fun SleepTimerCustomAlertDialog(
alertDialogState: AlertDialogState,
modifier: Modifier = Modifier,
onConfirmClick: (seconds: Int) -> Unit,
onCancelClick: () -> Unit = {}
) {
val context = LocalContext.current
var selectedItem by remember { mutableIntStateOf(0) }
var value by remember { mutableStateOf("") }
AlertDialog(
modifier = modifier
.dialogBorder,
onDismissRequest = alertDialogState::hide
) {
Surface(
modifier = modifier,
shape = dialogShape,
color = dialogContainerColor,
tonalElevation = dialogElevation,
) {
Column(
modifier = Modifier.padding(all = dimensionResource(id = R.dimen.big_margin))
) {
Text(
modifier = Modifier.padding(bottom = dimensionResource(id = R.dimen.activity_margin)),
text = stringResource(id = R.string.sleep_timer),
style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.onSurface
)
Column(
modifier = Modifier.padding(
start = dimensionResource(id = R.dimen.activity_margin),
end = dimensionResource(id = R.dimen.activity_margin),
top = dimensionResource(id = R.dimen.activity_margin),
)
) {
TextField(
modifier = Modifier.padding(
bottom = dimensionResource(id = R.dimen.normal_margin),
),
value = value,
onValueChange = {
value = it.filter { it.isDigit() }
},
label = {
Text(stringResource(id = R.string.value))
},
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
)
)
items.forEachIndexed { index, item ->
Row(
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = index == selectedItem,
onClick = {
selectedItem = index
}
)
Text(
text = stringResource(id = item)
)
}
}
}
Row(
Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.End
) {
TextButton(onClick = {
onCancelClick()
alertDialogState.hide()
}) {
Text(text = stringResource(id = R.string.cancel))
}
TextButton(onClick = {
val enteredValue = Integer.valueOf(value.ifEmpty { "0" })
val multiplier = getMultiplier(items[selectedItem])
onConfirmClick(enteredValue * multiplier)
alertDialogState.hide()
}) {
Text(text = stringResource(id = R.string.ok))
}
}
}
}
}
}
private fun getMultiplier(id: Int) = when (id) {
R.string.seconds_raw -> 1
R.string.minutes_raw -> 60
else -> 60
}
@Composable
@MyDevices
private fun SleepTimerCustomAlertDialogPreview() {
AppThemeSurface {
SleepTimerCustomAlertDialog(
alertDialogState = rememberAlertDialogState(),
onConfirmClick = {},
onCancelClick = {},
)
}
}

View File

@ -1,49 +0,0 @@
package com.simplemobiletools.flashlight.dialogs
import android.app.Activity
import android.view.inputmethod.EditorInfo
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.flashlight.R
import com.simplemobiletools.flashlight.databinding.DialogCustomSleepTimerPickerBinding
class SleepTimerCustomDialog(val activity: Activity, val callback: (seconds: Int) -> Unit) {
private var dialog: AlertDialog? = null
private val binding = DialogCustomSleepTimerPickerBinding.inflate(activity.layoutInflater)
init {
binding.dialogRadioView.check(R.id.dialog_radio_minutes)
binding.timerValue.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
dialogConfirmed()
return@setOnEditorActionListener true
}
return@setOnEditorActionListener false
}
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { _, _ -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.apply {
activity.setupDialogStuff(binding.root, this, R.string.sleep_timer) { alertDialog ->
dialog = alertDialog
alertDialog.showKeyboard(binding.timerValue)
}
}
}
private fun dialogConfirmed() {
val value = binding.timerValue.value
val minutes = Integer.valueOf(value.ifEmpty { "0" })
val multiplier = getMultiplier(binding.dialogRadioView.checkedRadioButtonId)
callback(minutes * multiplier)
activity.hideKeyboard()
dialog?.dismiss()
}
private fun getMultiplier(id: Int) = when (id) {
R.id.dialog_radio_seconds -> 1
R.id.dialog_radio_minutes -> 60
else -> 60
}
}