diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e7a8de14bc19091d4bf8d8cbba1d0ff152aafe09..34496cb8e5db6dede40412ad0a059c9c8446fd48 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -151,7 +151,7 @@ android:label="@string/webdav_add_mount_title" android:parentActivityName=".ui.webdav.WebdavMountsActivity" /> - + @@ -217,7 +217,7 @@ - + diff --git a/app/src/main/java/at/bitfire/davdroid/Constants.kt b/app/src/main/java/at/bitfire/davdroid/Constants.kt index 8e6c59bc981c5ef5bdb768df26f0ad1c1c40751b..ac502255400cd0f35ca0872a49800cdc3897eeed 100644 --- a/app/src/main/java/at/bitfire/davdroid/Constants.kt +++ b/app/src/main/java/at/bitfire/davdroid/Constants.kt @@ -7,6 +7,10 @@ object Constants { const val DAVDROID_GREEN_RGBA = 0xFF8bc34a.toInt() + // NOTE: Android 7 and up don't allow 2 min sync frequencies unless system frameworks are modified + const val DEFAULT_CALENDAR_SYNC_INTERVAL = 2 * 60L // 2 minutes + const val DEFAULT_CONTACTS_SYNC_INTERVAL = 15 * 60L // 15 minutes + // gplay billing const val BILLINGCLIENT_CONNECTION_MAX_RETRIES = 4 diff --git a/app/src/main/java/at/bitfire/davdroid/DavService.kt b/app/src/main/java/at/bitfire/davdroid/DavService.kt index fd6c3b68a070799c9262eabd689688ff0e89c572..c2114e93c570aecdbf7cbd12eec895dfeaae2cf1 100644 --- a/app/src/main/java/at/bitfire/davdroid/DavService.kt +++ b/app/src/main/java/at/bitfire/davdroid/DavService.kt @@ -145,7 +145,7 @@ class DavService: android.app.Service() { * @throws HttpException * @throws foundation.e.dav4jvm.exception.DavException */ - fun queryHomeSets(client: OkHttpClient, url: HttpUrl, accessToken: String, recurse: Boolean = true) { + fun queryHomeSets(client: OkHttpClient, url: HttpUrl, accessToken: String?, recurse: Boolean = true) { val related = mutableSetOf() fun findRelated(root: HttpUrl, dav: Response) { @@ -263,12 +263,12 @@ class DavService: android.app.Service() { .build().use { client -> val httpClient = client.okHttpClient - val accessToken = service.accessToken + val authState = service.authState // refresh home set list (from principal) service.principal?.let { principalUrl -> Logger.log.fine("Querying principal $principalUrl for home sets") - queryHomeSets(httpClient, principalUrl, accessToken) + queryHomeSets(httpClient, principalUrl, AuthState.jsonDeserialize(authState).accessToken) } // now refresh homesets and their member collections @@ -278,7 +278,7 @@ class DavService: android.app.Service() { Logger.log.fine("Listing home set ${homeSet.key}") try { - DavResource(httpClient, homeSet.key, accessToken).propfind(1, *DAV_COLLECTION_PROPERTIES) { response, relation -> + DavResource(httpClient, homeSet.key, AuthState.jsonDeserialize(authState).accessToken).propfind(1, *DAV_COLLECTION_PROPERTIES) { response, relation -> if (!response.isSuccess()) return@propfind @@ -312,7 +312,7 @@ class DavService: android.app.Service() { val (url, info) = itCollections.next() if (!info.confirmed) try { - DavResource(httpClient, url, accessToken).propfind(0, *DAV_COLLECTION_PROPERTIES) { response, _ -> + DavResource(httpClient, url, AuthState.jsonDeserialize(authState).accessToken).propfind(0, *DAV_COLLECTION_PROPERTIES) { response, _ -> if (!response.isSuccess()) return@propfind 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 683b624b4283758d80de51c6547a66e4d4809195..1bc95a9c92ee562056e7184919372bf7531d63e3 100644 --- a/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt +++ b/app/src/main/java/at/bitfire/davdroid/db/AppDatabase.kt @@ -117,15 +117,15 @@ abstract class AppDatabase: RoomDatabase() { "CREATE TABLE service(" + "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + "accountName TEXT NOT NULL," + - "accessToken TEXT ," + - "refreshToken TEXT ," + + "authState TEXT ," + "type TEXT NOT NULL," + "principal TEXT DEFAULT NULL" + ")", "CREATE UNIQUE INDEX index_service_accountName_type ON service(accountName, type)", - "INSERT INTO service(id, accountName, accessToken, refreshToken, type, principal) SELECT _id, accountName, accessToken, refreshToken, service, principal FROM services", + "INSERT INTO service(id, accountName, authState, type, principal) SELECT _id, accountName, authState, service, principal FROM services", "DROP TABLE services", + // migrate "homesets" to "homeset": rename columns, make id NOT NULL "CREATE TABLE homeset(" + "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + diff --git a/app/src/main/java/at/bitfire/davdroid/db/Credentials.kt b/app/src/main/java/at/bitfire/davdroid/db/Credentials.kt index c3becfeaf945f31fa3499c2afdf4a55d3bef3647..488f503d0e02940db5cd6a6284f0aaf60e9406a0 100644 --- a/app/src/main/java/at/bitfire/davdroid/db/Credentials.kt +++ b/app/src/main/java/at/bitfire/davdroid/db/Credentials.kt @@ -8,12 +8,16 @@ package foundation.e.accountmanager.model +import net.openid.appauth.AuthState + class Credentials( val userName: String? = null, val password: String? = null, + val authState: AuthState? = null, val accessToken: String? = null, val refreshToken: String? = null, val certificateAlias: String? = null + ) { enum class Type { @@ -28,8 +32,7 @@ class Credentials( type = when { !certificateAlias.isNullOrEmpty() -> Type.ClientCertificate - !userName.isNullOrEmpty() && !accessToken.isNullOrEmpty() - && !refreshToken.isNullOrEmpty() -> + !userName.isNullOrEmpty() && (authState != null) -> Type.OAuth !userName.isNullOrEmpty() && !password.isNullOrEmpty() -> Type.UsernamePassword diff --git a/app/src/main/java/at/bitfire/davdroid/db/Service.kt b/app/src/main/java/at/bitfire/davdroid/db/Service.kt index a5500ff584baab917c9f5b4dd21bbdc3e1fc4a3b..c991e65aa93de6ce63078a57dc1e15d10a7017c4 100644 --- a/app/src/main/java/at/bitfire/davdroid/db/Service.kt +++ b/app/src/main/java/at/bitfire/davdroid/db/Service.kt @@ -22,7 +22,7 @@ data class Service( var type: String, var accessToken: String, var refreshToken: String, - + var authState: String, var principal: HttpUrl? ): IdEntity { diff --git a/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt b/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt index d961278c30734886e6e857d4b254ea913a33c41f..bb37a1835b2a64ebe16a9b32acb0d51cafbb11a1 100644 --- a/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt +++ b/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt @@ -17,6 +17,7 @@ import android.os.RemoteException import android.provider.CalendarContract import android.provider.ContactsContract import androidx.core.content.ContextCompat +import at.bitfire.davdroid.Constants import foundation.e.accountmanager.* import foundation.e.accountmanager.log.Logger import foundation.e.accountmanager.model.AppDatabase @@ -34,6 +35,7 @@ import okhttp3.HttpUrl import org.apache.commons.lang3.StringUtils import org.dmfs.tasks.contract.TaskContract import java.util.logging.Level +import net.openid.appauth.AuthState /** * Manages settings of an account. @@ -51,8 +53,7 @@ class AccountSettings( const val KEY_SETTINGS_VERSION = "version" const val KEY_USERNAME = "user_name" - const val KEY_ACCESS_TOKEN = "access_token" - const val KEY_REFRESH_TOKEN = "refresh_token" + const val KEY_AUTH_STATE = "auth_state" const val KEY_CERTIFICATE_ALIAS = "certificate_alias" const val KEY_WIFI_ONLY = "wifi_only" // sync on WiFi only (default: false) @@ -102,8 +103,7 @@ class AccountSettings( bundle.putString(KEY_USERNAME, credentials.userName) Credentials.Type.OAuth -> { bundle.putString(KEY_USERNAME, credentials.userName) - bundle.putString(KEY_ACCESS_TOKEN, credentials.accessToken) - bundle.putString(KEY_REFRESH_TOKEN, credentials.refreshToken) + bundle.putString(KEY_AUTH_STATE, credentials.authState!!.jsonSerializeString()) } Credentials.Type.ClientCertificate -> bundle.putString(KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) @@ -136,18 +136,35 @@ class AccountSettings( // authentication settings - fun credentials() = Credentials( - accountManager.getUserData(account, KEY_USERNAME), - accountManager.getPassword(account), - accountManager.getUserData(account, KEY_ACCESS_TOKEN), - accountManager.getUserData(account, KEY_REFRESH_TOKEN), - accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS) - ) + fun credentials(): Credentials { + if (accountManager.getUserData(account, KEY_AUTH_STATE).isNullOrEmpty()) { + return Credentials( + accountManager.getUserData(account, KEY_USERNAME), + accountManager.getPassword(account), + null, + accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS)) + } + else { + return Credentials( + accountManager.getUserData(account, KEY_USERNAME), + accountManager.getPassword(account), + AuthState.jsonDeserialize(accountManager.getUserData(account, KEY_AUTH_STATE)), + accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS)) + } + } fun credentials(credentials: Credentials) { - accountManager.setUserData(account, KEY_USERNAME, credentials.userName) - accountManager.setPassword(account, credentials.password) - accountManager.setUserData(account, KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) + if (credentials.authState == null) { + accountManager.setUserData(account, KEY_USERNAME, credentials.userName) + accountManager.setPassword(account, credentials.password) + accountManager.setUserData(account, KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) + } + else { + accountManager.setUserData(account, KEY_USERNAME, credentials.userName) + accountManager.setPassword(account, credentials.password) + accountManager.setUserData(account, KEY_AUTH_STATE, credentials.authState.jsonSerializeString()) + accountManager.setUserData(account, KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) + } } @@ -432,7 +449,7 @@ class AccountSettings( // request sync of new address book account ContentResolver.setIsSyncable(account, context.getString(R.string.address_books_authority), 1) - setSyncInterval(context.getString(R.string.address_books_authority), Constants.DEFAULT_SYNC_INTERVAL) + setSyncInterval(context.getString(R.string.address_books_authority), Constants.DEFAULT_CONTACTS_SYNC_INTERVAL) } /* Android 7.1.1 OpenTasks fix */ diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.kt index b01e83a8a002c08c04c7f55e6b7c57b32229904d..2d7404fff7f77314ba8117d9eb713afcd29991eb 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.kt @@ -56,7 +56,7 @@ class CalendarSyncManager( override fun prepare(): Boolean { collectionURL = HttpUrl.parse(localCollection.name ?: return false) ?: return false - davCollection = DavCalendar(httpClient.okHttpClient, collectionURL, accountSettings.credentials().accessToken) + davCollection = DavCalendar(httpClient.okHttpClient, collectionURL, accountSettings.credentials().authState?.accessToken) // if there are dirty exceptions for events, mark their master events as dirty, too localCollection.processDirtyExceptions() @@ -119,8 +119,7 @@ class CalendarSyncManager( if (bunch.size == 1) { val remote = bunch.first() // only one contact, use GET - useRemote(DavResource(httpClient.okHttpClient, remote, accountSettings.credentials().accessToken)) { resource -> - resource.get(DavCalendar.MIME_ICALENDAR.toString()) { response -> + useRemote(DavResource(httpClient.okHttpClient, remote, accountSettings.credentials().authState?.accessToken)) { resource -> // CalDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc4791#section-5.3.4] val eTag = response.header("ETag")?.let { GetETag(it).eTag } ?: throw DavException("Received CalDAV GET response without ETag") diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarsSyncAdapterService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarsSyncAdapterService.kt index 28e759c0412c83fafe421c69c81c37016e85145f..18fd5dbb992a6db9bc1a9543de42d6cda2fa5782 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarsSyncAdapterService.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarsSyncAdapterService.kt @@ -24,18 +24,20 @@ import java.util.logging.Level import kotlin.collections.component1 import kotlin.collections.component2 import kotlin.collections.set +import android.os.AsyncTask +import foundation.e.accountmanager.model.Credentials +import net.openid.appauth.AuthorizationService class CalendarsSyncAdapterService: SyncAdapterService() { - override fun syncAdapter() = CalendarsSyncAdapter(this, appDatabase) + override fun syncAdapter() = CalendarsSyncAdapter(this) - class CalendarsSyncAdapter( - context: Context, - appDatabase: AppDatabase - ) : SyncAdapter(context, appDatabase) { + class CalendarsSyncAdapter( + context: Context + ): SyncAdapter(context) { - override fun sync(account: Account, extras: Bundle, authority: String, httpClient: Lazy, provider: ContentProviderClient, syncResult: SyncResult) { + override fun sync(account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { val accountSettings = AccountSettings(context, account) @@ -55,12 +57,38 @@ class CalendarsSyncAdapterService: SyncAdapterService() { val priorityCalendars = priorityCollections(extras) val calendars = AndroidCalendar - .find(account, provider, LocalCalendar.Factory, "${CalendarContract.Calendars.SYNC_EVENTS}!=0", null) - .sortedByDescending { priorityCalendars.contains(it.id) } + .find(account, provider, LocalCalendar.Factory, "${CalendarContract.Calendars.SYNC_EVENTS}!=0", null) + .sortedByDescending { priorityCalendars.contains(it.id) } for (calendar in calendars) { Logger.log.info("Synchronizing calendar #${calendar.id}, URL: ${calendar.name}") - CalendarSyncManager(context, account, accountSettings, extras, httpClient.value, authority, syncResult, calendar).let { - it.performSync() + CalendarSyncManager(context, account, accountSettings, extras, authority, syncResult, calendar).use { + val authState = accountSettings.credentials().authState + if (authState != null) + { + if (authState.needsTokenRefresh) + { + val tokenRequest = authState.createTokenRefreshRequest() + + AuthorizationService(context).performTokenRequest(tokenRequest, + AuthorizationService.TokenResponseCallback { tokenResponse, ex -> + authState.update(tokenResponse, ex) + accountSettings.credentials(Credentials(account.name, null, authState, null)) + it.accountSettings.credentials(Credentials(it.account.name, null, authState, null)) + object : AsyncTask() { + override fun doInBackground(vararg params: Void): Void? { + it.performSync() + return null + } + }.execute() + }) + } + else { + it.performSync() + } + } + else { + it.performSync() + } } } } catch(e: Exception) { @@ -70,6 +98,7 @@ class CalendarsSyncAdapterService: SyncAdapterService() { } private fun updateLocalCalendars(provider: ContentProviderClient, account: Account, settings: AccountSettings) { + val db = AppDatabase.getInstance(context) val service = db.serviceDao().getByAccountAndType(account.name, Service.TYPE_CALDAV) val remoteCalendars = mutableMapOf() @@ -82,7 +111,7 @@ class CalendarsSyncAdapterService: SyncAdapterService() { val updateColors = settings.getManageCalendarColors() for (calendar in AndroidCalendar.find(account, provider, LocalCalendar.Factory, null, null)) calendar.name?.let { - val url = it.toHttpUrl() + val url = HttpUrl.parse(it)!! val info = remoteCalendars[url] if (info == null) { Logger.log.log(Level.INFO, "Deleting obsolete local calendar", url) diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncAdapterService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncAdapterService.kt index 454d06535ea4f0420dfb2bb12aa49d5b6435bf87..a0a940398a0d46040735ba1d635651bd806be9b9 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncAdapterService.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncAdapterService.kt @@ -17,6 +17,9 @@ import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.AccountSettings import java.util.logging.Level +import android.os.AsyncTask +import foundation.e.accountmanager.model.Credentials +import net.openid.appauth.AuthorizationService class ContactsSyncAdapterService: SyncAdapterService() { @@ -24,18 +27,17 @@ class ContactsSyncAdapterService: SyncAdapterService() { const val PREVIOUS_GROUP_METHOD = "previous_group_method" } - override fun syncAdapter() = ContactsSyncAdapter(this, appDatabase) + override fun syncAdapter() = ContactsSyncAdapter(this) - class ContactsSyncAdapter( - context: Context, - appDatabase: AppDatabase - ) : SyncAdapter(context, appDatabase) { + class ContactsSyncAdapter( + context: Context + ): SyncAdapter(context) { - override fun sync(account: Account, extras: Bundle, authority: String, httpClient: Lazy, provider: ContentProviderClient, syncResult: SyncResult) { + override fun sync(account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { - val accountSettings = AccountSettings(context, account) val addressBook = LocalAddressBook(context, account, provider) + val accountSettings = AccountSettings(context, addressBook.mainAccount) // handle group method change val groupMethod = accountSettings.getGroupMethod().name @@ -63,8 +65,34 @@ class ContactsSyncAdapterService: SyncAdapterService() { Logger.log.info("Synchronizing address book: ${addressBook.url}") Logger.log.info("Taking settings from: ${addressBook.mainAccount}") - ContactsSyncManager(context, account, accountSettings, httpClient.value, extras, authority, syncResult, provider, addressBook).let { - it.performSync() + ContactsSyncManager(context, account, accountSettings, extras, authority, syncResult, provider, addressBook).use { + val authState = accountSettings.credentials().authState + if (authState != null) + { + if (authState.needsTokenRefresh) + { + val tokenRequest = authState.createTokenRefreshRequest() + + AuthorizationService(context).performTokenRequest(tokenRequest, + AuthorizationService.TokenResponseCallback { tokenResponse, ex -> + authState.update(tokenResponse, ex) + accountSettings.credentials(Credentials(account.name, null, authState, null)) + it.accountSettings.credentials(Credentials(it.account.name, null, authState, null)) + object : AsyncTask() { + override fun doInBackground(vararg params: Void): Void? { + it.performSync() + return null + } + }.execute() + }) + } + else { + it.performSync() + } + } + else { + it.performSync() + } } } catch(e: Exception) { Logger.log.log(Level.SEVERE, "Couldn't sync contacts", e) diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt index 9fead6301a4b5d4b0ec184a960e99de5e9688d31..981a9101f625970af59cce712f467e174770179d 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt @@ -97,7 +97,7 @@ class ContactsSyncManager( } private val readOnly = localAddressBook.readOnly - private val accessToken: String? = accountSettings.credentials().accessToken + private val accessToken: String? = accountSettings.credentials().authState?.accessToken private var hasVCard4 = false private val groupMethod = accountSettings.getGroupMethod() @@ -120,7 +120,7 @@ class ContactsSyncManager( } collectionURL = HttpUrl.parse(localCollection.url) ?: return false - davCollection = DavAddressBook(httpClient.okHttpClient, collectionURL, accountSettings.credentials().accessToken) + davCollection = DavAddressBook(httpClient.okHttpClient, collectionURL, accountSettings.credentials().authState?.accessToken) resourceDownloader = ResourceDownloader(davCollection.location) @@ -283,7 +283,7 @@ class ContactsSyncManager( if (bunch.size == 1) { val remote = bunch.first() // only one contact, use GET - useRemote(DavResource(httpClient.okHttpClient, remote, accountSettings.credentials().accessToken)) { resource -> + useRemote(DavResource(httpClient.okHttpClient, remote, accountSettings.credentials().authState?.accessToken)) { resource -> resource.get("text/vcard;version=4.0, text/vcard;charset=utf-8;q=0.8, text/vcard;q=0.5") { response -> // CardDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc6352#section-6.3.2.3] val eTag = response.header("ETag")?.let { GetETag(it).eTag } diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncUtils.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncUtils.kt index a808dd905906e5d30aac8588a635d8c946eba3a2..1254a268feb43a5d5ad000aae7222367dde7d52d 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncUtils.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncUtils.kt @@ -14,9 +14,11 @@ import android.content.pm.PackageManager import android.graphics.drawable.BitmapDrawable import android.net.Uri import android.os.Build +import android.os.Bundle import androidx.annotation.WorkerThread import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import at.bitfire.davdroid.Constants import at.bitfire.davdroid.InvalidAccountException import at.bitfire.davdroid.PermissionUtils import at.bitfire.davdroid.R @@ -33,6 +35,7 @@ import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent +import foundation.e.ical4android.TaskProvider object SyncUtils { @@ -131,6 +134,7 @@ object SyncUtils { if (syncable) { Logger.log.info("Enabling $authority sync for $account") ContentResolver.setIsSyncable(account, authority, 1) + ContentResolver.addPeriodicSync(account, TaskProvider.ProviderName.OpenTasks.authority, Bundle(), Constants.DEFAULT_CALENDAR_SYNC_INTERVAL) try { val settings = AccountSettings(context, account) val interval = settings.getSavedTasksSyncInterval() ?: settingsManager.getLong(Settings.DEFAULT_SYNC_INTERVAL) diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncAdapterService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncAdapterService.kt index 22a0c71f228aa211d65f1602648636617acb7d77..122fd58979c0f1e9113180d0b3fe456d8fa2ab69 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncAdapterService.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncAdapterService.kt @@ -25,34 +25,29 @@ import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl import org.dmfs.tasks.contract.TaskContract import java.util.logging.Level +import android.os.AsyncTask +import foundation.e.accountmanager.model.Credentials +import net.openid.appauth.AuthorizationService /** * Synchronization manager for CalDAV collections; handles tasks ({@code VTODO}). */ -open class TasksSyncAdapterService: SyncAdapterService() { +class TasksSyncAdapterService: SyncAdapterService() { - override fun syncAdapter() = TasksSyncAdapter(this, appDatabase) + override fun syncAdapter() = TasksSyncAdapter(this) - class TasksSyncAdapter( - context: Context, - appDatabase: AppDatabase, - ) : SyncAdapter(context, appDatabase) { + class TasksSyncAdapter( + context: Context + ): SyncAdapter(context) { - override fun sync(account: Account, extras: Bundle, authority: String, httpClient: Lazy, provider: ContentProviderClient, syncResult: SyncResult) { + override fun sync(account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { - val providerName = TaskProvider.ProviderName.fromAuthority(authority) - val taskProvider = TaskProvider.fromProviderClient(context, providerName, provider) - - // make sure account can be seen by task provider - if (Build.VERSION.SDK_INT >= 26) { - /* Warning: If setAccountVisibility is called, Android 12 broadcasts the - AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION Intent. This cancels running syncs - and starts them again! So make sure setAccountVisibility is only called when necessary. */ - val am = AccountManager.get(context) - if (am.getAccountVisibility(account, providerName.packageName) != AccountManager.VISIBILITY_VISIBLE) - am.setAccountVisibility(account, providerName.packageName, AccountManager.VISIBILITY_VISIBLE) - } + val taskProvider = TaskProvider.fromProviderClient(context, provider) + + // make sure account can be seen by OpenTasks + if (Build.VERSION.SDK_INT >= 26) + AccountManager.get(context).setAccountVisibility(account, taskProvider.name.packageName, AccountManager.VISIBILITY_VISIBLE) val accountSettings = AccountSettings(context, account) /* don't run sync if @@ -66,16 +61,62 @@ open class TasksSyncAdapterService: SyncAdapterService() { val priorityTaskLists = priorityCollections(extras) val taskLists = AndroidTaskList - .find(account, taskProvider, LocalTaskList.Factory, "${TaskContract.TaskLists.SYNC_ENABLED}!=0", null) - .sortedByDescending { priorityTaskLists.contains(it.id) } + .find(account, taskProvider, LocalTaskList.Factory, "${TaskContract.TaskLists.SYNC_ENABLED}!=0", null) + .sortedByDescending { priorityTaskLists.contains(it.id) } for (taskList in taskLists) { Logger.log.info("Synchronizing task list #${taskList.id} [${taskList.syncId}]") - TasksSyncManager(context, account, accountSettings, httpClient.value, extras, authority, syncResult, taskList).let { - it.performSync() + TasksSyncManager(context, account, accountSettings, extras, authority, syncResult, taskList).use { + val authState = accountSettings.credentials().authState + if (authState != null) + { + if (authState.needsTokenRefresh) + { + val tokenRequest = authState.createTokenRefreshRequest() + + AuthorizationService(context).performTokenRequest(tokenRequest, + AuthorizationService.TokenResponseCallback { tokenResponse, ex -> + authState.update(tokenResponse, ex) + accountSettings.credentials(Credentials(account.name, null, authState, null)) + it.accountSettings.credentials(Credentials(it.account.name, null, authState, null)) + object : AsyncTask() { + override fun doInBackground(vararg params: Void): Void? { + it.performSync() + return null + } + }.execute() + }) + } + else { + it.performSync() + } + } + else { + it.performSync() + } } } } catch (e: TaskProvider.ProviderTooOldException) { - SyncUtils.notifyProviderTooOld(context, e) + val nm = NotificationManagerCompat.from(context) + val message = context.getString(R.string.sync_error_opentasks_required_version, e.provider.minVersionName, e.installedVersionName) + val notify = NotificationUtils.newBuilder(context, NotificationUtils.CHANNEL_SYNC_ERRORS) + .setSmallIcon(R.drawable.ic_sync_problem_notify) + .setContentTitle(context.getString(R.string.sync_error_opentasks_too_old)) + .setContentText(message) + .setStyle(NotificationCompat.BigTextStyle().bigText(message)) + .setCategory(NotificationCompat.CATEGORY_ERROR) + + try { + val icon = context.packageManager.getApplicationIcon(e.provider.packageName) + if (icon is BitmapDrawable) + notify.setLargeIcon(icon.bitmap) + } catch(ignored: PackageManager.NameNotFoundException) {} + + val intent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=${e.provider.packageName}")) + if (intent.resolveActivity(context.packageManager) != null) + notify .setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) + .setAutoCancel(true) + + nm.notify(NotificationUtils.NOTIFY_OPENTASKS, notify.build()) syncResult.databaseError = true } catch (e: Exception) { Logger.log.log(Level.SEVERE, "Couldn't sync task lists", e) @@ -86,6 +127,7 @@ open class TasksSyncAdapterService: SyncAdapterService() { } private fun updateLocalTaskLists(provider: TaskProvider, account: Account, settings: AccountSettings) { + val db = AppDatabase.getInstance(context) val service = db.serviceDao().getByAccountAndType(account.name, Service.TYPE_CALDAV) val remoteTaskLists = mutableMapOf() @@ -99,7 +141,7 @@ open class TasksSyncAdapterService: SyncAdapterService() { for (list in AndroidTaskList.find(account, provider, LocalTaskList.Factory, null, null)) list.syncId?.let { - val url = it.toHttpUrl() + val url = HttpUrl.parse(it)!! val info = remoteTaskLists[url] if (info == null) { Logger.log.fine("Deleting obsolete local task list $url") @@ -122,4 +164,4 @@ open class TasksSyncAdapterService: SyncAdapterService() { } -} \ No newline at end of file +} diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.kt index 7fd4cf34f0146e75096745a943bd93d46bb441b0..a0bbbc8ef82cb41c82df0e7c585cdd0d9bbe07f2 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.kt +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.kt @@ -57,7 +57,7 @@ class TasksSyncManager( override fun prepare(): Boolean { collectionURL = (localCollection.syncId ?: return false).toHttpUrlOrNull() ?: return false - davCollection = DavCalendar(httpClient.okHttpClient, collectionURL, accountSettings.credentials().accessToken) + davCollection = DavCalendar(httpClient.okHttpClient, collectionURL, accountSettings.credentials().authState?.accessToken) return true } 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 a776c8c4afb4d73a235f784519c308c47a54035f..e462453cb4d3c27e2609b0c04fcaaba994bd5735 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 @@ -151,7 +151,7 @@ class AccountDetailsFragment: Fragment() { if (config.cardDAV != null) { // insert CardDAV service - val id = insertService(db, name, credentials.accessToken!!, credentials.refreshToken!!, Service.TYPE_CARDDAV, config.cardDAV) + val id = insertService(db, name, credentials.authState!!.jsonSerializeString(), Service.TYPE_CARDDAV, config.cardDAV) // initial CardDAV account settings accountSettings.setGroupMethod(groupMethod) @@ -161,26 +161,26 @@ class AccountDetailsFragment: Fragment() { context.startService(refreshIntent) // contact sync is automatically enabled by isAlwaysSyncable="true" in res/xml/sync_address_books.xml - accountSettings.setSyncInterval(context.getString(R.string.address_books_authority), Constants.DEFAULT_SYNC_INTERVAL) + accountSettings.setSyncInterval(context.getString(R.string.address_books_authority), Constants.DEFAULT_CALENDAR_SYNC_INTERVAL) } else ContentResolver.setIsSyncable(account, context.getString(R.string.address_books_authority), 0) if (config.calDAV != null) { // insert CalDAV service - val id = insertService(db, name, credentials.accessToken!!, credentials.refreshToken!!, Service.TYPE_CALDAV, config.calDAV) + val id = insertService(db, name, credentials.authState!!.jsonSerializeString(), Service.TYPE_CALDAV, config.calDAV) // start CalDAV service detection (refresh collections) refreshIntent.putExtra(DavService.EXTRA_DAV_SERVICE_ID, id) context.startService(refreshIntent) // calendar sync is automatically enabled by isAlwaysSyncable="true" in res/xml/sync_calendars.xml - accountSettings.setSyncInterval(CalendarContract.AUTHORITY, Constants.DEFAULT_SYNC_INTERVAL) + accountSettings.setSyncInterval(CalendarContract.AUTHORITY, Constants.DEFAULT_CALENDAR_SYNC_INTERVAL) // enable task sync if OpenTasks is installed // further changes will be handled by PackageChangedReceiver if (LocalTaskList.tasksProviderAvailable(context)) { ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 1) - accountSettings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, Constants.DEFAULT_SYNC_INTERVAL) + accountSettings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, Constants.DEFAULT_CALENDAR_SYNC_INTERVAL) } } else { ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 0) @@ -197,9 +197,9 @@ class AccountDetailsFragment: Fragment() { return result } - private fun insertService(db: AppDatabase, accountName: String, accessToken: String, refreshToken: String, type: String, info: DavResourceFinder.Configuration.ServiceInfo): Long { + private fun insertService(db: AppDatabase, accountName: String, authState: String, type: String, info: DavResourceFinder.Configuration.ServiceInfo): Long { // insert service - val service = Service(0, accountName, accessToken, refreshToken, type, info.principal) + val service = Service(0, accountName, authState, type, info.principal) val serviceId = db.serviceDao().insertOrReplace(service) // insert home sets diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/DavResourceFinder.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/DavResourceFinder.kt index 9af3d3cc79039576809acd2f38fe6ce7aff0cb3a..342ed7bd244130cfec9dee7606e96223914878aa 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/DavResourceFinder.kt +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/DavResourceFinder.kt @@ -168,7 +168,7 @@ class DavResourceFinder( private fun checkUserGivenURL(baseURL: HttpUrl, service: Service, config: Configuration.ServiceInfo) { log.info("Checking user-given URL: $baseURL") - val davBase = DavResource(httpClient.okHttpClient, baseURL, loginModel.credentials!!.accessToken, log) + val davBase = DavResource(httpClient.okHttpClient, baseURL, loginModel.credentials!!.authState!!.accessToken, log) try { when (service) { Service.CARDDAV -> { @@ -291,7 +291,7 @@ class DavResourceFinder( fun providesService(url: HttpUrl, service: Service): Boolean { var provided = false try { - DavResource(httpClient.okHttpClient, url, loginModel.credentials!!.accessToken, log).options { capabilities, _ -> + DavResource(httpClient.okHttpClient, url, loginModel.credentials!!.authState!!.accessToken, log).options { capabilities, _ -> if ((service == Service.CARDDAV && capabilities.contains("addressbook")) || (service == Service.CALDAV && capabilities.contains("calendar-access"))) provided = true @@ -377,7 +377,7 @@ class DavResourceFinder( @Throws(IOException::class, HttpException::class, DavException::class) fun getCurrentUserPrincipal(url: HttpUrl, service: Service?): HttpUrl? { var principal: HttpUrl? = null - DavResource(httpClient.okHttpClient, url, loginModel.credentials!!.accessToken, log).propfind(0, CurrentUserPrincipal.NAME) { response, _ -> + DavResource(httpClient.okHttpClient, url, loginModel.credentials!!.authState!!.accessToken, log).propfind(0, CurrentUserPrincipal.NAME) { response, _ -> response[CurrentUserPrincipal::class.java]?.href?.let { href -> response.requestedUrl.resolve(href)?.let { log.info("Found current-user-principal: $it") diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt index 445079025c282ff85b97e9a500042ca53e3c18fa..a8470b8cc2babe84247b3a82c261e0a6c5b59c17 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt @@ -30,13 +30,15 @@ import java.net.URI import java.net.URISyntaxException import javax.inject.Inject -class DefaultLoginCredentialsFragment : Fragment() { - - val loginModel by activityViewModels() - val model by viewModels() +class DefaultLoginCredentialsFragment: Fragment() { + private lateinit var model: DefaultLoginCredentialsModel + private lateinit var loginModel: LoginModel override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + model = ViewModelProviders.of(this).get(DefaultLoginCredentialsModel::class.java) + loginModel = ViewModelProviders.of(requireActivity()).get(LoginModel::class.java) + val v = LoginCredentialsFragmentBinding.inflate(inflater, container, false) v.lifecycleOwner = viewLifecycleOwner v.model = model @@ -45,33 +47,20 @@ class DefaultLoginCredentialsFragment : Fragment() { if (savedInstanceState == null) activity?.intent?.let { model.initialize(it) } - v.loginUrlBaseUrlEdittext.setAdapter(DefaultLoginCredentialsModel.LoginUrlAdapter(requireActivity())) - v.selectCertificate.setOnClickListener { KeyChain.choosePrivateKeyAlias(requireActivity(), { alias -> Handler(Looper.getMainLooper()).post { - - // Show a Snackbar to add a certificate if no certificate was found - // API Versions < 29 still handle this automatically - if (alias == null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { - Snackbar.make(v.root, R.string.login_no_certificate_found, Snackbar.LENGTH_LONG) - .setAction(R.string.login_install_certificate) { - startActivity(KeyChain.createInstallIntent()) - } - .show() - } - else - model.certificateAlias.value = alias + model.certificateAlias.value = alias } }, null, null, null, -1, model.certificateAlias.value) } v.login.setOnClickListener { if (validate()) - parentFragmentManager.beginTransaction() - .replace(android.R.id.content, DetectConfigurationFragment(), null) - .addToBackStack(null) - .commit() + requireFragmentManager().beginTransaction() + .replace(android.R.id.content, DetectConfigurationFragment(), null) + .addToBackStack(null) + .commit() } return v.root @@ -150,49 +139,18 @@ class DefaultLoginCredentialsFragment : Fragment() { loginModel.credentials = Credentials(username, password, null) } - model.loginAdvanced.value == true -> { + model.loginWithUrlAndCertificate.value == true -> { validateUrl() model.certificateAliasError.value = null val alias = model.certificateAlias.value - if (model.loginUseClientCertificate.value == true && alias.isNullOrBlank()) { + if (alias.isNullOrBlank()) { valid = false model.certificateAliasError.value = "" // error icon without text } - model.usernameError.value = null - val username = model.username.value - - model.passwordError.value = null - val password = model.password.value - - if (model.loginUseUsernamePassword.value == true) { - if (username.isNullOrEmpty()) { - valid = false - model.usernameError.value = getString(R.string.login_user_name_required) - } - validatePassword() - } - - // loginModel.credentials stays null if login is tried with Base URL only if (valid) - loginModel.credentials = when { - // username/password and client certificate - model.loginUseUsernamePassword.value == true && model.loginUseClientCertificate.value == true -> - Credentials(username, password, alias) - - // user/name password only - model.loginUseUsernamePassword.value == true && model.loginUseClientCertificate.value == false -> - Credentials(username, password) - - // client certificate only - model.loginUseUsernamePassword.value == false && model.loginUseClientCertificate.value == true -> - Credentials(certificateAlias = alias) - - // anonymous (neither username/password nor client certificate) - else -> - null - } + loginModel.credentials = Credentials(null, null, null, alias) } } @@ -200,19 +158,10 @@ class DefaultLoginCredentialsFragment : Fragment() { } - class Factory @Inject constructor() : LoginCredentialsFragmentFactory { + class Factory: ILoginCredentialsFragment { override fun getFragment(intent: Intent) = DefaultLoginCredentialsFragment() } - @Module - @InstallIn(SingletonComponent::class) - abstract class DefaultLoginCredentialsFragmentModule { - @Binds - @IntoMap - @IntKey(/* priority */ 10) - abstract fun factory(impl: Factory): LoginCredentialsFragmentFactory - } - -} \ No newline at end of file +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/GoogleAuthenticatorFragment.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/GoogleAuthenticatorFragment.kt index 7e0f2b42bbcbdb3cfb55b084010a29b65544fbe3..f9cefe5f1924d359bf3a4acb5c87e5964dc8256e 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/GoogleAuthenticatorFragment.kt +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/GoogleAuthenticatorFragment.kt @@ -125,7 +125,6 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon requireActivity().setResult(Activity.RESULT_OK) requireActivity().finish() - } private fun createPostAuthorizationIntent( @@ -293,7 +292,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon emailAddress = userInfoJson!!.getString("email") } - if (validate(emailAddress, authState!!.accessToken!!, authState!!.refreshToken!!)) + if (validate(emailAddress, authState!!)) requireFragmentManager().beginTransaction() .replace(android.R.id.content, DetectConfigurationFragment(), null) .addToBackStack(null) @@ -315,7 +314,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon } - private fun validate(emailAddress: String, accessToken: String, refreshToken: String): Boolean { + private fun validate(emailAddress: String, authState: AuthState): Boolean { var valid = false fun validateUrl() { @@ -341,7 +340,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon if (loginModel.baseURI != null) { valid = true - loginModel.credentials = Credentials(emailAddress, null, accessToken, refreshToken, null) + loginModel.credentials = Credentials(emailAddress, null, authState, null) } } @@ -358,3 +357,4 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon } + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1fc6e0f7344d063ac60bb77adb8d84a4ec808fd2..7eaf460db86cd92acc3c18b28df4dbfa223afad4 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 الآن. + تم تعطيل المزامنة التلقائية على مستوى النظام تفعيل @@ -208,7 +208,7 @@ حدث خطأ في الإدخال/الإخراج. عرض التفاصيل - أذونات DAVx⁵ + أذونات Account Manager مطلوب أذونات إضافية فشلت المصادقة (تحقق من بيانات تسجيل الدخول) خطأ شبكة أو الإدخال/الإخراج - %s @@ -221,6 +221,6 @@ استلام مهمة غير صالحة من الخادم جرى تجاهل مورد غير صالح واحد أو أكثر - DAVx⁵: أمن الاتصال - عثر DAVx⁵ على شهادة غير معروفة. هل تريد الوثوق بها؟ + Account Manager: أمن الاتصال + عثر Account Manager على شهادة غير معروفة. هل تريد الوثوق بها؟ diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index a7fc4c434f7036e3cd9ccfe4f497b49662e99105..a776e5f5a6803953c9bdccbad0779c3892136183 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 Адресници Задължително поле Помощ @@ -123,7 +123,7 @@ Лични данни Няма връзка с интернет. Android няма да извършва синхронизация. Няма достатъчно свободно място. Android няма да извършва синхронизация. - Добре дошли при DAVx⁵!\n\nМожете да добавите регистрация за CalDAV/CardDAV. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Автоматичното синхронизиране е изключено на ниво система Включване Синхронизиране на всички профили @@ -393,7 +393,7 @@ Изпраща се файл на WebDAV Дял на WebDAV - Разрешения на DAVx⁵ + Разрешения на Account Manager Необходими са допълнителни разрешения Приложението %s е твърде старо Минимално необходимо издание: %1$s @@ -408,6 +408,6 @@ Получен е недействителен файл от сървъра Пренебрегване на сбъркани данни - DAVx⁵: Защита на връзката - DAVx⁵ се натъкна на непознат сертификат. Ще му се довериш ли? + Account Manager: Защита на връзката + Account Manager се натъкна на непознат сертификат. Ще му се довериш ли? diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 32453fd23e6f296db2ce67966a1038446699bf25..870f836868a7d5285fc17d7ccdc48402dfe1076a 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Správce účtu 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. La sincronització automàtica de tot el sistema està inhabilitada Activa Sincronitza tots els comptes @@ -235,7 +235,7 @@ Inici de sessió amb un URL i un certificat de client Selecciona el certificat Inici de sessió - Crea un compte + Přidat účet Nom del compte S\'ha informat que l\'ús d\'apòstrofs (\'), causa problemes en alguns dispositius. Utilitzeu la vostra adreça de correu electrònic com a nom del compte perquè l\'Android utilitzarà el nom del compte com a camp ORGANITZADOR per als esdeveniments que creeu. No poden haver-hi dos comptes amb el mateix nom. @@ -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 63d4fe5790454528d189b0f9f48276dcf323ab0b..f27c9555d5306c94e9b1d480763d67a55850f358 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Automatická synchronizace v rámci celého systému je vypnutá Zapnout Synchronizovat všechny účty @@ -308,8 +308,8 @@ Nejsou vytvořené žádné výchozí připomínky Pokud mají být pro události bez připomínky vytvořeny výchozí připomínky: požadovaný počet minut před událostí. Pokud výchozí připomínky nechcete, nevyplňujte. Spravovat barvy kalendářů - Barvy kalendáře jsou při každé synchronizaci resetovány - Barvy kalendáře je možné nastavovat ostatními aplikacemi + Barvy kalendářů spravuje Správce účtu + Barvy kalendářů nespravuje Správce účtu Podpora pro barvy událostí Barvy událostí jsou synchronizovány Barvy událostí nejsou synchronizovány @@ -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 8187429f97bab371ddfa31c9bbd44e3d13b267bc..641647c668dfacb3c56f5462ba36aa141afa693f 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Kundechef 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Automatisk synkronisering på tværs af systemet er deaktiveret Aktivere Synkronisere alle konti @@ -235,7 +235,7 @@ Log ind med URL og klientcertifikat Vælge certifikat Log ind - Oprette konto + Tilføj konto Kontonavn Du kan ikke bruge anførelsestegn (\') på alle mobiler. Brug e-mail adresse som kontonavn da Android bruger kontonavn til ORGANIZER-felt for oprettede aktiviteter. Man kan ikke have to konti med samme navn. @@ -399,7 +399,7 @@ Overfør WebDAV fil Montere WebDAV - DAVx⁵-rettigheder + Account Manager-rettigheder Yderligere adgang påkrævet %s for gammel Påkrævet version: %1$s @@ -414,6 +414,6 @@ Modtaget ugyldig opgave fra server Ignorere en eller flere ugyldige kilder - DAVx⁵: Forbindelsessikkerhed - DAVx⁵ er stødt på et ukendt certifikat. Vil du stole på det? + Account Manager: Forbindelsessikkerhed + Account Manager er stødt på et ukendt certifikat. Vil du stole på det? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d13ada330016d330d60a33c9041925ac906f7424..27300cf14bf1946cb2299950aaa95747792631f7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Buchhalter Konto nicht (mehr) vorhanden - DAVx⁵-Adressbuch + Account Manager-Adressbuch Adressbücher Feld wird benötigt Hilfe @@ -123,7 +123,7 @@ Datenschutzerklärung Keine Internet-Verbindung. Android wird die Synchronisierung daher nicht starten. Speicher knapp. Android wird keine Synchronisierung ausführen. - Herzlich willkommen!\n\nSie können jetzt ein CalDAV/CardDAV-Konto hinzufügen. + Systemweite automatische Synchronisierung ist nicht aktiv Aktivieren Alle Konten synchronisieren @@ -235,7 +235,7 @@ Mit URL und Client-Zertifikat anmelden Zertifikat auswählen Anmelden - Konto anlegen + hinzufügen anlegen Kontoname Auf manchen Geräten führt die Verwendung von einfachen Anführungszeichen (\') zu Problemen. Verwenden Sie Ihre E-Mail-Adresse als Kontonamen, da Android den Kontonamen als ORGANIZER einsetzt. Es kann allerdings keine zwei Konten mit dem gleichen Namen geben. @@ -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-el/strings.xml b/app/src/main/res/values-el/strings.xml index 050a4d2c2e44cf546b2c0d83a5561b91bc1a3811..ced34438cfc0a7715218d230730880cd886c3738 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account Manager Ο λογαριασμός δεν υπάρχει (πια) - Βιβλίο διευθύνσεων DAVx⁵ + Βιβλίο διευθύνσεων Account Manager Βιβλία διευθύνσεων Αυτό το πεδίο είναι απαραίτητο Βοήθεια @@ -109,7 +109,7 @@ Πολιτική απορρήτου Δεν υπάρχει σύνδεση στο Διαδίκτυο. Το Android δεν θα πραγματοποιήσει συγχρονισμό. Χαμηλός αποθηκευτικός χώρος. Το Android δεν θα εκτελέσει συγχρονισμό. - Καλώς ήρθατε στο DAVx⁵!\n\nΜπορείτε να προσθέσετε τώρα έναν λογαριασμό CalDAV/CardDAV. + Ο αυτόματος συγχρονισμός σε όλο το σύστημα είναι απενεργοποιημένος Ενεργοποίηση Συγχρονισμός όλων των λογαριασμών @@ -359,7 +359,7 @@ Ανέβασμα αρχείου WebDAV Bάση WebDAV - Δικαιώματα DAVx⁵ + Δικαιώματα Account Manager Απαιτούνται πρόσθετα δικαιώματα Παλιά έκδοση %s Ελάχιστη απαιτούμενη έκδοση: %1$s @@ -374,6 +374,6 @@ Έλαβε μη έγκυρη εργασία από το διακομιστή Αγνόηση ενός ή περισσοτέρων μη έγκυρων πόρων - DAVx⁵: Ασφάλεια σύνδεσης - Το DAVx⁵ εντόπισε ένα άγνωστο πιστοποιητικό. Θέλετε να το εμπιστεύεστε; + Account Manager: Ασφάλεια σύνδεσης + Το Account Manager εντόπισε ένα άγνωστο πιστοποιητικό. Θέλετε να το εμπιστεύεστε; diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3dc8a1c11b40e39e05ec89c10ab57a2fd8ea16df..34b559a5cb7bb68d6e71aad8fdb9d9bc004aba45 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Gerente de cuentas La cuenta (ya) no existe - Agenda DAVx⁵ + Agenda Account Manager Agendas Este campo es requerido Ayuda @@ -123,7 +123,7 @@ Reglamento de privacidad No hay conexión a Internet. Android no se sincronizará. Espacio de almacenamiento bajo. Android no ejecutará la sincronización. - Bienvenido a DAVx⁵!\n\nAhora puedes añadir una cuenta CalDAV/CardDAV. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Sincronización automática del sistema completo está deshabilitada Activar Sincronizar todas las cuentas @@ -235,7 +235,7 @@ Iniciar sesión con URL y certificado del cliente Seleccionar un certificado Registrar - Crear cuenta + Añadir cuenta Nombre de cuenta Se han reportado problemas con el uso de apóstrofes(\') en algunos dispositivos. Usa tu dirección de correo como nombre de cuenta puesto que Android usará el nombre de la cuenta como campo de \"organizador\" en los eventos que cree. No puedes tener dos cuentas con el mismo nombre. @@ -401,7 +401,7 @@ Subiendo fichero WebDAV Montaje WebDAV - Permisos de DAVx⁵ + Permisos de Account Manager Permisos adicionales requeridos %s muy antiguo Mínima versión requerida: %1$s @@ -416,6 +416,6 @@ Tarea inválida recibidas del servidor Ignorando uno o más recursos inválidos - DAVx⁵: Seguridad de conexión - DAVx⁵ ha encontrado un certificado desconocido. ¿Quieres que sea válido? + Account Manager: Seguridad de conexión + Account Manager ha encontrado un certificado desconocido. ¿Quieres que sea válido? diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c72ca1efcdd896c8bc2eb116826d32e5beb5076d..af4bd1bc8e29362420eb26296cdf6929bd3511f3 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account Manager Kontua ez da existitzen (dagoeneko) - DAVx⁵ Helbide liburua + Account Manager Helbide liburua Helbide liburuak Eremu hau beharrezkoa da Laguntza @@ -123,7 +123,7 @@ Pribatutasun gidalerroak Ez dago internetik. Androidek ez du sinkronizaziorik egingo. Biltegiratze-lekua baxua da. Androidek ez du sinkronizatuko. - Ongi etorri DAVx⁵ aplikaziora!\n\nCalDAV/CardDAV kontu bat gehitu dezakezu orain. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Sistema osoko sinkronizazio automatikoa desgaituta dago Gaitu Sinkronizatu kontu guztiak @@ -399,7 +399,7 @@ WebDAV fitxategia kargatzen WebDAV muntaia - DAVx⁵ baimenak + Account Manager baimenak Baimen gehigarriak beharrezkoak %s zaharregia Beharrezko bertsio minimoa: %1$s @@ -414,6 +414,6 @@ Zeregin baliogabea jaso da zerbitzaritik Baliabide baliogabe bat edo gehiago ezikusten - DAVx⁵: Konexio segurtasuna - DAVx⁵ aplikazioak ziurtagiri ezezagun bat aurkitu du. Fidagarritzat jo nahi duzu? + Account Manager: Konexio segurtasuna + Account Manager aplikazioak ziurtagiri ezezagun bat aurkitu du. Fidagarritzat jo nahi duzu? diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 58d34a526ce0d34f33d1d3b7634f276f8fe507b5..a1dba41a7a6d4eb70ac07bda48c4222aaf3b33a2 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account Manager حساب کاربری موجود نیست (بیشتر از این) - کتاب آدرس DAVx⁵ + کتاب آدرس Account Manager کتاب آدرس راهنما مدیریت حساب‌ها @@ -103,7 +103,7 @@ کمک سیاست حفظ حریم خصوصی بدون اتصال به اینترنت. اندروید همگام سازی را اجرا نمی کند. - به همگام‌ساز DAVx⁵ خوش آمدید + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. همگام سازی خودکار در کل سیستم غیرفعال است فعال همگام سازی همه حساب‌ها @@ -334,7 +334,7 @@ نام کاربری گذرواژه - مجوزهای همگام‌ساز DAVx⁵ + مجوزهای همگام‌ساز Account Manager مجوزهای اضافی لازم است %s خیلی قدیمی است حداقل نسخه مورد نیاز: %1$s @@ -349,6 +349,6 @@ کار نامعتبر از سرور دریافت شد نادیده گرفتن یک یا چند منبع نامعتبر - همگام ساز DAVx⁵: امنیت اتصال - همگام ساز DAVx⁵ با یک گواهی ناشناخته روبرو شده است. آیا می خواهید به آن اعتماد کنید؟ + همگام ساز Account Manager: امنیت اتصال + همگام ساز Account Manager با یک گواهی ناشناخته روبرو شده است. آیا می خواهید به آن اعتماد کنید؟ diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 0f8ef70117cf37242240c318654015a95ee3fa03..c9738741bb85f8175e0ab6a2757aa8ffe690e5fa 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1,8 +1,8 @@ - DAVx⁵ - DAVx⁵ Osoitekirja + Account Manager + Account Manager Osoitekirja Osoitekirjat Apua Hallitse tilejä diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 596f940407c38c91edad80941424f060e0d1f117..f7f82517843dcde3adc55e561ec6a4df8a2a5587 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Gestionnaire de compte 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. La synchronisation automatique globale est désactivée Activer Synchroniser tous les comptes @@ -222,7 +222,7 @@ Se connecter avec l\'URL et le certificat client Choisir le certificat Se connecter - Créer un compte + Ajouter un compte Nom du compte L\'utilisation d\'apostrophes (\') est connue pour causer des problèmes sur certains appareils. Utilisez votre adresse e-mail comme nom de compte car Android utilisera ce nom en tant que champ ORGANISATEUR pour les événements que vous créerez. Vous ne pouvez pas avoir deux comptes avec le même nom. @@ -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 2b8556aa62ff90c5630d0a78830e0334956848d8..8a687ebc60def2ab2a825ac2bdfbcf725e7ea51d 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 + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. A sincronización global automática do sistema está desactivada Activar Sincroniza todas as contas @@ -399,7 +399,7 @@ Subindo ficheiro WebDAV Montaxe WebDAV - Permisos DAVx⁵ + Permisos Account Manager Precísanse permisos adicionais %s demasiado antigo Versión mínima requerida: %1$s @@ -414,6 +414,6 @@ Recibida tarefa non válida desde o servidor Ignorando un ou varios recursos non válidos - DAVx⁵: seguridade da conexión - DAVx⁵ atopou un certificado descoñecido. Queres confiar nel? + Account Manager: seguridade da conexión + Account Manager atopou un certificado descoñecido. Queres confiar nel? diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 378c665c4b66559590932e02be73cd6d69511aef..6329bdb9c6debccaa5fb21ff456062117a25f071 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Fiókkezelő 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. A rendszerszintű automatikus szinkronizálás ki van kapcsolva Bekapcsolás Az összes fiók szinkronizálása @@ -235,7 +235,7 @@ Bejelentkezés URL és tanúsítvány segítségével Tanúsítvány kiválasztása Bejelentkezés - Fiók létrehozása + Fiók hozzáadása A fiók neve Az aposztróf (\') használata a visszajelzések szerinte egyes eszközökön problémát okoz. Használja az email címet fióknévként, mert később a létrehozandó események szervezőjeként (ORGANIZER mező) az Android ezt fogja használni. Két fiókot nem lehet azonos néven létrehozni. @@ -399,7 +399,7 @@ WebDAV fájl feltöltése WebDAV kötetek - DAVx⁵ engedélyek + Account Manager engedélyek További engedélyek szükségesek %s túl régi Legalacsonyabb szükséges verzió: %1$s @@ -414,6 +414,6 @@ A szerver érvénytelen feladatot küldött Egy vagy több érvénytelen erőforrás kihagyva - DAVx⁵: kapcsolatbiztonság + Account Manager: kapcsolatbiztonság Egy eddig ismeretlen tanúsítvány érkezett. Megbízhatónak kívánja elfogadni? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 67d536005b7b8b63c8e05e53af3ca163fdacba7e..506b45bea21db40384bba9ecb42a0e501bd5e820 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. La sincronizzazione automatica dell\'intero sistema è disabilitata Attiva Sincronizzazione di tutti gli account @@ -211,7 +211,7 @@ Accedi con URL e certificato client Seleziona certificato Login - Crea account + Aggiungi account Nome account L\'utilizzo di apostrofi (\') potrebbe causare problemi su alcuni dispositivi. Inserisci il tuo indirizzo email come nome dell\'account in quanto Android userà il nome dell\'account nel campo ORGANIZER degli eventi creati. Non è possibile avere due account con nome uguale. @@ -376,7 +376,7 @@ Lasciare vuoto per non creare un promemoria predefinito. Caricare file WebDAV Installazione WebDAV - Autorizzazioni DAVx⁵ + Autorizzazioni Account Manager Autorizzazioni addizionali richieste %s troppo vecchio Versione minima richiesta %1$s @@ -391,6 +391,6 @@ Lasciare vuoto per non creare un promemoria predefinito. Attività non valida ricevuta dal server Una o più risorse non valide ignorate - DAVx⁵: sicurezza della connessione - DAVx⁵ ha trovato un certificato sconosciuto. Ritenerlo affidabile? + Account Manager: sicurezza della connessione + Account Manager ha trovato un certificato sconosciuto. Ritenerlo affidabile? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 09c31e81e2185efffe73e81142832d523180a812..ba0aa635de1ef7a0b42deb7eff56667c0bef3db8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + アカウントマネージャー アカウントがありません - DAVx⁵ アドレス帳 + Account Manager アドレス帳 アドレス帳 ヘルプ アカウントの管理 @@ -46,7 +46,7 @@ FAQ 寄付 インターネット接続がありません。 Android は同期を実行しません。 - DAVx⁵ にようこそ!\n\nCalDAV/CardDAV アカウントを追加できるようになりました。 + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. システム全体の自動同期が無効です 有効 @@ -118,7 +118,7 @@ URL とクライアント証明書でログイン 証明書を選択 ログイン - アカウントを作成 + アカウントを追加する アカウント名 Android はあなたが作成した予定の ORGANIZER フィールドとしてアカウント名を使用するので、アカウント名としてメールアドレスを使用してください。同じ名前のアカウントを 2 つ持つことはできません。 連絡先グループ方法: @@ -214,7 +214,7 @@ ユーザー名 パスワード - DAVx⁵ アクセス許可 + Account Manager アクセス許可 追加のアクセス許可が必要です 認証に失敗しました (ログイン情報を確認してください) ネットワークまたは I/O エラー – %s @@ -227,6 +227,6 @@ サーバーから無効なタスクを受信しました 1 または複数の無効なリソースを無視します - DAVx⁵: 接続セキュリティ - DAVx⁵は、未知の証明書を検出しました。それを信頼しますか? + Account Manager: 接続セキュリティ + Account Managerは、未知の証明書を検出しました。それを信頼しますか? diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ce2fe91179f23ed6eadbb2cf009af6bb3bb2c80e..a001a54d891427bf798fcf1b37416693b7bd626d 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1,8 +1,8 @@ - DAVx⁵ - DAVx⁵-adressebok + Kontoadministrator + Account Manager-adressebok Adressebøker Hjelp Behandle kontoer @@ -38,7 +38,7 @@ O-S-S Hjelp / Forum Doner - Velkommen til DAVx⁵.\n\nDu kan legge til en CalDAV/CardDAV-konto nå. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Systemomspennende automatisk synkronisering avskrudd Skru på @@ -111,7 +111,7 @@ Brukernavn påkrevd Landings-nettadresse Logg inn - Opprett konto + Legg til konto Kontonavn Bruk din e-postadresse som kontonavn fordi Android vil bruke kontonavnet som ORGANISATOR-felt for hendelser du oppretter. Du kan ikke ha to kontoer med samme navn. Kontaktgruppemetode: @@ -201,7 +201,7 @@ En I/O-feil har inntruffet. Vis detaljer - DAVx⁵-tilganger + Account Manager-tilganger Ytterligere tilganger kreves Nettverk- og I/O-feil - %s HTTP-tjenerfeil - %s @@ -209,6 +209,6 @@ Forsøk igjen Fikk ugyldig kontakt fra server - DAVx⁵: Tilkoblingssikkerhet - DAVx⁵ har støtt på et ukjent sertifikat. Har du tiltro til det? + Account Manager: Tilkoblingssikkerhet + Account Manager har støtt på et ukjent sertifikat. Har du tiltro til det? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2714f02714eb198d69906d1e7c7750488ce3c9cc..b49280bd1047fdebaf856e7b1a5bae7685c53a81 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Account Manager Account bestaat niet (of niet meer) - DAVx⁵ Adresboek + Account Manager Adresboek Adresboeken Dit veld is verplicht Hulp @@ -123,7 +123,7 @@ Privacybeleid Geen internetverbinding. Android synchroniseert niet. Er is te weinig opslagruimte. Android zal niet synchroniseren. - Welkom bij DAVx⁵!\n\nJe kunt nu een CalDAV/CardDAV account toevoegen. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Automatisch synchroniseren is voor alle accounts uitgeschakeld Inschakelen Alle accounts synchroniseren @@ -235,7 +235,7 @@ Login met URL en client certificaat Certificaat selecteren Login - Account aanmaken + Account toevoegen Accountnaam Het gebruik van apostrofs (\') heeft op sommige apparaten problemen veroorzaakt. Gebruik het eigen e-mailadres als accountnaam, want Android gebruikt het als ORGANIZER veld voor gebeurtenissen. Twee accounts met hetzelfde adres kan niet. @@ -399,7 +399,7 @@ WebDAV-bestand uploaden WebDAV-koppeling - DAVx⁵ rechten + Account Manager rechten Aanvullende rechten vereist %ste oud Minimaal vereiste versie: %1$s @@ -414,6 +414,6 @@ Ongeldige taak ontvangen van server Een of meer ongeldige bronnen negeren - DAVx⁵: Beveiliging van de verbinding - DAVx⁵ is een onbekend certificaat tegengekomen. Moet het vertrouwd worden? + Account Manager: Beveiliging van de verbinding + Account Manager is een onbekend certificaat tegengekomen. Moet het vertrouwd worden? diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index de5e86fed9a071fdcedc6c589ad08ce21e0e618d..9e33846d755085d8e8f8a6f11512c3672d32a373 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Menadżer konta Konto (już) nie istnieje - Książka adresowa DAVx⁵ + Książka adresowa Account Manager Książka adresowa To pole jest wymagane Pomoc @@ -123,7 +123,7 @@ Polityka prywatności Brak połączenia z Internetem. Android nie wykona synchronizacji. Za mało miejsca do przechowywania. Android nie uruchomi synchronizacji. - Witamy w DAVx⁵!\n\nMożesz teraz dodać konto CalDAV/CardDAV. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Automatyczna synchronizacja dla całego systemu jest wyłączona Włącz Synchronizuj wszystkie konta @@ -235,7 +235,7 @@ Logowanie za pomocą adresu URL i certyfikatu klienta Wybierz certyfikat Zaloguj - Stwórz konto + Dodaj konto Nazwa konta Zgłoszono, że użycie apostrofów (\') powoduje problemy na niektórych urządzeniach. Użyj swojego adresu e‑mail jako nazwy konta, ponieważ Android będzie używał nazwy konta jako pola ORGANIZATOR dla wydarzeń, które stworzysz. Nie możesz posiadać dwóch kont o takiej samej nazwie. @@ -403,7 +403,7 @@ Wgrywanie pliku WebDAV Punkt linkowania WebDAV - Uprawnienia DAVx⁵ + Uprawnienia Account Manager Wymagane dodatkowe uprawnienia %s zbyt stary/a Minimalna wymagana wersja: %1$s @@ -418,6 +418,6 @@ Otrzymano błędne zadanie z serwera Zignorowano jeden lub więcej nieważnych zasobów - DAVx⁵: Bezpieczeństwo połączenia - DAVx⁵ napotkał nieznany certyfikat. Czy chcesz go dodać? + Account Manager: Bezpieczeństwo połączenia + Account Manager napotkał nieznany certyfikat. Czy chcesz go dodać? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8b66834ebce7b4937898213838734baacfe5e606..38769da6044bbf58872d210421c9038fb674e0a8 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Gerente de contas A conta não existe mais - Livro de endereços DAVx⁵ + Livro de endereços Account Manager Livros de endereços Ajuda Gerenciar contas @@ -97,7 +97,7 @@ Doações Política de privacidade Sem conexão com a Internet. O Android não executará a sincronização. - Bem-vindo ao DAVx⁵!\n\nVocê pode adicionar uma conta CalDAV/CardDAV agora. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. A sincronização automática pelo sistema está desativada Ativar Sincronizar todas as contas @@ -180,7 +180,7 @@ Autenticação com URL e certificado do cliente Selecionar certificado Autenticar - Criar conta + Adicionar Conta Nome da conta Use seu endereço de e-mail como nome da conta porque o Android irá usar esse nome como campo AGENDA nos eventos que você criar. Não é possível ter duas contas com o mesmo nome. Método do grupo Contato: @@ -314,7 +314,7 @@ Nome do usuário Palavra passe - Permissões do DAVx⁵ + Permissões do Account Manager É necessário permissões adicionais Versão mínima exigida: %1$s Falha de autenticação (verifique as credenciais) @@ -328,6 +328,6 @@ Tarefa inválida recebida do servidor Ignorando um ou mais recursos inválidos - DAVx⁵: Segurança da conexão - O DAVx⁵ encontrou um certificado desconhecido. Deseja torná-lo confiável? + Account Manager: Segurança da conexão + O Account Manager encontrou um certificado desconhecido. Deseja torná-lo confiável? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6940f3b017fc61a4adad55cb6903c3cf0de7ed4f..25b4aab88fe37b4b93d10eb7d7ad81f4c784871c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Менеджер по работе с клиентами Аккаунт не существует (больше) - Адресная книга DAVx⁵ + Адресная книга Account Manager Адресные книги Это поле является обязательным Помощь @@ -123,7 +123,7 @@ Политика конфиденциальности Нет подключения к интернету. Android не будет выполнять синхронизацию. Место для хранения мало. Android не будет выполнять синхронизацию. - Добро пожаловать в DAVx⁵!\n\nТеперь вы можете добавить аккаунт CalDAV/CardDAV. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Синхронизация отключена на уровне устройства Включить Синхронизировать все аккаунты @@ -235,7 +235,7 @@ Войти с URL и сертификатом клиента Выберите сертификат Войти - Создать аккаунт + Добавить аккаунт Название аккаунта По имеющимся данным, использование апострофов (\') вызывает проблемы на некоторых устройствах. Укажите ваш адрес email в качестве названия аккаунта, поскольку Android будет его использовать в поле ORGANIZER для создаваемых событий. У вас не может быть двух аккаунтов с тем же именем. @@ -403,7 +403,7 @@ Выгрузка файла WebDAV Точка монтирования WebDAV - Разрешения DAVx⁵ + Разрешения Account Manager Требуются дополнительные разрешения Приложение %s устарело Минимально необходимая версия: %1$s @@ -418,6 +418,6 @@ Получена недействительная задача от сервера Игнорирование одного или нескольких недействительных ресурсов - DAVx⁵: безопасность подключения - DAVx⁵ обнаружил неизвестный сертификат. Вы согласны ему доверять? + Account Manager: безопасность подключения + Account Manager обнаружил неизвестный сертификат. Вы согласны ему доверять? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8ed69f38295ec7dfb4b13d0dfd39aa32927baa42..7bfb89d064a5c17e859e5f24110f03d8019b5265 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 . + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. 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 c027c6583b82d8324d57239379516d0fb92ce8be..b3d61deab3fac4beeb5b1118155190bc8347af04 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. 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-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index b47339b344cea21494c086edf25674cece16b593..3644c9589ad2d44ebe0fe69d2a378d5076a5eeba 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,7 +1,7 @@ - ДАВдроид + Менаџер налога ДАВдроид адресар Адресари Помоћ @@ -37,7 +37,7 @@ Приручник ЧПП Донирај - Добро дошли у ДАВдроид!\n\nМожете сада да додате КалДАВ/КардДАВ налог. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Синхронизација је системски искључена Укључи @@ -100,7 +100,7 @@ Пријавите се УРЛ-ом и сертификатом клијента Изабери сертификат Пријава - Направи налог + Додај налог Назив налога Користите вашу е-адресу за назив налога јер Андроид користи назив налога за поље ОРГАНИЗАТОР за догађаје које направите. Не можете имати два налога истог назива. Режим група контаката: @@ -182,7 +182,7 @@ Корисничко име Лозинка - ДАВдроид дозволе + Account Manager permissions Потребне су додатне доволе Аутентификација није успела (проверите акредитиве за пријаву) Мрежна или У/И грешка – %s diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml index 74277d0a943a79805ac52e06e65a797c2b963a7b..86aa76496a1e0632fafbde82c832d05f5f537580 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. 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 1e038bc4bd3bba3dd6c53f1bc55faa3271ddbb4b..1d07448d74eb6fedefb0dd5e4ee21bb5e4407319 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. 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-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0f0cf8621399d56ac7f59e26595bc458e24d10de..841488fdba324aa0df526e068c83f39823b81f9e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,9 +1,9 @@ - DAVx⁵ + Менеджер рахунків Обліківки не існує (більше) - Адресна книга DAVx⁵ + Адресна книга Account Manager Адресні книги Це поле обовʼязкове Допомога @@ -77,7 +77,7 @@ Підтримка Політика конфіденційності Відсутнє підключення до інтернету. Android не може розпочати синхронізацію. - Вітаємо у DAVx⁵!\n\nТепер можете додавати облікові записи CalDAV/CardDAV. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Автоматичну синхронізацію вимкнено зі сторони системи Увімкнути Синхронізувати всі обліківки @@ -161,7 +161,7 @@ Вхід по посиланню та сертифікату клієнта Обрати сертифікат Увійти - Створити запис + Додати обліковий Назва запису Використовуйте вашу електронну адресу як ім\'я облікового запису, так як Android буде використовувати ім\'я облікового запису в полі ORGANIZER для подій, які ви створюватимете. Ви не можете мати два облікових записи з однаковими іменами. Метод групування контактів: @@ -286,7 +286,7 @@ Ім\'я користувача Пароль - Дозволи DAVx⁵ + Дозволи Account Manager Потребує додаткові дозволи Помилка аутентифікації (перевірте обліковий запис) Помилка мережі та вводу/виводу — %s @@ -299,6 +299,6 @@ Отримано помилкове завдання від сервера Ігнорування одного або більше хибних джерел - DAVx⁵: Безпека з\'єднання - DAVx⁵ зіткнувся з невідомим сертифікатом. Чи довіряти йому? + Account Manager: Безпека з\'єднання + Account Manager зіткнувся з невідомим сертифікатом. Чи довіряти йому? diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index d972f4887e3887f3e49b1a80b42c9d1db6769958..03abb953c17aa5f7cab5565c1aa54679d8948a50 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. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Đồ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 b321324a062f54efef062a40c2060924b84e0f8a..c83c9931503f56cc2fcd6e27a443ccda1e4d183a 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⁵ + 客户经理 賬戶不存在 (anymore) - DAVx⁵ 通訊錄 + Account Manager 通訊錄 通訊錄 幫助 管理帳號 @@ -55,7 +55,7 @@ 贊助我們 隱私權政策 網際網絡沒有連接。Android不會進行同步。 - 歡迎使用 DAVx⁵!\n\n您現在可以新增 CalDAV/CardDAV 帳號 + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. 操作系統的自動同步被關閉了 啟用 @@ -131,7 +131,7 @@ 用網址和客戶端鑒權登入 點選憑證 登入 - 新建帳號 + 新增帐户 帳號名稱 使用 Email 地址當作裝置上的帳號顯示名稱,因為當您在行事曆創建活動時,Android 會把帳號顯示名稱放到「活動發起人」欄位。兩個帳號不能有相同的名稱。 聯絡人群組的儲存格式 @@ -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 5f468229d000e79669b85ba87289e02cb4b1b5f7..4c832dba959e106c01b52a8d5f1d625dff01d842 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 账户。 + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. 系统全局自动同步已禁用 启用 同步所有账户 @@ -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/email_providers_auth_config.xml b/app/src/main/res/values/email_providers_auth_config.xml index 78fff1469345fce50a2f2ca1cd2d804dc93d314d..42852efae422e2a20f598f92fb8b754930eb9ddc 100644 --- a/app/src/main/res/values/email_providers_auth_config.xml +++ b/app/src/main/res/values/email_providers_auth_config.xml @@ -2,7 +2,7 @@ - Google + Google 100496780587-pbiu5eudcjm6cge2phduc6mt8mgbsmsr.apps.googleusercontent.com diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b65c718f8f5accb819e556b89c2bf8e4d366f458..b66a08d572d8fb4b1c2bb2ff35d41123c460aa27 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -143,7 +143,7 @@ Privacy policy No Internet connectivity. Android will not run synchronization. Storage space low. Android will not run synchronization. - Welcome to DAVx⁵!\n\nYou can add a CalDAV/CardDAV account now. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. System-wide automatic synchronization is disabled Enable Sync all accounts @@ -474,7 +474,7 @@ WebDAV mount - DAVx⁵ permissions + Account Manager permissions Additional permissions required %s too old Minimum required version: %1$s @@ -490,7 +490,7 @@ Ignoring one or more invalid resources - DAVx⁵: Connection security - DAVx⁵ has encountered an unknown certificate. Do you want to trust it? + Account Manager: Connection security + Account Manager has encountered an unknown certificate. Do you want to trust it? diff --git a/cert4android b/cert4android index 39e9a827854b3367038877877f7a0c0149b14856..35ebaad610ab387348fb684bea0f765fe9e4ebdb 160000 --- a/cert4android +++ b/cert4android @@ -1 +1 @@ -Subproject commit 39e9a827854b3367038877877f7a0c0149b14856 +Subproject commit 35ebaad610ab387348fb684bea0f765fe9e4ebdb diff --git a/ical4android b/ical4android index ff08ef81abfd60d85f52ffd6c300a0d40ed8e0ce..52caa98bec8fc379edbf2944845321a94fb9a5a5 160000 --- a/ical4android +++ b/ical4android @@ -1 +1 @@ -Subproject commit ff08ef81abfd60d85f52ffd6c300a0d40ed8e0ce +Subproject commit 52caa98bec8fc379edbf2944845321a94fb9a5a5 diff --git a/vcard4android b/vcard4android index 782650a80dc0e614a764f3670dad1e2dae4d8f0c..ab6167b9213c2fe03ca159f6eb6bd1472ede1fab 160000 --- a/vcard4android +++ b/vcard4android @@ -1 +1 @@ -Subproject commit 782650a80dc0e614a764f3670dad1e2dae4d8f0c +Subproject commit ab6167b9213c2fe03ca159f6eb6bd1472ede1fab