From 28ddf5c86a0a69c61cdf5918961da2b87794e119 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Wed, 20 Mar 2024 12:37:57 +0100 Subject: [PATCH] Provide a widget option (#643) * Added Glance dependency Signed-off-by: Arnau Mora Gras * Defined Glance widget Signed-off-by: Arnau Mora Gras * Replaced with new worker Signed-off-by: Arnau Mora Gras * Rename ui/widget to ui/composable, move sync widget into ui/widget; adapt strings --------- Signed-off-by: Arnau Mora Gras Co-authored-by: Ricki Hirner --- app/build.gradle.kts | 4 + app/src/main/AndroidManifest.xml | 12 +++ .../at/bitfire/davdroid/ui/AboutActivity.kt | 2 +- .../bitfire/davdroid/ui/AccountsActivity.kt | 2 +- .../davdroid/ui/AppSettingsActivity.kt | 10 +- .../bitfire/davdroid/ui/DebugInfoActivity.kt | 2 +- .../davdroid/ui/PermissionsActivity.kt | 4 +- .../at/bitfire/davdroid/ui/TasksActivity.kt | 4 +- .../kotlin/at/bitfire/davdroid/ui/Theme.kt | 6 +- .../davdroid/ui/account/AccountActivity.kt | 2 +- .../ui/account/AccountSettingsActivity.kt | 12 +-- .../ui/account/WifiPermissionsActivity.kt | 2 +- .../ui/{widget => composable}/ActionCard.kt | 2 +- .../{widget => composable}/BindingAdapters.kt | 2 +- .../ui/{widget => composable}/Boxes.kt | 2 +- .../{widget => composable}/CardWithImage.kt | 2 +- .../{widget => composable}/CropImageView.kt | 2 +- .../ui/{widget => composable}/InputDialogs.kt | 2 +- .../PasswordTextField.kt | 2 +- .../PermissionSwitchRow.kt | 2 +- .../{widget => composable}/RadioWithSwitch.kt | 2 +- .../SafeAndroidUriHandler.kt | 2 +- .../ui/{widget => composable}/Settings.kt | 2 +- .../davdroid/ui/intro/OpenSourcePage.kt | 2 +- .../ui/webdav/AddWebdavMountActivity.kt | 2 +- .../davdroid/ui/widget/SyncButtonWidget.kt | 92 +++++++++++++++++++ .../ui/widget/SyncButtonWidgetReceiver.kt | 8 ++ app/src/main/res/values/strings.xml | 4 + .../main/res/xml/widget_info_sync_button.xml | 13 +++ gradle/libs.versions.toml | 3 + 30 files changed, 174 insertions(+), 34 deletions(-) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/ActionCard.kt (98%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/BindingAdapters.kt (97%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/Boxes.kt (96%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/CardWithImage.kt (99%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/CropImageView.kt (99%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/InputDialogs.kt (99%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/PasswordTextField.kt (98%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/PermissionSwitchRow.kt (98%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/RadioWithSwitch.kt (98%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/SafeAndroidUriHandler.kt (94%) rename app/src/main/kotlin/at/bitfire/davdroid/ui/{widget => composable}/Settings.kt (99%) create mode 100644 app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidget.kt create mode 100644 app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidgetReceiver.kt create mode 100644 app/src/main/res/xml/widget_info_sync_button.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1dfe73e2..0dc4f62b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -179,6 +179,10 @@ dependencies { debugImplementation(libs.compose.ui.tooling) implementation(libs.compose.ui.toolingPreview) + // Glance Widgets + implementation(libs.glance.base) + implementation(libs.glance.material) + // Jetpack Room implementation(libs.room.runtime) implementation(libs.room.base) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cae60d36..941c47b4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -295,6 +295,18 @@ android:resource="@xml/debug_paths" /> + + + + + + + + + diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt index 3895bd12..6db31aa4 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt @@ -53,7 +53,7 @@ import at.bitfire.davdroid.Constants import at.bitfire.davdroid.Constants.withStatParams import at.bitfire.davdroid.R import at.bitfire.davdroid.log.Logger -import at.bitfire.davdroid.ui.widget.PixelBoxes +import at.bitfire.davdroid.ui.composable.PixelBoxes import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer import com.mikepenz.aboutlibraries.util.withJson diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsActivity.kt index 04983d05..db3ff5c9 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsActivity.kt @@ -89,7 +89,7 @@ import at.bitfire.davdroid.syncadapter.SyncUtils import at.bitfire.davdroid.ui.account.AccountActivity import at.bitfire.davdroid.ui.intro.IntroActivity import at.bitfire.davdroid.ui.setup.LoginActivity -import at.bitfire.davdroid.ui.widget.ActionCard +import at.bitfire.davdroid.ui.composable.ActionCard import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt index edd67528..75cfefe1 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt @@ -67,11 +67,11 @@ import at.bitfire.davdroid.settings.Settings import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage import at.bitfire.davdroid.ui.intro.OpenSourcePage -import at.bitfire.davdroid.ui.widget.EditTextInputDialog -import at.bitfire.davdroid.ui.widget.MultipleChoiceInputDialog -import at.bitfire.davdroid.ui.widget.Setting -import at.bitfire.davdroid.ui.widget.SettingsHeader -import at.bitfire.davdroid.ui.widget.SwitchSetting +import at.bitfire.davdroid.ui.composable.EditTextInputDialog +import at.bitfire.davdroid.ui.composable.MultipleChoiceInputDialog +import at.bitfire.davdroid.ui.composable.Setting +import at.bitfire.davdroid.ui.composable.SettingsHeader +import at.bitfire.davdroid.ui.composable.SwitchSetting import at.bitfire.davdroid.util.PermissionUtils import at.bitfire.davdroid.util.TaskUtils import at.bitfire.ical4android.TaskProvider diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt index 9b0318f8..e0c5c145 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt @@ -83,7 +83,7 @@ import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.AccountSettings import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.syncadapter.BaseSyncWorker -import at.bitfire.davdroid.ui.widget.CardWithImage +import at.bitfire.davdroid.ui.composable.CardWithImage import at.bitfire.ical4android.TaskProvider import at.bitfire.ical4android.TaskProvider.ProviderName import at.techbee.jtx.JtxContract diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsActivity.kt index 776d1e1e..ec0d926b 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsActivity.kt @@ -39,8 +39,8 @@ import at.bitfire.davdroid.BuildConfig import at.bitfire.davdroid.PackageChangedReceiver import at.bitfire.davdroid.R import at.bitfire.davdroid.log.Logger -import at.bitfire.davdroid.ui.widget.CardWithImage -import at.bitfire.davdroid.ui.widget.PermissionSwitchRow +import at.bitfire.davdroid.ui.composable.CardWithImage +import at.bitfire.davdroid.ui.composable.PermissionSwitchRow import at.bitfire.davdroid.util.PermissionUtils import at.bitfire.ical4android.TaskProvider import java.util.logging.Level diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksActivity.kt index 9c21fac8..7723db52 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksActivity.kt @@ -54,8 +54,8 @@ import at.bitfire.davdroid.R import at.bitfire.davdroid.util.TaskUtils import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.ui.UiUtils.toAnnotatedString -import at.bitfire.davdroid.ui.widget.CardWithImage -import at.bitfire.davdroid.ui.widget.RadioWithSwitch +import at.bitfire.davdroid.ui.composable.CardWithImage +import at.bitfire.davdroid.ui.composable.RadioWithSwitch import at.bitfire.ical4android.TaskProvider import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/Theme.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/Theme.kt index 6b233572..4b9c8376 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/Theme.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/Theme.kt @@ -2,11 +2,15 @@ package at.bitfire.davdroid.ui import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler -import at.bitfire.davdroid.ui.widget.SafeAndroidUriHandler +import at.bitfire.davdroid.ui.composable.SafeAndroidUriHandler import com.google.accompanist.themeadapter.material.MdcTheme +val primaryGreen = Color(0xff7cb342) +val onPrimaryGreen = Color(0xfffafafa) + @Suppress("DEPRECATION") @Composable fun AppTheme(content: @Composable () -> Unit) { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountActivity.kt index 69a93300..17752d8c 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountActivity.kt @@ -81,7 +81,7 @@ import at.bitfire.davdroid.settings.AccountSettings import at.bitfire.davdroid.syncadapter.OneTimeSyncWorker import at.bitfire.davdroid.ui.AppTheme import at.bitfire.davdroid.ui.PermissionsActivity -import at.bitfire.davdroid.ui.widget.ActionCard +import at.bitfire.davdroid.ui.composable.ActionCard import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberMultiplePermissionsState import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsActivity.kt index 4e24da92..9008cc52 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsActivity.kt @@ -69,12 +69,12 @@ import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.syncadapter.OneTimeSyncWorker import at.bitfire.davdroid.syncadapter.Syncer import at.bitfire.davdroid.ui.AppTheme -import at.bitfire.davdroid.ui.widget.ActionCard -import at.bitfire.davdroid.ui.widget.EditTextInputDialog -import at.bitfire.davdroid.ui.widget.MultipleChoiceInputDialog -import at.bitfire.davdroid.ui.widget.Setting -import at.bitfire.davdroid.ui.widget.SettingsHeader -import at.bitfire.davdroid.ui.widget.SwitchSetting +import at.bitfire.davdroid.ui.composable.ActionCard +import at.bitfire.davdroid.ui.composable.EditTextInputDialog +import at.bitfire.davdroid.ui.composable.MultipleChoiceInputDialog +import at.bitfire.davdroid.ui.composable.Setting +import at.bitfire.davdroid.ui.composable.SettingsHeader +import at.bitfire.davdroid.ui.composable.SwitchSetting import at.bitfire.davdroid.util.PermissionUtils import at.bitfire.ical4android.TaskProvider import at.bitfire.vcard4android.GroupMethod diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsActivity.kt index 2998ab30..705d1b39 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsActivity.kt @@ -56,7 +56,7 @@ import at.bitfire.davdroid.Constants import at.bitfire.davdroid.Constants.withStatParams import at.bitfire.davdroid.R import at.bitfire.davdroid.ui.AppTheme -import at.bitfire.davdroid.ui.widget.PermissionSwitchRow +import at.bitfire.davdroid.ui.composable.PermissionSwitchRow import at.bitfire.davdroid.util.PermissionUtils import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/ActionCard.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/ActionCard.kt similarity index 98% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/ActionCard.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/ActionCard.kt index fd7c795b..5a6a796b 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/ActionCard.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/ActionCard.kt @@ -2,7 +2,7 @@ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. **************************************************************************************************/ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/BindingAdapters.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/BindingAdapters.kt similarity index 97% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/BindingAdapters.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/BindingAdapters.kt index abd60af0..977d4ec9 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/BindingAdapters.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/BindingAdapters.kt @@ -2,7 +2,7 @@ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. **************************************************************************************************/ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import android.text.method.LinkMovementMethod import android.widget.AutoCompleteTextView diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/Boxes.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Boxes.kt similarity index 96% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/Boxes.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Boxes.kt index 71ff55bc..194b37e6 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/Boxes.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Boxes.kt @@ -2,7 +2,7 @@ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. **************************************************************************************************/ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/CardWithImage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/CardWithImage.kt similarity index 99% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/CardWithImage.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/CardWithImage.kt index 9dbd2371..ebb39f00 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/CardWithImage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/CardWithImage.kt @@ -2,7 +2,7 @@ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. **************************************************************************************************/ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/CropImageView.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/CropImageView.kt similarity index 99% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/CropImageView.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/CropImageView.kt index 29e84318..6cf312df 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/CropImageView.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/CropImageView.kt @@ -2,7 +2,7 @@ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. **************************************************************************************************/ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import android.content.Context import android.graphics.Matrix diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/InputDialogs.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/InputDialogs.kt similarity index 99% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/InputDialogs.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/InputDialogs.kt index 2f5dac1a..55bfa69a 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/InputDialogs.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/InputDialogs.kt @@ -1,4 +1,4 @@ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/PasswordTextField.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PasswordTextField.kt similarity index 98% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/PasswordTextField.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PasswordTextField.kt index b2a5d57f..0f4b4559 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/PasswordTextField.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PasswordTextField.kt @@ -1,4 +1,4 @@ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/PermissionSwitchRow.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt similarity index 98% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/PermissionSwitchRow.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt index b1226db5..1e20e62b 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/PermissionSwitchRow.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt @@ -1,4 +1,4 @@ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/RadioWithSwitch.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt similarity index 98% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/RadioWithSwitch.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt index f47952c5..e99af396 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/RadioWithSwitch.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt @@ -2,7 +2,7 @@ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. **************************************************************************************************/ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SafeAndroidUriHandler.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/SafeAndroidUriHandler.kt similarity index 94% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SafeAndroidUriHandler.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/SafeAndroidUriHandler.kt index a922d706..60e57ebc 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SafeAndroidUriHandler.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/SafeAndroidUriHandler.kt @@ -1,4 +1,4 @@ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import android.content.Context import android.widget.Toast diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/Settings.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt similarity index 99% rename from app/src/main/kotlin/at/bitfire/davdroid/ui/widget/Settings.kt rename to app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt index fc586837..6c75416d 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/Settings.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt @@ -1,4 +1,4 @@ -package at.bitfire.davdroid.ui.widget +package at.bitfire.davdroid.ui.composable import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/OpenSourcePage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/OpenSourcePage.kt index b3435c40..750eb181 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/OpenSourcePage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/OpenSourcePage.kt @@ -39,7 +39,7 @@ import at.bitfire.davdroid.Constants import at.bitfire.davdroid.Constants.withStatParams import at.bitfire.davdroid.R import at.bitfire.davdroid.settings.SettingsManager -import at.bitfire.davdroid.ui.widget.CardWithImage +import at.bitfire.davdroid.ui.composable.CardWithImage import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.android.EntryPointAccessors diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/AddWebdavMountActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/AddWebdavMountActivity.kt index 253d80c0..e580ffa0 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/AddWebdavMountActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/AddWebdavMountActivity.kt @@ -60,7 +60,7 @@ import at.bitfire.davdroid.db.WebDavMount import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.network.HttpClient import at.bitfire.davdroid.ui.AppTheme -import at.bitfire.davdroid.ui.widget.PasswordTextField +import at.bitfire.davdroid.ui.composable.PasswordTextField import at.bitfire.davdroid.webdav.CredentialsStore import at.bitfire.davdroid.webdav.DavDocumentsProvider import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidget.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidget.kt new file mode 100644 index 00000000..a7913582 --- /dev/null +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidget.kt @@ -0,0 +1,92 @@ +package at.bitfire.davdroid.ui.widget + +import android.accounts.AccountManager +import android.content.Context +import android.widget.Toast +import androidx.compose.runtime.Composable +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.glance.ColorFilter +import androidx.glance.GlanceId +import androidx.glance.GlanceModifier +import androidx.glance.Image +import androidx.glance.ImageProvider +import androidx.glance.LocalContext +import androidx.glance.action.clickable +import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.cornerRadius +import androidx.glance.appwidget.provideContent +import androidx.glance.background +import androidx.glance.layout.Alignment +import androidx.glance.layout.Row +import androidx.glance.layout.fillMaxWidth +import androidx.glance.layout.padding +import androidx.glance.layout.size +import androidx.glance.text.Text +import androidx.glance.text.TextDefaults +import androidx.glance.unit.ColorProvider +import at.bitfire.davdroid.R +import at.bitfire.davdroid.syncadapter.OneTimeSyncWorker +import at.bitfire.davdroid.ui.onPrimaryGreen +import at.bitfire.davdroid.ui.primaryGreen +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class SyncButtonWidget : GlanceAppWidget() { + override suspend fun provideGlance(context: Context, id: GlanceId) { + provideContent { + WidgetContent() + } + } + + @Composable + private fun WidgetContent() { + val context = LocalContext.current + + Row( + modifier = GlanceModifier + .fillMaxWidth() + .background(primaryGreen) + .cornerRadius(16.dp) + .padding(4.dp) + .clickable { + requestSync(context) + }, + verticalAlignment = Alignment.CenterVertically + ) { + Image( + provider = ImageProvider(R.drawable.ic_sync), + contentDescription = context.getString(R.string.widget_sync_all_accounts), + modifier = GlanceModifier + .padding(vertical = 8.dp, horizontal = 8.dp) + .size(32.dp), + colorFilter = ColorFilter.tint(ColorProvider(onPrimaryGreen)) + ) + Text( + text = context.getString(R.string.widget_sync_all), + modifier = GlanceModifier + .defaultWeight() + .padding(end = 8.dp), + style = TextDefaults.defaultTextStyle.copy( + color = ColorProvider(onPrimaryGreen), + fontSize = 16.sp + ) + ) + } + } + + private fun requestSync(context: Context) = CoroutineScope(Dispatchers.IO).launch { + val accountType = context.getString(R.string.account_type) + val accounts = AccountManager.get(context).getAccountsByType(accountType) + for (account in accounts) { + OneTimeSyncWorker.enqueueAllAuthorities(context, account, manual = true) + } + + withContext(Dispatchers.Main) { + Toast.makeText(context, R.string.sync_started, Toast.LENGTH_SHORT).show() + } + } + +} \ No newline at end of file diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidgetReceiver.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidgetReceiver.kt new file mode 100644 index 00000000..a1206640 --- /dev/null +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/widget/SyncButtonWidgetReceiver.kt @@ -0,0 +1,8 @@ +package at.bitfire.davdroid.ui.widget + +import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.GlanceAppWidgetReceiver + +class SyncButtonWidgetReceiver : GlanceAppWidgetReceiver() { + override val glanceAppWidget: GlanceAppWidget = SyncButtonWidget() +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b74666d7..3fd545c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -490,6 +490,10 @@ Received invalid task from server Ignoring one or more invalid resources + + Sync all + Sync all accounts + DAVx⁵: Connection security DAVx⁵ has encountered an unknown certificate. Do you want to trust it? diff --git a/app/src/main/res/xml/widget_info_sync_button.xml b/app/src/main/res/xml/widget_info_sync_button.xml new file mode 100644 index 00000000..76131f2f --- /dev/null +++ b/app/src/main/res/xml/widget_info_sync_button.xml @@ -0,0 +1,13 @@ + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 76950723..7deba9bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,6 +42,7 @@ compose-bom = "2024.02.02" compose-compiler = "1.5.8" # don't update to dnsjava 3.x until API level 26 (Android 8) is the minimum API [https://github.com/bitfireAT/davx5/issues/453] dnsjava = "2.1.9" +glance = "1.0.0" hilt = "2.51" jaredrummler-colorpicker = "1.1.0" # keep in sync with * app/build.gradle.kts composeOptions.kotlinCompilerExtensionVersion @@ -103,6 +104,8 @@ compose-runtime-livedata = { module = "androidx.compose.runtime:runtime-livedata compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } compose-ui-toolingPreview = { module = "androidx.compose.ui:ui-tooling-preview" } dnsjava = { module = "dnsjava:dnsjava", version.ref = "dnsjava" } +glance-base = { module = "androidx.glance:glance-appwidget", version.ref = "glance" } +glance-material = { module = "androidx.glance:glance-material", version.ref = "glance" } hilt-android-base = { module = "com.google.dagger:hilt-android", version.ref = "hilt" } hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" } hilt-android-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }