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" }