15f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro/*
25f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * Copyright (C) 2011 The Android Open Source Project
35f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro *
45f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * Licensed under the Apache License, Version 2.0 (the "License");
55f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * you may not use this file except in compliance with the License.
65f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * You may obtain a copy of the License at
75f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro *
85f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro *      http://www.apache.org/licenses/LICENSE-2.0
95f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro *
105f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * Unless required by applicable law or agreed to in writing, software
115f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * distributed under the License is distributed on an "AS IS" BASIS,
125f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * See the License for the specific language governing permissions and
145f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * limitations under the License
155f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro */
165f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaropackage com.android.contacts;
175f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
185f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.content.Context;
195f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.content.CursorLoader;
205f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.net.Uri;
215f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.provider.ContactsContract;
225f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
235f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.provider.ContactsContract.Contacts;
245f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.provider.ContactsContract.Data;
255f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport android.provider.ContactsContract.Directory;
265f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
27a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.preference.ContactsPreferences;
28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
295f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport java.util.ArrayList;
305f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaroimport java.util.List;
315f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
325f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro/**
335f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro * Group Member loader. Loads all group members from the given groupId
345f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro */
355f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaropublic final class GroupMemberLoader extends CursorLoader {
365f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
37a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    public static class GroupEditorQuery {
38a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        private static final String[] PROJECTION = new String[] {
39a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.CONTACT_ID,                        // 0
40a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.RAW_CONTACT_ID,                    // 1
41a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.DISPLAY_NAME_PRIMARY,              // 2
42a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.PHOTO_URI,                         // 3
43a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.LOOKUP_KEY,                        // 4
44a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        };
45a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa
46a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_ID                   = 0;
47a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int RAW_CONTACT_ID               = 1;
48a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_DISPLAY_NAME_PRIMARY = 2;
49a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_PHOTO_URI            = 3;
50a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_LOOKUP_KEY           = 4;
51a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    }
52a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa
53a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    public static class GroupDetailQuery {
54a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        private static final String[] PROJECTION = new String[] {
558102959341bce26f99a8a15c5348db1f4f4d18f2Katherine Kuan            Data.CONTACT_ID,                        // 0
56a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.PHOTO_URI,                         // 1
57a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.LOOKUP_KEY,                        // 2
58a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.DISPLAY_NAME_PRIMARY,              // 3
59a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.CONTACT_PRESENCE,                  // 4
60a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Data.CONTACT_STATUS,                    // 5
61a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        };
62a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa
638102959341bce26f99a8a15c5348db1f4f4d18f2Katherine Kuan        public static final int CONTACT_ID                   = 0;
64a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_PHOTO_URI            = 1;
65a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_LOOKUP_KEY           = 2;
66a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_DISPLAY_NAME_PRIMARY = 3;
67a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_PRESENCE_STATUS      = 4;
68a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        public static final int CONTACT_STATUS               = 5;
69a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    }
705f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
715f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    private final long mGroupId;
725f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
73a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    /**
74a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa     * @return GroupMemberLoader object which can be used in group editor.
75a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa     */
76a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    public static GroupMemberLoader constructLoaderForGroupEditorQuery(
77a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Context context, long groupId) {
78a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        return new GroupMemberLoader(context, groupId, GroupEditorQuery.PROJECTION);
79a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    }
80a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa
81a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    /**
82a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa     * @return GroupMemberLoader object used in group detail page.
83a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa     */
84a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    public static GroupMemberLoader constructLoaderForGroupDetailQuery(
85a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa            Context context, long groupId) {
86a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        return new GroupMemberLoader(context, groupId, GroupDetailQuery.PROJECTION);
87a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    }
885f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
89a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa    private GroupMemberLoader(Context context, long groupId, String[] projection) {
905f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        super(context);
915f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        mGroupId = groupId;
925f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        setUri(createUri());
93a939372643a86688ae196cce03cf4f6f70864d93Daisuke Miyakawa        setProjection(projection);
945f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        setSelection(createSelection());
955f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        setSelectionArgs(createSelectionArgs());
964b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson
974b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson        ContactsPreferences prefs = new ContactsPreferences(context);
984b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson        if (prefs.getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {
994b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson            setSortOrder(Contacts.SORT_KEY_PRIMARY);
1004b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson        } else {
1014b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson            setSortOrder(Contacts.SORT_KEY_ALTERNATIVE);
1024b9b26ec637a171532a679a3cea3afa342caaa37Isaac Katzenelson        }
1035f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    }
1045f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
1055f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    private Uri createUri() {
1065f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        Uri uri = Data.CONTENT_URI;
1075f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        uri = uri.buildUpon().appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
1085f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro                String.valueOf(Directory.DEFAULT)).build();
1095f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        return uri;
1105f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    }
1115f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
1125f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    private String createSelection() {
1135f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        StringBuilder selection = new StringBuilder();
1145f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        selection.append(Data.MIMETYPE + "=?" + " AND " + GroupMembership.GROUP_ROW_ID + "=?");
1155f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        return selection.toString();
1165f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    }
1175f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro
1185f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    private String[] createSelectionArgs() {
1195f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        List<String> selectionArgs = new ArrayList<String>();
1205f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        selectionArgs.add(GroupMembership.CONTENT_ITEM_TYPE);
1215f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        selectionArgs.add(String.valueOf(mGroupId));
1225f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro        return selectionArgs.toArray(new String[0]);
1235f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro    }
1245f34b2e20ad4a41b6dd3fd0703d59e085bffeb1cFrank Sposaro}
125