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

Commit f10ca15f authored by Walter Jang's avatar Walter Jang
Browse files

Add group membership support to compact editor (E9)

Bug 23589603

Change-Id: I71082af35a35dc7d0658ffb671a4436f794f5b0c
parent 192a01c6
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -289,7 +289,9 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl

    @Override
    protected void setGroupMetaData() {
        // The compact editor does not support groups.
        if (mGroupMetaData != null) {
            getContent().setGroupMetaData(mGroupMetaData);
        }
    }

    @Override
+31 −4
Original line number Diff line number Diff line
@@ -17,7 +17,8 @@
package com.android.contacts.editor;

import android.content.Context;
import android.provider.ContactsContract;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.CommonDataKinds.Nickname;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.util.AttributeSet;
@@ -178,6 +179,15 @@ public class CompactKindSectionView extends LinearLayout implements EditorListen
        mHideIfEmpty = hideWhenEmpty;
    }

    public void setGroupMetaData(Cursor cursor) {
        for (int i = 0; i < mEditors.getChildCount(); i++) {
            final View view = mEditors.getChildAt(i);
            if (view instanceof GroupMembershipView) {
                ((GroupMembershipView) view).setGroupMetaData(cursor);
            }
        }
    }

    public void setState(List<KindSectionData> kindSectionDataList, boolean readOnly,
            ViewIdGenerator viewIdGenerator, CompactRawContactsEditorView.Listener listener) {
        mKindSectionDataList = kindSectionDataList;
@@ -208,11 +218,15 @@ public class CompactKindSectionView extends LinearLayout implements EditorListen
        mEditors.removeAllViews();

        for (KindSectionData kindSectionData : mKindSectionDataList) {
            if (StructuredName.CONTENT_ITEM_TYPE.equals(kindSectionData.getDataKind().mimeType)) {
            final String mimeType = kindSectionData.getDataKind().mimeType;
            if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
                for (ValuesDelta valuesDelta : kindSectionData.getValuesDeltas()) {
                    createNameEditorViews(kindSectionData.getAccountType(),
                            valuesDelta, kindSectionData.getRawContactDelta());
                }
            } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
                createGroupEditorView(kindSectionData.getRawContactDelta(),
                        kindSectionData.getDataKind());
            } else {
                for (ValuesDelta valuesDelta : kindSectionData.getValuesDeltas()) {
                    createEditorView(kindSectionData.getRawContactDelta(),
@@ -259,6 +273,19 @@ public class CompactKindSectionView extends LinearLayout implements EditorListen
        mEditors.addView(phoneticNameView);
    }

    private void createGroupEditorView(RawContactDelta rawContactDelta, DataKind dataKind) {
        final GroupMembershipView view = (GroupMembershipView) mInflater.inflate(
                R.layout.item_group_membership, mEditors, /* attachToRoot =*/ false);
        view.setKind(dataKind);
        view.setEnabled(isEnabled());
        view.setState(rawContactDelta);

        // Correct start margin since there is another icon in the group layout
        view.findViewById(R.id.kind_icon).setVisibility(View.GONE);

        mEditors.addView(view);
    }

    /**
     * Creates an EditorView for the given values delta. This function must be used while
     * constructing the views corresponding to the the object-model. The resulting EditorView is
@@ -426,8 +453,8 @@ public class CompactKindSectionView extends LinearLayout implements EditorListen
    private List<View> getEmptyEditors() {
        List<View> emptyEditorViews = new ArrayList<View>();
        for (int i = 0; i < mEditors.getChildCount(); i++) {
            View view = mEditors.getChildAt(i);
            if (((Editor) view).isEmpty()) {
            final View view = mEditors.getChildAt(i);
            if (view instanceof Editor && ((Editor) view).isEmpty()) {
                emptyEditorViews.add(view);
            }
        }
+27 −10
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.contacts.editor.CompactContactEditorFragment.PhotoHandler;
import com.android.contacts.util.UiClosables;

import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -129,6 +130,7 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O
     *     <li>All names are together at the top.</li>
     *     <li>IM is moved up after addresses</li>
     *     <li>SIP addresses are moved to below phone numbers</li>
     *     <li>Group membership is palced at the end</li>
     * </ol>
     */
    private static final class MimeTypeComparator implements Comparator<String> {
@@ -145,7 +147,8 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O
                Organization.CONTENT_ITEM_TYPE,
                Event.CONTENT_ITEM_TYPE,
                Relation.CONTENT_ITEM_TYPE,
                Note.CONTENT_ITEM_TYPE
                Note.CONTENT_ITEM_TYPE,
                GroupMembership.CONTENT_ITEM_TYPE
        });

        @Override
@@ -271,6 +274,7 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O

    private CompactPhotoEditorView mPhotoView;
    private ViewGroup mKindSectionViews;
    private Map<String,List<CompactKindSectionView>> mKindSectionViewsMap = new HashMap<>();
    private View mMoreFields;

    private long mPhotoRawContactId;
@@ -380,15 +384,22 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O
    }

    public View getAggregationAnchorView() {
        // The kind section for the primary account is sorted to the front
        final List<KindSectionData> kindSectionDataList = getKindSectionDataList(
        final List<CompactKindSectionView> kindSectionViews = getKindSectionViews(
                StructuredName.CONTENT_ITEM_TYPE);
        if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
        if (!kindSectionViews.isEmpty()) {
            return mKindSectionViews.getChildAt(0).findViewById(R.id.anchor_view);
        }
        return null;
    }

    public void setGroupMetaData(Cursor groupMetaData) {
        final List<CompactKindSectionView> kindSectionViews = getKindSectionViews(
                GroupMembership.CONTENT_ITEM_TYPE);
        for (CompactKindSectionView kindSectionView : kindSectionViews) {
            kindSectionView.setGroupMetaData(groupMetaData);
        }
    }

    public void setState(RawContactDeltaList rawContactDeltas,
            MaterialColorMapUtils.MaterialPalette materialPalette, ViewIdGenerator viewIdGenerator,
            long photoId, boolean hasNewContact, boolean isUserProfile,
@@ -720,12 +731,6 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O
                continue;
            }

            // Ignore mime types that we don't handle
            if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
                vlog("kind: " + i + " " + mimeType + " dropped");
                continue;
            }

            if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
                vlog("kind: " + i + " " + mimeType + ": " + kindSectionDataList.size() +
                        " kindSectionData(s)");
@@ -733,10 +738,22 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O
                final CompactKindSectionView kindSectionView = inflateKindSectionView(
                        mKindSectionViews, kindSectionDataList, mimeType);
                mKindSectionViews.addView(kindSectionView);

                // Keep a pointer to all the KindSectionsViews for each mimeType
                getKindSectionViews(mimeType).add(kindSectionView);
            }
        }
    }

    private List<CompactKindSectionView> getKindSectionViews(String mimeType) {
        List<CompactKindSectionView> kindSectionViews = mKindSectionViewsMap.get(mimeType);
        if (kindSectionViews == null) {
            kindSectionViews = new ArrayList<>();
            mKindSectionViewsMap.put(mimeType, kindSectionViews);
        }
        return kindSectionViews;
    }

    private CompactKindSectionView inflateKindSectionView(ViewGroup viewGroup,
            List<KindSectionData> kindSectionDataList, String mimeType) {
        final CompactKindSectionView kindSectionView = (CompactKindSectionView)