Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2e4798e authored by Nihar Thakkar's avatar Nihar Thakkar
Browse files

Show eelo and Google contacts accounts in their own custom account types

parent 65bfa19f
Loading
Loading
Loading
Loading
Loading
+86 −0
Original line number Diff line number Diff line
@@ -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"
@@ -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">

+2 −0
Original line number Diff line number Diff line
@@ -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"

@@ -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})")
+26 −5
Original line number Diff line number Diff line
@@ -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
@@ -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")

@@ -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()
@@ -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),
+5 −2
Original line number Diff line number Diff line
@@ -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))
+5 −2
Original line number Diff line number Diff line
@@ -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