diff options
Diffstat (limited to 'src/com/android/messaging/datamodel/data/ContactPickerData.java')
-rw-r--r-- | src/com/android/messaging/datamodel/data/ContactPickerData.java | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/com/android/messaging/datamodel/data/ContactPickerData.java b/src/com/android/messaging/datamodel/data/ContactPickerData.java new file mode 100644 index 0000000..fd6fca0 --- /dev/null +++ b/src/com/android/messaging/datamodel/data/ContactPickerData.java @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.messaging.datamodel.data; + +import android.app.LoaderManager; +import android.content.Context; +import android.content.Loader; +import android.database.Cursor; +import android.os.Bundle; + +import com.android.messaging.datamodel.BoundCursorLoader; +import com.android.messaging.datamodel.FrequentContactsCursorBuilder; +import com.android.messaging.datamodel.MessagingContentProvider; +import com.android.messaging.datamodel.binding.BindableData; +import com.android.messaging.datamodel.binding.BindingBase; +import com.android.messaging.sms.MmsConfig; +import com.android.messaging.util.Assert; +import com.android.messaging.util.ContactUtil; +import com.android.messaging.util.LogUtil; + +/** + * Class to access phone contacts. + * The caller is responsible for ensuring that the app has READ_CONTACTS permission (see + * {@link ContactUtil#hasReadContactsPermission()}) before instantiating this class. + */ +public class ContactPickerData extends BindableData implements + LoaderManager.LoaderCallbacks<Cursor> { + public interface ContactPickerDataListener { + void onAllContactsCursorUpdated(Cursor data); + void onFrequentContactsCursorUpdated(Cursor data); + void onContactCustomColorLoaded(ContactPickerData data); + } + + private static final String BINDING_ID = "bindingId"; + private final Context mContext; + private LoaderManager mLoaderManager; + private ContactPickerDataListener mListener; + private final FrequentContactsCursorBuilder mFrequentContactsCursorBuilder; + + public ContactPickerData(final Context context, final ContactPickerDataListener listener) { + mListener = listener; + mContext = context; + mFrequentContactsCursorBuilder = new FrequentContactsCursorBuilder(); + } + + private static final int ALL_CONTACTS_LOADER = 1; + private static final int FREQUENT_CONTACTS_LOADER = 2; + private static final int PARTICIPANT_LOADER = 3; + + @Override + public Loader<Cursor> onCreateLoader(final int id, final Bundle args) { + final String bindingId = args.getString(BINDING_ID); + // Check if data still bound to the requesting ui element + if (isBound(bindingId)) { + switch (id) { + case ALL_CONTACTS_LOADER: + return ContactUtil.getPhones(mContext) + .createBoundCursorLoader(bindingId); + case FREQUENT_CONTACTS_LOADER: + return ContactUtil.getFrequentContacts(mContext) + .createBoundCursorLoader(bindingId); + case PARTICIPANT_LOADER: + return new BoundCursorLoader(bindingId, mContext, + MessagingContentProvider.PARTICIPANTS_URI, + ParticipantData.ParticipantsQuery.PROJECTION, null, null, null); + default: + Assert.fail("Unknown loader id for contact picker!"); + break; + } + } else { + LogUtil.w(LogUtil.BUGLE_TAG, "Loader created after unbinding the contacts list"); + } + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) { + final BoundCursorLoader cursorLoader = (BoundCursorLoader) loader; + if (isBound(cursorLoader.getBindingId())) { + switch (loader.getId()) { + case ALL_CONTACTS_LOADER: + mListener.onAllContactsCursorUpdated(data); + mFrequentContactsCursorBuilder.setAllContacts(data); + break; + case FREQUENT_CONTACTS_LOADER: + mFrequentContactsCursorBuilder.setFrequents(data); + break; + case PARTICIPANT_LOADER: + mListener.onContactCustomColorLoaded(this); + break; + default: + Assert.fail("Unknown loader id for contact picker!"); + break; + } + + if (loader.getId() != PARTICIPANT_LOADER) { + // The frequent contacts cursor to be used in the UI depends on results from both + // all contacts and frequent contacts loader, and we don't know which will finish + // first. Therefore, try to build the cursor and notify the listener if it's + // successfully built. + final Cursor frequentContactsCursor = mFrequentContactsCursorBuilder.build(); + if (frequentContactsCursor != null) { + mListener.onFrequentContactsCursorUpdated(frequentContactsCursor); + } + } + } else { + LogUtil.w(LogUtil.BUGLE_TAG, "Loader finished after unbinding the contacts list"); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onLoaderReset(final Loader<Cursor> loader) { + final BoundCursorLoader cursorLoader = (BoundCursorLoader) loader; + if (isBound(cursorLoader.getBindingId())) { + switch (loader.getId()) { + case ALL_CONTACTS_LOADER: + mListener.onAllContactsCursorUpdated(null); + mFrequentContactsCursorBuilder.setAllContacts(null); + break; + case FREQUENT_CONTACTS_LOADER: + mListener.onFrequentContactsCursorUpdated(null); + mFrequentContactsCursorBuilder.setFrequents(null); + break; + case PARTICIPANT_LOADER: + mListener.onContactCustomColorLoaded(this); + break; + default: + Assert.fail("Unknown loader id for contact picker!"); + break; + } + } else { + LogUtil.w(LogUtil.BUGLE_TAG, "Loader reset after unbinding the contacts list"); + } + } + + public void init(final LoaderManager loaderManager, + final BindingBase<ContactPickerData> binding) { + final Bundle args = new Bundle(); + args.putString(BINDING_ID, binding.getBindingId()); + mLoaderManager = loaderManager; + mLoaderManager.initLoader(ALL_CONTACTS_LOADER, args, this); + mLoaderManager.initLoader(FREQUENT_CONTACTS_LOADER, args, this); + mLoaderManager.initLoader(PARTICIPANT_LOADER, args, this); + } + + @Override + protected void unregisterListeners() { + mListener = null; + + + // This could be null if we bind but the caller doesn't init the BindableData + if (mLoaderManager != null) { + mLoaderManager.destroyLoader(ALL_CONTACTS_LOADER); + mLoaderManager.destroyLoader(FREQUENT_CONTACTS_LOADER); + mLoaderManager.destroyLoader(PARTICIPANT_LOADER); + mLoaderManager = null; + } + mFrequentContactsCursorBuilder.resetBuilder(); + } + + public static boolean isTooManyParticipants(final int participantCount) { + // When creating a conversation, the conversation will be created using the system's + // default SIM, so use the default MmsConfig's recipient limit. + return (participantCount > MmsConfig.get(ParticipantData.DEFAULT_SELF_SUB_ID) + .getRecipientLimit()); + } + + public static boolean getCanAddMoreParticipants(final int participantCount) { + // When creating a conversation, the conversation will be created using the system's + // default SIM, so use the default MmsConfig's recipient limit. + return (participantCount < MmsConfig.get(ParticipantData.DEFAULT_SELF_SUB_ID) + .getRecipientLimit()); + } +} |