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); 98c9bb2179ab321461f88f54d49e9d41f2f6b19fe3Yorke Lee if (prefs.getSortOrder() == ContactsPreferences.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