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

Commit 69b4a886 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

"Invite" part 2

- ContactLoader now loads invitable account types, which are account types
  that supports the invite feature and don't contribute to the loaded
  contact.
- Add AccountType.DisplayLabelComparator

Bug 5061956

Change-Id: Icadffac9e5e3b739e70f59d709cfdd67909c9a41
parent 36b27c62
Loading
Loading
Loading
Loading
+40 −6
Original line number Diff line number Diff line
@@ -16,9 +16,12 @@

package com.android.contacts;

import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.util.DataStatus;
import com.android.contacts.util.StreamItemEntry;
import com.android.contacts.util.StreamItemPhotoEntry;
import com.google.android.collect.Lists;
import com.google.common.annotations.VisibleForTesting;

import android.content.ContentResolver;
@@ -44,23 +47,20 @@ import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.DisplayNameSources;
import android.provider.ContactsContract.Groups;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.StreamItems;
import android.provider.ContactsContract.StreamItemPhotos;
import android.provider.ContactsContract.StreamItems;
import android.text.TextUtils;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Loads a single Contact and all it constituent RawContacts.
@@ -71,6 +71,7 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
    private Uri mLookupUri;
    private boolean mLoadGroupMetaData;
    private boolean mLoadStreamItems;
    private final boolean mLoadInvitableAccountTypes;
    private Result mContact;
    private ForceLoadContentObserver mObserver;
    private boolean mDestroyed;
@@ -113,6 +114,7 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
        private final ArrayList<Entity> mEntities;
        private ArrayList<StreamItemEntry> mStreamItems;
        private final HashMap<Long, DataStatus> mStatuses;
        private final ArrayList<String> mInvitableAccountTypes;

        private String mDirectoryDisplayName;
        private String mDirectoryType;
@@ -147,6 +149,7 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
            mPhoneticName = null;
            mStarred = false;
            mPresence = null;
            mInvitableAccountTypes = null;
        }

        /**
@@ -173,6 +176,7 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
            mPhoneticName = phoneticName;
            mStarred = starred;
            mPresence = presence;
            mInvitableAccountTypes = Lists.newArrayList();
        }

        private Result(Result from) {
@@ -193,6 +197,7 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
            mEntities = from.mEntities;
            mStreamItems = from.mStreamItems;
            mStatuses = from.mStatuses;
            mInvitableAccountTypes = from.mInvitableAccountTypes;

            mDirectoryDisplayName = from.mDirectoryDisplayName;
            mDirectoryType = from.mDirectoryType;
@@ -279,6 +284,10 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
            return mPresence;
        }

        public ArrayList<String> getInvitableAccontTypes() {
            return mInvitableAccountTypes;
        }

        public ArrayList<Entity> getEntities() {
            return mEntities;
        }
@@ -568,6 +577,9 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
                        loadStreamItems(result);
                    }
                    loadPhotoBinaryData(result);
                    if (mLoadInvitableAccountTypes) {
                        loadInvitableAccountTypes(result);
                    }
                }
                return result;
            } catch (Exception e) {
@@ -718,6 +730,27 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
            }
        }

        private void loadInvitableAccountTypes(Result contactData) {
            Map<String, AccountType> allInvitables =
                    AccountTypeManager.getInstance(getContext()).getInvitableAccountTypes();
            if (allInvitables.isEmpty()) {
                return;
            }

            HashMap<String, AccountType> result = new HashMap<String, AccountType>(allInvitables);

            // Remove the ones that already has a raw contact in the current contact
            for (Entity entity : contactData.getEntities()) {
                final String type = entity.getEntityValues().getAsString(RawContacts.ACCOUNT_TYPE);
                if (!TextUtils.isEmpty(type)) {
                    result.remove(type);
                }
            }

            // Set to mInvitableAccountTypes
            contactData.mInvitableAccountTypes.addAll(result.keySet());
        }

        /**
         * Extracts Contact level columns from the cursor.
         */
@@ -1058,15 +1091,16 @@ public class ContactLoader extends Loader<ContactLoader.Result> {
    }

    public ContactLoader(Context context, Uri lookupUri) {
        this(context, lookupUri, false, false);
        this(context, lookupUri, false, false, false);
    }

    public ContactLoader(Context context, Uri lookupUri, boolean loadGroupMetaData,
            boolean loadStreamItems) {
            boolean loadStreamItems, boolean loadInvitableAccountTypes) {
        super(context);
        mLookupUri = lookupUri;
        mLoadGroupMetaData = loadGroupMetaData;
        mLoadStreamItems = loadStreamItems;
        mLoadInvitableAccountTypes = loadInvitableAccountTypes;
    }

    public Uri getLookupUri() {
+1 −1
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ public class ContactLoaderFragment extends Fragment implements FragmentKeyListen
        public Loader<ContactLoader.Result> onCreateLoader(int id, Bundle args) {
            Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI);
            return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */,
                    true /* loadStreamItems */);
                    true /* loadStreamItems */, false /* load invitable account types */);
        }

        @Override
+26 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.widget.EditText;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -120,7 +121,7 @@ public abstract class AccountType {
     */
    public CharSequence getInviteContactActionLabel(Context context) {
        return getResourceText(context, summaryResPackageName, getInviteContactActionResId(context),
                null);
                "");
    }

    /**
@@ -342,4 +343,28 @@ public abstract class AccountType {
        public CharSequence inflateUsing(Context context, Cursor cursor);
        public CharSequence inflateUsing(Context context, ContentValues values);
    }

    /**
     * Compare two {@link AccountType} by their {@link AccountType#getDisplayLabel} with the
     * current locale.
     */
    public static class DisplayLabelComparator implements Comparator<AccountType> {
        private final Context mContext;
        /** {@link Comparator} for the current locale. */
        private final Collator mCollator = Collator.getInstance();

        public DisplayLabelComparator(Context context) {
            mContext = context;
        }

        private String getDisplayLabel(AccountType type) {
            CharSequence label = type.getDisplayLabel(mContext);
            return (label == null) ? "" : label.toString();
        }

        @Override
        public int compare(AccountType lhs, AccountType rhs) {
            return mCollator.compare(getDisplayLabel(lhs), getDisplayLabel(rhs));
        }
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -111,7 +111,8 @@ public class SocialWidgetProvider extends AppWidgetProvider {
            // Not yet set-up (this can happen while the Configuration activity is visible)
            return;
        }
        final ContactLoader contactLoader = new ContactLoader(context, contactUri, false, true);
        final ContactLoader contactLoader = new ContactLoader(context, contactUri, false, true,
                false);
        contactLoader.registerListener(0,
                new ContactLoader.OnLoadCompleteListener<ContactLoader.Result>() {
                    @Override
+54 −0
Original line number Diff line number Diff line
@@ -17,9 +17,14 @@
package com.android.contacts.model;

import com.android.contacts.tests.R;
import com.google.common.collect.Lists;

import android.content.Context;
import android.test.AndroidTestCase;
import android.test.MoreAsserts;

import java.util.ArrayList;
import java.util.Collections;

/**
 * Test case for {@link AccountType}.
@@ -87,4 +92,53 @@ public class AccountTypeTest extends AndroidTestCase {
        assertEquals(getTestContext().getString(externalResID),
                accountType.getInviteContactActionLabel(c));
    }

    public void testDisplayLabelComparator() {
        final AccountTypeForDisplayLabelTest EMPTY = new AccountTypeForDisplayLabelTest("");
        final AccountTypeForDisplayLabelTest NULL = new AccountTypeForDisplayLabelTest(null);
        final AccountTypeForDisplayLabelTest AA = new AccountTypeForDisplayLabelTest("aa");
        final AccountTypeForDisplayLabelTest BBB = new AccountTypeForDisplayLabelTest("bbb");
        final AccountTypeForDisplayLabelTest C = new AccountTypeForDisplayLabelTest("c");

        assertTrue(compareDisplayLabel(AA, BBB) < 0);
        assertTrue(compareDisplayLabel(BBB, C) < 0);
        assertTrue(compareDisplayLabel(AA, C) < 0);
        assertTrue(compareDisplayLabel(AA, AA) == 0);
        assertTrue(compareDisplayLabel(BBB, AA) > 0);

        assertTrue(compareDisplayLabel(EMPTY, AA) < 0);
        assertTrue(compareDisplayLabel(EMPTY, NULL) == 0);
    }

    private int compareDisplayLabel(AccountType lhs, AccountType rhs) {
        return new AccountType.DisplayLabelComparator(getContext()).compare(lhs, rhs);
    }

    private class AccountTypeForDisplayLabelTest extends AccountType {
        private final String mDisplayLabel;

        public AccountTypeForDisplayLabelTest(String displayLabel) {
            mDisplayLabel = displayLabel;
        }

        @Override
        public CharSequence getDisplayLabel(Context context) {
            return mDisplayLabel;
        }

        @Override
        public int getHeaderColor(Context context) {
            return 0;
        }

        @Override
        public int getSideBarColor(Context context) {
            return 0;
        }

        @Override
        public boolean isGroupMembershipEditable() {
            return false;
        }
    }
}