184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro/* 284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * Copyright (C) 2011 The Android Open Source Project 384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * 484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * Licensed under the Apache License, Version 2.0 (the "License"); 584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * you may not use this file except in compliance with the License. 684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * You may obtain a copy of the License at 784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * 884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * http://www.apache.org/licenses/LICENSE-2.0 984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * 1084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * Unless required by applicable law or agreed to in writing, software 1184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * distributed under the License is distributed on an "AS IS" BASIS, 1284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * See the License for the specific language governing permissions and 1484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * limitations under the License. 1584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro */ 1684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoropackage com.android.contacts.list; 1784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 1884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport com.google.android.collect.Lists; 1984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 2084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.content.Context; 2184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.content.CursorLoader; 2284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.database.Cursor; 2384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.database.MatrixCursor; 2484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.database.MergeCursor; 2584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.os.Bundle; 2684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.provider.ContactsContract.Profile; 2784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 2884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport java.util.List; 2984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 3084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro/** 3184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * A loader for use in the default contact list, which will also query for the user's profile 3284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * if configured to do so. 3384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro */ 3484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoropublic class ProfileAndContactsLoader extends CursorLoader { 3584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 3684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro private boolean mLoadProfile; 3784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro private String[] mProjection; 3884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 3984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro public ProfileAndContactsLoader(Context context) { 4084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro super(context); 4184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 4284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 4384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro public void setLoadProfile(boolean flag) { 4484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro mLoadProfile = flag; 4584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 4684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 4784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro public void setProjection(String[] projection) { 4884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro super.setProjection(projection); 4984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro mProjection = projection; 5084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 5184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 5284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro @Override 5384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro public Cursor loadInBackground() { 5484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro // First load the profile, if enabled. 5584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro List<Cursor> cursors = Lists.newArrayList(); 5684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro if (mLoadProfile) { 5784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro cursors.add(loadProfile()); 5884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 5984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro final Cursor contactsCursor = super.loadInBackground(); 6084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro cursors.add(contactsCursor); 6184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro return new MergeCursor(cursors.toArray(new Cursor[cursors.size()])) { 6284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro @Override 6384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro public Bundle getExtras() { 6484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro // Need to get the extras from the contacts cursor. 6584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro return contactsCursor.getExtras(); 6684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 6784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro }; 6884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 6984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 7084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro /** 7184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro * Loads the profile into a MatrixCursor. 7284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro */ 7384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro private MatrixCursor loadProfile() { 7484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro Cursor cursor = getContext().getContentResolver().query(Profile.CONTENT_URI, mProjection, 7584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro null, null, null); 7684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro try { 7784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro MatrixCursor matrix = new MatrixCursor(mProjection); 7884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro Object[] row = new Object[mProjection.length]; 7984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro while (cursor.moveToNext()) { 8084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro for (int i = 0; i < row.length; i++) { 8184cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro row[i] = cursor.getString(i); 8284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 8384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro matrix.addRow(row); 8484cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 8584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro return matrix; 8684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } finally { 8784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro cursor.close(); 8884cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 8984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 9084cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro} 91