diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index cd376f3538a8e5df6d8314b10591343d1438a0d5..18e97d13d6293b75f9ba5e9a7d53d3602853a016 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -228,10 +228,12 @@ dependencies {
exclude(group="junit")
exclude(group="org.ogce", module="xpp3") // Android has its own XmlPullParser implementation
}
+ /*
implementation(libs.bitfire.synctools) {
exclude(group="androidx.test") // synctools declares test rules, but we don't want them in non-test code
exclude(group = "junit")
}
+ */
// third-party libs
@Suppress("RedundantSuppression")
@@ -254,6 +256,17 @@ dependencies {
implementation(libs.commons.codec)
implementation(libs.commons.lang)
+ // e-Specific dependencies - (Avoid moving into toml)
+ implementation("foundation.e:elib:0.0.1-alpha11")
+ implementation("foundation.e:synctools:58bc6752") {
+ exclude(group="androidx.test")
+ exclude(group = "junit")
+ }
+ implementation("org.mnode.ical4j:ical4j:3.2.19") {
+ exclude(group = "commons-logging", module = "commons-logging")
+ }
+ implementation("com.googlecode.ez-vcard:ez-vcard:0.12.1")
+
// for tests
androidTestImplementation(libs.androidx.arch.core.testing)
androidTestImplementation(libs.androidx.test.core)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e279299bbb53c760fa0a7406348a6e552c694d7..6cf7d65d7f83ab2d8d3aee8a8a2be26ab47216bf 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -324,6 +324,7 @@
+
diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png
index 4cc81409080c7754124235d4d31c11ce7a8434f0..cafde5df9d1e89e1bdc0c9800cacbdabf7bd084a 100644
Binary files a/app/src/main/ic_launcher-web.png and b/app/src/main/ic_launcher-web.png differ
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt b/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt
index 77e11df426a4b7fe198673179e479ff973b12c03..3b2df226f97fd79505f8f6b26092864d2ffe4895 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt
@@ -23,6 +23,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
import at.bitfire.davdroid.R
import at.bitfire.davdroid.TextTable
import at.bitfire.davdroid.db.migration.AutoMigration12
+import at.bitfire.davdroid.db.migration.AutoMigration13
import at.bitfire.davdroid.db.migration.AutoMigration16
import at.bitfire.davdroid.db.migration.AutoMigration18
import at.bitfire.davdroid.ui.AccountsActivity
@@ -49,7 +50,7 @@ import javax.inject.Singleton
AutoMigration(from = 15, to = 16, spec = AutoMigration16::class),
AutoMigration(from = 14, to = 15),
AutoMigration(from = 13, to = 14),
- AutoMigration(from = 12, to = 13),
+ AutoMigration(from = 12, to = 13, spec = AutoMigration13::class),
AutoMigration(from = 11, to = 12, spec = AutoMigration12::class),
AutoMigration(from = 10, to = 11),
AutoMigration(from = 9, to = 10)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration13.kt b/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration13.kt
new file mode 100644
index 0000000000000000000000000000000000000000..db2fecc866b12c78c535a68cf95414cc49c3897a
--- /dev/null
+++ b/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration13.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
+ */
+
+package at.bitfire.davdroid.db.migration
+
+
+import android.content.Context
+import androidx.room.DeleteColumn
+import androidx.room.ProvidedAutoMigrationSpec
+import androidx.room.migration.AutoMigrationSpec
+import dagger.Binds
+import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import dagger.multibindings.IntoSet
+import java.util.logging.Logger
+import javax.inject.Inject
+
+@ProvidedAutoMigrationSpec
+@DeleteColumn(tableName = "service", columnName = "accountType")
+@DeleteColumn(tableName = "service", columnName = "authState")
+@DeleteColumn(tableName = "service", columnName = "addressBookAccountType")
+class AutoMigration13 @Inject constructor(
+ @ApplicationContext val context: Context,
+ val logger: Logger
+): AutoMigrationSpec {
+
+ @Module
+ @InstallIn(SingletonComponent::class)
+ abstract class AutoMigrationModule {
+ @Binds @IntoSet
+ abstract fun provide(impl: AutoMigration13): AutoMigrationSpec
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration18.kt b/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration18.kt
index ac0764ff685429f6737c3d3c8fb1a0cdababa186..598649ebb74f9cc14a88878ea283f562c9f1be4b 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration18.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/db/migration/AutoMigration18.kt
@@ -48,7 +48,8 @@ class AutoMigration18 @Inject constructor() : AutoMigrationSpec {
CalendarContract.AUTHORITY -> SyncDataType.EVENTS.name
TaskProvider.ProviderName.JtxBoard.authority,
TaskProvider.ProviderName.TasksOrg.authority,
- TaskProvider.ProviderName.OpenTasks.authority -> SyncDataType.TASKS.name
+ TaskProvider.ProviderName.OpenTasks.authority,
+ TaskProvider.ProviderName.EOpenTasks.authority -> SyncDataType.TASKS.name
else -> {
db.execSQL("DELETE FROM syncstats WHERE id = ?", arrayOf(id))
continue
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/network/OAuthModule.kt b/app/src/main/kotlin/at/bitfire/davdroid/network/OAuthModule.kt
index 8b4e361c57beef2c6338ce63c190b5da77454207..7f818372208114344efd676aa63e8e20bb452f3a 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/network/OAuthModule.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/network/OAuthModule.kt
@@ -18,6 +18,7 @@ import java.net.URL
@Module
@InstallIn(SingletonComponent::class)
object OAuthModule {
+ const val DEFAULT_BROWSER = "foundation.e.browser"
/**
* Make sure to call [AuthorizationService.dispose] when obtaining an instance.
@@ -29,6 +30,9 @@ object OAuthModule {
fun authorizationService(@ApplicationContext context: Context): AuthorizationService =
AuthorizationService(context,
AppAuthConfiguration.Builder()
+ .setBrowserMatcher {
+ it.packageName == DEFAULT_BROWSER
+ }
.setConnectionBuilder { uri ->
val url = URL(uri.toString())
(url.openConnection() as HttpURLConnection).apply {
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/network/UserAgentInterceptor.kt b/app/src/main/kotlin/at/bitfire/davdroid/network/UserAgentInterceptor.kt
index 88b97917549dc426040c39964b8c76f1661a0ca2..081ed27985c5a59bcfdeec9605842fbe3598034b 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/network/UserAgentInterceptor.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/network/UserAgentInterceptor.kt
@@ -14,10 +14,11 @@ import java.util.logging.Logger
object UserAgentInterceptor: Interceptor {
- val userAgent = "DAVx5/${BuildConfig.VERSION_NAME} (dav4jvm; " +
+ var userAgent = "DAVx5/${BuildConfig.VERSION_NAME} (dav4jvm; " +
"okhttp/${OkHttp.VERSION}) Android/${Build.VERSION.RELEASE}"
init {
+ userAgent = "/e/OS v2 (Android) Nextcloud-android"
Logger.getGlobal().info("Will set User-Agent: $userAgent")
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/HomeSetRefresher.kt b/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/HomeSetRefresher.kt
index 634e170636df71df7436db977fec460ec6c0f20e..b04a2f8ee504b6f0efa79edf16c2270eccc453b8 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/HomeSetRefresher.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/HomeSetRefresher.kt
@@ -154,8 +154,8 @@ class HomeSetRefresher @AssistedInject constructor(
.contains(collection.homeSetId)
&& !excluded
- else -> // don't preselect
- false
+ else -> // preselect
+ true
}
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/DefaultsProvider.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/DefaultsProvider.kt
index 4755bccefc1975f2ed2c211d5b120a7c9dd5fb16..09f922c4509ab1f8e6484d8e6614046f5a6bead7 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/settings/DefaultsProvider.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/DefaultsProvider.kt
@@ -29,7 +29,7 @@ class DefaultsProvider @Inject constructor(): SettingsProvider {
)
val longDefaults = mapOf(
- Pair(Settings.DEFAULT_SYNC_INTERVAL, 4*3600) /* 4 hours */
+ Pair(Settings.DEFAULT_SYNC_INTERVAL, 900) /* 15 minutes */
)
val stringDefaults = mapOf(
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration10.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration10.kt
index fb561c7998cfc0fb6006734ca75718f521c303f7..1cf9bba10e766a3ee516de39b370c522aad7bd7d 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration10.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration10.kt
@@ -37,10 +37,17 @@ class AccountSettingsMigration10 @Inject constructor(
): AccountSettingsMigration {
override fun migrate(account: Account) {
- TaskProvider.acquire(context, TaskProvider.ProviderName.OpenTasks)?.use { provider ->
- val tasksUri = provider.tasksUri().asSyncAdapter(account)
- val emptyETag = contentValuesOf(LocalTask.COLUMN_ETAG to null)
- provider.client.update(tasksUri, emptyETag, "${TaskContract.Tasks._DIRTY}=0 AND ${TaskContract.Tasks._DELETED}=0", null)
+ val providerNames = listOf(
+ TaskProvider.ProviderName.OpenTasks,
+ TaskProvider.ProviderName.EOpenTasks
+ )
+
+ providerNames.forEach { providerName ->
+ TaskProvider.acquire(context, providerName)?.use { provider ->
+ val tasksUri = provider.tasksUri().asSyncAdapter(account)
+ val emptyETag = contentValuesOf(LocalTask.COLUMN_ETAG to null)
+ provider.client.update(tasksUri, emptyETag, "${TaskContract.Tasks._DIRTY}=0 AND ${TaskContract.Tasks._DELETED}=0", null)
+ }
}
if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_CALENDAR) == PackageManager.PERMISSION_GRANTED)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration14.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration14.kt
index d68614ae371ef8e41b161cbd381edfac6a3043ec..ba318e88acfea4bee4a0bf00ed2db06abf67fa67 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration14.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration14.kt
@@ -36,6 +36,7 @@ class AccountSettingsMigration14 @Inject constructor(
CalendarContract.AUTHORITY,
TaskProvider.ProviderName.JtxBoard.authority,
TaskProvider.ProviderName.OpenTasks.authority,
+ TaskProvider.ProviderName.EOpenTasks.authority,
TaskProvider.ProviderName.TasksOrg.authority
)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration8.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration8.kt
index e29aeb20a56bf2408d9440c350062a97b4a81731..b7f1cefebbc0f36a6bda0b4cebe1c530c9e1cc62 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration8.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration8.kt
@@ -33,27 +33,37 @@ class AccountSettingsMigration8 @Inject constructor(
* SEQUENCE and should not be used for the eTag.
*/
override fun migrate(account: Account) {
- TaskProvider.acquire(context, TaskProvider.ProviderName.OpenTasks)?.use { provider ->
- // ETag is now in sync_version instead of sync1
- // UID is now in _uid instead of sync2
- provider.client.query(provider.tasksUri().asSyncAdapter(account),
- arrayOf(TaskContract.Tasks._ID, TaskContract.Tasks.SYNC1, TaskContract.Tasks.SYNC2),
- "${TaskContract.Tasks.ACCOUNT_TYPE}=? AND ${TaskContract.Tasks.ACCOUNT_NAME}=?",
- arrayOf(account.type, account.name), null)!!.use { cursor ->
- while (cursor.moveToNext()) {
- val id = cursor.getLong(0)
- val eTag = cursor.getString(1)
- val uid = cursor.getString(2)
- val values = contentValuesOf(
- TaskContract.Tasks._UID to uid,
- TaskContract.Tasks.SYNC_VERSION to eTag,
- TaskContract.Tasks.SYNC1 to null,
- TaskContract.Tasks.SYNC2 to null
- )
- logger.log(Level.FINER, "Updating task $id", values)
- provider.client.update(
- ContentUris.withAppendedId(provider.tasksUri(), id).asSyncAdapter(account),
- values, null, null)
+ val providerNames = listOf(
+ TaskProvider.ProviderName.OpenTasks,
+ TaskProvider.ProviderName.EOpenTasks
+ )
+
+ providerNames.forEach { providerName ->
+ TaskProvider.acquire(context, providerName)?.use { provider ->
+ // ETag is now in sync_version instead of sync1
+ // UID is now in _uid instead of sync2
+ provider.client.query(
+ provider.tasksUri().asSyncAdapter(account),
+ arrayOf(TaskContract.Tasks._ID, TaskContract.Tasks.SYNC1, TaskContract.Tasks.SYNC2),
+ "${TaskContract.Tasks.ACCOUNT_TYPE}=? AND ${TaskContract.Tasks.ACCOUNT_NAME}=?",
+ arrayOf(account.type, account.name), null
+ )!!.use { cursor ->
+ while (cursor.moveToNext()) {
+ val id = cursor.getLong(0)
+ val eTag = cursor.getString(1)
+ val uid = cursor.getString(2)
+ val values = contentValuesOf(
+ TaskContract.Tasks._UID to uid,
+ TaskContract.Tasks.SYNC_VERSION to eTag,
+ TaskContract.Tasks.SYNC1 to null,
+ TaskContract.Tasks.SYNC2 to null
+ )
+ logger.log(Level.FINER, "Updating task $id", values)
+ provider.client.update(
+ ContentUris.withAppendedId(provider.tasksUri(), id).asSyncAdapter(account),
+ values, null, null
+ )
+ }
}
}
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration9.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration9.kt
index b3b22750ad97b820df4a71f98343268788703d9e..9c7866a13c4802ec06160ebcfd23061d821735d5 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration9.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/migration/AccountSettingsMigration9.kt
@@ -30,9 +30,17 @@ class AccountSettingsMigration9 @Inject constructor(
override fun migrate(account: Account) = runBlocking {
val hasCalDAV = db.serviceDao().getByAccountAndType(account.name, Service.TYPE_CALDAV) != null
- if (!hasCalDAV && ContentResolver.getIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority) != 0) {
- logger.info("Disabling OpenTasks sync for $account")
- ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 0)
+ if (!hasCalDAV) {
+ val providerNames = listOf(
+ TaskProvider.ProviderName.OpenTasks,
+ TaskProvider.ProviderName.EOpenTasks
+ )
+ providerNames.forEach { providerName ->
+ if (ContentResolver.getIsSyncable(account, providerName.authority) != 0) {
+ logger.info("Disabling ${providerName.name} sync for $account")
+ ContentResolver.setIsSyncable(account, providerName.authority, 0)
+ }
+ }
}
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncDataType.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncDataType.kt
index 738ab9d1abde399c1e10ef923552ee02a97173d0..9eb68efc8e5d0062732fce1b9b0177b73bc7fff0 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncDataType.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncDataType.kt
@@ -46,7 +46,8 @@ enum class SyncDataType {
EVENTS
TaskProvider.ProviderName.JtxBoard.authority,
TaskProvider.ProviderName.TasksOrg.authority,
- TaskProvider.ProviderName.OpenTasks.authority ->
+ TaskProvider.ProviderName.OpenTasks.authority,
+ TaskProvider.ProviderName.EOpenTasks.authority ->
TASKS
else -> throw IllegalArgumentException("Unknown authority: $authority")
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt
index ccf085bed63e7a38be764ae6f5ad8679c24d553a..f2ae8898a3a0e276448ab63f959a746356014201 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt
@@ -40,6 +40,7 @@ import at.bitfire.davdroid.resource.SyncState
import at.bitfire.davdroid.sync.account.InvalidAccountException
import at.bitfire.synctools.storage.LocalStorageException
import dagger.hilt.android.qualifiers.ApplicationContext
+import foundation.e.accountmanager.utils.SystemUtils
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
@@ -733,10 +734,14 @@ abstract class SyncManager, out CollectionType: L
*/
private fun handleException(e: Throwable, local: LocalResource<*>?, remote: HttpUrl?) {
var message: String
+ var isNetworkAvailable = true
when (e) {
is IOException -> {
logger.log(Level.WARNING, "I/O error", e)
- syncResult.numIoExceptions++
+ isNetworkAvailable = SystemUtils.isNetworkAvailable(context)
+ if (isNetworkAvailable) {
+ syncResult.numIoExceptions++
+ }
message = context.getString(R.string.sync_error_io, e.localizedMessage)
}
@@ -765,15 +770,19 @@ abstract class SyncManager, out CollectionType: L
}
}
- syncNotificationManager.notifyException(
- dataType,
- localCollection.tag,
- message,
- localCollection,
- e,
- local,
- remote
- )
+ if (isNetworkAvailable) {
+ syncNotificationManager.notifyException(
+ dataType,
+ localCollection.tag,
+ message,
+ localCollection,
+ e,
+ local,
+ remote
+ )
+ } else {
+ logger.log(Level.WARNING, "No network available, no notification shown", e)
+ }
}
protected fun notifyInvalidResource(e: Throwable, fileName: String) =
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncNotificationManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncNotificationManager.kt
index 7efb92b88a473934b9bee34479f281b62163c76e..398a660aa956f798965f8028226f1796caac1960 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncNotificationManager.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncNotificationManager.kt
@@ -263,7 +263,7 @@ class SyncNotificationManager @AssistedInject constructor(
is LocalEvent ->
Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, id))
is LocalTask ->
- Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(TaskContract.Tasks.getContentUri(TaskProvider.ProviderName.OpenTasks.authority), id))
+ Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(TaskContract.Tasks.getContentUri(TaskProvider.ProviderName.EOpenTasks.authority), id))
else ->
null
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt
index 71138dd3e059bbab638feb755dcfa9a2dc55e3c1..cf20a455227ea7cf5ef9d375e52d25e7ca4f7d40 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt
@@ -139,7 +139,7 @@ class TasksAppManager @Inject constructor(
fun getDataStore(): LocalDataStore<*>? {
val provider = currentProvider() ?: return null
return when (provider) {
- ProviderName.TasksOrg, ProviderName.OpenTasks -> localTaskListStoreFactory.create(provider)
+ ProviderName.TasksOrg, ProviderName.OpenTasks, ProviderName.EOpenTasks -> localTaskListStoreFactory.create(provider)
ProviderName.JtxBoard -> localJtxCollectionStore.get()
}
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AccountAuthenticatorService.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AccountAuthenticatorService.kt
index ca7b57ec2baad9d47ebabb2c199da1414638726c..ad2f5a9bcb28e69edf9218ae7aa7e2b88443ec1e 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AccountAuthenticatorService.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AccountAuthenticatorService.kt
@@ -12,7 +12,7 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.core.os.bundleOf
-import at.bitfire.davdroid.R
+import at.bitfire.davdroid.ui.setup.LoginActivity
/**
@@ -34,12 +34,17 @@ class AccountAuthenticatorService: Service() {
val context: Context
): AbstractAccountAuthenticator(context) {
- override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array?, options: Bundle?) =
- bundleOf(
- AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE to response,
- AccountManager.KEY_ERROR_CODE to AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
- AccountManager.KEY_ERROR_MESSAGE to context.getString(R.string.account_prefs_use_app)
- )
+ override fun addAccount(
+ response: AccountAuthenticatorResponse?,
+ accountType: String?,
+ authTokenType: String?,
+ requiredFeatures: Array?,
+ options: Bundle?
+ ): Bundle {
+ val intent = Intent(context, LoginActivity::class.java)
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response)
+ return bundleOf(AccountManager.KEY_INTENT to intent)
+ }
override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null
override fun getAuthTokenLabel(p0: String?) = null
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AddressBookAuthenticatorService.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AddressBookAuthenticatorService.kt
index 245275d410ee9998f4c041ae4a20bdaeb2f9e476..af4543c0937e9df55f450dce892fb9948afc6e94 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AddressBookAuthenticatorService.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/account/AddressBookAuthenticatorService.kt
@@ -12,7 +12,7 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.core.os.bundleOf
-import at.bitfire.davdroid.R
+import at.bitfire.davdroid.ui.AccountsActivity
class AddressBookAuthenticatorService: Service() {
@@ -30,11 +30,11 @@ class AddressBookAuthenticatorService: Service() {
val context: Context
): AbstractAccountAuthenticator(context) {
- override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array?, options: Bundle?) = bundleOf(
- AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE to response,
- AccountManager.KEY_ERROR_CODE to AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
- AccountManager.KEY_ERROR_MESSAGE to context.getString(R.string.account_prefs_use_app)
- )
+ override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array?, options: Bundle?): Bundle {
+ val intent = Intent(context, AccountsActivity::class.java)
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response)
+ return bundleOf(AccountManager.KEY_INTENT to intent)
+ }
override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null
override fun getAuthTokenLabel(p0: String?) = null
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/worker/BaseSyncWorker.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/worker/BaseSyncWorker.kt
index ae8cf49a86774a78e98cdc6d4112471739754a37..87edf986f7945549b418f55c61e4d52233d960d0 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/sync/worker/BaseSyncWorker.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/worker/BaseSyncWorker.kt
@@ -164,6 +164,7 @@ abstract class BaseSyncWorker(
TaskProvider.ProviderName.JtxBoard ->
jtxSyncer.create(account, resyncType, syncResult)
TaskProvider.ProviderName.OpenTasks,
+ TaskProvider.ProviderName.EOpenTasks,
TaskProvider.ProviderName.TasksOrg ->
taskSyncer.create(account, currentProvider, resyncType, syncResult)
else -> {
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsDrawerHandler.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsDrawerHandler.kt
index d9e757e199e3322b0002570c8238f5ec7a2241cd..9114462200848c4999a33703bfa89cb0d1a1b05f 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsDrawerHandler.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsDrawerHandler.kt
@@ -45,6 +45,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode
+import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
@@ -257,12 +258,12 @@ fun BrandingHeader() {
Spacer(Modifier.height(16.dp))
Box(
Modifier.background(
- color = M3ColorScheme.primaryLight,
+ color = colorResource(R.color.ic_launcher_background),
shape = RoundedCornerShape(16.dp)
)
) {
Icon(
- painterResource(R.drawable.ic_launcher_foreground),
+ painterResource(R.mipmap.ic_launcher_foreground),
stringResource(R.string.app_name),
tint = Color.White,
modifier = Modifier
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsScreen.kt
index 6e58ab98e055b8fe9a8696cd0035b00813f94513..61a3e0b37de8990ac5ecd5d99834ba3f2f6e489c 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsScreen.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AccountsScreen.kt
@@ -366,7 +366,7 @@ fun AccountList(
.padding(8.dp)
) {
Text(
- text = stringResource(R.string.account_list_welcome),
+ text = stringResource(R.string.e_account_list_welcome),
style = MaterialTheme.typography.headlineSmall,
textAlign = TextAlign.Center,
modifier = Modifier
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsScreen.kt
index 373eb16d35c14d22212333e2f2c288acdc918c80..e2e81fb7680832e4791e0f3ab22622983aa84347 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsScreen.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsScreen.kt
@@ -684,7 +684,7 @@ fun PushDistributorSelectionDialog_Preview_PushDisabled() {
PushDistributorInfo(
"com.example.distributor1",
"Distributor 1",
- AppCompatResources.getDrawable(ctx, R.drawable.ic_launcher_foreground)
+ AppCompatResources.getDrawable(ctx, R.mipmap.ic_launcher_foreground)
)
)
) { }
@@ -701,7 +701,7 @@ fun PushDistributorSelectionDialog_Preview_DistributorSelected() {
PushDistributorInfo(
"com.example.distributor1",
"Distributor 1",
- AppCompatResources.getDrawable(ctx, R.drawable.ic_launcher_foreground)
+ AppCompatResources.getDrawable(ctx, R.mipmap.ic_launcher_foreground)
),
PushDistributorInfo("com.example.distributor2")
)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoGenerator.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoGenerator.kt
index c60e062c7f60961c04ce4517918896615ca6a9cf..e3df6c3e90119164cc66d1653ed4ce8ccb8936cb 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoGenerator.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoGenerator.kt
@@ -142,6 +142,7 @@ class DebugInfoGenerator @Inject constructor(
BuildConfig.APPLICATION_ID, // DAVx5
TaskProvider.ProviderName.JtxBoard.packageName, // jtx Board
TaskProvider.ProviderName.OpenTasks.packageName, // OpenTasks
+ TaskProvider.ProviderName.EOpenTasks.packageName, // eOpenTasks
TaskProvider.ProviderName.TasksOrg.packageName // tasks.org
)
// ... and info about contact and calendar provider
@@ -152,6 +153,7 @@ class DebugInfoGenerator @Inject constructor(
ContactsContract.Contacts.CONTENT_URI,
CalendarContract.Events.CONTENT_URI,
TaskContract.Tasks.getContentUri(TaskProvider.ProviderName.OpenTasks.authority),
+ TaskContract.Tasks.getContentUri(TaskProvider.ProviderName.EOpenTasks.authority),
TaskContract.Tasks.getContentUri(TaskProvider.ProviderName.TasksOrg.authority)
)
for (uri in dataUris) {
@@ -545,6 +547,8 @@ class DebugInfoGenerator @Inject constructor(
AccountDumpInfo(account, TaskProvider.ProviderName.JtxBoard.authority, JtxContract.JtxICalObject.CONTENT_URI.asJtxSyncAdapter(account), "jtx Board ICalObject(s)"),
AccountDumpInfo(account, TaskProvider.ProviderName.OpenTasks.authority, TaskContract.Tasks.getContentUri(
TaskProvider.ProviderName.OpenTasks.authority).asCalendarSyncAdapter(account), "OpenTasks task(s)"),
+ AccountDumpInfo(account, TaskProvider.ProviderName.EOpenTasks.authority, TaskContract.Tasks.getContentUri(
+ TaskProvider.ProviderName.EOpenTasks.authority).asCalendarSyncAdapter(account), "EOpenTasks task(s)"),
AccountDumpInfo(account, TaskProvider.ProviderName.TasksOrg.authority, TaskContract.Tasks.getContentUri(
TaskProvider.ProviderName.TasksOrg.authority).asCalendarSyncAdapter(account), "tasks.org task(s)"),
AccountDumpInfo(account, ContactsContract.AUTHORITY, ContactsContract.RawContacts.CONTENT_URI.asContactsSyncAdapter(account), "wrongly assigned raw contact(s)")
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsModel.kt
index a593af5ee7ae235eef0943543b922b87690e21d1..bd5df6dd0b804baf4ca79a2a73721b21ba9f9300 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsModel.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsModel.kt
@@ -27,6 +27,8 @@ class PermissionsModel @Inject constructor(
private set
var openTasksAvailable by mutableStateOf(false)
private set
+ var eOpenTasksAvailable by mutableStateOf(false)
+ private set
var tasksOrgAvailable by mutableStateOf(false)
private set
var jtxAvailable by mutableStateOf(false)
@@ -50,6 +52,7 @@ class PermissionsModel @Inject constructor(
}
openTasksAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.OpenTasks.authority, 0) != null
+ eOpenTasksAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.EOpenTasks.authority, 0) != null
tasksOrgAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.TasksOrg.authority, 0) != null
jtxAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.JtxBoard.authority, 0) != null
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsScreen.kt
index 7d1592bfa97ba37fec8ac393102d417eb2fe43d7..ea0617ee39c772823fa8deb01f622f902d367e1a 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsScreen.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/PermissionsScreen.kt
@@ -115,6 +115,7 @@ fun PermissionsScreen(
}
},
openTasksAvailable = model.openTasksAvailable,
+ eOpenTasksAvailable = model.eOpenTasksAvailable,
tasksOrgAvailable = model.tasksOrgAvailable,
jtxAvailable = model.jtxAvailable,
modifier = modifier
@@ -127,6 +128,7 @@ fun PermissionsScreen(
keepPermissions: Boolean?,
onKeepPermissionsRequested: () -> Unit,
openTasksAvailable: Boolean?,
+ eOpenTasksAvailable: Boolean?,
tasksOrgAvailable: Boolean?,
jtxAvailable: Boolean?,
modifier: Modifier = Modifier
@@ -163,6 +165,8 @@ fun PermissionsScreen(
allPermissions += Manifest.permission.POST_NOTIFICATIONS
if (openTasksAvailable == true)
allPermissions.addAll(TaskProvider.PERMISSIONS_OPENTASKS)
+ if (eOpenTasksAvailable == true)
+ allPermissions.addAll(TaskProvider.PERMISSIONS_EOPENTASKS)
if (tasksOrgAvailable == true)
allPermissions.addAll(TaskProvider.PERMISSIONS_TASKS_ORG)
if (jtxAvailable == true)
@@ -216,6 +220,14 @@ fun PermissionsScreen(
permissions = TaskProvider.PERMISSIONS_OPENTASKS.toList(),
modifier = Modifier.padding(vertical = 4.dp)
)
+ if (eOpenTasksAvailable == true)
+ PermissionSwitchRow(
+ text = stringResource(R.string.permissions_opentasks_title),
+ summaryWhenGranted = stringResource(R.string.permissions_tasks_status_on),
+ summaryWhenNotGranted = stringResource(R.string.permissions_tasks_status_off),
+ permissions = TaskProvider.PERMISSIONS_EOPENTASKS.toList(),
+ modifier = Modifier.padding(vertical = 4.dp)
+ )
if (tasksOrgAvailable == true)
PermissionSwitchRow(
text = stringResource(R.string.permissions_tasksorg_title),
@@ -250,6 +262,7 @@ fun PermissionsCard_Preview() {
keepPermissions = true,
onKeepPermissionsRequested = {},
openTasksAvailable = true,
+ eOpenTasksAvailable = true,
tasksOrgAvailable = true,
jtxAvailable = true
)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksModel.kt
index 356e7691f944124a07e07103e208528b76b12845..ba29f78a2d60409f3a92b75ce6a4f8a1f31a5e1e 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksModel.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksModel.kt
@@ -52,10 +52,12 @@ class TasksModel @Inject constructor(
val jtxSelected = currentProvider.map { it == TaskProvider.ProviderName.JtxBoard }
val tasksOrgSelected = currentProvider.map { it == TaskProvider.ProviderName.TasksOrg }
val openTasksSelected = currentProvider.map { it == TaskProvider.ProviderName.OpenTasks }
+ val eOpenTasksSelected = currentProvider.map { it == TaskProvider.ProviderName.EOpenTasks }
var jtxInstalled by mutableStateOf(false)
var tasksOrgInstalled by mutableStateOf(false)
var openTasksInstalled by mutableStateOf(false)
+ var eOpenTasksInstalled by mutableStateOf(false)
init {
viewModelScope.launch {
@@ -63,6 +65,7 @@ class TasksModel @Inject constructor(
jtxInstalled = isInstalled(TaskProvider.ProviderName.JtxBoard.packageName)
tasksOrgInstalled = isInstalled(TaskProvider.ProviderName.TasksOrg.packageName)
openTasksInstalled = isInstalled(TaskProvider.ProviderName.OpenTasks.packageName)
+ eOpenTasksInstalled = isInstalled(TaskProvider.ProviderName.EOpenTasks.packageName)
}
}
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksScreen.kt
index e854f7b6c4df6110a8ea59163797ee65990caa81..6d2dd4b3a1433695180820c4e59a54f4e2c78e21 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksScreen.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/TasksScreen.kt
@@ -95,6 +95,9 @@ fun TasksCard(
val openTasksInstalled = model.openTasksInstalled
val openTasksSelected by model.openTasksSelected.collectAsStateWithLifecycle(false)
+ val eOpenTasksInstalled = model.eOpenTasksInstalled
+ val eOpenTasksSelected by model.eOpenTasksSelected.collectAsStateWithLifecycle(false)
+
val showAgain by model.showAgain.collectAsStateWithLifecycle(true)
TasksCard(
@@ -104,6 +107,8 @@ fun TasksCard(
tasksOrgInstalled = tasksOrgInstalled,
openTasksSelected = openTasksSelected,
openTasksInstalled = openTasksInstalled,
+ eOpenTasksSelected = eOpenTasksSelected,
+ eOpenTasksInstalled = eOpenTasksInstalled,
showAgain = showAgain,
onSetShowAgain = model::setShowAgain,
onProviderSelected = { provider ->
@@ -135,6 +140,8 @@ fun TasksCard(
tasksOrgInstalled: Boolean,
openTasksSelected: Boolean,
openTasksInstalled: Boolean,
+ eOpenTasksSelected: Boolean,
+ eOpenTasksInstalled: Boolean,
onProviderSelected: (TaskProvider.ProviderName) -> Unit = {},
installApp: (String) -> Unit = {},
showAgain: Boolean,
@@ -207,6 +214,23 @@ fun TasksCard(
.padding(top = 12.dp)
)
+ RadioWithSwitch(
+ title = stringResource(R.string.intro_tasks_eopentasks),
+ summary = {
+ Text(stringResource(R.string.intro_tasks_eopentasks_info))
+ },
+ isSelected = eOpenTasksSelected,
+ isToggled = eOpenTasksInstalled,
+ enabled = eOpenTasksInstalled,
+ onSelected = { onProviderSelected(TaskProvider.ProviderName.EOpenTasks) },
+ onToggled = { toggled ->
+ if (toggled) installApp(TaskProvider.ProviderName.EOpenTasks.packageName)
+ },
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(top = 12.dp)
+ )
+
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
@@ -251,6 +275,8 @@ fun TasksCard_Preview() {
tasksOrgInstalled = false,
openTasksSelected = false,
openTasksInstalled = false,
+ eOpenTasksSelected = false,
+ eOpenTasksInstalled = false,
showAgain = true
)
}
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionScreen.kt
index cbea9751a6601babd0360cd31f79238cff5f74e7..17543ac90e841e4e3ec725c78f0a6e6bde92d27e 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionScreen.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionScreen.kt
@@ -33,7 +33,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MediumTopAppBar
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -57,6 +56,7 @@ import at.bitfire.davdroid.sync.SyncDataType
import at.bitfire.davdroid.ui.AppTheme
import at.bitfire.davdroid.ui.composable.ExceptionInfoDialog
import at.bitfire.davdroid.ui.composable.ProgressBar
+import foundation.e.accountmanager.ui.components.ESwitch
import java.time.Instant
import java.time.ZoneId
import java.time.ZonedDateTime
@@ -203,7 +203,7 @@ fun CollectionScreen(
else
stringResource(R.string.collection_synchronization_off),
control = {
- Switch(
+ ESwitch(
checked = sync,
onCheckedChange = onSetSync
)
@@ -223,7 +223,7 @@ fun CollectionScreen(
else -> stringResource(R.string.collection_read_write)
},
control = {
- Switch(
+ ESwitch(
checked = readOnly.isReadOnly(),
enabled = readOnly.canUserChange(),
onCheckedChange = onSetForceReadOnly
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionsList.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionsList.kt
index 4feb9395ec13f28adf62dc65771ef381a60747c4..e3af288f254b6956dddec7c206e00a9067781e26 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionsList.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/CollectionsList.kt
@@ -36,7 +36,6 @@ import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
@@ -55,6 +54,7 @@ import androidx.paging.compose.itemKey
import at.bitfire.davdroid.R
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.ui.AppTheme
+import foundation.e.accountmanager.ui.components.ESwitch
import okhttp3.HttpUrl.Companion.toHttpUrl
@Composable
@@ -183,7 +183,7 @@ fun CollectionsList_Item_Standard(
}
) {
val context = LocalContext.current
- Switch(
+ ESwitch(
checked = collection.sync,
onCheckedChange = onChangeSync,
modifier = Modifier
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsScreen.kt
index 73d039fc9dfbb62653ab508c9141bc4922cbc421..4df2a8ad3182dad35dbe4e4b7752297648e05cf7 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsScreen.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/WifiPermissionsScreen.kt
@@ -25,7 +25,6 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
@@ -44,6 +43,7 @@ import at.bitfire.davdroid.ui.ExternalUris
import at.bitfire.davdroid.ui.ExternalUris.withStatParams
import at.bitfire.davdroid.ui.composable.PermissionSwitchRow
import at.bitfire.davdroid.util.PermissionUtils
+import foundation.e.accountmanager.ui.components.ESwitch
@Composable
fun WifiPermissionsScreen(
@@ -245,7 +245,7 @@ fun LocationService(
style = MaterialTheme.typography.bodyMedium
)
}
- Switch(
+ ESwitch(
checked = locationServiceEnabled,
onCheckedChange = onEnableLocationService
)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt
index ad6a6f5cc7a7b5f477e0c06f7f54c61b7163e8f7..0743d5cb230f43428d5034b14228f929b6a0fdd0 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/PermissionSwitchRow.kt
@@ -14,7 +14,6 @@ import androidx.compose.material.icons.filled.Check
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
@@ -26,6 +25,7 @@ import androidx.compose.ui.unit.dp
import at.bitfire.davdroid.ui.AppTheme
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState
+import foundation.e.accountmanager.ui.components.ESwitch
@Composable
fun PermissionSwitchRow(
@@ -56,7 +56,7 @@ fun PermissionSwitchRow(
style = MaterialTheme.typography.bodyMedium
)
}
- Switch(
+ ESwitch(
checked = allPermissionsGranted,
thumbContent = if (allPermissionsGranted) {
{
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt
index f84c18d471c2bde659decdd1be5fef53823c7c32..767d6e81f766cd1ee508fef459c2ae458ab7eeb5 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/RadioWithSwitch.kt
@@ -11,12 +11,12 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material3.RadioButton
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
+import foundation.e.accountmanager.ui.components.ESwitch
/**
* Provides a radio button with a text, a switch at the end, and an optional summary to be shown
@@ -65,7 +65,7 @@ fun RadioWithSwitch(
}
}
- Switch(
+ ESwitch(
checked = isToggled,
onCheckedChange = onToggled
)
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt
index 07191e4d36d2149facbac548a14dcedf3b98208f..e58901d57b48b3f0f5994631a7e20bde9e1cbbb3 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/composable/Settings.kt
@@ -18,7 +18,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ProvideTextStyle
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
@@ -28,6 +27,7 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import foundation.e.accountmanager.ui.components.ESwitch
@Composable
fun SettingsHeader(divider: Boolean = false, content: @Composable () -> Unit) {
@@ -168,7 +168,7 @@ fun SwitchSetting(
},
summary = if (checked) summaryOn else summaryOff,
end = {
- Switch(
+ ESwitch(
checked = checked,
enabled = enabled,
onCheckedChange = onCheckedChange,
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt
index 6864442ef3204487fc607f237fe9a6eacb823466..525f040c4539d4030002293bc1ff4443eb036ddb 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt
@@ -19,7 +19,6 @@ import androidx.compose.material3.Card
import androidx.compose.material3.Checkbox
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
-import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -37,6 +36,7 @@ import at.bitfire.davdroid.R
import at.bitfire.davdroid.ui.AppTheme
import at.bitfire.davdroid.ui.ExternalUris
import at.bitfire.davdroid.ui.ExternalUris.withStatParams
+import foundation.e.accountmanager.ui.components.ESwitch
import java.util.Locale
@Composable
@@ -104,7 +104,7 @@ fun BatteryOptimizationsPageContent(
style = MaterialTheme.typography.labelLarge,
modifier = Modifier.weight(1f)
)
- Switch(
+ ESwitch(
checked = shouldBeExempted,
onCheckedChange = {
// Only accept click events if not whitelisted
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/PermissionsIntroPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/PermissionsIntroPage.kt
index 080d6bffb07e659e2525e0361e4ac4328e1f0bb8..48a0f39af1566d299a9d62e9c7916c2f1b5fe935 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/PermissionsIntroPage.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/PermissionsIntroPage.kt
@@ -26,6 +26,7 @@ class PermissionsIntroPage @Inject constructor(
val permissions = CONTACT_PERMISSIONS + CALENDAR_PERMISSIONS +
TaskProvider.PERMISSIONS_JTX +
TaskProvider.PERMISSIONS_OPENTASKS +
+ TaskProvider.PERMISSIONS_EOPENTASKS +
TaskProvider.PERMISSIONS_TASKS_ORG
return if (PermissionUtils.haveAnyPermission(context, permissions))
ShowPolicy.DONT_SHOW
diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/WelcomePage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/WelcomePage.kt
index 4863b2f15958d292aa438dffc0565699ddc13fed..fc51d7d4ee5318258e94c6d424c3f4501513783c 100644
--- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/WelcomePage.kt
+++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/WelcomePage.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
@@ -53,11 +54,11 @@ class WelcomePage: IntroPage() {
Column(
modifier = Modifier
.fillMaxSize()
- .background(color = M3ColorScheme.primaryLight) // fill background color edge-to-edge
+ .background(color = colorResource(R.color.ic_launcher_background)) // fill background color edge-to-edge
.safeContentPadding()
) {
Image(
- painter = painterResource(R.drawable.ic_launcher_foreground),
+ painter = painterResource(R.mipmap.ic_launcher_foreground),
contentDescription = null,
modifier = Modifier
.fillMaxWidth()
@@ -126,12 +127,12 @@ class WelcomePage: IntroPage() {
Row(
modifier = Modifier
.fillMaxSize()
- .background(color = MaterialTheme.colorScheme.primary)
+ .background(color = colorResource(R.color.ic_launcher_background))
.safeContentPadding(),
verticalAlignment = Alignment.CenterVertically
) {
Image(
- painter = painterResource(R.drawable.ic_launcher_foreground),
+ painter = painterResource(R.mipmap.ic_launcher_foreground),
contentDescription = null,
modifier = Modifier
.fillMaxHeight()
diff --git a/app/src/main/kotlin/foundation/e/accountmanager/ui/components/ESwitch.kt b/app/src/main/kotlin/foundation/e/accountmanager/ui/components/ESwitch.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6a678300c291bb2603e209040d9e58ff62da9ac6
--- /dev/null
+++ b/app/src/main/kotlin/foundation/e/accountmanager/ui/components/ESwitch.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2025 eFoundation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+package foundation.e.accountmanager.ui.components
+
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Switch
+import androidx.compose.material3.SwitchDefaults
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import foundation.e.elib.R
+
+@Composable
+fun ESwitch(
+ checked: Boolean,
+ onCheckedChange: ((Boolean) -> Unit)?,
+ modifier: Modifier = Modifier,
+ enabled: Boolean = true,
+ thumbContent: (@Composable (() -> Unit))? = null,
+ interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
+) {
+ Switch(
+ checked = checked,
+ onCheckedChange = onCheckedChange,
+ modifier = modifier,
+ enabled = enabled,
+ interactionSource = interactionSource,
+ thumbContent = thumbContent ?: {
+ Box(
+ modifier = Modifier
+ .size(1.dp) // effectively invisible default
+ )
+ },
+ colors = SwitchDefaults.colors(
+ checkedThumbColor = Color.White,
+ checkedTrackColor = colorResource(R.color.e_switch_track_on),
+ uncheckedThumbColor = Color.White,
+ uncheckedTrackColor = colorResource(R.color.e_switch_track_off),
+ uncheckedBorderColor = Color.Transparent,
+ checkedBorderColor = Color.Transparent
+ )
+ )
+}
+
+@Preview(showBackground = true)
+@Composable
+fun AppSwitchPreview() {
+ var checked by remember { mutableStateOf(false) }
+
+ MaterialTheme {
+ Surface {
+ ESwitch(
+ checked = checked,
+ onCheckedChange = { checked = it }
+ )
+ }
+ }
+}
diff --git a/app/src/main/kotlin/foundation/e/accountmanager/utils/SystemUtils.kt b/app/src/main/kotlin/foundation/e/accountmanager/utils/SystemUtils.kt
new file mode 100644
index 0000000000000000000000000000000000000000..cf1b0a154f91baf97ece6f594e5023221fb3bf35
--- /dev/null
+++ b/app/src/main/kotlin/foundation/e/accountmanager/utils/SystemUtils.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
+ */
+
+package foundation.e.accountmanager.utils
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.Network
+import android.net.NetworkCapabilities
+import android.os.Build
+import androidx.annotation.RequiresApi
+
+object SystemUtils {
+
+ fun isNetworkAvailable(context: Context): Boolean {
+ val cm: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java)
+ val activeNetwork: Network? = cm.activeNetwork
+ val networkCapabilities = cm.getNetworkCapabilities(activeNetwork)
+ if (networkCapabilities != null &&
+ networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
+ networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
+ ) {
+ return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
+ || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
+ || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)
+ || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
+ || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
+ }
+ return false
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/ic_murena_background.png b/app/src/main/res/drawable-hdpi/ic_murena_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..81a2dd3ec5d5510f7b8b22d21a3d2a78f5fa7eae
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_murena_background.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_murena_foreground.png b/app/src/main/res/drawable-hdpi/ic_murena_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9b87c38a535dd3ff358137166b5f13ca8fd92fc
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_murena_foreground.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_murena_background.png b/app/src/main/res/drawable-mdpi/ic_murena_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..cec448828a5f949d4aadeb4fe8fb293b1cc550e0
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_murena_background.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_murena_foreground.png b/app/src/main/res/drawable-mdpi/ic_murena_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..214bb9096896514088e517a1bf6e4d6f7e23903d
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_murena_foreground.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_murena_background.png b/app/src/main/res/drawable-xhdpi/ic_murena_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..103d35d4af08fbb810d11cda6ffc66e6dd63e793
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_murena_background.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_murena_foreground.png b/app/src/main/res/drawable-xhdpi/ic_murena_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcf7ab54e09e8b46cdf009ec73fd19ce7b618510
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_murena_foreground.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_murena_background.png b/app/src/main/res/drawable-xxhdpi/ic_murena_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9a92be1bea6ac15dd4ee94e5487379065f3f56b
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_murena_background.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_murena_foreground.png b/app/src/main/res/drawable-xxhdpi/ic_murena_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..d800dc83d36761a6f0160222a01f5e756abf8d34
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_murena_foreground.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_murena_background.png b/app/src/main/res/drawable-xxxhdpi/ic_murena_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce6c4f103d9943b8f4afa050a4faff156103b7bd
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_murena_background.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_murena_foreground.png b/app/src/main/res/drawable-xxxhdpi/ic_murena_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1cd035102c8e3b09639e2d71868a0862b7b9c2f
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_murena_foreground.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 0cae7307bcaed231a19a0847a68a39fcee1e6ad0..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_murena_logo.xml b/app/src/main/res/drawable/ic_murena_logo.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5476e8eceb0e777663c5c8a9995ac59ecaaa57f2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_murena_logo.xml
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index f14eb871419ec681927a13a8929e2e34d85338cf..f1df331b7ba49525ccbd9089bedab17332a43498 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,7 +1,7 @@
-
-
-
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_murena.xml b/app/src/main/res/mipmap-anydpi-v26/ic_murena.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9c3f63b55085559fcb49d9ab537fba87dc2c3fd1
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_murena.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index c402e3feb9efa131b521651be72c2a40e2b73c80..5f37a53ba01c4cc942e4f63fc5442299388f2d4d 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cacca24f6bbd89db3d0ca96d6171d22e498780c
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 77e9d2fc2b06a484953880f13d171082c4baeb94..0abd7b9aef1eeb349120f5ea7cc09164fec65018 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bec04edce7b671e73026860a203a9530a93fd89
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 2aa7185580e3d47e30abd92c4694d9877e21e66d..7f7b37920902820d13dd6a6ef777349a9a12ab25 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..76499e569a47cb0879b32919382c62830629a7fa
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 01b53f26ed5b841272e24d2a269ce66c48f113d8..fba2ba0473f7325e4b862a902f1a19f8c76e8132 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..495a066b0598b59f0ceafa6f2774e352dbc56be5
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index f50fed52275f4387fb1b7ac33354aee4e813482b..387ff43694164b6b5f43348873a49772b5491069 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2d12ad0a079346f39e2459278c5a7e21a992092
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 62ec229f9970f8b682d391e6c0d9500edfd292da..09e3351a821bd20eaa8c449802c7256b82ab3b54 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,6 +1,6 @@
- #7cb342
- #aee571
- #4b830d
-
\ No newline at end of file
+ @color/e_accent
+ @color/e_accent_inverse
+ @color/e_alpha_accent
+
diff --git a/app/src/main/res/values/e_colors.xml b/app/src/main/res/values/e_colors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..73fab6619b2d19bb5d3d6df7ba51fdb58be027fb
--- /dev/null
+++ b/app/src/main/res/values/e_colors.xml
@@ -0,0 +1,4 @@
+
+
+ #7CB342
+
diff --git a/app/src/main/res/values/e_strings.xml b/app/src/main/res/values/e_strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..072674a3efc47edeecdf14abc2c30e243c609036
--- /dev/null
+++ b/app/src/main/res/values/e_strings.xml
@@ -0,0 +1,8 @@
+
+
+ Account Manager
+ Welcome to Account Manager!
+ Manage accounts
+ Tasks
+ /e/OS Tasks app.
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a51ef0b631a041decf5b21da0801a51be2d0a4fc..d2f27833d938f8685b9c507c3dd8e1b87cf94224 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -5,7 +5,7 @@
- DAVx⁵
+ DAVx⁵
Account does not exist (anymore)
bitfire.at.davdroid
diff --git a/app/src/main/res/xml/account_authenticator.xml b/app/src/main/res/xml/account_authenticator.xml
index 85eaa203324c6da6ddcfe9e282e59fe55685847e..c184344a14c274a9b90104e9b81e8db5986322ad 100644
--- a/app/src/main/res/xml/account_authenticator.xml
+++ b/app/src/main/res/xml/account_authenticator.xml
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/app/src/main/res/xml/sync_calendars.xml b/app/src/main/res/xml/sync_calendars.xml
index e50cee697a656b9993de325c6b27c07ce316b85e..703fe86e71b00870d3c0632b65fc0d807cf8115d 100644
--- a/app/src/main/res/xml/sync_calendars.xml
+++ b/app/src/main/res/xml/sync_calendars.xml
@@ -1,7 +1,6 @@
diff --git a/app/src/main/res/xml/sync_contacts.xml b/app/src/main/res/xml/sync_contacts.xml
index 18c4eea992558964dbf1050a41a3e63bff773953..261b1206a6b4163981f28a03d5065f44c0ad9dc8 100644
--- a/app/src/main/res/xml/sync_contacts.xml
+++ b/app/src/main/res/xml/sync_contacts.xml
@@ -1,7 +1,6 @@
diff --git a/app/src/main/res/xml/sync_prefs.xml b/app/src/main/res/xml/sync_prefs.xml
index 2e6e5eb189af12a6095ef1ac8aae00410bac20eb..143c3828e8717bb0da215f4aca172ca84c2ae9f7 100644
--- a/app/src/main/res/xml/sync_prefs.xml
+++ b/app/src/main/res/xml/sync_prefs.xml
@@ -1,6 +1,11 @@
-
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/ose/kotlin/at/bitfire/davdroid/ui/ThemeColors.kt b/app/src/ose/kotlin/at/bitfire/davdroid/ui/ThemeColors.kt
index 9e6d25051a4bedecac26ae838995396c8a41bd2b..c39edff7377725245381758020ce40941b9f01ed 100644
--- a/app/src/ose/kotlin/at/bitfire/davdroid/ui/ThemeColors.kt
+++ b/app/src/ose/kotlin/at/bitfire/davdroid/ui/ThemeColors.kt
@@ -13,15 +13,15 @@ object M3ColorScheme {
// All colors hand-crafted because Material Theme Builder generates unbelievably ugly colors
- val primaryLight = Color(0xFF7cb342)
+ val primaryLight = Color(0xFF0086FF)
val onPrimaryLight = Color(0xFFffffff)
- val primaryContainerLight = Color(0xFFb4e47d)
+ val primaryContainerLight = Color(0xFF5DB2FF)
val onPrimaryContainerLight = Color(0xFF232d18)
val secondaryLight = Color(0xFFff7f2a)
val onSecondaryLight = Color(0xFFFFFFFF)
val secondaryContainerLight = Color(0xFFffa565)
val onSecondaryContainerLight = Color(0xFF3a271b)
- val tertiaryLight = Color(0xFF658a24)
+ val tertiaryLight = Color(0x140086FF)
val onTertiaryLight = Color(0xFFFFFFFF)
val tertiaryContainerLight = Color(0xFFb0d08e)
val onTertiaryContainerLight = Color(0xFF263015)
@@ -49,15 +49,15 @@ object M3ColorScheme {
val surfaceContainerHighLight = Color(0xFFf0f0ef)
val surfaceContainerHighestLight = Color(0xFFebebea)
- val primaryDark = Color(0xFFc4e3a4)
+ val primaryDark = Color(0xFF5DB2FF)
val onPrimaryDark = Color(0xFF2b4310)
- val primaryContainerDark = Color(0xFF7cb342)
+ val primaryContainerDark = Color(0xFF0086FF)
val onPrimaryContainerDark = Color(0xFFedf5e4)
val secondaryDark = Color(0xFFe5c3ac)
val onSecondaryDark = Color(0xFF3e332e)
val secondaryContainerDark = Color(0xFFff7f2a)
val onSecondaryContainerDark = Color(0xFFffeadb)
- val tertiaryDark = Color(0xFFc6e597)
+ val tertiaryDark = Color(0x145DB2FF)
val onTertiaryDark = Color(0xFF4b661b)
val tertiaryContainerDark = Color(0xFF658a24)
val onTertiaryContainerDark = Color(0xFFf0f8e2)
diff --git a/app/src/ose/kotlin/at/bitfire/davdroid/ui/intro/OseIntroPageFactory.kt b/app/src/ose/kotlin/at/bitfire/davdroid/ui/intro/OseIntroPageFactory.kt
index fd78cc284c4792735f5782750344677791fdad52..6379ecb567f7a86ccd6c443894f5cfea2611dd42 100644
--- a/app/src/ose/kotlin/at/bitfire/davdroid/ui/intro/OseIntroPageFactory.kt
+++ b/app/src/ose/kotlin/at/bitfire/davdroid/ui/intro/OseIntroPageFactory.kt
@@ -13,12 +13,14 @@ class OseIntroPageFactory @Inject constructor(
tasksIntroPage: TasksIntroPage
): IntroPageFactory {
- override val introPages = arrayOf(
+ /*override val introPages = arrayOf(
WelcomePage(),
tasksIntroPage,
permissionsIntroPage,
batteryOptimizationsPage,
openSourcePage
- )
+ )*/
+
+ override val introPages = emptyArray()
}
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 9ff7403619dbcfeae3bb495a47e1bdffd2ce4d74..d2eab0c68b6990da74dce6087618b8f9d926993e 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -16,6 +16,7 @@ dependencyResolutionManagement {
// AppIntro, dav4jvm
maven("https://jitpack.io")
+ maven("https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven")
}
}