From b21472da47fea3281007ebdd9a64a0328cc54558 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 8 Jan 2025 01:13:07 -0600 Subject: [PATCH] Warn microsoft and google tasks users --- .../ui/editviewmodel/TaskListViewModelTest.kt | 3 ++ .../astrid/activity/TaskListFragment.kt | 22 +++++++--- app/src/main/java/org/tasks/compose/Banner.kt | 44 +++++++++++++++++++ .../java/org/tasks/preferences/Preferences.kt | 8 ++++ .../java/org/tasks/ui/TaskListViewModel.kt | 15 ++++++- app/src/main/res/values/keys.xml | 4 ++ app/src/main/res/values/strings.xml | 5 +++ app/src/main/res/xml/preferences_advanced.xml | 2 +- 8 files changed, 94 insertions(+), 9 deletions(-) diff --git a/app/src/androidTest/java/org/tasks/ui/editviewmodel/TaskListViewModelTest.kt b/app/src/androidTest/java/org/tasks/ui/editviewmodel/TaskListViewModelTest.kt index c725515e8..314c8ba1a 100644 --- a/app/src/androidTest/java/org/tasks/ui/editviewmodel/TaskListViewModelTest.kt +++ b/app/src/androidTest/java/org/tasks/ui/editviewmodel/TaskListViewModelTest.kt @@ -11,6 +11,7 @@ import org.junit.Test import org.tasks.LocalBroadcastManager import org.tasks.analytics.Firebase import org.tasks.billing.Inventory +import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.DeletionDao import org.tasks.data.dao.TaskDao import org.tasks.data.entity.Task @@ -34,6 +35,7 @@ class TaskListViewModelTest : InjectingTestCase() { @Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var inventory: Inventory @Inject lateinit var firebase: Firebase + @Inject lateinit var caldavDao: CaldavDao @Before override fun setUp() { @@ -48,6 +50,7 @@ class TaskListViewModelTest : InjectingTestCase() { inventory = inventory, firebase = firebase, permissionChecker = PermissivePermissionChecker(context), + caldavDao = caldavDao, ) viewModel.setFilter(runBlocking { MyTasksFilter.create() }) } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt index c2b0fd7ac..97c188d30 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt @@ -91,6 +91,8 @@ import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPicker import org.tasks.compose.NotificationsDisabledBanner import org.tasks.compose.QuietHoursBanner import org.tasks.compose.SubscriptionNagBanner +import org.tasks.compose.SyncWarningGoogleTasks +import org.tasks.compose.SyncWarningMicrosoft import org.tasks.data.TaskContainer import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.TagDataDao @@ -416,9 +418,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL context.openUri(R.string.url_donate) } }, - dismiss = { - listViewModel.dismissBanner() - }, + dismiss = { listViewModel.dismissBanner() }, ) Banner.QuietHoursEnabled -> @@ -432,9 +432,19 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL ) ) }, - dismiss = { - listViewModel.dismissBanner() - } + dismiss = { listViewModel.dismissBanner() }, + ) + + Banner.WarnGoogleTasks -> + SyncWarningGoogleTasks( + moreInfo = { context.openUri(R.string.url_google_tasks) }, + dismiss = { listViewModel.dismissBanner() }, + ) + + Banner.WarnMicrosoft -> + SyncWarningMicrosoft( + moreInfo = { context.openUri(R.string.url_microsoft) }, + dismiss = { listViewModel.dismissBanner() }, ) null -> {} diff --git a/app/src/main/java/org/tasks/compose/Banner.kt b/app/src/main/java/org/tasks/compose/Banner.kt index 9dcf92827..30d7a5222 100644 --- a/app/src/main/java/org/tasks/compose/Banner.kt +++ b/app/src/main/java/org/tasks/compose/Banner.kt @@ -79,6 +79,36 @@ fun QuietHoursBanner( ) } +@Composable +fun SyncWarningGoogleTasks( + moreInfo: () -> Unit, + dismiss: () -> Unit, +) { + Banner( + title = stringResource(R.string.sync_warning_google_tasks_title), + body = stringResource(R.string.sync_warning_google_tasks), + dismissText = stringResource(id = R.string.dismiss), + onDismiss = dismiss, + action = stringResource(id = R.string.button_learn_more), + onAction = moreInfo, + ) +} + +@Composable +fun SyncWarningMicrosoft( + moreInfo: () -> Unit, + dismiss: () -> Unit, +) { + Banner( + title = stringResource(R.string.sync_warning_microsoft_title), + body = stringResource(R.string.sync_warning_microsoft), + dismissText = stringResource(id = R.string.dismiss), + onDismiss = dismiss, + action = stringResource(id = R.string.button_learn_more), + onAction = moreInfo, + ) +} + @Composable fun BeastModeBanner( visible: Boolean, @@ -123,3 +153,17 @@ private fun SubscriptionNagPreview() = TasksTheme { private fun QuietHoursPreview() = TasksTheme { QuietHoursBanner(showSettings = {}, dismiss = {}) } + +@Preview(showBackground = true) +@Preview(showBackground = true, backgroundColor = 0x202124, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun MicrosoftWarningPreview() = TasksTheme { + SyncWarningMicrosoft(moreInfo = {}, dismiss = {}) +} + +@Preview(showBackground = true) +@Preview(showBackground = true, backgroundColor = 0x202124, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun GoogleTasksWarningPreview() = TasksTheme { + SyncWarningGoogleTasks(moreInfo = {}, dismiss = {}) +} diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt index 5d68579a8..9cef004bf 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.kt +++ b/app/src/main/java/org/tasks/preferences/Preferences.kt @@ -570,6 +570,14 @@ class Preferences @JvmOverloads constructor( get() = getBoolean(R.string.p_warn_quiet_hours_enabled, true) set(value) = setBoolean(R.string.p_warn_quiet_hours_enabled, value) + var warnMicrosoft: Boolean + get() = getBoolean(R.string.p_warn_microsoft, true) + set(value) = setBoolean(R.string.p_warn_microsoft, value) + + var warnGoogleTasks: Boolean + get() = getBoolean(R.string.p_warn_google_tasks, true) + set(value) = setBoolean(R.string.p_warn_google_tasks, value) + var lastSubscribeRequest: Long get() = getLong(R.string.p_last_subscribe_request, 0L) set(value) = setLong(R.string.p_last_subscribe_request, value) diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt index fa00280e3..2c6c20095 100644 --- a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt @@ -26,6 +26,7 @@ import org.tasks.billing.Inventory import org.tasks.compose.throttleLatest import org.tasks.data.TaskContainer import org.tasks.data.TaskListQuery.getQuery +import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.DeletionDao import org.tasks.data.dao.TaskDao import org.tasks.data.entity.Task @@ -51,6 +52,8 @@ sealed interface Banner { data object AlarmsDisabled : Banner data object QuietHoursEnabled : Banner data object BegForMoney : Banner + data object WarnMicrosoft : Banner + data object WarnGoogleTasks : Banner } @HiltViewModel @@ -64,6 +67,7 @@ class TaskListViewModel @Inject constructor( private val inventory: Inventory, private val firebase: Firebase, private val permissionChecker: PermissionChecker, + private val caldavDao: CaldavDao, ) : ViewModel() { data class State( @@ -188,6 +192,7 @@ class TaskListViewModel @Inject constructor( fun updateBannerState() { viewModelScope.launch(Dispatchers.IO) { + val accounts = caldavDao.getAccounts() val banner = when { preferences.warnNotificationsDisabled && !permissionChecker.hasNotificationPermission() -> Banner.NotificationsDisabled @@ -197,6 +202,10 @@ class TaskListViewModel @Inject constructor( Banner.BegForMoney preferences.isCurrentlyQuietHours && preferences.warnQuietHoursDisabled -> Banner.QuietHoursEnabled + accounts.any { it.isMicrosoft } && preferences.warnMicrosoft -> + Banner.WarnMicrosoft + accounts.any { it.isGoogleTasks } && preferences.warnGoogleTasks -> + Banner.WarnGoogleTasks else -> null } _state.update { @@ -207,14 +216,16 @@ class TaskListViewModel @Inject constructor( fun dismissBanner(tookAction: Boolean = false) { when (state.value.banner) { - Banner.NotificationsDisabled ->preferences.warnNotificationsDisabled = tookAction + Banner.NotificationsDisabled -> preferences.warnNotificationsDisabled = tookAction Banner.AlarmsDisabled -> preferences.warnAlarmsDisabled = false Banner.QuietHoursEnabled -> preferences.warnQuietHoursDisabled = false Banner.BegForMoney -> { preferences.lastSubscribeRequest = currentTimeMillis() firebase.logEvent(R.string.event_banner_sub, R.string.param_click to tookAction) } - else -> {} + Banner.WarnGoogleTasks -> preferences.warnGoogleTasks = false + Banner.WarnMicrosoft -> preferences.warnMicrosoft = false + null -> {} } updateBannerState() diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 36263a30e..31506ace3 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -43,6 +43,8 @@ https://tasks.org/translations https://tasks.org/notifications https://tasks.org/intents + https://tasks.org/docs/sync_google_tasks + https://tasks.org/docs/sync_microsoft date_shortcut_morning date_shortcut_afternoon @@ -409,6 +411,8 @@ warn_notifications_disabled warn_alarms_disabled warn_quiet_hours_enabled + warn_microsoft + warn_google_Tasks showed_purchase_dialog billing_flow_result diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d356a287..2e1dc1839 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -734,4 +734,9 @@ File %1$s contained %2$s.\n\n Allow multiline titles Press Enter key to add line breaks Press Done to close keyboard + About Microsoft To Do sync + Not all task details sync with Microsoft To Do. + About Google Task sync + Not all task details sync with Google Tasks + Learn more diff --git a/app/src/main/res/xml/preferences_advanced.xml b/app/src/main/res/xml/preferences_advanced.xml index 8dcccb1d1..cfb63fe28 100644 --- a/app/src/main/res/xml/preferences_advanced.xml +++ b/app/src/main/res/xml/preferences_advanced.xml @@ -6,7 +6,7 @@ android:defaultValue="false" android:key="@string/p_microsoft_sync" android:title="Microsoft To Do Sync" - android:summary="Early access feature. USE AT YOUR OWN RISK" /> + android:summary="Early access feature, please report any bugs!" />