More calendar picker updates

pull/1964/head
Alex Baker 2 years ago
parent 135f628dae
commit 5f3b706b81

@ -1,78 +1,49 @@
package org.tasks.calendars
import android.Manifest
import android.app.Activity
import android.app.Dialog
import android.content.Intent
import android.os.Bundle
import androidx.compose.runtime.LaunchedEffect
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.compose.CalendarPickerList
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.CalendarPicker
import org.tasks.dialogs.DialogBuilder
import javax.inject.Inject
@AndroidEntryPoint
class CalendarPicker : DialogFragment() {
private val viewModel: CalendarPickerViewModel by viewModels()
@Inject lateinit var dialogBuilder: DialogBuilder
@OptIn(ExperimentalPermissionsApi::class)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return dialogBuilder
.newDialog()
.setContent {
val hasPermissions = rememberMultiplePermissionsState(
permissions = listOf(Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR),
onPermissionsResult = { result ->
if (result.values.all { it }) {
viewModel.loadCalendars()
}
}
CalendarPicker(
selected = arguments?.getString(EXTRA_SELECTED),
onSelected = {
targetFragment!!.onActivityResult(
targetRequestCode,
Activity.RESULT_OK,
Intent().putExtra(EXTRA_CALENDAR_ID, it?.id)
)
dismiss()
},
)
if (hasPermissions.allPermissionsGranted) {
CalendarPickerList(
calendars = viewModel.viewState.collectAsStateLifecycleAware().value.calendars,
selected = arguments?.getString(EXTRA_SELECTED),
onClick = {
targetFragment!!.onActivityResult(
targetRequestCode,
Activity.RESULT_OK,
Intent()
.putExtra(EXTRA_CALENDAR_ID, it?.id)
.putExtra(EXTRA_CALENDAR_NAME, it?.name)
)
dismiss()
},
)
}
LaunchedEffect(hasPermissions) {
if (!hasPermissions.allPermissionsGranted) {
hasPermissions.launchMultiplePermissionRequest()
}
}
}
.show()
}
companion object {
const val EXTRA_CALENDAR_ID = "extra_calendar_id"
const val EXTRA_CALENDAR_NAME = "extra_calendar_name"
private const val EXTRA_SELECTED = "extra_selected"
fun newCalendarPicker(target: Fragment?, rc: Int, selected: String?): CalendarPicker {
val arguments = Bundle()
arguments.putString(EXTRA_SELECTED, selected)
val fragment = CalendarPicker()
fragment.arguments = arguments
fragment.setTargetFragment(target, rc)
return fragment
}
fun newCalendarPicker(target: Fragment?, rc: Int, selected: String?) =
CalendarPicker().apply {
arguments = Bundle().apply {
putString(EXTRA_SELECTED, selected)
}
setTargetFragment(target, rc)
}
}
}

@ -1,5 +1,6 @@
package org.tasks.compose
import android.Manifest
import android.content.res.Configuration
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
@ -10,20 +11,54 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Block
import androidx.compose.material.icons.outlined.Event
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import com.google.android.material.composethemeadapter.MdcTheme
import org.tasks.R
import org.tasks.calendars.AndroidCalendar
import org.tasks.calendars.CalendarPickerViewModel
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun CalendarPicker(
viewModel: CalendarPickerViewModel = viewModel(),
selected: String?,
onSelected: (AndroidCalendar?) -> Unit,
) {
val hasPermissions = rememberMultiplePermissionsState(
permissions = listOf(Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR),
onPermissionsResult = { result ->
if (result.values.all { it }) {
viewModel.loadCalendars()
}
}
)
if (hasPermissions.allPermissionsGranted) {
CalendarPickerList(
calendars = viewModel.viewState.collectAsStateLifecycleAware().value.calendars,
selected = selected,
onSelected = onSelected,
)
}
LaunchedEffect(hasPermissions) {
if (!hasPermissions.allPermissionsGranted) {
hasPermissions.launchMultiplePermissionRequest()
}
}
}
@Composable
fun CalendarPickerList(
calendars: List<AndroidCalendar>,
selected: String?,
onClick: (AndroidCalendar?) -> Unit,
onSelected: (AndroidCalendar?) -> Unit,
) {
val selectedCalendar = calendars.find { it.id == selected }
MdcTheme {
@ -37,7 +72,7 @@ fun CalendarPickerList(
tint = MaterialTheme.colors.onSurface,
text = stringResource(id = R.string.dont_add_to_calendar),
selected = selectedCalendar == null,
onClick = { onClick(null) },
onClick = { onSelected(null) },
)
calendars.forEach {
CheckableIconRow(
@ -45,7 +80,7 @@ fun CalendarPickerList(
tint = Color(it.color),
text = it.name,
selected = selectedCalendar == it,
onClick = { onClick(it) }
onClick = { onSelected(it) }
)
}
}
@ -55,7 +90,7 @@ fun CalendarPickerList(
@Preview(showBackground = true, widthDp = 320)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES, widthDp = 320)
@Composable
fun CalendarPicker() {
fun CalendarPickerPreview() {
MdcTheme {
CalendarPickerList(
calendars = listOf(
@ -64,7 +99,7 @@ fun CalendarPicker() {
AndroidCalendar("3", "Personal", -10395295),
),
selected = "2",
onClick = {},
onSelected = {},
)
}
}
@ -81,7 +116,7 @@ fun CalendarPickerNoneSelected() {
AndroidCalendar("3", "Personal", -10395295),
),
selected = null,
onClick = {},
onSelected = {},
)
}
}

@ -62,9 +62,7 @@ class TaskDefaults : InjectingPreferenceFragment() {
.show(parentFragmentManager, FRAG_TAG_CALENDAR_PICKER)
false
}
val defaultCalendarName: String? = getDefaultCalendarName()
defaultCalendarPref.summary = defaultCalendarName
?: getString(R.string.dont_add_to_calendar)
updateCalendarName()
findPreference(R.string.p_default_list)
.setOnPreferenceClickListener {
@ -138,9 +136,7 @@ class TaskDefaults : InjectingPreferenceFragment() {
R.string.gcal_p_default,
data!!.getStringExtra(CalendarPicker.EXTRA_CALENDAR_ID)
)
defaultCalendarPref.summary =
data.getStringExtra(CalendarPicker.EXTRA_CALENDAR_NAME)
?: getString(R.string.dont_add_to_calendar)
updateCalendarName()
}
REQUEST_RECURRENCE -> if (resultCode == RESULT_OK) {
preferences.setString(
@ -170,6 +166,12 @@ class TaskDefaults : InjectingPreferenceFragment() {
updateDefaultLocation()
}
private fun updateCalendarName() {
val calendarId = preferences.defaultCalendar
val name = calendarProvider.getCalendar(calendarId)?.name
defaultCalendarPref.summary = name ?: getString(R.string.dont_add_to_calendar)
}
override fun onResume() {
super.onResume()
@ -180,11 +182,6 @@ class TaskDefaults : InjectingPreferenceFragment() {
updateDefaultReminders()
}
private fun getDefaultCalendarName(): String? {
val calendarId = preferences.defaultCalendar
return calendarProvider.getCalendar(calendarId)?.name
}
private fun updateRemoteListSummary() = lifecycleScope.launch {
val defaultFilter = defaultFilterProvider.getDefaultList()
findPreference(R.string.p_default_list).summary = defaultFilter.listingTitle

Loading…
Cancel
Save