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

Commit ecc222b8 authored by Wenyi Wang's avatar Wenyi Wang
Browse files

Get rid of invisible contacts from group member picker using Data Uri

Bug 29126479

Change-Id: Ia28eeccb15c789394bdbe8221a49f48dcaf96d50
parent a31a55b8
Loading
Loading
Loading
Loading
+19 −13
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ import android.content.Context;
import android.content.CursorLoader;
import android.content.CursorLoader;
import android.database.Cursor;
import android.database.Cursor;
import android.net.Uri;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
import android.text.TextUtils;
@@ -43,21 +44,21 @@ public class GroupMemberPickListAdapter extends ContactEntryListAdapter {
    static class GroupMembersQuery {
    static class GroupMembersQuery {


        private static final String[] PROJECTION_PRIMARY = new String[] {
        private static final String[] PROJECTION_PRIMARY = new String[] {
                RawContacts._ID,                        // 0
                Data.RAW_CONTACT_ID,             // 0
                RawContacts.CONTACT_ID,                 // 1
                Data.CONTACT_ID,                 // 1
                RawContacts.DISPLAY_NAME_PRIMARY,       // 2
                Data.DISPLAY_NAME_PRIMARY,       // 2
                // Dummy columns overwritten by the cursor wrapper
                // Dummy columns overwritten by the cursor wrapper
                RawContacts.SYNC1,                      // 3
                Data.PHOTO_ID,                   // 3
                RawContacts.SYNC2                       // 4
                Data.LOOKUP_KEY                  // 4
        };
        };


        private static final String[] PROJECTION_ALTERNATIVE = new String[] {
        private static final String[] PROJECTION_ALTERNATIVE = new String[] {
                RawContacts._ID,                        // 0
                Data.RAW_CONTACT_ID,             // 0
                RawContacts.CONTACT_ID,                 // 1
                Data.CONTACT_ID,                 // 1
                RawContacts.DISPLAY_NAME_ALTERNATIVE,   // 2
                Data.DISPLAY_NAME_ALTERNATIVE,   // 2
                // Dummy columns overwritten by the cursor wrapper
                // Dummy columns overwritten by the cursor wrapper
                RawContacts.SYNC1,                      // 3
                Data.PHOTO_ID,                   // 3
                RawContacts.SYNC2                       // 4
                Data.LOOKUP_KEY                  // 4
        };
        };


        static final int RAW_CONTACT_ID = 0;
        static final int RAW_CONTACT_ID = 0;
@@ -101,7 +102,10 @@ public class GroupMemberPickListAdapter extends ContactEntryListAdapter {


    @Override
    @Override
    public void configureLoader(CursorLoader loader, long directoryId) {
    public void configureLoader(CursorLoader loader, long directoryId) {
        loader.setUri(RawContacts.CONTENT_URI);
        final Uri uri = Data.CONTENT_URI.buildUpon()
                .appendQueryParameter(Data.VISIBLE_CONTACTS_ONLY, "true")
                .build();
        loader.setUri(uri);
        loader.setProjection(
        loader.setProjection(
                getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
                getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
                        ? GroupMembersQuery.PROJECTION_PRIMARY
                        ? GroupMembersQuery.PROJECTION_PRIMARY
@@ -115,7 +119,8 @@ public class GroupMemberPickListAdapter extends ContactEntryListAdapter {


    private String getSelection() {
    private String getSelection() {
        // Select raw contacts by account
        // Select raw contacts by account
        String result = RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=? AND ";
        String result = RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=? AND "
                + Data.MIMETYPE + "=? AND ";
        if (TextUtils.isEmpty(mAccount.dataSet)) {
        if (TextUtils.isEmpty(mAccount.dataSet)) {
            result += Data.DATA_SET + " IS NULL";
            result += Data.DATA_SET + " IS NULL";
        } else {
        } else {
@@ -128,6 +133,7 @@ public class GroupMemberPickListAdapter extends ContactEntryListAdapter {
        final ArrayList<String> result = new ArrayList<>();
        final ArrayList<String> result = new ArrayList<>();
        result.add(mAccount.name);
        result.add(mAccount.name);
        result.add(mAccount.type);
        result.add(mAccount.type);
        result.add(GroupMembership.CONTENT_ITEM_TYPE);
        if (!TextUtils.isEmpty(mAccount.dataSet)) result.add(mAccount.dataSet);
        if (!TextUtils.isEmpty(mAccount.dataSet)) result.add(mAccount.dataSet);
        return result.toArray(new String[0]);
        return result.toArray(new String[0]);
    }
    }
@@ -135,7 +141,7 @@ public class GroupMemberPickListAdapter extends ContactEntryListAdapter {
    public Uri getRawContactUri(int position) {
    public Uri getRawContactUri(int position) {
        final Cursor cursor = (Cursor) getItem(position);
        final Cursor cursor = (Cursor) getItem(position);
        final long rawContactId = cursor.getLong(GroupMembersQuery.RAW_CONTACT_ID);
        final long rawContactId = cursor.getLong(GroupMembersQuery.RAW_CONTACT_ID);
        return RawContacts.CONTENT_URI.buildUpon()
        return Data.CONTENT_URI.buildUpon()
                .appendPath(Long.toString(rawContactId))
                .appendPath(Long.toString(rawContactId))
                .build();
                .build();
    }
    }
+25 −16
Original line number Original line Diff line number Diff line
@@ -23,7 +23,7 @@ import android.database.CursorWrapper;
import android.net.Uri;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.Data;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
@@ -38,7 +38,9 @@ import com.android.contacts.list.GroupMemberPickListAdapter.GroupMembersQuery;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map;
import java.util.Set;


/**
/**
 * Fragment containing raw contacts for a specified account that are not already in a group.
 * Fragment containing raw contacts for a specified account that are not already in a group.
@@ -84,12 +86,17 @@ public class GroupMemberPickerFragment extends
                        + (mContactPhotosMap == null ? 0 : mContactPhotosMap.size()));
                        + (mContactPhotosMap == null ? 0 : mContactPhotosMap.size()));
            }
            }


            final Set<String> uniqueRawContactIds = new HashSet<String>();

            for (int i = 0; i < mCount; i++) {
            for (int i = 0; i < mCount; i++) {
                super.moveToPosition(i);
                super.moveToPosition(i);
                final String rawContactId = getString(GroupMembersQuery.RAW_CONTACT_ID);
                final String rawContactId = getString(GroupMembersQuery.RAW_CONTACT_ID);
                if (!mRawContactIds.contains(rawContactId)) {
                if (!mRawContactIds.contains(rawContactId)
                        && !uniqueRawContactIds.contains(rawContactId)) {
                    mIndex[mPos++] = i;
                    mIndex[mPos++] = i;
                } else if (mContactPhotosMap != null) {
                    uniqueRawContactIds.add(rawContactId);
                }
                if (mRawContactIds.contains(rawContactId) && mContactPhotosMap != null) {
                    final long contactId = getLong(GroupMembersQuery.CONTACT_ID);
                    final long contactId = getLong(GroupMembersQuery.CONTACT_ID);
                    mContactPhotosMap.remove(contactId);
                    mContactPhotosMap.remove(contactId);
                }
                }
@@ -117,10 +124,10 @@ public class GroupMemberPickerFragment extends
        }
        }


        private int getColumnIndexForContactColumn(String columnName) {
        private int getColumnIndexForContactColumn(String columnName) {
            if (Contacts.PHOTO_ID.equals(columnName)) {
            if (Data.PHOTO_ID.equals(columnName)) {
                return GroupMembersQuery.CONTACT_PHOTO_ID;
                return GroupMembersQuery.CONTACT_PHOTO_ID;
            }
            }
            if (Contacts.LOOKUP_KEY.equals(columnName)) {
            if (Data.LOOKUP_KEY.equals(columnName)) {
                return GroupMembersQuery.CONTACT_LOOKUP_KEY;
                return GroupMembersQuery.CONTACT_LOOKUP_KEY;
            }
            }
            return -1;
            return -1;
@@ -130,14 +137,14 @@ public class GroupMemberPickerFragment extends
        public String[] getColumnNames() {
        public String[] getColumnNames() {
            final String displayNameColumnName =
            final String displayNameColumnName =
                    getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
                    getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
                            ? RawContacts.DISPLAY_NAME_PRIMARY
                            ? Data.DISPLAY_NAME_PRIMARY
                            : RawContacts.DISPLAY_NAME_ALTERNATIVE;
                            : Data.DISPLAY_NAME_ALTERNATIVE;
            return new String[] {
            return new String[] {
                    RawContacts._ID,
                    Data._ID,
                    RawContacts.CONTACT_ID,
                    Data.CONTACT_ID,
                    displayNameColumnName,
                    displayNameColumnName,
                    Contacts.PHOTO_ID,
                    Data.PHOTO_ID,
                    Contacts.LOOKUP_KEY,
                    Data.LOOKUP_KEY,
            };
            };
        }
        }


@@ -219,15 +226,15 @@ public class GroupMemberPickerFragment extends
    private final LoaderCallbacks<Cursor> mContactsEntityCallbacks = new LoaderCallbacks<Cursor>() {
    private final LoaderCallbacks<Cursor> mContactsEntityCallbacks = new LoaderCallbacks<Cursor>() {


        private final String[] PROJECTION = new String[] {
        private final String[] PROJECTION = new String[] {
                Contacts._ID,
                Data.CONTACT_ID,
                Contacts.PHOTO_ID,
                Data.PHOTO_ID,
                Contacts.LOOKUP_KEY
                Data.LOOKUP_KEY
        };
        };


        @Override
        @Override
        public CursorLoader onCreateLoader(int id, Bundle args) {
        public CursorLoader onCreateLoader(int id, Bundle args) {
            final CursorLoader loader = new CursorLoader(getActivity());
            final CursorLoader loader = new CursorLoader(getActivity());
            loader.setUri(Contacts.CONTENT_URI);
            loader.setUri(Data.CONTENT_URI);
            loader.setProjection(PROJECTION);
            loader.setProjection(PROJECTION);
            return loader;
            return loader;
        }
        }
@@ -311,8 +318,10 @@ public class GroupMemberPickerFragment extends


    @Override
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        if (data != null) {
            super.onLoadFinished(loader, new FilterCursorWrapper(data));
            super.onLoadFinished(loader, new FilterCursorWrapper(data));
        }
        }
    }


    @Override
    @Override
    protected GroupMemberPickListAdapter createListAdapter() {
    protected GroupMemberPickListAdapter createListAdapter() {