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