Loading app/src/main/AndroidManifest.xml +56 −0 Original line number Diff line number Diff line Loading @@ -253,6 +253,18 @@ android:name="android.content.SyncAdapter" android:resource="@xml/google_sync_tasks" /> </service> <service android:name=".syncadapter.GoogleNullAuthenticatorService" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/account_authenticator_google_address_book" /> </service> <service android:name=".syncadapter.GoogleAddressBooksSyncAdapterService" android:exported="true" Loading @@ -266,6 +278,22 @@ android:name="android.content.SyncAdapter" android:resource="@xml/google_sync_address_books" /> </service> <service android:name=".syncadapter.GoogleContactsSyncAdapterService" android:exported="true" android:process=":sync" tools:ignore="ExportedService"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/google_sync_contacts" /> <meta-data android:name="android.provider.CONTACTS_STRUCTURE" android:resource="@xml/contacts" /> </service> <!-- account type "eelo" --> <service Loading Loading @@ -305,6 +333,18 @@ android:name="android.content.SyncAdapter" android:resource="@xml/eelo_sync_tasks" /> </service> <service android:name=".syncadapter.EeloNullAuthenticatorService" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/account_authenticator_eelo_address_book" /> </service> <service android:name=".syncadapter.EeloAddressBooksSyncAdapterService" android:exported="true" Loading @@ -318,6 +358,22 @@ android:name="android.content.SyncAdapter" android:resource="@xml/eelo_sync_address_books" /> </service> <service android:name=".syncadapter.EeloContactsSyncAdapterService" android:exported="true" android:process=":sync" tools:ignore="ExportedService"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/eelo_sync_contacts" /> <meta-data android:name="android.provider.CONTACTS_STRUCTURE" android:resource="@xml/contacts" /> </service> <!-- Callback from authentication screen --> <activity android:name="net.openid.appauth.RedirectUriReceiverActivity"> Loading app/src/main/java/at/bitfire/davdroid/syncadapter/EeloContactsSyncAdapterService.kt 0 → 100644 +104 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.Account import android.content.ContentProviderClient import android.content.ContentResolver import android.content.Context import android.content.SyncResult import android.os.AsyncTask import android.os.Bundle import android.provider.ContactsContract import at.bitfire.davdroid.AccountSettings import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.model.Credentials import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.ISettings import net.openid.appauth.AuthorizationService import java.util.logging.Level class EeloContactsSyncAdapterService: SyncAdapterService() { companion object { const val PREVIOUS_GROUP_METHOD = "previous_group_method" } override fun syncAdapter() = ContactsSyncAdapter(this) class ContactsSyncAdapter( context: Context ): SyncAdapter(context) { override fun sync(settings: ISettings, account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { val addressBook = LocalAddressBook(context, account, provider) val accountSettings = AccountSettings(context, settings, addressBook.mainAccount) // handle group method change val groupMethod = accountSettings.getGroupMethod().name accountSettings.accountManager.getUserData(account, PREVIOUS_GROUP_METHOD)?.let { previousGroupMethod -> if (previousGroupMethod != groupMethod) { Logger.log.info("Group method changed, deleting all local contacts/groups") // delete all local contacts and groups so that they will be downloaded again provider.delete(addressBook.syncAdapterURI(ContactsContract.RawContacts.CONTENT_URI), null, null) provider.delete(addressBook.syncAdapterURI(ContactsContract.Groups.CONTENT_URI), null, null) // reset sync state addressBook.syncState = null } } accountSettings.accountManager.setUserData(account, PREVIOUS_GROUP_METHOD, groupMethod) if (!extras.containsKey(ContentResolver.SYNC_EXTRAS_MANUAL) && !checkSyncConditions(accountSettings)) return Logger.log.info("Synchronizing address book: ${addressBook.url}") Logger.log.info("Taking settings from: ${addressBook.mainAccount}") ContactsSyncManager(context, settings, 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<Void, Void, Void>() { 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) } Logger.log.info("Contacts sync complete") } } } app/src/main/java/at/bitfire/davdroid/syncadapter/EeloNullAuthenticatorService.kt 0 → 100644 +55 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.AbstractAccountAuthenticator import android.accounts.Account import android.accounts.AccountAuthenticatorResponse import android.accounts.AccountManager import android.app.Service import android.content.Context import android.content.Intent import android.os.Bundle import at.bitfire.davdroid.ui.AccountsActivity import at.bitfire.davdroid.ui.setup.LoginActivity class EeloNullAuthenticatorService: Service() { private lateinit var accountAuthenticator: AccountAuthenticator override fun onCreate() { accountAuthenticator = AccountAuthenticator(this) } override fun onBind(intent: Intent?) = accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } private class AccountAuthenticator( val context: Context ): AbstractAccountAuthenticator(context) { override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array<String>?, options: Bundle?): Bundle { val intent = Intent(context, LoginActivity::class.java) intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response) intent.putExtra(LoginActivity.SETUP_ACCOUNT_PROVIDER_TYPE, LoginActivity.ACCOUNT_PROVIDER_EELO) val bundle = Bundle(1) bundle.putParcelable(AccountManager.KEY_INTENT, intent) return bundle } override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null override fun getAuthTokenLabel(p0: String?) = null override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array<out String>?) = null } } No newline at end of file app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleContactsSyncAdapterService.kt 0 → 100644 +104 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.Account import android.content.ContentProviderClient import android.content.ContentResolver import android.content.Context import android.content.SyncResult import android.os.AsyncTask import android.os.Bundle import android.provider.ContactsContract import at.bitfire.davdroid.AccountSettings import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.model.Credentials import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.ISettings import net.openid.appauth.AuthorizationService import java.util.logging.Level class GoogleContactsSyncAdapterService: SyncAdapterService() { companion object { const val PREVIOUS_GROUP_METHOD = "previous_group_method" } override fun syncAdapter() = ContactsSyncAdapter(this) class ContactsSyncAdapter( context: Context ): SyncAdapter(context) { override fun sync(settings: ISettings, account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { val addressBook = LocalAddressBook(context, account, provider) val accountSettings = AccountSettings(context, settings, addressBook.mainAccount) // handle group method change val groupMethod = accountSettings.getGroupMethod().name accountSettings.accountManager.getUserData(account, PREVIOUS_GROUP_METHOD)?.let { previousGroupMethod -> if (previousGroupMethod != groupMethod) { Logger.log.info("Group method changed, deleting all local contacts/groups") // delete all local contacts and groups so that they will be downloaded again provider.delete(addressBook.syncAdapterURI(ContactsContract.RawContacts.CONTENT_URI), null, null) provider.delete(addressBook.syncAdapterURI(ContactsContract.Groups.CONTENT_URI), null, null) // reset sync state addressBook.syncState = null } } accountSettings.accountManager.setUserData(account, PREVIOUS_GROUP_METHOD, groupMethod) if (!extras.containsKey(ContentResolver.SYNC_EXTRAS_MANUAL) && !checkSyncConditions(accountSettings)) return Logger.log.info("Synchronizing address book: ${addressBook.url}") Logger.log.info("Taking settings from: ${addressBook.mainAccount}") ContactsSyncManager(context, settings, 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<Void, Void, Void>() { 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) } Logger.log.info("Contacts sync complete") } } } app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleNullAuthenticatorService.kt 0 → 100644 +55 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.AbstractAccountAuthenticator import android.accounts.Account import android.accounts.AccountAuthenticatorResponse import android.accounts.AccountManager import android.app.Service import android.content.Context import android.content.Intent import android.os.Bundle import at.bitfire.davdroid.ui.AccountsActivity import at.bitfire.davdroid.ui.setup.LoginActivity class GoogleNullAuthenticatorService: Service() { private lateinit var accountAuthenticator: AccountAuthenticator override fun onCreate() { accountAuthenticator = AccountAuthenticator(this) } override fun onBind(intent: Intent?) = accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } private class AccountAuthenticator( val context: Context ): AbstractAccountAuthenticator(context) { override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array<String>?, options: Bundle?): Bundle { val intent = Intent(context, LoginActivity::class.java) intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response) intent.putExtra(LoginActivity.SETUP_ACCOUNT_PROVIDER_TYPE, LoginActivity.ACCOUNT_PROVIDER_GOOGLE) val bundle = Bundle(1) bundle.putParcelable(AccountManager.KEY_INTENT, intent) return bundle } override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null override fun getAuthTokenLabel(p0: String?) = null override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array<out String>?) = null } } No newline at end of file Loading
app/src/main/AndroidManifest.xml +56 −0 Original line number Diff line number Diff line Loading @@ -253,6 +253,18 @@ android:name="android.content.SyncAdapter" android:resource="@xml/google_sync_tasks" /> </service> <service android:name=".syncadapter.GoogleNullAuthenticatorService" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/account_authenticator_google_address_book" /> </service> <service android:name=".syncadapter.GoogleAddressBooksSyncAdapterService" android:exported="true" Loading @@ -266,6 +278,22 @@ android:name="android.content.SyncAdapter" android:resource="@xml/google_sync_address_books" /> </service> <service android:name=".syncadapter.GoogleContactsSyncAdapterService" android:exported="true" android:process=":sync" tools:ignore="ExportedService"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/google_sync_contacts" /> <meta-data android:name="android.provider.CONTACTS_STRUCTURE" android:resource="@xml/contacts" /> </service> <!-- account type "eelo" --> <service Loading Loading @@ -305,6 +333,18 @@ android:name="android.content.SyncAdapter" android:resource="@xml/eelo_sync_tasks" /> </service> <service android:name=".syncadapter.EeloNullAuthenticatorService" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/account_authenticator_eelo_address_book" /> </service> <service android:name=".syncadapter.EeloAddressBooksSyncAdapterService" android:exported="true" Loading @@ -318,6 +358,22 @@ android:name="android.content.SyncAdapter" android:resource="@xml/eelo_sync_address_books" /> </service> <service android:name=".syncadapter.EeloContactsSyncAdapterService" android:exported="true" android:process=":sync" tools:ignore="ExportedService"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/eelo_sync_contacts" /> <meta-data android:name="android.provider.CONTACTS_STRUCTURE" android:resource="@xml/contacts" /> </service> <!-- Callback from authentication screen --> <activity android:name="net.openid.appauth.RedirectUriReceiverActivity"> Loading
app/src/main/java/at/bitfire/davdroid/syncadapter/EeloContactsSyncAdapterService.kt 0 → 100644 +104 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.Account import android.content.ContentProviderClient import android.content.ContentResolver import android.content.Context import android.content.SyncResult import android.os.AsyncTask import android.os.Bundle import android.provider.ContactsContract import at.bitfire.davdroid.AccountSettings import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.model.Credentials import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.ISettings import net.openid.appauth.AuthorizationService import java.util.logging.Level class EeloContactsSyncAdapterService: SyncAdapterService() { companion object { const val PREVIOUS_GROUP_METHOD = "previous_group_method" } override fun syncAdapter() = ContactsSyncAdapter(this) class ContactsSyncAdapter( context: Context ): SyncAdapter(context) { override fun sync(settings: ISettings, account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { val addressBook = LocalAddressBook(context, account, provider) val accountSettings = AccountSettings(context, settings, addressBook.mainAccount) // handle group method change val groupMethod = accountSettings.getGroupMethod().name accountSettings.accountManager.getUserData(account, PREVIOUS_GROUP_METHOD)?.let { previousGroupMethod -> if (previousGroupMethod != groupMethod) { Logger.log.info("Group method changed, deleting all local contacts/groups") // delete all local contacts and groups so that they will be downloaded again provider.delete(addressBook.syncAdapterURI(ContactsContract.RawContacts.CONTENT_URI), null, null) provider.delete(addressBook.syncAdapterURI(ContactsContract.Groups.CONTENT_URI), null, null) // reset sync state addressBook.syncState = null } } accountSettings.accountManager.setUserData(account, PREVIOUS_GROUP_METHOD, groupMethod) if (!extras.containsKey(ContentResolver.SYNC_EXTRAS_MANUAL) && !checkSyncConditions(accountSettings)) return Logger.log.info("Synchronizing address book: ${addressBook.url}") Logger.log.info("Taking settings from: ${addressBook.mainAccount}") ContactsSyncManager(context, settings, 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<Void, Void, Void>() { 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) } Logger.log.info("Contacts sync complete") } } }
app/src/main/java/at/bitfire/davdroid/syncadapter/EeloNullAuthenticatorService.kt 0 → 100644 +55 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.AbstractAccountAuthenticator import android.accounts.Account import android.accounts.AccountAuthenticatorResponse import android.accounts.AccountManager import android.app.Service import android.content.Context import android.content.Intent import android.os.Bundle import at.bitfire.davdroid.ui.AccountsActivity import at.bitfire.davdroid.ui.setup.LoginActivity class EeloNullAuthenticatorService: Service() { private lateinit var accountAuthenticator: AccountAuthenticator override fun onCreate() { accountAuthenticator = AccountAuthenticator(this) } override fun onBind(intent: Intent?) = accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } private class AccountAuthenticator( val context: Context ): AbstractAccountAuthenticator(context) { override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array<String>?, options: Bundle?): Bundle { val intent = Intent(context, LoginActivity::class.java) intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response) intent.putExtra(LoginActivity.SETUP_ACCOUNT_PROVIDER_TYPE, LoginActivity.ACCOUNT_PROVIDER_EELO) val bundle = Bundle(1) bundle.putParcelable(AccountManager.KEY_INTENT, intent) return bundle } override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null override fun getAuthTokenLabel(p0: String?) = null override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array<out String>?) = null } } No newline at end of file
app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleContactsSyncAdapterService.kt 0 → 100644 +104 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.Account import android.content.ContentProviderClient import android.content.ContentResolver import android.content.Context import android.content.SyncResult import android.os.AsyncTask import android.os.Bundle import android.provider.ContactsContract import at.bitfire.davdroid.AccountSettings import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.model.Credentials import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.ISettings import net.openid.appauth.AuthorizationService import java.util.logging.Level class GoogleContactsSyncAdapterService: SyncAdapterService() { companion object { const val PREVIOUS_GROUP_METHOD = "previous_group_method" } override fun syncAdapter() = ContactsSyncAdapter(this) class ContactsSyncAdapter( context: Context ): SyncAdapter(context) { override fun sync(settings: ISettings, account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) { try { val addressBook = LocalAddressBook(context, account, provider) val accountSettings = AccountSettings(context, settings, addressBook.mainAccount) // handle group method change val groupMethod = accountSettings.getGroupMethod().name accountSettings.accountManager.getUserData(account, PREVIOUS_GROUP_METHOD)?.let { previousGroupMethod -> if (previousGroupMethod != groupMethod) { Logger.log.info("Group method changed, deleting all local contacts/groups") // delete all local contacts and groups so that they will be downloaded again provider.delete(addressBook.syncAdapterURI(ContactsContract.RawContacts.CONTENT_URI), null, null) provider.delete(addressBook.syncAdapterURI(ContactsContract.Groups.CONTENT_URI), null, null) // reset sync state addressBook.syncState = null } } accountSettings.accountManager.setUserData(account, PREVIOUS_GROUP_METHOD, groupMethod) if (!extras.containsKey(ContentResolver.SYNC_EXTRAS_MANUAL) && !checkSyncConditions(accountSettings)) return Logger.log.info("Synchronizing address book: ${addressBook.url}") Logger.log.info("Taking settings from: ${addressBook.mainAccount}") ContactsSyncManager(context, settings, 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<Void, Void, Void>() { 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) } Logger.log.info("Contacts sync complete") } } }
app/src/main/java/at/bitfire/davdroid/syncadapter/GoogleNullAuthenticatorService.kt 0 → 100644 +55 −0 Original line number Diff line number Diff line /* * Copyright © Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter import android.accounts.AbstractAccountAuthenticator import android.accounts.Account import android.accounts.AccountAuthenticatorResponse import android.accounts.AccountManager import android.app.Service import android.content.Context import android.content.Intent import android.os.Bundle import at.bitfire.davdroid.ui.AccountsActivity import at.bitfire.davdroid.ui.setup.LoginActivity class GoogleNullAuthenticatorService: Service() { private lateinit var accountAuthenticator: AccountAuthenticator override fun onCreate() { accountAuthenticator = AccountAuthenticator(this) } override fun onBind(intent: Intent?) = accountAuthenticator.iBinder.takeIf { intent?.action == android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT } private class AccountAuthenticator( val context: Context ): AbstractAccountAuthenticator(context) { override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array<String>?, options: Bundle?): Bundle { val intent = Intent(context, LoginActivity::class.java) intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response) intent.putExtra(LoginActivity.SETUP_ACCOUNT_PROVIDER_TYPE, LoginActivity.ACCOUNT_PROVIDER_GOOGLE) val bundle = Bundle(1) bundle.putParcelable(AccountManager.KEY_INTENT, intent) return bundle } override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?) = null override fun getAuthTokenLabel(p0: String?) = null override fun confirmCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Bundle?) = null override fun updateCredentials(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun getAuthToken(p0: AccountAuthenticatorResponse?, p1: Account?, p2: String?, p3: Bundle?) = null override fun hasFeatures(p0: AccountAuthenticatorResponse?, p1: Account?, p2: Array<out String>?) = null } } No newline at end of file