From aef1e16f15810946a5e2897ef1a59427f63b9aa3 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Fri, 15 Jul 2022 14:25:10 +0530 Subject: [PATCH 01/14] Eelo account authenticatior Auto-fill URL for the eelo Contacts and Calendar service. --- app/src/main/AndroidManifest.xml | 27 +++++ .../at/bitfire/davdroid/db/AppDatabase.kt | 14 +++ .../EeloAccountAuthenticatorService.kt | 113 ++++++++++++++++++ .../davdroid/ui/setup/LoginActivity.kt | 24 +++- .../res/drawable/ic_account_provider_eelo.png | Bin 0 -> 17628 bytes app/src/main/res/values/strings.xml | 6 + .../res/xml/eelo_account_authenticator.xml | 14 +++ ical4android | 2 +- 8 files changed, 196 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt create mode 100644 app/src/main/res/drawable/ic_account_provider_eelo.png create mode 100644 app/src/main/res/xml/eelo_account_authenticator.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 957d80859..ad2c22f06 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -261,6 +261,33 @@ android:resource="@xml/contacts"/> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt b/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt index fc56d4c69..6a727a657 100644 --- a/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt +++ b/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt @@ -76,6 +76,20 @@ abstract class AppDatabase: RoomDatabase() { } companion object { + private var INSTANCE: AppDatabase? = null + + @Synchronized + fun getInstance(context: Context): AppDatabase { + INSTANCE?.let { return it } + + val db = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "services.db") + .addMigrations(*migrations) + .fallbackToDestructiveMigration() // as a last fallback, recreate database instead of crashing + .build() + INSTANCE = db + + return db + } // migrations diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt new file mode 100644 index 000000000..b01e72527 --- /dev/null +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt @@ -0,0 +1,113 @@ +package at.bitfire.davdroid.syncadapter + +import android.accounts.* +import android.app.Service +import android.content.Context +import android.content.Intent +import android.database.DatabaseUtils +import android.os.Bundle +import androidx.annotation.WorkerThread +import at.bitfire.davdroid.R +import at.bitfire.davdroid.db.AppDatabase + +import at.bitfire.davdroid.log.Logger +import at.bitfire.davdroid.resource.LocalAddressBook +import at.bitfire.davdroid.ui.setup.LoginActivity +//import foundation.e.accountmanager.R +//import foundation.e.accountmanager.log.Logger +//import foundation.e.accountmanager.model.AppDatabase +//import foundation.e.accountmanager.resource.LocalAddressBook +//import foundation.e.accountmanager.ui.setup.LoginActivity +import java.util.* +import java.util.logging.Level +import kotlin.concurrent.thread + +/** + * Account authenticator for the eelo account type. + * + * Gets started when an eelo account is removed, too, so it also watches for account removals + * and contains the corresponding cleanup code. + */ +class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { + + companion object { + + fun cleanupAccounts(context: Context) { + Logger.log.info("Cleaning up orphaned accounts") + + val accountManager = AccountManager.get(context) + val accountNames = accountManager.getAccountsByType(context.getString(R.string.account_type)) + .map { it.name } + + // delete orphaned address book accounts + accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) + .map { LocalAddressBook(context, it, null) } + .forEach { + try { + if (!accountNames.contains(it.mainAccount.name)) + it.delete() + } catch(e: Exception) { + Logger.log.log(Level.SEVERE, "Couldn't delete address book account", e) + } + } + + // delete orphaned services in DB + val db = AppDatabase.getInstance(context) + val serviceDao = db.serviceDao() + if (accountNames.isEmpty()) + serviceDao.deleteAll() + else + serviceDao.deleteExceptAccounts(accountNames.toTypedArray()) + } + + } + + + private lateinit var accountManager: AccountManager + private lateinit var accountAuthenticator: AccountAuthenticator + + override fun onCreate() { + accountManager = AccountManager.get(this) + accountManager.addOnAccountsUpdatedListener(this, null, true) + + accountAuthenticator = AccountAuthenticator(this) + } + + override fun onDestroy() { + super.onDestroy() + accountManager.removeOnAccountsUpdatedListener(this) + } + + override fun onBind(intent: Intent?) = + accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } + + + override fun onAccountsUpdated(accounts: Array?) { + thread { + cleanupAccounts(this) + } + } + + + private class AccountAuthenticator( + val context: Context + ) : AbstractAccountAuthenticator(context) { + + 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) + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response) + val bundle = Bundle(1) + bundle.putParcelable(AccountManager.KEY_INTENT, intent) + return bundle + } + + override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null + override fun getAuthTokenLabel(p0: String?) = null + override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null + override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null + override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null + override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array?) = null + + } +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt index e03c39899..8e1ea7571 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt @@ -41,6 +41,9 @@ class LoginActivity: AppCompatActivity() { * When set, the password field will be set to this value. */ const val EXTRA_PASSWORD = "password" + const val SETUP_ACCOUNT_PROVIDER_TYPE = "setup_account_provider_type" + const val ACCOUNT_PROVIDER_EELO = "eelo" + const val ACCOUNT_PROVIDER_GOOGLE = "google" } @@ -63,9 +66,24 @@ class LoginActivity: AppCompatActivity() { } if (fragment != null) { - supportFragmentManager.beginTransaction() - .replace(android.R.id.content, fragment) - .commit() + when (intent.getStringExtra(SETUP_ACCOUNT_PROVIDER_TYPE)) { + ACCOUNT_PROVIDER_EELO -> { + intent.putExtra(EXTRA_URL, "https://drive.eelo.io") + // first call, add first login fragment + supportFragmentManager.beginTransaction() + .replace(android.R.id.content, fragment) + .commit() + } + ACCOUNT_PROVIDER_GOOGLE -> { + print("starting google account sign-in") + } + else -> + // first call, add first login fragment + supportFragmentManager.beginTransaction() + .replace(android.R.id.content, fragment) + .commit() + } + } else Logger.log.severe("Couldn't create LoginFragment") } diff --git a/app/src/main/res/drawable/ic_account_provider_eelo.png b/app/src/main/res/drawable/ic_account_provider_eelo.png new file mode 100644 index 0000000000000000000000000000000000000000..435feabb03767ec8b09e320225926ffdf44990e2 GIT binary patch literal 17628 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e37ce368c..73d81722c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,12 @@ Account does not exist (anymore) bitfire.at.davdroid + + Google + bitfire.at.davdroid.google + eelo + bitfire.at.davdroid.eelo + at.bitfire.davdroid.address_book DAVx⁵ Address book at.bitfire.davdroid.addressbooks diff --git a/app/src/main/res/xml/eelo_account_authenticator.xml b/app/src/main/res/xml/eelo_account_authenticator.xml new file mode 100644 index 000000000..0f39608e6 --- /dev/null +++ b/app/src/main/res/xml/eelo_account_authenticator.xml @@ -0,0 +1,14 @@ + + + diff --git a/ical4android b/ical4android index 22dfb270e..6dfe520be 160000 --- a/ical4android +++ b/ical4android @@ -1 +1 @@ -Subproject commit 22dfb270ee783290a635ad4e3594fd8c9ad3d5ec +Subproject commit 6dfe520be1795f71db2a36aa6864953d68599e72 -- GitLab From fbca99d4ba625daaafc7da09fbfa8465e09c87b8 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Mon, 18 Jul 2022 11:57:01 +0530 Subject: [PATCH 02/14] Auto-fill URL for the eelo Contacts and Calendar service --- .../davdroid/syncadapter/EeloAccountAuthenticatorService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt index b01e72527..4c4880172 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt @@ -96,7 +96,7 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { 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) - intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response) + intent.putExtra(LoginActivity.SETUP_ACCOUNT_PROVIDER_TYPE, LoginActivity.ACCOUNT_PROVIDER_EELO) val bundle = Bundle(1) bundle.putParcelable(AccountManager.KEY_INTENT, intent) return bundle -- GitLab From 1df03ca7b03bf6c702b79070c883aa64b90c7d76 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Mon, 18 Jul 2022 12:27:07 +0530 Subject: [PATCH 03/14] update EeloAccountAuthenticatorService, update string DAVx5 to account manager --- README.md | 2 +- app/src/main/AndroidManifest.xml | 4 +-- .../EeloAccountAuthenticatorService.kt | 36 ++++++++++++++----- app/src/main/res/values-ar/strings.xml | 6 ++-- app/src/main/res/values-bg/strings.xml | 4 +-- app/src/main/res/values-ca/strings.xml | 12 +++---- app/src/main/res/values-cs/strings.xml | 12 +++---- app/src/main/res/values-da/strings.xml | 6 ++-- app/src/main/res/values-de/strings.xml | 10 +++--- app/src/main/res/values-fr/strings.xml | 12 +++---- app/src/main/res/values-gl/strings.xml | 6 ++-- app/src/main/res/values-hu/strings.xml | 6 ++-- app/src/main/res/values-it/strings.xml | 6 ++-- app/src/main/res/values-ru/strings.xml | 6 ++-- app/src/main/res/values-sk/strings.xml | 12 +++---- app/src/main/res/values-sl-rSI/strings.xml | 12 +++---- app/src/main/res/values-szl/strings.xml | 14 ++++---- app/src/main/res/values-tr/strings.xml | 6 ++-- app/src/main/res/values-vi/strings.xml | 12 +++---- app/src/main/res/values-zh-rTW/strings.xml | 12 +++---- app/src/main/res/values-zh/strings.xml | 12 +++---- app/src/main/res/values/strings.xml | 14 ++++++-- .../metadata/android/ar/full_description.txt | 2 +- fastlane/metadata/android/en-US/title.txt | 2 +- .../metadata/android/eu/full_description.txt | 2 +- .../metadata/android/fa/full_description.txt | 2 +- .../metadata/android/nl/full_description.txt | 2 +- .../metadata/android/pt/full_description.txt | 2 +- .../metadata/android/sk/full_description.txt | 2 +- .../metadata/android/uk/full_description.txt | 2 +- .../android/zh-TW/full_description.txt | 2 +- 31 files changed, 134 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index eb83a4164..5b19e8404 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![License](https://img.shields.io/github/license/bitfireAT/davx5-ose?style=flat-square)](https://github.com/bitfireAT/davx5-ose/blob/main/LICENSE) [![Development tests](https://github.com/bitfireAT/davx5-ose/actions/workflows/test-dev.yml/badge.svg)](https://github.com/bitfireAT/davx5-ose/actions/workflows/test-dev.yml) -![DAVx⁵ logo](app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) +![Account manager logo](app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) DAVx⁵ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ad2c22f06..e475a60e3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -150,7 +150,7 @@ android:label="@string/webdav_add_mount_title" android:parentActivityName=".ui.webdav.WebdavMountsActivity" /> - + @@ -216,7 +216,7 @@ - + diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt index 4c4880172..44e150b52 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt @@ -13,11 +13,6 @@ import at.bitfire.davdroid.db.AppDatabase import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.ui.setup.LoginActivity -//import foundation.e.accountmanager.R -//import foundation.e.accountmanager.log.Logger -//import foundation.e.accountmanager.model.AppDatabase -//import foundation.e.accountmanager.resource.LocalAddressBook -//import foundation.e.accountmanager.ui.setup.LoginActivity import java.util.* import java.util.logging.Level import kotlin.concurrent.thread @@ -36,12 +31,22 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { Logger.log.info("Cleaning up orphaned accounts") val accountManager = AccountManager.get(context) - val accountNames = accountManager.getAccountsByType(context.getString(R.string.account_type)) - .map { it.name } + + val accountNames = HashSet() + + val accounts = ArrayList() + accountManager.getAccountsByType(context.getString(R.string.eelo_account_type)).forEach { accounts.add(it) } + accountManager.getAccountsByType(context.getString(R.string.google_account_type)).forEach { accounts.add(it) } + accountManager.getAccountsByType(context.getString(R.string.account_type)).forEach { accounts.add(it) } + for (account in accounts.toTypedArray()) + accountNames += account.name // delete orphaned address book accounts - accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) - .map { LocalAddressBook(context, it, null) } + val addressBookAccounts = ArrayList() + accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { addressBookAccounts.add(it) } + accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { addressBookAccounts.add(it) } + accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { addressBookAccounts.add(it) } + addressBookAccounts.map { LocalAddressBook(context, it, null) } .forEach { try { if (!accountNames.contains(it.mainAccount.name)) @@ -85,6 +90,17 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { override fun onAccountsUpdated(accounts: Array?) { thread { cleanupAccounts(this) + val eeloAccounts = ArrayList(accounts?.asList()?: emptyList()) + eeloAccounts.removeIf { it.type != getString(R.string.eelo_account_type) } + eeloAccounts.removeAll(accountManager.getAccountsByType(getString( + R.string.eelo_account_type))) + for (removedAccount in eeloAccounts) { + val intent = Intent("drive.services.ResetService") + intent.setPackage(getString(R.string.e_drive_package_name)) + intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, removedAccount.name) + intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, removedAccount.type) + startService(intent) + } } } @@ -111,3 +127,5 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { } } + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1fc6e0f73..2d6ef0800 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,8 +1,8 @@ - DAVx⁵ - DAVx⁵ دفتر عناوين + Account manager + Account manager دفتر عناوين دفاتر العناوين مساعدة إدارة الحسابات @@ -40,7 +40,7 @@ الأسئلة الشائعة المساعدة / المنتدى تبرَّع - مرحباً بك في DAVx⁵ !\n\n يمكنك إضافة حساب CalDAV أو CardDAV الآن. + مرحباً بك في Account manager !\n\n يمكنك إضافة حساب CalDAV أو CardDAV الآن. تم تعطيل المزامنة التلقائية على مستوى النظام تفعيل diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index a7fc4c434..765ff2c2d 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Регистрацията (вече) не съществува - Адресник на DAVx⁵ + Адресник на Account manager Адресници Задължително поле Помощ diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 32453fd23..daedbee8c 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager El compte no existeix (eliminat) - Llibreta d’adreces del DAVx⁵ + Llibreta d’adreces del Account manager Llibreta d’adreces Cal aquest camp Ajuda @@ -123,7 +123,7 @@ Política de privacitat Sense connexió a internet. Android no executarà la sincronització Espai d\'emmagatzematge baix. L\'Android no executarà la sincronització. - Us donem la benvinguda a DAVx⁵! \n\nAra podeu afegir un compte CalDAV / CardDAV. + Us donem la benvinguda a Account manager! \n\nAra podeu afegir un compte CalDAV / CardDAV. La sincronització automàtica de tot el sistema està inhabilitada Activa Sincronitza tots els comptes @@ -399,7 +399,7 @@ S\'està pujant el fitxer WebDAV Muntatge WebDAV - Permisos del DAVx⁵ + Permisos del Account manager Es requereixen permisos addicionals %s és massa antiga Versió mínima requerida: %1$s @@ -414,6 +414,6 @@ S\'ha rebut una tasca no vàlida del servidor S\'ha ignorat un o més recursos no vàlids - DAVx⁵: Seguretat de la connexió - El DAVx⁵ ha trobat un certificat desconegut. Voleu confiar-hi? + Account manager: Seguretat de la connexió + El Account manager ha trobat un certificat desconegut. Voleu confiar-hi? diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 63d4fe579..7145c03ee 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Účet (už) neexistuje - DAVx⁵ adresář kontaktů + Account manager adresář kontaktů Adresáře kontaktů Tuto kolonku je třeba vyplnit Pomoc @@ -122,7 +122,7 @@ Ochrana soukromí Bez připojení k Internetu. Systém Android synchronizaci nespustí. Zbývá málo místa na úložišti. Systém Android nespustí synchronizaci. - Vítejte v aplikaci DAVx⁵!\n\nNyní můžete přidat CalDAV/CardDAV účet. + Vítejte v aplikaci Account manager!\n\nNyní můžete přidat CalDAV/CardDAV účet. Automatická synchronizace v rámci celého systému je vypnutá Zapnout Synchronizovat všechny účty @@ -402,7 +402,7 @@ Nahrává se WebDAV soubor WebDAV připojení - DAVx⁵ oprávnění + Account manager oprávnění Vyžadována dodatečná oprávnění Příliš stará verze %s Nejnižší požadovaná verze: %1$s @@ -417,6 +417,6 @@ Ze serveru obdržen neplatný úkol Ignoruje se jeden či více neplatný prostředků - DAVx⁵: Zabezpečení připojení - DAVx⁵ nalezlo neznámý certifikát. Chcete mu důvěřovat? + Account manager: Zabezpečení připojení + Account manager nalezlo neznámý certifikát. Chcete mu důvěřovat? diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 8187429f9..618d41831 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Konto findes ikke (længere) - DAVx⁵ adressebog + Account manager adressebog Adressebøger Feltet er påkrævet Hjælp @@ -123,7 +123,7 @@ Privatlivs politik Ingen internetforbindelse. Android kører ikke synkronisering. Lagerplds lav. Android kører ikke synkronisering. - Velkommen til DAVx⁵!\n\nDu kan nu tilføje en CalDAV/CardDAV konto. + Velkommen til Account manager!\n\nDu kan nu tilføje en CalDAV/CardDAV konto. Automatisk synkronisering på tværs af systemet er deaktiveret Aktivere Synkronisere alle konti diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d13ada330..ee80dae1e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Konto nicht (mehr) vorhanden - DAVx⁵-Adressbuch + Account manager-Adressbuch Adressbücher Feld wird benötigt Hilfe @@ -399,7 +399,7 @@ WebDAV-Upload WebDAV-Zugang - DAVx⁵-Berechtigungen + Account manager-Berechtigungen Zusätzliche Berechtigungen benötigt %s zu alt Benötigte Mindestversion: %1$s @@ -414,6 +414,6 @@ Ungültige Aufgabe vom Server erhalten Eine/mehrere ungültige Ressourcen ignoriert - DAVx⁵: Verbindungssicherheit - DAVx⁵ ist auf ein unbekanntes Zertifikat gestoßen. Ist dieses vertrauenswürdig? + Account manager: Verbindungssicherheit + Account manager ist auf ein unbekanntes Zertifikat gestoßen. Ist dieses vertrauenswürdig? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 596f94040..e9bd3eca3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Le compte n’existe plus (désormais) - Carnet d\'adresses DAVx⁵ + Carnet d\'adresses Account manager Carnets d\'adresses Ce champ est requis Aide @@ -118,7 +118,7 @@ Politique de confidentialité Pas de connectivité Internet. Android ne pourra pas exécuter la synchronisation. L\'espace de stockage est presque plein. Android ne lancera pas la synchronisation. - Bienvenue sur DAVx⁵!\n\nVous pouvez maintenant ajouter un compte CalDAV ou CardDAV. + Bienvenue sur Account manager!\n\nVous pouvez maintenant ajouter un compte CalDAV ou CardDAV. La synchronisation automatique globale est désactivée Activer Synchroniser tous les comptes @@ -382,7 +382,7 @@ Téléchargement du fichier WebDAV Téléversement du fichier WebDAV - Autorisations DAVx⁵ + Autorisations Account manager Autorisations supplémentaires demandées %s trop vieux Version minimale requise : %1$s @@ -397,6 +397,6 @@ Reçu une tâche invalide du serveur Ignorer une ou plusieurs ressources non valides - DAVx⁵ : Sécurité de la connexion - DAVx⁵ a rencontré un certificat inconnu. Voulez-vous lui faire confiance? + Account manager : Sécurité de la connexion + Account manager a rencontré un certificat inconnu. Voulez-vous lui faire confiance? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 2b8556aa6..5d7689681 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager A conta non existe (definitivamente) - DAVx⁵ libreta de enderezos + Account manager libreta de enderezos Libretas de enderezos Este campo é requerido Axuda @@ -123,7 +123,7 @@ Política de Privacidade Sen conexión a internet. Android non sincronizará. Queda pouco espazo, Android non executará a sincronización. - Benvida a DAVx⁵!\n\nXa podes engadir unha conta CalDAV/CardDAV + Benvida a Account manager!\n\nXa podes engadir unha conta CalDAV/CardDAV A sincronización global automática do sistema está desactivada Activar Sincroniza todas as contas diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 378c665c4..7506694e8 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager A felhasználói fiók (már) nem létezik - DAVx⁵ címjegyzék + Account manager címjegyzék Címjegyzékek Ennek e mezőnek a megadása kötelező Súgó @@ -123,7 +123,7 @@ Adatvédelmi politika Nincs Internet-elérés. Az Android rendszer nem fogja elvégezni a szinkronizálst Kevés a rendelkezésre álló tárhely. A rendszer nem fog szinkronizálást végezni. - Üdvözöljük a DAVx⁵ felhasználók között!\n\nMost már felvehet CalDAV/CardDav fiókokat. + Üdvözöljük a Account manager felhasználók között!\n\nMost már felvehet CalDAV/CardDav fiókokat. A rendszerszintű automatikus szinkronizálás ki van kapcsolva Bekapcsolás Az összes fiók szinkronizálása diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 67d536005..6ecd704b5 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Account inesistente (o cancellato) - Rubrica DAVx⁵ + Rubrica Account manager Rubriche Questo campo è necessario Aiuto @@ -114,7 +114,7 @@ Donazione Politica sulla riservatezza Nessuna connessione Internet. Android non eseguirà la sincronizzazione. - Benvenuto a DAVx⁵!\n\nÈ ora possibile aggiungere account CalDAV/CardDAV. + Benvenuto a Account manager!\n\nÈ ora possibile aggiungere account CalDAV/CardDAV. La sincronizzazione automatica dell\'intero sistema è disabilitata Attiva Sincronizzazione di tutti gli account diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6940f3b01..f957c6ff1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Аккаунт не существует (больше) - Адресная книга DAVx⁵ + Адресная книга Account manager Адресные книги Это поле является обязательным Помощь @@ -123,7 +123,7 @@ Политика конфиденциальности Нет подключения к интернету. Android не будет выполнять синхронизацию. Место для хранения мало. Android не будет выполнять синхронизацию. - Добро пожаловать в DAVx⁵!\n\nТеперь вы можете добавить аккаунт CalDAV/CardDAV. + Добро пожаловать в Account manager!\n\nТеперь вы можете добавить аккаунт CalDAV/CardDAV. Синхронизация отключена на уровне устройства Включить Синхронизировать все аккаунты diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8ed69f382..c3a171dde 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -1,8 +1,8 @@ - DAVx⁵ - DAVx⁵ adresár + Account manager + Account manager adresár Adresáre Pomoc Spravovať používateľské účty @@ -44,7 +44,7 @@ Darovať Zásady bezpečnosti Žiadne pripojenie do internetu. Android nestpustí synchronizáciu. - Vitajte v programe DAVx⁵!\n\nTeraz môžete pridať používateľský účet pre CalDAV/CardDAV . + Vitajte v programe Account manager!\n\nTeraz môžete pridať používateľský účet pre CalDAV/CardDAV . Automatická synchronizácia platná pre celý systém je zakázaná Povoliť @@ -227,7 +227,7 @@ Vyskytla sa V/V chyba. Zobraziť detaily - Oprávnenia DAVx⁵ + Oprávnenia Account manager Vyžadujú sa dodatočné oprávnenia Overenie zlyhalo (skontroluje prihlasovacie údaje) Sieťová alebo V/V chyba – %s @@ -240,6 +240,6 @@ Úloha prijatá zo servera nie je platná Ignoruje sa jeden alebo viac neplatných zdrojov - DAVx⁵: Zabezpečenie spojenia - DAVx⁵ zistil neznámy certifikát. Prajete si dôverovať mu? + Account manager: Zabezpečenie spojenia + Account manager zistil neznámy certifikát. Prajete si dôverovať mu? diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml index c027c6583..4480b8454 100644 --- a/app/src/main/res/values-sl-rSI/strings.xml +++ b/app/src/main/res/values-sl-rSI/strings.xml @@ -1,8 +1,8 @@ - DAVx⁵ - DAVx⁵ imenik + Account manager + Account manager imenik Seznami s stiki Pomoč Urejanje prijav @@ -40,7 +40,7 @@ Pogosta vprašanja Pomoč / forumi Prispevaj - Dobrodošli v DAVx⁵!\n\nZdaj lahko dodate CalDAV/CardDAV račun. + Dobrodošli v Account manager!\n\nZdaj lahko dodate CalDAV/CardDAV račun. Sistemska avtomatska sinhronizacija je izklopljena Omogoči @@ -210,7 +210,7 @@ I/O napaka se je zgodila. Pokaži podrobnosti - DAVx⁵ dovoljenja + Account manager dovoljenja Dodatna dovoljenja so zahtevana Avtentikacija ni uspela (preverite podatke prijave) Omrežna ali I/O napaka -- %s @@ -223,6 +223,6 @@ S strežnika so bili prejeti neveljavni dogodki Eden ali več neveljavnih virov bo ignoriranih - DAVx⁵: Varnost povezave - DAVx⁵ je naletel na neznan certifikat. Ali mu zaupate? + Account manager: Varnost povezave + Account manager je naletel na neznan certifikat. Ali mu zaupate? diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml index 74277d0a9..82b6f297a 100644 --- a/app/src/main/res/values-szl/strings.xml +++ b/app/src/main/res/values-szl/strings.xml @@ -1,8 +1,8 @@ - DAVx⁵ - Ksiōnżka adresowo DAVx⁵ + Account manager + Ksiōnżka adresowo Account manager Ksiōnżka adresowo Pōmoc Zarzōndzej kōntami @@ -51,7 +51,7 @@ Ôtwōrz myni nawigacyje Zawrzij myni nawigacyje Adapter synchrōnizacyje CalDAV/CardDAV - Ô DAVx⁵ / Licyncyjo + Ô Account manager / Licyncyjo Przekoż ôpinijo Zainstaluj klijynt emaila Zainstaluj przeglōndarka internetowo @@ -64,7 +64,7 @@ Dowka Polityka prywatności Brak połōnczynio z internetym. Android niy bydzie synchrōnizować. - Witōmy w DAVx⁵!\n\nMożesz teroz przidać kōnto CalDAV/CardDAV. + Witōmy w Account manager!\n\nMożesz teroz przidać kōnto CalDAV/CardDAV. Autōmatyczno synchrōnizacyjo dlo cołkigo systymu je zastawiōno Włōncz @@ -245,7 +245,7 @@ Miano używocza Hasło - Uprawniynia DAVx⁵ + Uprawniynia Account manager Wymogane ekstra uprawniynia Autoryzacyjo sie niy podarziła (dej pozōr na dane logowanio) Feler necu abo I/O – %s @@ -258,6 +258,6 @@ Dostane zadanie ze serwera je niynoleżne Ignorowanie jednego abo wiyncyj niynoleżnych zasobōw - DAVx⁵: Bezpieczyństwo połōnczynio - DAVx⁵ trefiōł niyznōmy certyfikat. Chcesz go przidać? + Account manager: Bezpieczyństwo połōnczynio + Account manager trefiōł niyznōmy certyfikat. Chcesz go przidać? diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 1e038bc4b..72fa7cdd0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Account manager Rehberler Yardım Hesapları yönet @@ -28,7 +28,7 @@ Web sitesi SSS Bağış yap - DAVx⁵\'e hoşgeldin!\n\nŞimdi bir CalDAV/CardDAV hesabı ekleyebilirsin. + Account manager\'e hoşgeldin!\n\nŞimdi bir CalDAV/CardDAV hesabı ekleyebilirsin. Servis keşfi başarısız Kolleksiyon listesi yenilenemedi @@ -130,7 +130,7 @@ Kullanıcı adı Parola - DAVx⁵ izinleri + Account manager izinleri Ek izinler zorunludur diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index d972f4887..05a281db2 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager Tài khoản không tồn tại (nữa) - Sổ địa chỉ của DAVx⁵ + Sổ địa chỉ của Account manager Sổ địa chỉ Trường này là bắt buộc Trợ giúp @@ -123,7 +123,7 @@ Chính sách riêng tư Không có kết nối internet. Android sẽ không chạy đồng bộ hoá. Dung lượng bộ nhớ thấp. Android sẽ không thực hiện đồng bộ. - Chào mừng đến DAVx⁵!\n\nBạn có thể thêm một tài khoản CalDAV/CardDAV ngay. + Chào mừng đến Account manager!\n\nBạn có thể thêm một tài khoản CalDAV/CardDAV ngay. Đồng bộ hoá tự động trên toàn hệ thống bị tắt Bật Đồng bộ tất cả tài khoản @@ -397,7 +397,7 @@ Đang tải lên tệp WebDAV Nơi gắn WebDAV - Quyền của DAVx⁵ + Quyền của Account manager Yêu cầu quyền bổ sung %s quá cũ Phiên bản tối thiểu được yêu cầu: %1$s @@ -412,6 +412,6 @@ Đã nhận công việc không hợp lệ từ máy chủ Đang bỏ qua một hoặc nhiều tài nguyên không hợp lệ - DAVx⁵: Sự bảo mật của kết nối - DAVx⁵ đã gặp một chứng chỉ không xác định. Bạn có muốn tin tưởng nó không? + Account manager: Sự bảo mật của kết nối + Account manager đã gặp một chứng chỉ không xác định. Bạn có muốn tin tưởng nó không? diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b321324a0..18f175137 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager 賬戶不存在 (anymore) - DAVx⁵ 通訊錄 + Account manager 通訊錄 通訊錄 幫助 管理帳號 @@ -55,7 +55,7 @@ 贊助我們 隱私權政策 網際網絡沒有連接。Android不會進行同步。 - 歡迎使用 DAVx⁵!\n\n您現在可以新增 CalDAV/CardDAV 帳號 + 歡迎使用 Account manager!\n\n您現在可以新增 CalDAV/CardDAV 帳號 操作系統的自動同步被關閉了 啟用 @@ -232,7 +232,7 @@ 讀寫錯誤 顯示細節 - DAVx⁵ 權限 + Account manager 權限 需要額外的權限 鑒權失敗(你需要檢查登錄憑證) 網際網絡或者輸入輸出錯誤——%s @@ -245,6 +245,6 @@ 收到了無效的任務 略過了一個或多個無效的資料 - DAVx⁵: 連線安全性 - DAVx⁵ 發現未知的憑證,您要信任它嗎? + Account manager: 連線安全性 + Account manager 發現未知的憑證,您要信任它嗎? diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 5f468229d..eee9d0d29 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account manager 帐户(已)不存在 - DAVx⁵ 通讯录 + Account manager 通讯录 通讯录 此字段是必填项 帮助 @@ -123,7 +123,7 @@ 隐私政策 无网络连接。Android 将不会运行同步。 存储空间低。Android 将不会运行同步。 - 欢迎使用 DAVx⁵!\n\n请开始增加 CalDAV/CardDAV 账户。 + 欢迎使用 Account manager!\n\n请开始增加 CalDAV/CardDAV 账户。 系统全局自动同步已禁用 启用 同步所有账户 @@ -397,7 +397,7 @@ 正在上传 WebDAV 文件 WebDAV 文件系统 - DAVx⁵ 权限 + Account manager 权限 需要额外权限 %s太旧 最低要求版本: %1$s @@ -412,6 +412,6 @@ 从服务器收到无效的任务项 正在忽略若干无效资源 - DAVx⁵: 连接安全性 - DAVx⁵ 遇到了未知证书。你是否要信任该证书? + Account manager: 连接安全性 + Account manager 遇到了未知证书。你是否要信任该证书? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73d81722c..fdfd3fa0f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Account manager https://www.davx5.com/ davx5app @@ -14,13 +14,23 @@ bitfire.at.davdroid.eelo at.bitfire.davdroid.address_book - DAVx⁵ Address book + Account manager Address book + foundation.e.accountmanager.eelo.address_book + /e/ Address book + foundation.e.accountmanager.google.address_book + at.bitfire.davdroid.addressbooks Address books This field is required Help Manage accounts Share + foundation.e.notes.android.providers.AppContentProvider + foundation.e.mail.provider.AppContentProvider + foundation.e.drive.providers.MediasSyncProvider + foundation.e.drive.providers.SettingsSyncProvider + foundation.e.drive.providers.MeteredConnectionAllowedProvider + foundation.e.drive Database corrupted All accounts have been removed locally. diff --git a/fastlane/metadata/android/ar/full_description.txt b/fastlane/metadata/android/ar/full_description.txt index e53f34548..35edf8bfa 100644 --- a/fastlane/metadata/android/ar/full_description.txt +++ b/fastlane/metadata/android/ar/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ هو تطبيق إدارة ومزامنة لآندرويد يتكامل مع التطبيقات الأصيلة للتقويم وجهات الاتصال في نظام آندرويد. +Account manager هو تطبيق إدارة ومزامنة لآندرويد يتكامل مع التطبيقات الأصيلة للتقويم وجهات الاتصال في نظام آندرويد. استخدمه مع خادمك الخاص أو مع جهة استضافة تثق بها لإبقاء جهات اتصالك و أحداثك و مهامك تحت سيطرتك. diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt index 8c8984578..91c04de3d 100644 --- a/fastlane/metadata/android/en-US/title.txt +++ b/fastlane/metadata/android/en-US/title.txt @@ -1 +1 @@ -DAVx⁵ +Account manager diff --git a/fastlane/metadata/android/eu/full_description.txt b/fastlane/metadata/android/eu/full_description.txt index c234f443e..edd5c6524 100644 --- a/fastlane/metadata/android/eu/full_description.txt +++ b/fastlane/metadata/android/eu/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ Androiderako CalDAV/CardDAV kudeatze eta sinkronizazio aplikazio bat da, Android egutegi/kontaktu aplikazio integrazioarekin. +Account manager Androiderako CalDAV/CardDAV kudeatze eta sinkronizazio aplikazio bat da, Android egutegi/kontaktu aplikazio integrazioarekin. Erabili ezazu zure zerbitzarian edo ostalari fidagarri batekin kontaktuak, ekitaldiak eta zereginak zure kontrolpean edukitzeko. diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt index 3dd44e112..0f9c5c64e 100644 --- a/fastlane/metadata/android/fa/full_description.txt +++ b/fastlane/metadata/android/fa/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ یک برنامه‌ی CalDAV/CardDAV مدیرتی و همگام سازی برای اندروید است که به صورت بومی با برنامه‌ی تقویم و مخاطبین اندروید ادقام می‌شود. +Account manager یک برنامه‌ی CalDAV/CardDAV مدیرتی و همگام سازی برای اندروید است که به صورت بومی با برنامه‌ی تقویم و مخاطبین اندروید ادقام می‌شود. با همراهی سرور خودتان یا با یک میزبان قابل اطمینان استفاده کنید تا مخاطبین، وقایع و وظایفت تحت کنترل خودتان باشد. diff --git a/fastlane/metadata/android/nl/full_description.txt b/fastlane/metadata/android/nl/full_description.txt index fc8662e9e..66745e7aa 100644 --- a/fastlane/metadata/android/nl/full_description.txt +++ b/fastlane/metadata/android/nl/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ is een CalDAV/CardDAV management en synchronisatie app voor Android die integreert met de standaard Android kalender/contact apps. +Account manager is een CalDAV/CardDAV management en synchronisatie app voor Android die integreert met de standaard Android kalender/contact apps. Gebruik het met je eigen server of met een vertrouwde hoster om je contacten, afspraken en taken onder je eigen controle te houden. diff --git a/fastlane/metadata/android/pt/full_description.txt b/fastlane/metadata/android/pt/full_description.txt index 251fa004a..f10bd674c 100644 --- a/fastlane/metadata/android/pt/full_description.txt +++ b/fastlane/metadata/android/pt/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ é um aplicativo de gerenciamento e sincronização CalDAV/CardDAV para Android que se integra nativamente com aplicativos de calendário/contatos do Android. +Account manager é um aplicativo de gerenciamento e sincronização CalDAV/CardDAV para Android que se integra nativamente com aplicativos de calendário/contatos do Android. Use-o com seu próprio servidor ou com um host confiável para manter seus contatos, eventos e tarefas sob seu controle. diff --git a/fastlane/metadata/android/sk/full_description.txt b/fastlane/metadata/android/sk/full_description.txt index 39752267b..a8c69720a 100644 --- a/fastlane/metadata/android/sk/full_description.txt +++ b/fastlane/metadata/android/sk/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ je aplikácia na správu a synchronizáciu CalDAV/CardDAV pre Android ktorá sa natívne integruje s Android aplikáciami kalendár/kontakt. +Account manager je aplikácia na správu a synchronizáciu CalDAV/CardDAV pre Android ktorá sa natívne integruje s Android aplikáciami kalendár/kontakt. Používajte s vašim vlastným serverom alebo s poskytovateľom server-hostingu ktorému dôverujete a majte svoje kontakty, udalosti a úlohy pod kontrolou. diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt index cf8022049..caa369bb2 100644 --- a/fastlane/metadata/android/uk/full_description.txt +++ b/fastlane/metadata/android/uk/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ це Android додаток для керування та синхронізації CalDAV/CardDAV, який органічно інтегрується з Android календарем/контактами. +Account manager це Android додаток для керування та синхронізації CalDAV/CardDAV, який органічно інтегрується з Android календарем/контактами. Використовуйте його з власним сервером або з довіреним постачальником, аби зберегти контроль над вашими контактами, подіями та задачами. diff --git a/fastlane/metadata/android/zh-TW/full_description.txt b/fastlane/metadata/android/zh-TW/full_description.txt index cdcb63d3d..03001a4d4 100644 --- a/fastlane/metadata/android/zh-TW/full_description.txt +++ b/fastlane/metadata/android/zh-TW/full_description.txt @@ -1,4 +1,4 @@ -DAVx⁵ 是一個 CalDAV/CardDAV 管理與同步工具,在 Android 設備上運行,並集合了 Android 内置的行事曆和聯絡人APP。 +Account manager 是一個 CalDAV/CardDAV 管理與同步工具,在 Android 設備上運行,並集合了 Android 内置的行事曆和聯絡人APP。 在您自己的伺服器上,或者在可信任的管理服務上保管你的聯絡人,事項和任務。 -- GitLab From 06fe997583763a74881511f7135cfa89cecc8d5c Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Tue, 19 Jul 2022 09:52:27 +0530 Subject: [PATCH 04/14] google account authenticator --- app/build.gradle | 4 + app/src/main/AndroidManifest.xml | 22 ++-- .../GoogleAccountAuthenticatorService.kt | 118 ++++++++++++++++++ .../drawable/ic_account_provider_google.png | Bin 0 -> 21709 bytes .../res/xml/google_account_authenticator.xml | 16 +++ 5 files changed, 149 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleAccountAuthenticatorService.kt create mode 100644 app/src/main/res/drawable/ic_account_provider_google.png create mode 100644 app/src/main/res/xml/google_account_authenticator.xml diff --git a/app/build.gradle b/app/build.gradle index bdb6d3118..dace8855f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,6 +33,9 @@ android { arg("room.schemaLocation", "$projectDir/schemas") } } + manifestPlaceholders = [ + 'appAuthRedirectScheme': 'net.openid.appauthdemo' + ] } compileOptions { @@ -93,6 +96,7 @@ android { excludes += ['META-INF/*.md'] } } + } dependencies { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e475a60e3..b8d82ef07 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -262,17 +262,17 @@ - - - - - - - - - - - + + + + + + + ?) { + thread { + cleanupAccounts(this) + } + } + + + private class AccountAuthenticator( + val context: Context + ) : AbstractAccountAuthenticator(context) { + + 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) + val bundle = Bundle(1) + bundle.putParcelable(AccountManager.KEY_INTENT, intent) + return bundle + } + + override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null + override fun getAuthTokenLabel(p0: String?) = null + override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null + override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null + override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null + override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array?) = null + + } +} diff --git a/app/src/main/res/drawable/ic_account_provider_google.png b/app/src/main/res/drawable/ic_account_provider_google.png new file mode 100644 index 0000000000000000000000000000000000000000..2154694f964da71ead68a6ff4baa784a21e76a03 GIT binary patch literal 21709 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/xml/google_account_authenticator.xml b/app/src/main/res/xml/google_account_authenticator.xml new file mode 100644 index 000000000..21f33eac1 --- /dev/null +++ b/app/src/main/res/xml/google_account_authenticator.xml @@ -0,0 +1,16 @@ + + + + + -- GitLab From 344bf3b3ea2d7815a73eed8b18e8228812958b5f Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Tue, 19 Jul 2022 14:38:55 +0530 Subject: [PATCH 05/14] update account authenticator --- app/src/main/AndroidManifest.xml | 4 ++-- .../syncadapter/EeloAccountAuthenticatorService.kt | 6 +++--- app/src/main/res/values/strings.xml | 7 +++---- app/src/main/res/xml/account_authenticator.xml | 2 +- .../main/res/xml/eelo_account_authenticator.xml | 14 -------------- 5 files changed, 9 insertions(+), 24 deletions(-) delete mode 100644 app/src/main/res/xml/eelo_account_authenticator.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b8d82ef07..bac94b67a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -275,7 +275,7 @@ - @@ -286,7 +286,7 @@ android:name="android.accounts.AccountAuthenticator" android:resource="@xml/eelo_account_authenticator" /> - + --> () val accounts = ArrayList() - accountManager.getAccountsByType(context.getString(R.string.eelo_account_type)).forEach { accounts.add(it) } + //accountManager.getAccountsByType(context.getString(R.string.eelo_account_type)).forEach { accounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.google_account_type)).forEach { accounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type)).forEach { accounts.add(it) } for (account in accounts.toTypedArray()) @@ -91,9 +91,9 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { thread { cleanupAccounts(this) val eeloAccounts = ArrayList(accounts?.asList()?: emptyList()) - eeloAccounts.removeIf { it.type != getString(R.string.eelo_account_type) } + eeloAccounts.removeIf { it.type != getString(R.string.account_type) } eeloAccounts.removeAll(accountManager.getAccountsByType(getString( - R.string.eelo_account_type))) + R.string.account_type))) for (removedAccount in eeloAccounts) { val intent = Intent("drive.services.ResetService") intent.setPackage(getString(R.string.e_drive_package_name)) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fdfd3fa0f..1973c6f86 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,13 +10,12 @@ Google bitfire.at.davdroid.google - eelo - bitfire.at.davdroid.eelo + at.bitfire.davdroid.address_book - Account manager Address book + /e/ + /e/ Address book foundation.e.accountmanager.eelo.address_book - /e/ Address book foundation.e.accountmanager.google.address_book at.bitfire.davdroid.addressbooks diff --git a/app/src/main/res/xml/account_authenticator.xml b/app/src/main/res/xml/account_authenticator.xml index 85eaa2033..7c2b771ac 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/eelo_account_authenticator.xml b/app/src/main/res/xml/eelo_account_authenticator.xml deleted file mode 100644 index 0f39608e6..000000000 --- a/app/src/main/res/xml/eelo_account_authenticator.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - -- GitLab From 03f3e669c1d52de91296651f0d7fab8a6adaf8e5 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Thu, 21 Jul 2022 10:03:07 +0530 Subject: [PATCH 06/14] worked on feedback, removed EeloAccountAuthenticatorService, GoolgeAccountAuthenticatorService --- app/src/main/AndroidManifest.xml | 27 ---- .../at/bitfire/davdroid/db/AppDatabase.kt | 8 +- .../EeloAccountAuthenticatorService.kt | 131 ------------------ .../GoogleAccountAuthenticatorService.kt | 118 ---------------- 4 files changed, 4 insertions(+), 280 deletions(-) delete mode 100644 app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt delete mode 100644 app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleAccountAuthenticatorService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bac94b67a..99f49fac6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -261,33 +261,6 @@ android:resource="@xml/contacts"/> - - - - - - - - - - - - diff --git a/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt b/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt index 6a727a657..2ed99e26f 100644 --- a/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt +++ b/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt @@ -82,13 +82,13 @@ abstract class AppDatabase: RoomDatabase() { fun getInstance(context: Context): AppDatabase { INSTANCE?.let { return it } - val db = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "services.db") + val database = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "services.db") .addMigrations(*migrations) - .fallbackToDestructiveMigration() // as a last fallback, recreate database instead of crashing + .fallbackToDestructiveMigration() .build() - INSTANCE = db + INSTANCE = database - return db + return database } // migrations diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt deleted file mode 100644 index 9a53885b3..000000000 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt +++ /dev/null @@ -1,131 +0,0 @@ -package at.bitfire.davdroid.syncadapter - -import android.accounts.* -import android.app.Service -import android.content.Context -import android.content.Intent -import android.database.DatabaseUtils -import android.os.Bundle -import androidx.annotation.WorkerThread -import at.bitfire.davdroid.R -import at.bitfire.davdroid.db.AppDatabase - -import at.bitfire.davdroid.log.Logger -import at.bitfire.davdroid.resource.LocalAddressBook -import at.bitfire.davdroid.ui.setup.LoginActivity -import java.util.* -import java.util.logging.Level -import kotlin.concurrent.thread - -/** - * Account authenticator for the eelo account type. - * - * Gets started when an eelo account is removed, too, so it also watches for account removals - * and contains the corresponding cleanup code. - */ -class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { - - companion object { - - fun cleanupAccounts(context: Context) { - Logger.log.info("Cleaning up orphaned accounts") - - val accountManager = AccountManager.get(context) - - val accountNames = HashSet() - - val accounts = ArrayList() - //accountManager.getAccountsByType(context.getString(R.string.eelo_account_type)).forEach { accounts.add(it) } - accountManager.getAccountsByType(context.getString(R.string.google_account_type)).forEach { accounts.add(it) } - accountManager.getAccountsByType(context.getString(R.string.account_type)).forEach { accounts.add(it) } - for (account in accounts.toTypedArray()) - accountNames += account.name - - // delete orphaned address book accounts - val addressBookAccounts = ArrayList() - accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { addressBookAccounts.add(it) } - accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { addressBookAccounts.add(it) } - accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { addressBookAccounts.add(it) } - addressBookAccounts.map { LocalAddressBook(context, it, null) } - .forEach { - try { - if (!accountNames.contains(it.mainAccount.name)) - it.delete() - } catch(e: Exception) { - Logger.log.log(Level.SEVERE, "Couldn't delete address book account", e) - } - } - - // delete orphaned services in DB - val db = AppDatabase.getInstance(context) - val serviceDao = db.serviceDao() - if (accountNames.isEmpty()) - serviceDao.deleteAll() - else - serviceDao.deleteExceptAccounts(accountNames.toTypedArray()) - } - - } - - - private lateinit var accountManager: AccountManager - private lateinit var accountAuthenticator: AccountAuthenticator - - override fun onCreate() { - accountManager = AccountManager.get(this) - accountManager.addOnAccountsUpdatedListener(this, null, true) - - accountAuthenticator = AccountAuthenticator(this) - } - - override fun onDestroy() { - super.onDestroy() - accountManager.removeOnAccountsUpdatedListener(this) - } - - override fun onBind(intent: Intent?) = - accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } - - - override fun onAccountsUpdated(accounts: Array?) { - thread { - cleanupAccounts(this) - val eeloAccounts = ArrayList(accounts?.asList()?: emptyList()) - eeloAccounts.removeIf { it.type != getString(R.string.account_type) } - eeloAccounts.removeAll(accountManager.getAccountsByType(getString( - R.string.account_type))) - for (removedAccount in eeloAccounts) { - val intent = Intent("drive.services.ResetService") - intent.setPackage(getString(R.string.e_drive_package_name)) - intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, removedAccount.name) - intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, removedAccount.type) - startService(intent) - } - } - } - - - private class AccountAuthenticator( - val context: Context - ) : AbstractAccountAuthenticator(context) { - - 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) - intent.putExtra(LoginActivity.SETUP_ACCOUNT_PROVIDER_TYPE, LoginActivity.ACCOUNT_PROVIDER_EELO) - val bundle = Bundle(1) - bundle.putParcelable(AccountManager.KEY_INTENT, intent) - return bundle - } - - override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null - override fun getAuthTokenLabel(p0: String?) = null - override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null - override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null - override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null - override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array?) = null - - } -} - - diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleAccountAuthenticatorService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleAccountAuthenticatorService.kt deleted file mode 100644 index 4d8b672fa..000000000 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleAccountAuthenticatorService.kt +++ /dev/null @@ -1,118 +0,0 @@ -package at.bitfire.davdroid.syncadapter - -/* - * Copyright © Ricki Hirner (bitfire web engineering). - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - */ - -import android.accounts.* -import android.app.Service -import android.content.Context -import android.content.Intent -import android.database.DatabaseUtils -import android.os.Bundle -import androidx.annotation.WorkerThread -import at.bitfire.davdroid.R -import at.bitfire.davdroid.db.AppDatabase -import at.bitfire.davdroid.log.Logger -import at.bitfire.davdroid.resource.LocalAddressBook -import at.bitfire.davdroid.ui.setup.LoginActivity -//import foundation.e.accountmanager.R -//import foundation.e.accountmanager.log.Logger -//import foundation.e.accountmanager.model.AppDatabase -//import foundation.e.accountmanager.resource.LocalAddressBook -//import foundation.e.accountmanager.ui.setup.LoginActivity -import java.util.* -import java.util.logging.Level -import kotlin.concurrent.thread - -/** - * Account authenticator for the Google account type. - * - * Gets started when a Google account is removed, too, so it also watches for account removals - * and contains the corresponding cleanup code. - */ -class GoogleAccountAuthenticatorService : Service(), OnAccountsUpdateListener { - - companion object { - - fun cleanupAccounts(context: Context) { - Logger.log.info("Cleaning up orphaned accounts") - - val accountManager = AccountManager.get(context) - val accountNames = accountManager.getAccountsByType(context.getString(R.string.account_type)) - .map { it.name } - - // delete orphaned address book accounts - accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) - .map { LocalAddressBook(context, it, null) } - .forEach { - try { - if (!accountNames.contains(it.mainAccount.name)) - it.delete() - } catch(e: Exception) { - Logger.log.log(Level.SEVERE, "Couldn't delete address book account", e) - } - } - - // delete orphaned services in DB - val db = AppDatabase.getInstance(context) - val serviceDao = db.serviceDao() - if (accountNames.isEmpty()) - serviceDao.deleteAll() - else - serviceDao.deleteExceptAccounts(accountNames.toTypedArray()) - } - - } - - private lateinit var accountManager: AccountManager - private lateinit var accountAuthenticator: AccountAuthenticator - - override fun onCreate() { - accountManager = AccountManager.get(this) - accountManager.addOnAccountsUpdatedListener(this, null, true) - - accountAuthenticator = AccountAuthenticator(this) - } - - override fun onDestroy() { - super.onDestroy() - accountManager.removeOnAccountsUpdatedListener(this) - } - - override fun onBind(intent: Intent?) = - accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } - - - override fun onAccountsUpdated(accounts: Array?) { - thread { - cleanupAccounts(this) - } - } - - - private class AccountAuthenticator( - val context: Context - ) : AbstractAccountAuthenticator(context) { - - 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) - val bundle = Bundle(1) - bundle.putParcelable(AccountManager.KEY_INTENT, intent) - return bundle - } - - override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null - override fun getAuthTokenLabel(p0: String?) = null - override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null - override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null - override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null - override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array?) = null - - } -} -- GitLab From 0fb9eacc3ee186cf1ccd18a83a573335eac8f2f2 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Thu, 21 Jul 2022 11:57:39 +0530 Subject: [PATCH 07/14] worked on feedback: replace print to Log.i --- .../main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt index 8e1ea7571..801f82729 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginActivity.kt @@ -5,6 +5,7 @@ package at.bitfire.davdroid.ui.setup import android.os.Bundle +import android.util.Log import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity @@ -23,6 +24,8 @@ import javax.inject.Inject @AndroidEntryPoint class LoginActivity: AppCompatActivity() { + private val TAG = LoginActivity::class.qualifiedName + companion object { /** @@ -75,7 +78,7 @@ class LoginActivity: AppCompatActivity() { .commit() } ACCOUNT_PROVIDER_GOOGLE -> { - print("starting google account sign-in") + Log.i(TAG, "starting google account sign-in") } else -> // first call, add first login fragment -- GitLab From b164f4f9c76de3b06c353d84d0ad0cdb5b73a05b Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Mon, 25 Jul 2022 08:47:25 +0530 Subject: [PATCH 08/14] worked on feedback: string translatable --- app/src/main/res/values/strings.xml | 22 +++++++++---------- .../res/xml/google_account_authenticator.xml | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1973c6f86..404bb77f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,15 +8,15 @@ Account does not exist (anymore) bitfire.at.davdroid - Google - bitfire.at.davdroid.google + Google + bitfire.at.davdroid.google at.bitfire.davdroid.address_book - /e/ - /e/ Address book - foundation.e.accountmanager.eelo.address_book - foundation.e.accountmanager.google.address_book + /e/ + /e/ Address book + foundation.e.accountmanager.eelo.address_book + foundation.e.accountmanager.google.address_book at.bitfire.davdroid.addressbooks Address books @@ -24,12 +24,12 @@ Help Manage accounts Share - foundation.e.notes.android.providers.AppContentProvider - foundation.e.mail.provider.AppContentProvider - foundation.e.drive.providers.MediasSyncProvider - foundation.e.drive.providers.SettingsSyncProvider + foundation.e.notes.android.providers.AppContentProvider + foundation.e.mail.provider.AppContentProvider + foundation.e.drive.providers.MediasSyncProvider + foundation.e.drive.providers.SettingsSyncProvider foundation.e.drive.providers.MeteredConnectionAllowedProvider - foundation.e.drive + foundation.e.drive Database corrupted All accounts have been removed locally. diff --git a/app/src/main/res/xml/google_account_authenticator.xml b/app/src/main/res/xml/google_account_authenticator.xml index 21f33eac1..24ec8ec29 100644 --- a/app/src/main/res/xml/google_account_authenticator.xml +++ b/app/src/main/res/xml/google_account_authenticator.xml @@ -1,5 +1,6 @@ + + -- GitLab From 72f5a379952a1335fde4bb8d422963afca5b64a5 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Thu, 28 Jul 2022 09:21:41 +0530 Subject: [PATCH 11/14] refine and add copyRight statement --- .../davdroid/syncadapter/EeloEmailSyncAdapterService.kt | 1 + .../at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt | 6 ------ app/src/main/res/xml/eelo_sync_email.xml | 1 + 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloEmailSyncAdapterService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloEmailSyncAdapterService.kt index 5e76c21a8..86deed86d 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloEmailSyncAdapterService.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/EeloEmailSyncAdapterService.kt @@ -1,6 +1,7 @@ package at.bitfire.davdroid.syncadapter /* + * Copyright ECORP SAS 2022 * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt index ae4e9827c..c85733a73 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt @@ -241,12 +241,6 @@ class AccountDetailsFragment : Fragment() { true ) - // add entries for account to service DB - Logger.log.log(Level.INFO, "Writing account configuration to database", config) - val db = AppDatabase.getInstance(context) - - - // add entries for account to service DB Logger.log.log(Level.INFO, "Writing account configuration to database", config) try { diff --git a/app/src/main/res/xml/eelo_sync_email.xml b/app/src/main/res/xml/eelo_sync_email.xml index 4003b9f0a..1e2761959 100644 --- a/app/src/main/res/xml/eelo_sync_email.xml +++ b/app/src/main/res/xml/eelo_sync_email.xml @@ -1,5 +1,6 @@