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