Loading app/src/main/AndroidManifest.xml +86 −0 Original line number Diff line number Diff line Loading @@ -254,6 +254,49 @@ android:resource="@xml/eelo_sync_tasks" /> </service> <!-- account type "eelo Address book" --> <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" 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_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> <!-- account type "Google" --> <service android:name=".syncadapter.GoogleAccountAuthenticatorService" Loading Loading @@ -293,6 +336,49 @@ android:resource="@xml/google_sync_tasks" /> </service> <!-- account type "Google Address book" --> <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" 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_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> <!-- Callback from authentication screen --> <activity android:name="net.openid.appauth.RedirectUriReceiverActivity"> Loading app/src/main/java/at/bitfire/davdroid/model/ServiceDB.kt +2 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ class ServiceDB { const val ACCOUNT_NAME = "accountName" const val AUTH_STATE = "authState" const val ACCOUNT_TYPE = "accountType" const val ADDRESS_BOOK_ACCOUNT_TYPE = "addressBookAccountType" const val SERVICE = "service" const val PRINCIPAL = "principal" Loading Loading @@ -93,6 +94,7 @@ class ServiceDB { "${Services.ACCOUNT_NAME} TEXT NOT NULL," + "${Services.AUTH_STATE} TEXT," + "${Services.ACCOUNT_TYPE} TEXT," + "${Services.ADDRESS_BOOK_ACCOUNT_TYPE} TEXT," + "${Services.SERVICE} TEXT NOT NULL," + "${Services.PRINCIPAL} TEXT NULL)") db.execSQL("CREATE UNIQUE INDEX services_account ON ${Services._TABLE} (${Services.ACCOUNT_NAME},${Services.SERVICE})") Loading app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.kt +26 −5 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import at.bitfire.davdroid.DavUtils import at.bitfire.davdroid.R import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.model.CollectionInfo import at.bitfire.davdroid.model.ServiceDB import at.bitfire.davdroid.model.SyncState import at.bitfire.vcard4android.* import java.io.ByteArrayOutputStream Loading Loading @@ -50,8 +51,19 @@ class LocalAddressBook( fun create(context: Context, provider: ContentProviderClient, mainAccount: Account, info: CollectionInfo): LocalAddressBook { val accountManager = AccountManager.get(context) var account = Account(accountName(mainAccount, info), context.getString(R.string.account_type_address_book)) ServiceDB.OpenHelper(context).use { dbHelper -> val db = dbHelper.readableDatabase db.query(ServiceDB.Services._TABLE, arrayOf(ServiceDB.Services.ADDRESS_BOOK_ACCOUNT_TYPE), "${ServiceDB.Services.ACCOUNT_NAME}=?", arrayOf(mainAccount.name), null, null, null)?.use { cursor -> if (cursor.moveToNext()) { account = Account(accountName(mainAccount, info), cursor.getString(0)) } } } val account = Account(accountName(mainAccount, info), context.getString(R.string.account_type_address_book)) if (!accountManager.addAccountExplicitly(account, null, initialUserData(mainAccount, info.url))) throw IllegalStateException("Couldn't create address book account") Loading @@ -67,11 +79,17 @@ class LocalAddressBook( return addressBook } fun findAll(context: Context, provider: ContentProviderClient, mainAccount: Account?) = AccountManager.get(context) .getAccountsByType(context.getString(R.string.account_type_address_book)) .map { LocalAddressBook(context, it, provider) } fun findAll(context: Context, provider: ContentProviderClient, mainAccount: Account?): List<LocalAddressBook> { val accountManager = AccountManager.get(context) val accounts = ArrayList<Account>() accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { accounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { accounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { accounts.add(it) } return accounts.toTypedArray().map { LocalAddressBook(context, it, provider) } .filter { mainAccount == null || it.mainAccount == mainAccount } .toList() } fun accountName(mainAccount: Account, info: CollectionInfo): String { val baos = ByteArrayOutputStream() Loading @@ -92,7 +110,10 @@ class LocalAddressBook( } fun mainAccount(context: Context, account: Account): Account = if (account.type == context.getString(R.string.account_type_address_book)) { if (account.type == context.getString(R.string.account_type_address_book) || account.type == context.getString(R.string.account_type_eelo_address_book) || account.type == context.getString(R.string.account_type_google_address_book) ) { val manager = AccountManager.get(context) Account( manager.getUserData(account, USER_DATA_MAIN_ACCOUNT_NAME), Loading app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.kt +5 −2 Original line number Diff line number Diff line Loading @@ -51,8 +51,11 @@ class AccountAuthenticatorService : Service(), OnAccountsUpdateListener { } // delete orphaned address book accounts accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) .map { LocalAddressBook(context, it, null) } val addressBookAccounts = ArrayList<Account>() accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { addressBookAccounts.add(it) } addressBookAccounts.map { LocalAddressBook(context, it, null) } .forEach { try { if (!accountNames.contains(it.mainAccount.name)) Loading app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt +5 −2 Original line number Diff line number Diff line Loading @@ -51,8 +51,11 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { } // delete orphaned address book accounts accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) .map { LocalAddressBook(context, it, null) } val addressBookAccounts = ArrayList<Account>() accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { addressBookAccounts.add(it) } addressBookAccounts.map { LocalAddressBook(context, it, null) } .forEach { try { if (!accountNames.contains(it.mainAccount.name)) Loading Loading
app/src/main/AndroidManifest.xml +86 −0 Original line number Diff line number Diff line Loading @@ -254,6 +254,49 @@ android:resource="@xml/eelo_sync_tasks" /> </service> <!-- account type "eelo Address book" --> <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" 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_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> <!-- account type "Google" --> <service android:name=".syncadapter.GoogleAccountAuthenticatorService" Loading Loading @@ -293,6 +336,49 @@ android:resource="@xml/google_sync_tasks" /> </service> <!-- account type "Google Address book" --> <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" 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_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> <!-- Callback from authentication screen --> <activity android:name="net.openid.appauth.RedirectUriReceiverActivity"> Loading
app/src/main/java/at/bitfire/davdroid/model/ServiceDB.kt +2 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ class ServiceDB { const val ACCOUNT_NAME = "accountName" const val AUTH_STATE = "authState" const val ACCOUNT_TYPE = "accountType" const val ADDRESS_BOOK_ACCOUNT_TYPE = "addressBookAccountType" const val SERVICE = "service" const val PRINCIPAL = "principal" Loading Loading @@ -93,6 +94,7 @@ class ServiceDB { "${Services.ACCOUNT_NAME} TEXT NOT NULL," + "${Services.AUTH_STATE} TEXT," + "${Services.ACCOUNT_TYPE} TEXT," + "${Services.ADDRESS_BOOK_ACCOUNT_TYPE} TEXT," + "${Services.SERVICE} TEXT NOT NULL," + "${Services.PRINCIPAL} TEXT NULL)") db.execSQL("CREATE UNIQUE INDEX services_account ON ${Services._TABLE} (${Services.ACCOUNT_NAME},${Services.SERVICE})") Loading
app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.kt +26 −5 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import at.bitfire.davdroid.DavUtils import at.bitfire.davdroid.R import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.model.CollectionInfo import at.bitfire.davdroid.model.ServiceDB import at.bitfire.davdroid.model.SyncState import at.bitfire.vcard4android.* import java.io.ByteArrayOutputStream Loading Loading @@ -50,8 +51,19 @@ class LocalAddressBook( fun create(context: Context, provider: ContentProviderClient, mainAccount: Account, info: CollectionInfo): LocalAddressBook { val accountManager = AccountManager.get(context) var account = Account(accountName(mainAccount, info), context.getString(R.string.account_type_address_book)) ServiceDB.OpenHelper(context).use { dbHelper -> val db = dbHelper.readableDatabase db.query(ServiceDB.Services._TABLE, arrayOf(ServiceDB.Services.ADDRESS_BOOK_ACCOUNT_TYPE), "${ServiceDB.Services.ACCOUNT_NAME}=?", arrayOf(mainAccount.name), null, null, null)?.use { cursor -> if (cursor.moveToNext()) { account = Account(accountName(mainAccount, info), cursor.getString(0)) } } } val account = Account(accountName(mainAccount, info), context.getString(R.string.account_type_address_book)) if (!accountManager.addAccountExplicitly(account, null, initialUserData(mainAccount, info.url))) throw IllegalStateException("Couldn't create address book account") Loading @@ -67,11 +79,17 @@ class LocalAddressBook( return addressBook } fun findAll(context: Context, provider: ContentProviderClient, mainAccount: Account?) = AccountManager.get(context) .getAccountsByType(context.getString(R.string.account_type_address_book)) .map { LocalAddressBook(context, it, provider) } fun findAll(context: Context, provider: ContentProviderClient, mainAccount: Account?): List<LocalAddressBook> { val accountManager = AccountManager.get(context) val accounts = ArrayList<Account>() accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { accounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { accounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { accounts.add(it) } return accounts.toTypedArray().map { LocalAddressBook(context, it, provider) } .filter { mainAccount == null || it.mainAccount == mainAccount } .toList() } fun accountName(mainAccount: Account, info: CollectionInfo): String { val baos = ByteArrayOutputStream() Loading @@ -92,7 +110,10 @@ class LocalAddressBook( } fun mainAccount(context: Context, account: Account): Account = if (account.type == context.getString(R.string.account_type_address_book)) { if (account.type == context.getString(R.string.account_type_address_book) || account.type == context.getString(R.string.account_type_eelo_address_book) || account.type == context.getString(R.string.account_type_google_address_book) ) { val manager = AccountManager.get(context) Account( manager.getUserData(account, USER_DATA_MAIN_ACCOUNT_NAME), Loading
app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.kt +5 −2 Original line number Diff line number Diff line Loading @@ -51,8 +51,11 @@ class AccountAuthenticatorService : Service(), OnAccountsUpdateListener { } // delete orphaned address book accounts accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) .map { LocalAddressBook(context, it, null) } val addressBookAccounts = ArrayList<Account>() accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { addressBookAccounts.add(it) } addressBookAccounts.map { LocalAddressBook(context, it, null) } .forEach { try { if (!accountNames.contains(it.mainAccount.name)) Loading
app/src/main/java/at/bitfire/davdroid/syncadapter/EeloAccountAuthenticatorService.kt +5 −2 Original line number Diff line number Diff line Loading @@ -51,8 +51,11 @@ class EeloAccountAuthenticatorService : Service(), OnAccountsUpdateListener { } // delete orphaned address book accounts accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)) .map { LocalAddressBook(context, it, null) } val addressBookAccounts = ArrayList<Account>() accountManager.getAccountsByType(context.getString(R.string.account_type_eelo_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_google_address_book)).forEach { addressBookAccounts.add(it) } accountManager.getAccountsByType(context.getString(R.string.account_type_address_book)).forEach { addressBookAccounts.add(it) } addressBookAccounts.map { LocalAddressBook(context, it, null) } .forEach { try { if (!accountNames.contains(it.mainAccount.name)) Loading