You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt

136 lines
5.7 KiB
Kotlin

package com.todoroo.astrid.ui
import android.Manifest
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.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ComposeView
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberPermissionState
import com.google.accompanist.themeadapter.appcompat.AppCompatTheme
import com.todoroo.andlib.utility.AndroidUtilities
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.activities.DateAndTimePickerActivity
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.AlarmRow
import org.tasks.data.Alarm
import org.tasks.data.Alarm.Companion.TYPE_DATE_TIME
import org.tasks.date.DateTimeUtils
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.MyTimePickerDialog
import org.tasks.scheduling.NotificationSchedulerIntentService
import org.tasks.ui.TaskEditControlFragment
import java.util.*
import javax.inject.Inject
@AndroidEntryPoint
class ReminderControlSet : TaskEditControlFragment() {
@Inject lateinit var activity: Activity
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var locale: Locale
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 fun setRingMode(ringMode: Int) {
viewModel.ringNonstop = ringMode == 2
viewModel.ringFiveTimes = ringMode == 1
this.ringMode.value = ringMode
}
@OptIn(ExperimentalPermissionsApi::class)
override fun bind(parent: ViewGroup?): View =
(parent as ComposeView).apply {
setContent {
AppCompatTheme {
val ringMode by remember { this@ReminderControlSet.ringMode }
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(0, timestamp, TYPE_DATE_TIME))
}
AlarmRow(
locale = locale,
alarms = viewModel.selectedAlarms.collectAsStateLifecycleAware().value,
permissionStatus = notificationPermissions?.status
?: PermissionStatus.Granted,
launchPermissionRequest = {
notificationPermissions?.launchPermissionRequest()
},
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)
)
}
)
}
}
}
override fun controlId() = TAG
companion object {
val TAG = R.string.TEA_ctrl_reminders_pref
private const val EXTRA_REPLACE = "extra_replace"
}
}