More calendar picker updates

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

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

@ -1,5 +1,6 @@
package org.tasks.compose package org.tasks.compose
import android.Manifest
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding 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.Block
import androidx.compose.material.icons.outlined.Event import androidx.compose.material.icons.outlined.Event
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp 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 com.google.android.material.composethemeadapter.MdcTheme
import org.tasks.R import org.tasks.R
import org.tasks.calendars.AndroidCalendar 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 @Composable
fun CalendarPickerList( fun CalendarPickerList(
calendars: List<AndroidCalendar>, calendars: List<AndroidCalendar>,
selected: String?, selected: String?,
onClick: (AndroidCalendar?) -> Unit, onSelected: (AndroidCalendar?) -> Unit,
) { ) {
val selectedCalendar = calendars.find { it.id == selected } val selectedCalendar = calendars.find { it.id == selected }
MdcTheme { MdcTheme {
@ -37,7 +72,7 @@ fun CalendarPickerList(
tint = MaterialTheme.colors.onSurface, tint = MaterialTheme.colors.onSurface,
text = stringResource(id = R.string.dont_add_to_calendar), text = stringResource(id = R.string.dont_add_to_calendar),
selected = selectedCalendar == null, selected = selectedCalendar == null,
onClick = { onClick(null) }, onClick = { onSelected(null) },
) )
calendars.forEach { calendars.forEach {
CheckableIconRow( CheckableIconRow(
@ -45,7 +80,7 @@ fun CalendarPickerList(
tint = Color(it.color), tint = Color(it.color),
text = it.name, text = it.name,
selected = selectedCalendar == it, selected = selectedCalendar == it,
onClick = { onClick(it) } onClick = { onSelected(it) }
) )
} }
} }
@ -55,7 +90,7 @@ fun CalendarPickerList(
@Preview(showBackground = true, widthDp = 320) @Preview(showBackground = true, widthDp = 320)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES, widthDp = 320) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES, widthDp = 320)
@Composable @Composable
fun CalendarPicker() { fun CalendarPickerPreview() {
MdcTheme { MdcTheme {
CalendarPickerList( CalendarPickerList(
calendars = listOf( calendars = listOf(
@ -64,7 +99,7 @@ fun CalendarPicker() {
AndroidCalendar("3", "Personal", -10395295), AndroidCalendar("3", "Personal", -10395295),
), ),
selected = "2", selected = "2",
onClick = {}, onSelected = {},
) )
} }
} }
@ -81,7 +116,7 @@ fun CalendarPickerNoneSelected() {
AndroidCalendar("3", "Personal", -10395295), AndroidCalendar("3", "Personal", -10395295),
), ),
selected = null, selected = null,
onClick = {}, onSelected = {},
) )
} }
} }

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

Loading…
Cancel
Save