From 7acd477bce26d4fa29fe95dc41c13f21c779eb54 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Thu, 7 Jul 2022 14:07:15 +0530 Subject: [PATCH 1/7] Use AuthState instead of accessToken and refreshToken. --- .../java/at/bitfire/davdroid/DavService.kt | 10 +-- .../at/bitfire/davdroid/db/AppDatabase.kt | 6 +- .../at/bitfire/davdroid/db/Credentials.kt | 7 +- .../java/at/bitfire/davdroid/db/Service.kt | 2 +- .../davdroid/settings/AccountSettings.kt | 31 ++++--- .../syncadapter/CalendarSyncManager.kt | 5 +- .../syncadapter/ContactsSyncManager.kt | 6 +- .../davdroid/syncadapter/TasksSyncManager.kt | 2 +- .../ui/setup/AccountDetailsFragment.kt | 8 +- .../davdroid/ui/setup/DavResourceFinder.kt | 6 +- .../setup/DefaultLoginCredentialsFragment.kt | 83 ++++--------------- .../ui/setup/GoogleAuthenticatorFragment.kt | 8 +- cert4android | 2 +- ical4android | 2 +- vcard4android | 2 +- 15 files changed, 70 insertions(+), 110 deletions(-) diff --git a/app/src/main/java/at/bitfire/davdroid/DavService.kt b/app/src/main/java/at/bitfire/davdroid/DavService.kt index fd6c3b68a..c2114e93c 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 683b624b4..1bc95a9c9 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 c3becfeaf..488f503d0 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 a5500ff58..c991e65aa 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 d961278c3..090bc65ec 100644 --- a/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt +++ b/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt @@ -34,6 +34,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 +52,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 +102,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,13 +135,23 @@ 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) 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 b01e83a8a..2d7404fff 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/ContactsSyncManager.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt index 9fead6301..981a9101f 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/TasksSyncManager.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.kt index 7fd4cf34f..a0bbbc8ef 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 a776c8c4a..03bad12b1 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) @@ -167,7 +167,7 @@ class AccountDetailsFragment: Fragment() { 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) @@ -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 9af3d3cc7..342ed7bd2 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 445079025..a8470b8cc 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 7e0f2b42b..f9cefe5f1 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/cert4android b/cert4android index 39e9a8278..35ebaad61 160000 --- a/cert4android +++ b/cert4android @@ -1 +1 @@ -Subproject commit 39e9a827854b3367038877877f7a0c0149b14856 +Subproject commit 35ebaad610ab387348fb684bea0f765fe9e4ebdb diff --git a/ical4android b/ical4android index ff08ef81a..52caa98be 160000 --- a/ical4android +++ b/ical4android @@ -1 +1 @@ -Subproject commit ff08ef81abfd60d85f52ffd6c300a0d40ed8e0ce +Subproject commit 52caa98bec8fc379edbf2944845321a94fb9a5a5 diff --git a/vcard4android b/vcard4android index 782650a80..ab6167b92 160000 --- a/vcard4android +++ b/vcard4android @@ -1 +1 @@ -Subproject commit 782650a80dc0e614a764f3670dad1e2dae4d8f0c +Subproject commit ab6167b9213c2fe03ca159f6eb6bd1472ede1fab -- GitLab From d99cea2b3bad3ab4aebd365a4d21480c4cfe69b8 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Thu, 7 Jul 2022 14:13:14 +0530 Subject: [PATCH 2/7] Implemented OAuth token refresh. --- .../davdroid/settings/AccountSettings.kt | 15 ++- .../CalendarsSyncAdapterService.kt | 51 +++++++--- .../syncadapter/ContactsSyncAdapterService.kt | 46 +++++++-- .../syncadapter/TasksSyncAdapterService.kt | 94 ++++++++++++++----- 4 files changed, 156 insertions(+), 50 deletions(-) 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 090bc65ec..e1e365dd7 100644 --- a/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt +++ b/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt @@ -152,11 +152,18 @@ class AccountSettings( } } - 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) + } } 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 28e759c04..18fd5dbb9 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 454d06535..a0a940398 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/TasksSyncAdapterService.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncAdapterService.kt index 22a0c71f2..122fd5897 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 +} -- GitLab From ea5ea77233dd904682f72e6ad9f34fe8873295f0 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Mon, 11 Jul 2022 10:42:36 +0530 Subject: [PATCH 3/7] Translated modified strings to all languages. --- app/src/main/res/values-ca/strings.xml | 4 ++-- app/src/main/res/values-da/strings.xml | 4 ++-- app/src/main/res/values-de/strings.xml | 4 ++-- app/src/main/res/values-es/strings.xml | 4 ++-- app/src/main/res/values-fr/strings.xml | 4 ++-- app/src/main/res/values-hu/strings.xml | 4 ++-- app/src/main/res/values-it/strings.xml | 4 ++-- app/src/main/res/values-ja/strings.xml | 4 ++-- app/src/main/res/values-nb-rNO/strings.xml | 4 ++-- app/src/main/res/values-nl/strings.xml | 4 ++-- app/src/main/res/values-pl/strings.xml | 4 ++-- app/src/main/res/values-pt/strings.xml | 4 ++-- app/src/main/res/values-ru/strings.xml | 4 ++-- app/src/main/res/values-sr/strings.xml | 4 ++-- app/src/main/res/values-uk/strings.xml | 4 ++-- app/src/main/res/values-zh-rTW/strings.xml | 4 ++-- app/src/main/res/values/email_providers_auth_config.xml | 2 +- 17 files changed, 33 insertions(+), 33 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 32453fd23..ff7d7005b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Správce účtu El compte no existeix (eliminat) Llibreta d’adreces del DAVx⁵ Llibreta d’adreces @@ -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. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 8187429f9..e978fb3f1 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Kundechef Konto findes ikke (længere) DAVx⁵ adressebog Adressebøger @@ -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. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d13ada330..daf7efc7d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Buchhalter Konto nicht (mehr) vorhanden DAVx⁵-Adressbuch Adressbücher @@ -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. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3dc8a1c11..ed4b10869 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Gerente de cuentas La cuenta (ya) no existe Agenda DAVx⁵ Agendas @@ -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. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 596f94040..891df8347 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Gestionnaire de compte Le compte n’existe plus (désormais) Carnet d\'adresses DAVx⁵ Carnets d\'adresses @@ -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. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 378c665c4..e346cfce1 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Fiókkezelő A felhasználói fiók (már) nem létezik DAVx⁵ címjegyzék Címjegyzékek @@ -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. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 67d536005..18061eb17 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Account Manager Account inesistente (o cancellato) Rubrica DAVx⁵ Rubriche @@ -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. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 09c31e81e..95439ebc0 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + アカウントマネージャー アカウントがありません DAVx⁵ アドレス帳 アドレス帳 @@ -118,7 +118,7 @@ URL とクライアント証明書でログイン 証明書を選択 ログイン - アカウントを作成 + アカウントを追加する アカウント名 Android はあなたが作成した予定の ORGANIZER フィールドとしてアカウント名を使用するので、アカウント名としてメールアドレスを使用してください。同じ名前のアカウントを 2 つ持つことはできません。 連絡先グループ方法: diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ce2fe9117..20ee36b12 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Kontoadministrator DAVx⁵-adressebok Adressebøker Hjelp @@ -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: diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2714f0271..e4747b5f5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Account Manager Account bestaat niet (of niet meer) DAVx⁵ Adresboek Adresboeken @@ -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. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index de5e86fed..6d024746f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Menadżer konta Konto (już) nie istnieje Książka adresowa DAVx⁵ Książka adresowa @@ -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. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8b66834eb..fcc0eead6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Gerente de contas A conta não existe mais Livro de endereços DAVx⁵ Livros de endereços @@ -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: diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6940f3b01..710d3109e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Менеджер по работе с клиентами Аккаунт не существует (больше) Адресная книга DAVx⁵ Адресные книги @@ -235,7 +235,7 @@ Войти с URL и сертификатом клиента Выберите сертификат Войти - Создать аккаунт + Добавить аккаунт Название аккаунта По имеющимся данным, использование апострофов (\') вызывает проблемы на некоторых устройствах. Укажите ваш адрес email в качестве названия аккаунта, поскольку Android будет его использовать в поле ORGANIZER для создаваемых событий. У вас не может быть двух аккаунтов с тем же именем. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index b47339b34..d9b60fafd 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,7 +1,7 @@ - ДАВдроид + Менаџер налога ДАВдроид адресар Адресари Помоћ @@ -100,7 +100,7 @@ Пријавите се УРЛ-ом и сертификатом клијента Изабери сертификат Пријава - Направи налог + Додај налог Назив налога Користите вашу е-адресу за назив налога јер Андроид користи назив налога за поље ОРГАНИЗАТОР за догађаје које направите. Не можете имати два налога истог назива. Режим група контаката: diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0f0cf8621..c5ee37433 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + Менеджер рахунків Обліківки не існує (більше) Адресна книга DAVx⁵ Адресні книги @@ -161,7 +161,7 @@ Вхід по посиланню та сертифікату клієнта Обрати сертифікат Увійти - Створити запис + Додати обліковий Назва запису Використовуйте вашу електронну адресу як ім\'я облікового запису, так як Android буде використовувати ім\'я облікового запису в полі ORGANIZER для подій, які ви створюватимете. Ви не можете мати два облікових записи з однаковими іменами. Метод групування контактів: diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b321324a0..327f91348 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - DAVx⁵ + 客户经理 賬戶不存在 (anymore) DAVx⁵ 通訊錄 通訊錄 @@ -131,7 +131,7 @@ 用網址和客戶端鑒權登入 點選憑證 登入 - 新建帳號 + 新增帐户 帳號名稱 使用 Email 地址當作裝置上的帳號顯示名稱,因為當您在行事曆創建活動時,Android 會把帳號顯示名稱放到「活動發起人」欄位。兩個帳號不能有相同的名稱。 聯絡人群組的儲存格式 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 78fff1469..42852efae 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 -- GitLab From 494361d987da7206a8ea43093ba35007e8755e09 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Tue, 12 Jul 2022 11:58:08 +0530 Subject: [PATCH 4/7] Changed string 'DAVdroid' to 'Account Manager' everywhere. --- app/src/main/AndroidManifest.xml | 4 ++-- app/src/main/res/values-ar/strings.xml | 12 ++++++------ app/src/main/res/values-bg/strings.xml | 12 ++++++------ app/src/main/res/values-ca/strings.xml | 10 +++++----- app/src/main/res/values-cs/strings.xml | 16 ++++++++-------- app/src/main/res/values-da/strings.xml | 10 +++++----- app/src/main/res/values-de/strings.xml | 10 +++++----- app/src/main/res/values-el/strings.xml | 12 ++++++------ app/src/main/res/values-es/strings.xml | 10 +++++----- app/src/main/res/values-eu/strings.xml | 12 ++++++------ app/src/main/res/values-fa/strings.xml | 12 ++++++------ app/src/main/res/values-fi/strings.xml | 4 ++-- app/src/main/res/values-fr/strings.xml | 10 +++++----- app/src/main/res/values-gl/strings.xml | 12 ++++++------ app/src/main/res/values-hu/strings.xml | 8 ++++---- app/src/main/res/values-it/strings.xml | 10 +++++----- app/src/main/res/values-ja/strings.xml | 10 +++++----- app/src/main/res/values-nb-rNO/strings.xml | 10 +++++----- app/src/main/res/values-nl/strings.xml | 10 +++++----- app/src/main/res/values-pl/strings.xml | 10 +++++----- app/src/main/res/values-pt/strings.xml | 10 +++++----- app/src/main/res/values-ru/strings.xml | 10 +++++----- app/src/main/res/values-sk/strings.xml | 12 ++++++------ app/src/main/res/values-sl-rSI/strings.xml | 12 ++++++------ app/src/main/res/values-sr/strings.xml | 4 ++-- app/src/main/res/values-szl/strings.xml | 14 +++++++------- app/src/main/res/values-tr/strings.xml | 6 +++--- app/src/main/res/values-uk/strings.xml | 10 +++++----- app/src/main/res/values-vi/strings.xml | 12 ++++++------ app/src/main/res/values-zh-rTW/strings.xml | 10 +++++----- app/src/main/res/values-zh/strings.xml | 12 ++++++------ app/src/main/res/values/strings.xml | 8 ++++---- 32 files changed, 162 insertions(+), 162 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e7a8de14b..34496cb8e 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/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1fc6e0f73..7eaf460db 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 a7fc4c434..a776e5f5a 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 ff7d7005b..870f83686 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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..f27c9555d 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 e978fb3f1..641647c66 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 daf7efc7d..27300cf14 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 050a4d2c2..ced34438c 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 ed4b10869..34b559a5c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 c72ca1efc..af4bd1bc8 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 58d34a526..a1dba41a7 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 0f8ef7011..c9738741b 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 891df8347..f7f825178 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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..8a687ebc6 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 e346cfce1..6329bdb9c 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 18061eb17..506b45bea 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 95439ebc0..ba0aa635d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -3,7 +3,7 @@ アカウントマネージャー アカウントがありません - 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. システム全体の自動同期が無効です 有効 @@ -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 20ee36b12..a001a54d8 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -2,7 +2,7 @@ Kontoadministrator - DAVx⁵-adressebok + 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å @@ -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 e4747b5f5..b49280bd1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 6d024746f..9e33846d7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 fcc0eead6..38769da60 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -3,7 +3,7 @@ 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 @@ -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 710d3109e..25b4aab88 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -3,7 +3,7 @@ Менеджер по работе с клиентами Аккаунт не существует (больше) - Адресная книга 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. Синхронизация отключена на уровне устройства Включить Синхронизировать все аккаунты @@ -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 8ed69f382..7bfb89d06 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 c027c6583..b3d61deab 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 d9b60fafd..3644c9589 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -37,7 +37,7 @@ Приручник ЧПП Донирај - Добро дошли у ДАВдроид!\n\nМожете сада да додате КалДАВ/КардДАВ налог. + Welcome to Account Manager!\n\nYou can add a CalDAV/CardDAV account now. Синхронизација је системски искључена Укључи @@ -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 74277d0a9..86aa76496 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 1e038bc4b..1d07448d7 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 c5ee37433..841488fdb 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -3,7 +3,7 @@ Менеджер рахунків Обліківки не існує (більше) - Адресна книга 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. Автоматичну синхронізацію вимкнено зі сторони системи Увімкнути Синхронізувати всі обліківки @@ -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 d972f4887..03abb953c 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 327f91348..c83c99315 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -3,7 +3,7 @@ 客户经理 賬戶不存在 (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. 操作系統的自動同步被關閉了 啟用 @@ -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..4c832dba9 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/strings.xml b/app/src/main/res/values/strings.xml index b65c718f8..b66a08d57 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? -- GitLab From a015522718b853c681cbd2f803f6e40225d2bef8 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Tue, 12 Jul 2022 12:28:25 +0530 Subject: [PATCH 5/7] Change default sync frequency of contacts and calendar. --- app/src/main/java/at/bitfire/davdroid/Constants.kt | 4 ++++ .../java/at/bitfire/davdroid/settings/AccountSettings.kt | 3 ++- .../main/java/at/bitfire/davdroid/syncadapter/SyncUtils.kt | 4 ++++ .../at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt | 6 +++--- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/at/bitfire/davdroid/Constants.kt b/app/src/main/java/at/bitfire/davdroid/Constants.kt index 8e6c59bc9..ac5022554 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/settings/AccountSettings.kt b/app/src/main/java/at/bitfire/davdroid/settings/AccountSettings.kt index e1e365dd7..bb37a1835 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 @@ -448,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/SyncUtils.kt b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncUtils.kt index a808dd905..1254a268f 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/ui/setup/AccountDetailsFragment.kt b/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt index 03bad12b1..e462453cb 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 @@ -161,7 +161,7 @@ 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) @@ -174,13 +174,13 @@ class AccountDetailsFragment: Fragment() { 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) -- GitLab From 39b98f541061368ff0232e5bf18637fbfd35f208 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Tue, 12 Jul 2022 13:40:22 +0530 Subject: [PATCH 6/7] add .gitlab-ci.yml --- .gitlab-ci.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..89084ea0c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,23 @@ +image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:legacy" + +stages: + - build + +before_script: + - git submodule update --init --recursive + - echo email.key $PEPPER >> local.properties + - export GRADLE_USER_HOME=$(pwd)/.gradle + - chmod +x ./gradlew + +cache: + key: ${CI_PROJECT_ID} + paths: + - .gradle/ + +build: + stage: build + script: + - ./gradlew assembleDebug + artifacts: + paths: + - app/build/outputs/apk/standard/debug/app-standard-debug.apk -- GitLab From f77bd602d1db8bc130a476b46f745f8198c71ac3 Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Wed, 13 Jul 2022 08:48:29 +0530 Subject: [PATCH 7/7] remove .gitlab-ci.yml, will be manage in next MR --- .gitlab-ci.yml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 89084ea0c..000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,23 +0,0 @@ -image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:legacy" - -stages: - - build - -before_script: - - git submodule update --init --recursive - - echo email.key $PEPPER >> local.properties - - export GRADLE_USER_HOME=$(pwd)/.gradle - - chmod +x ./gradlew - -cache: - key: ${CI_PROJECT_ID} - paths: - - .gradle/ - -build: - stage: build - script: - - ./gradlew assembleDebug - artifacts: - paths: - - app/build/outputs/apk/standard/debug/app-standard-debug.apk -- GitLab