summaryrefslogtreecommitdiff
path: root/src/com/android/dialer/calllog/CallLogAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/dialer/calllog/CallLogAdapter.java')
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java141
1 files changed, 91 insertions, 50 deletions
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 3958611b9..9cde0b65d 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -16,8 +16,12 @@
package com.android.dialer.calllog;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.service.ExtendedCallInfoService;
+import com.android.dialerbind.ObjectFactory;
import com.google.common.annotations.VisibleForTesting;
+import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -32,10 +36,8 @@ import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.telecom.PhoneAccountHandle;
-import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.AccessibilityDelegate;
@@ -55,23 +57,19 @@ import com.android.dialer.contactinfo.ContactInfoCache;
import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener;
import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
import com.android.dialer.database.VoicemailArchiveContract;
-import com.android.dialer.filterednumber.BlockNumberDialogFragment.Callback;
import com.android.dialer.logging.InteractionEvent;
import com.android.dialer.logging.Logger;
-import com.android.dialer.service.ExtendedBlockingButtonRenderer;
import com.android.dialer.util.PhoneNumberUtil;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
import java.util.HashMap;
-import java.util.Map;
/**
* Adapter class to fill in data for the Call Log.
*/
public class CallLogAdapter extends GroupingListAdapter
implements CallLogGroupBuilder.GroupCreator,
- VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
- ExtendedBlockingButtonRenderer.Listener {
+ VoicemailPlaybackPresenter.OnVoicemailDeletedListener {
// Types of activities the call log adapter is used for
public static final int ACTIVITY_TYPE_CALL_LOG = 1;
@@ -104,7 +102,6 @@ public class CallLogAdapter extends GroupingListAdapter
protected final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
private final CallFetcher mCallFetcher;
private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
- private final Map<String, Boolean> mBlockedNumberCache = new ArrayMap<>();
protected ContactInfoCache mContactInfoCache;
@@ -121,6 +118,27 @@ public class CallLogAdapter extends GroupingListAdapter
private int mHiddenPosition = RecyclerView.NO_POSITION;
private Uri mHiddenItemUri = null;
private boolean mPendingHide = false;
+ private BlockNumberDialogFragment.Callback mBlockedNumberDialogCallback =
+ new BlockNumberDialogFragment.Callback() {
+ @Override
+ public void onFilterNumberSuccess() {
+ Logger.logInteraction(
+ InteractionEvent.BLOCK_NUMBER_CALL_LOG);
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void onUnfilterNumberSuccess() {
+ Logger.logInteraction(
+ InteractionEvent.UNBLOCK_NUMBER_CALL_LOG);
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void onChangeFilteredNumberUndo() {
+ }
+ };
+ private CallLogListItemViewHolder.OnClickListener mBlockReportSpamListener;
/**
* Hashmap, keyed by call Id, used to track the day group for a call. As call log entries are
@@ -153,6 +171,8 @@ public class CallLogAdapter extends GroupingListAdapter
/** Helper to group call log entries. */
private final CallLogGroupBuilder mCallLogGroupBuilder;
+ private ExtendedCallInfoService mExtendedCallInfoService;
+
/**
* The OnClickListener used to expand or collapse the action buttons of a call log entry.
*/
@@ -296,6 +316,12 @@ public class CallLogAdapter extends GroupingListAdapter
mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
mContactsPreferences = new ContactsPreferences(mContext);
maybeShowVoicemailPromoCard();
+
+ mExtendedCallInfoService = ObjectFactory.newExtendedCallInfoService(context);
+ mBlockReportSpamListener = new BlockReportSpamListener(
+ ((Activity) mContext).getFragmentManager(), this,
+ mExtendedCallInfoService, mFilteredNumberAsyncQueryHandler);
+ setHasStableIds(true);
}
public void onSaveInstanceState(Bundle outState) {
@@ -312,24 +338,6 @@ public class CallLogAdapter extends GroupingListAdapter
}
}
- @Override
- public void onBlockedNumber(String number,String countryIso) {
- String cacheKey = PhoneNumberUtils.formatNumberToE164(number, countryIso);
- if (!TextUtils.isEmpty(cacheKey)) {
- mBlockedNumberCache.put(cacheKey, true);
- notifyDataSetChanged();
- }
- }
-
- @Override
- public void onUnblockedNumber( String number, String countryIso) {
- String cacheKey = PhoneNumberUtils.formatNumberToE164(number, countryIso);
- if (!TextUtils.isEmpty(cacheKey)) {
- mBlockedNumberCache.put(cacheKey, false);
- notifyDataSetChanged();
- }
- }
-
/**
* Requery on background thread when {@link Cursor} changes.
*/
@@ -406,28 +414,14 @@ public class CallLogAdapter extends GroupingListAdapter
CallLogListItemViewHolder viewHolder = CallLogListItemViewHolder.create(
view,
mContext,
- this,
+ mBlockReportSpamListener,
mExpandCollapseListener,
mCallLogCache,
mCallLogListItemHelper,
mVoicemailPlaybackPresenter,
mFilteredNumberAsyncQueryHandler,
- new Callback() {
- @Override
- public void onFilterNumberSuccess() {
- Logger.logInteraction(
- InteractionEvent.BLOCK_NUMBER_CALL_LOG);
- }
-
- @Override
- public void onUnfilterNumberSuccess() {
- Logger.logInteraction(
- InteractionEvent.UNBLOCK_NUMBER_CALL_LOG);
- }
-
- @Override
- public void onChangeFilteredNumberUndo() {}
- }, mActivityType == ACTIVITY_TYPE_ARCHIVE);
+ mBlockedNumberDialogCallback,
+ mActivityType == ACTIVITY_TYPE_ARCHIVE);
viewHolder.callLogEntryView.setTag(viewHolder);
viewHolder.callLogEntryView.setAccessibilityDelegate(mAccessibilityDelegate);
@@ -481,7 +475,42 @@ public class CallLogAdapter extends GroupingListAdapter
* @param position The position of the list item.
*/
- private void bindCallLogListViewHolder(ViewHolder viewHolder, int position) {
+ private void bindCallLogListViewHolder(final ViewHolder viewHolder, final int position) {
+ Cursor c = (Cursor) getItem(position);
+ if (c == null) {
+ return;
+ }
+
+ final String number = c.getString(CallLogQuery.NUMBER);
+ final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
+ final CallLogListItemViewHolder views = (CallLogListItemViewHolder) viewHolder;
+ boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(Integer id) {
+ views.blockId = id;
+ if (mExtendedCallInfoService == null) {
+ loadDataAndRender(views);
+ } else {
+ views.isSpamFeatureEnabled = true;
+ mExtendedCallInfoService.getExtendedCallInfo(number, countryIso,
+ new ExtendedCallInfoService.Listener() {
+ @Override
+ public void onComplete(boolean isSpam) {
+ views.isSpam = isSpam;
+ loadDataAndRender(views);
+ }
+ });
+ }
+ }
+ }, number, countryIso);
+ if (!success) {
+ loadDataAndRender(views);
+ }
+ }
+
+ private void loadDataAndRender(CallLogListItemViewHolder views) {
+ int position = views.getAdapterPosition();
Cursor c = (Cursor) getItem(position);
if (c == null) {
return;
@@ -547,7 +576,6 @@ public class CallLogAdapter extends GroupingListAdapter
details.contactUserType = info.userType;
}
- final CallLogListItemViewHolder views = (CallLogListItemViewHolder) viewHolder;
views.info = info;
views.rowId = c.getLong(CallLogQuery.ID);
// Store values used when the actions ViewStub is inflated on expansion.
@@ -592,19 +620,22 @@ public class CallLogAdapter extends GroupingListAdapter
views.voicemailUri = c.getString(CallLogQuery.VOICEMAIL_URI);
}
- mCallLogListItemHelper.setPhoneCallDetails(views, details);
+ // Reversely pass spam information from views since details is not constructed when spam
+ // information comes back. This is used to render phone call details.
+ details.isSpam = views.isSpam;
+ render(views, details);
+ }
+ private void render(CallLogListItemViewHolder views, PhoneCallDetails details) {
+ mCallLogListItemHelper.setPhoneCallDetails(views, details);
if (mCurrentlyExpandedRowId == views.rowId) {
// In case ViewHolders were added/removed, update the expanded position if the rowIds
// match so that we can restore the correct expanded state on rebind.
- mCurrentlyExpandedPosition = position;
+ mCurrentlyExpandedPosition = views.getAdapterPosition();
views.showActions(true);
} else {
views.showActions(false);
}
- views.updatePhoto();
-
- mCallLogListItemHelper.setPhoneCallDetails(views, details);
}
private String getPreferredDisplayName(ContactInfo contactInfo) {
@@ -644,6 +675,16 @@ public class CallLogAdapter extends GroupingListAdapter
}
@Override
+ public long getItemId(int position) {
+ Cursor cursor = (Cursor) getItem(position);
+ if (cursor != null) {
+ return cursor.getLong(CallLogQuery.ID);
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
public int getGroupSize(int position) {
return super.getGroupSize(position - (mShowVoicemailPromoCard ? 1 : 0));
}