diff options
Diffstat (limited to 'java/com/android/dialer/app/calllog')
6 files changed, 77 insertions, 40 deletions
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java index 8d84e8ea7..b23e18d6b 100644 --- a/java/com/android/dialer/app/calllog/CallLogAdapter.java +++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java @@ -35,7 +35,6 @@ import android.support.annotation.WorkerThread; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.telecom.PhoneAccountHandle; -import android.telephony.PhoneNumberUtils; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -74,6 +73,7 @@ import com.android.dialer.phonenumbercache.ContactInfoHelper; import com.android.dialer.phonenumberutil.PhoneNumberHelper; import com.android.dialer.spam.Spam; import com.android.dialer.util.PermissionsUtil; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -141,6 +141,12 @@ public class CallLogAdapter extends GroupingListAdapter viewHolder.isCallComposerCapable = capabilities != null && capabilities.supportsCallComposer(); + CallDetailsEntries callDetailsEntries = viewHolder.getDetailedPhoneDetails(); + setCallDetailsEntriesHistoryResults( + viewHolder.number, + callDetailsEntries, + getAllHistoricalData(viewHolder.number, callDetailsEntries)); + if (viewHolder.rowId == mCurrentlyExpandedRowId) { // Hide actions, if the clicked item is the expanded item. viewHolder.showActions(false); @@ -461,6 +467,9 @@ public class CallLogAdapter extends GroupingListAdapter // the value will be false while capabilities are requested. mExpandCollapseListener will // attempt to set the field properly in that case views.isCallComposerCapable = isCallComposerCapable(views.number); + setCallDetailsEntriesHistoryResults( + views.number, callDetailsEntries, getAllHistoricalData(views.number, callDetailsEntries)); + views.setDetailedPhoneDetails(callDetailsEntries); final AsyncTask<Void, Void, Boolean> loadDataTask = new AsyncTask<Void, Void, Boolean>() { @Override @@ -482,35 +491,9 @@ public class CallLogAdapter extends GroupingListAdapter .checkSpamStatusSynchronous(views.number, views.countryIso); details.isSpam = views.isSpam; } - if (isCancelled()) { - return false; - } - setCallDetailsEntriesHistoryResults( - PhoneNumberUtils.formatNumberToE164(views.number, views.countryIso), - callDetailsEntries); - views.setDetailedPhoneDetails(callDetailsEntries); return !isCancelled() && loadData(views, rowId, details); } - private void setCallDetailsEntriesHistoryResults( - @Nullable String number, CallDetailsEntries callDetailsEntries) { - if (number == null) { - return; - } - Map<CallDetailsEntry, List<HistoryResult>> mappedResults = - getEnrichedCallManager().getAllHistoricalData(number, callDetailsEntries); - for (CallDetailsEntry entry : callDetailsEntries.entries) { - List<HistoryResult> results = mappedResults.get(entry); - if (results != null) { - entry.historyResults = mappedResults.get(entry).toArray(new HistoryResult[0]); - LogUtil.v( - "CallLogAdapter.setCallDetailsEntriesHistoryResults", - "mapped %d results", - entry.historyResults.length); - } - } - } - @Override protected void onPostExecute(Boolean success) { views.isLoaded = true; @@ -545,6 +528,41 @@ public class CallLogAdapter extends GroupingListAdapter return capabilities.supportsCallComposer(); } + @NonNull + private Map<CallDetailsEntry, List<HistoryResult>> getAllHistoricalData( + @Nullable String number, @NonNull CallDetailsEntries entries) { + if (number == null) { + return Collections.emptyMap(); + } + + Map<CallDetailsEntry, List<HistoryResult>> historicalData = + getEnrichedCallManager().getAllHistoricalData(number, entries); + if (historicalData == null) { + getEnrichedCallManager().requestAllHistoricalData(number, entries); + return Collections.emptyMap(); + } + return historicalData; + } + + private void setCallDetailsEntriesHistoryResults( + @Nullable String number, + @NonNull CallDetailsEntries callDetailsEntries, + @NonNull Map<CallDetailsEntry, List<HistoryResult>> mappedResults) { + if (number == null) { + return; + } + for (CallDetailsEntry entry : callDetailsEntries.entries) { + List<HistoryResult> results = mappedResults.get(entry); + if (results != null) { + entry.historyResults = mappedResults.get(entry).toArray(new HistoryResult[0]); + LogUtil.v( + "CallLogAdapter.setCallDetailsEntriesHistoryResults", + "mapped %d results", + entry.historyResults.length); + } + } + } + /** * Initialize PhoneCallDetails by reading all data from cursor. This method must be run on main * thread since cursor is not thread safe. diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java index f12837e6f..79a32afe3 100644 --- a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java +++ b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java @@ -215,7 +215,7 @@ public class CallLogNotificationsQueryHelper { public static final class NewCall { public final Uri callsUri; - public final Uri voicemailUri; + @Nullable public final Uri voicemailUri; public final String number; public final int numberPresentation; public final String accountComponentName; @@ -226,7 +226,7 @@ public class CallLogNotificationsQueryHelper { public NewCall( Uri callsUri, - Uri voicemailUri, + @Nullable Uri voicemailUri, String number, int numberPresentation, String accountComponentName, diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java index b0d48eee5..2f26027f9 100644 --- a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java +++ b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java @@ -20,6 +20,8 @@ import android.app.IntentService; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Handler; +import android.os.Looper; import android.support.annotation.Nullable; import com.android.dialer.common.LogUtil; import com.android.dialer.telecom.TelecomUtil; @@ -190,10 +192,16 @@ public class CallLogNotificationsService extends IntentService { String action = intent.getAction(); switch (action) { case ACTION_MARK_NEW_VOICEMAILS_AS_OLD: - if (mVoicemailQueryHandler == null) { - mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver()); - } - mVoicemailQueryHandler.markNewVoicemailsAsOld(intent.getData()); + // VoicemailQueryHandler cannot be created on the IntentService worker thread. The completed + // callback might happen when the thread is dead. + Handler handler = new Handler(Looper.getMainLooper()); + handler.post( + () -> { + if (mVoicemailQueryHandler == null) { + mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver()); + } + mVoicemailQueryHandler.markNewVoicemailsAsOld(intent.getData()); + }); break; case ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS: DefaultVoicemailNotifier.getInstance(this).updateNotification(); diff --git a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java index 02d23e996..b0a6ee135 100644 --- a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java +++ b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java @@ -113,8 +113,10 @@ public class DefaultVoicemailNotifier { context, newCall.number, newCall.countryIso, newCall.dateMs)) { itr.remove(); - // Delete the voicemail. - context.getContentResolver().delete(newCall.voicemailUri, null, null); + if (newCall.voicemailUri != null) { + // Delete the voicemail. + context.getContentResolver().delete(newCall.voicemailUri, null, null); + } continue; } @@ -137,8 +139,7 @@ public class DefaultVoicemailNotifier { } if (newCalls.isEmpty()) { - // No voicemails to notify about: clear the notification. - CallLogNotificationsService.markNewVoicemailsAsOld(context, null); + // No voicemails to notify about return; } @@ -164,7 +165,7 @@ public class DefaultVoicemailNotifier { for (NewCall voicemail : newCalls) { getNotificationManager() .notify( - voicemail.voicemailUri.toString(), + voicemail.callsUri.toString(), NOTIFICATION_ID, createNotificationForVoicemail(voicemail, contactInfos)); } @@ -234,8 +235,12 @@ public class DefaultVoicemailNotifier { contactInfo.name)) .setWhen(voicemail.dateMs) .setSound(notificationInfo.first) - .setDefaults(notificationInfo.second) - .setDeleteIntent(createMarkNewVoicemailsAsOldIntent(voicemail.voicemailUri)); + .setDefaults(notificationInfo.second); + + if (voicemail.voicemailUri != null) { + notificationBuilder.setDeleteIntent( + createMarkNewVoicemailsAsOldIntent(voicemail.voicemailUri)); + } NotificationChannelManager.applyChannel( notificationBuilder, diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java index acbccb39f..15f860009 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java @@ -87,6 +87,8 @@ public class PhoneCallDetailsHelper { (details.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO); views.callTypeIcons.setShowHd( MotorolaUtils.shouldShowHdIconInCallLog(mContext, details.features)); + views.callTypeIcons.setShowWifi( + MotorolaUtils.shouldShowWifiIconInCallLog(mContext, details.features)); views.callTypeIcons.requestLayout(); views.callTypeIcons.setVisibility(View.VISIBLE); diff --git a/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java b/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java index e73684e70..2aa3fb282 100644 --- a/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java +++ b/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java @@ -23,8 +23,10 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.provider.CallLog.Calls; +import android.support.annotation.MainThread; import android.support.annotation.Nullable; import com.android.dialer.app.R; +import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.notification.GroupedNotificationUtil; @@ -38,8 +40,10 @@ public class VoicemailQueryHandler extends AsyncQueryHandler { private Context mContext; + @MainThread public VoicemailQueryHandler(Context context, ContentResolver contentResolver) { super(contentResolver); + Assert.isMainThread(); mContext = context; } |