|
|
|
|
@ -5,15 +5,14 @@ import android.app.Activity
|
|
|
|
|
import android.app.Activity.RESULT_OK
|
|
|
|
|
import android.content.DialogInterface
|
|
|
|
|
import android.content.Intent
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
import android.view.View
|
|
|
|
|
import android.view.ViewGroup
|
|
|
|
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
|
|
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
|
|
|
import androidx.compose.runtime.getValue
|
|
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
|
|
import androidx.compose.runtime.mutableIntStateOf
|
|
|
|
|
import androidx.compose.runtime.remember
|
|
|
|
|
import androidx.compose.ui.platform.ComposeView
|
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|
|
|
|
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
|
|
|
|
import com.google.accompanist.permissions.PermissionStatus
|
|
|
|
|
@ -39,94 +38,90 @@ class ReminderControlSet : TaskEditControlFragment() {
|
|
|
|
|
@Inject lateinit var activity: Activity
|
|
|
|
|
@Inject lateinit var dialogBuilder: DialogBuilder
|
|
|
|
|
|
|
|
|
|
private val ringMode = mutableStateOf(0)
|
|
|
|
|
|
|
|
|
|
override fun createView(savedInstanceState: Bundle?) {
|
|
|
|
|
when {
|
|
|
|
|
viewModel.ringNonstop -> setRingMode(2)
|
|
|
|
|
viewModel.ringFiveTimes -> setRingMode(1)
|
|
|
|
|
else -> setRingMode(0)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun onClickRingType() {
|
|
|
|
|
val modes = resources.getStringArray(R.array.reminder_ring_modes)
|
|
|
|
|
val ringMode = when {
|
|
|
|
|
viewModel.ringNonstop -> 2
|
|
|
|
|
viewModel.ringFiveTimes -> 1
|
|
|
|
|
else -> 0
|
|
|
|
|
}
|
|
|
|
|
dialogBuilder
|
|
|
|
|
.newDialog()
|
|
|
|
|
.setSingleChoiceItems(modes, ringMode) { dialog: DialogInterface, which: Int ->
|
|
|
|
|
setRingMode(which)
|
|
|
|
|
dialog.dismiss()
|
|
|
|
|
}
|
|
|
|
|
.show()
|
|
|
|
|
}
|
|
|
|
|
private val ringMode = mutableIntStateOf(0)
|
|
|
|
|
|
|
|
|
|
private fun setRingMode(ringMode: Int) {
|
|
|
|
|
viewModel.ringNonstop = ringMode == 2
|
|
|
|
|
viewModel.ringFiveTimes = ringMode == 1
|
|
|
|
|
this.ringMode.value = ringMode
|
|
|
|
|
this.ringMode.intValue = ringMode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@OptIn(ExperimentalPermissionsApi::class)
|
|
|
|
|
override fun bind(parent: ViewGroup?): View =
|
|
|
|
|
(parent as ComposeView).apply {
|
|
|
|
|
setContent {
|
|
|
|
|
val ringMode by remember { this@ReminderControlSet.ringMode }
|
|
|
|
|
val hasReminderPermissions by rememberReminderPermissionState()
|
|
|
|
|
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {
|
|
|
|
|
rememberPermissionState(
|
|
|
|
|
Manifest.permission.POST_NOTIFICATIONS,
|
|
|
|
|
onPermissionResult = { success ->
|
|
|
|
|
if (success) {
|
|
|
|
|
NotificationSchedulerIntentService.enqueueWork(context)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
@Composable
|
|
|
|
|
override fun Content() {
|
|
|
|
|
LaunchedEffect(Unit) {
|
|
|
|
|
when {
|
|
|
|
|
viewModel.ringNonstop -> setRingMode(2)
|
|
|
|
|
viewModel.ringFiveTimes -> setRingMode(1)
|
|
|
|
|
else -> setRingMode(0)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
val ringMode by remember { this@ReminderControlSet.ringMode }
|
|
|
|
|
val hasReminderPermissions by rememberReminderPermissionState()
|
|
|
|
|
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {
|
|
|
|
|
rememberPermissionState(
|
|
|
|
|
Manifest.permission.POST_NOTIFICATIONS,
|
|
|
|
|
onPermissionResult = { success ->
|
|
|
|
|
if (success) {
|
|
|
|
|
NotificationSchedulerIntentService.enqueueWork(context)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
null
|
|
|
|
|
}
|
|
|
|
|
val pickDateAndTime =
|
|
|
|
|
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
|
|
|
|
if (result.resultCode != RESULT_OK) return@rememberLauncherForActivityResult
|
|
|
|
|
val data = result.data ?: return@rememberLauncherForActivityResult
|
|
|
|
|
val timestamp =
|
|
|
|
|
data.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L)
|
|
|
|
|
val replace: Alarm? = data.getParcelableExtra(EXTRA_REPLACE)
|
|
|
|
|
replace?.let { viewModel.removeAlarm(it) }
|
|
|
|
|
viewModel.addAlarm(Alarm(time = timestamp, type = TYPE_DATE_TIME))
|
|
|
|
|
}
|
|
|
|
|
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
|
|
|
|
|
val context = LocalContext.current
|
|
|
|
|
AlarmRow(
|
|
|
|
|
alarms = viewState.alarms,
|
|
|
|
|
hasNotificationPermissions = hasReminderPermissions &&
|
|
|
|
|
(notificationPermissions == null || notificationPermissions.status == PermissionStatus.Granted),
|
|
|
|
|
fixNotificationPermissions = {
|
|
|
|
|
if (hasReminderPermissions) {
|
|
|
|
|
notificationPermissions?.launchPermissionRequest()
|
|
|
|
|
} else {
|
|
|
|
|
null
|
|
|
|
|
context.openReminderSettings()
|
|
|
|
|
}
|
|
|
|
|
val pickDateAndTime =
|
|
|
|
|
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
|
|
|
|
if (result.resultCode != RESULT_OK) return@rememberLauncherForActivityResult
|
|
|
|
|
val data = result.data ?: return@rememberLauncherForActivityResult
|
|
|
|
|
val timestamp =
|
|
|
|
|
data.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L)
|
|
|
|
|
val replace: Alarm? = data.getParcelableExtra(EXTRA_REPLACE)
|
|
|
|
|
replace?.let { viewModel.removeAlarm(it) }
|
|
|
|
|
viewModel.addAlarm(Alarm(time = timestamp, type = TYPE_DATE_TIME))
|
|
|
|
|
}
|
|
|
|
|
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
|
|
|
|
|
AlarmRow(
|
|
|
|
|
alarms = viewState.alarms,
|
|
|
|
|
hasNotificationPermissions = hasReminderPermissions &&
|
|
|
|
|
(notificationPermissions == null || notificationPermissions.status == PermissionStatus.Granted),
|
|
|
|
|
fixNotificationPermissions = {
|
|
|
|
|
if (hasReminderPermissions) {
|
|
|
|
|
notificationPermissions?.launchPermissionRequest()
|
|
|
|
|
} else {
|
|
|
|
|
context.openReminderSettings()
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
ringMode = ringMode,
|
|
|
|
|
addAlarm = viewModel::addAlarm,
|
|
|
|
|
openRingType = this@ReminderControlSet::onClickRingType,
|
|
|
|
|
deleteAlarm = viewModel::removeAlarm,
|
|
|
|
|
pickDateAndTime = { replace ->
|
|
|
|
|
val timestamp = replace?.takeIf { it.type == TYPE_DATE_TIME }?.time
|
|
|
|
|
?: DateTimeUtils.newDateTime().noon().millis
|
|
|
|
|
pickDateAndTime.launch(
|
|
|
|
|
Intent(activity, DateAndTimePickerActivity::class.java)
|
|
|
|
|
.putExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, timestamp)
|
|
|
|
|
.putExtra(EXTRA_REPLACE, replace)
|
|
|
|
|
)
|
|
|
|
|
},
|
|
|
|
|
ringMode = ringMode,
|
|
|
|
|
addAlarm = viewModel::addAlarm,
|
|
|
|
|
openRingType = {
|
|
|
|
|
val modes = resources.getStringArray(R.array.reminder_ring_modes)
|
|
|
|
|
val selectedIndex = when {
|
|
|
|
|
viewModel.ringNonstop -> 2
|
|
|
|
|
viewModel.ringFiveTimes -> 1
|
|
|
|
|
else -> 0
|
|
|
|
|
}
|
|
|
|
|
dialogBuilder
|
|
|
|
|
.newDialog()
|
|
|
|
|
.setSingleChoiceItems(modes, selectedIndex) { dialog: DialogInterface, which: Int ->
|
|
|
|
|
setRingMode(which)
|
|
|
|
|
dialog.dismiss()
|
|
|
|
|
}
|
|
|
|
|
.show()
|
|
|
|
|
},
|
|
|
|
|
deleteAlarm = viewModel::removeAlarm,
|
|
|
|
|
pickDateAndTime = { replace ->
|
|
|
|
|
val timestamp = replace?.takeIf { it.type == TYPE_DATE_TIME }?.time
|
|
|
|
|
?: DateTimeUtils.newDateTime().noon().millis
|
|
|
|
|
pickDateAndTime.launch(
|
|
|
|
|
Intent(activity, DateAndTimePickerActivity::class.java)
|
|
|
|
|
.putExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, timestamp)
|
|
|
|
|
.putExtra(EXTRA_REPLACE, replace)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
val TAG = R.string.TEA_ctrl_reminders_pref
|
|
|
|
|
|