summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroldenburg <roldenburg@google.com>2017-08-18 18:07:34 -0700
committerEric Erfanian <erfanian@google.com>2017-08-30 11:19:51 -0700
commitacc6db277cb1b1eb88606a64a1d481680824739c (patch)
treebd432c824b5203e65ba4c57882f49e20c4d8d691
parent8b48d10a59eebeb3ca3c4ede23cb66f1e794bcf8 (diff)
Load historical enriched call data in CallDetailsActivity
Previously we were loading the data in the call log and passing it into CallDetailsActivity via the intent. This didn't work out because we weren't always loading the latest data and refreshing the call log to load it would be very expensive (especially considering we were not displaying it there). Bug: 63794593,64329542 Test: CallDetailsActivityTest in jcga, existing tests (CallDetailsActivityIntegrationTest, CallDetailsEntryViewHolderTest) PiperOrigin-RevId: 165777492 Change-Id: I1b29b02d95d627015a49b2b3c7758a94148326fe
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAdapter.java54
-rw-r--r--java/com/android/dialer/calldetails/CallDetailsActivity.java92
-rw-r--r--java/com/android/dialer/calldetails/CallDetailsAdapter.java7
-rw-r--r--java/com/android/dialer/enrichedcall/EnrichedCallManager.java28
-rw-r--r--java/com/android/dialer/enrichedcall/stub/EnrichedCallManagerStub.java8
5 files changed, 128 insertions, 61 deletions
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 5fcf59b28..b335cd571 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -74,7 +74,6 @@ import com.android.dialer.configprovider.ConfigProviderBindings;
import com.android.dialer.enrichedcall.EnrichedCallCapabilities;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.enrichedcall.EnrichedCallManager;
-import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult;
import com.android.dialer.lightbringer.Lightbringer;
import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.lightbringer.LightbringerListener;
@@ -90,8 +89,6 @@ import com.android.dialer.phonenumberutil.PhoneNumberHelper;
import com.android.dialer.spam.Spam;
import com.android.dialer.util.PermissionsUtil;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -368,11 +365,6 @@ public class CallLogAdapter extends GroupingListAdapter
getEnrichedCallManager().requestCapabilities(viewHolder.number);
}
- generateAndMapNewCallDetailsEntriesHistoryResults(
- viewHolder.number,
- viewHolder.getDetailedPhoneDetails(),
- getAllHistoricalData(viewHolder.number, viewHolder.getDetailedPhoneDetails()));
-
if (viewHolder.rowId == mCurrentlyExpandedRowId) {
// Hide actions, if the clicked item is the expanded item.
viewHolder.showActions(false);
@@ -837,12 +829,7 @@ 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);
- CallDetailsEntries updatedCallDetailsEntries =
- generateAndMapNewCallDetailsEntriesHistoryResults(
- views.number,
- callDetailsEntries,
- getAllHistoricalData(views.number, callDetailsEntries));
- views.setDetailedPhoneDetails(updatedCallDetailsEntries);
+ views.setDetailedPhoneDetails(callDetailsEntries);
views.lightbringerReady = getLightbringer().isReachable(mActivity, views.number);
final AsyncTask<Void, Void, Boolean> loadDataTask =
new AsyncTask<Void, Void, Boolean>() {
@@ -902,45 +889,6 @@ public class CallLogAdapter extends GroupingListAdapter
return capabilities.isCallComposerCapable();
}
- @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 static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults(
- @Nullable String number,
- @NonNull CallDetailsEntries callDetailsEntries,
- @NonNull Map<CallDetailsEntry, List<HistoryResult>> mappedResults) {
- if (number == null) {
- return callDetailsEntries;
- }
- CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder();
- for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
- CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry);
- List<HistoryResult> results = mappedResults.get(entry);
- if (results != null) {
- newEntry.addAllHistoryResults(mappedResults.get(entry));
- LogUtil.v(
- "CallLogAdapter.generateAndMapNewCallDetailsEntriesHistoryResults",
- "mapped %d results",
- newEntry.getHistoryResultsList().size());
- }
- mutableCallDetailsEntries.addEntries(newEntry.build());
- }
- return mutableCallDetailsEntries.build();
- }
-
/**
* 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/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 411006c46..385b4d172 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -23,6 +23,7 @@ import android.os.Bundle;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -31,19 +32,27 @@ import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.view.MenuItem;
import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.AsyncTaskExecutors;
import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.enrichedcall.EnrichedCallComponent;
+import com.android.dialer.enrichedcall.EnrichedCallManager.HistoricalDataChangedListener;
+import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.UiAction;
import com.android.dialer.performancereport.PerformanceReport;
import com.android.dialer.postcall.PostCall;
import com.android.dialer.protos.ProtoParsers;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
/** Displays the details of a specific call log entry. */
public class CallDetailsActivity extends AppCompatActivity
- implements OnMenuItemClickListener, CallDetailsFooterViewHolder.ReportCallIdListener {
+ implements OnMenuItemClickListener,
+ CallDetailsFooterViewHolder.ReportCallIdListener,
+ HistoricalDataChangedListener {
public static final String EXTRA_PHONE_NUMBER = "phone_number";
public static final String EXTRA_HAS_ENRICHED_CALL_DATA = "has_enriched_call_data";
@@ -52,8 +61,9 @@ public class CallDetailsActivity extends AppCompatActivity
private static final String EXTRA_CAN_REPORT_CALLER_ID = "can_report_caller_id";
private static final String TASK_DELETE = "task_delete";
- private List<CallDetailsEntry> entries;
+ private CallDetailsEntries entries;
private DialerContact contact;
+ private CallDetailsAdapter adapter;
public static boolean isLaunchIntent(Intent intent) {
return intent.getComponent() != null
@@ -103,6 +113,22 @@ public class CallDetailsActivity extends AppCompatActivity
}
PostCall.promptUserForMessageIfNecessary(this, findViewById(R.id.recycler_view));
+
+ EnrichedCallComponent.get(this)
+ .getEnrichedCallManager()
+ .registerHistoricalDataChangedListener(this);
+ EnrichedCallComponent.get(this)
+ .getEnrichedCallManager()
+ .requestAllHistoricalData(contact.getNumber(), entries);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ EnrichedCallComponent.get(this)
+ .getEnrichedCallManager()
+ .unregisterHistoricalDataChangedListener(this);
}
@Override
@@ -115,12 +141,12 @@ public class CallDetailsActivity extends AppCompatActivity
contact = ProtoParsers.getTrusted(intent, EXTRA_CONTACT, DialerContact.getDefaultInstance());
entries =
ProtoParsers.getTrusted(
- intent, EXTRA_CALL_DETAILS_ENTRIES, CallDetailsEntries.getDefaultInstance())
- .getEntriesList();
+ intent, EXTRA_CALL_DETAILS_ENTRIES, CallDetailsEntries.getDefaultInstance());
+ adapter = new CallDetailsAdapter(this, contact, entries.getEntriesList(), this);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
- recyclerView.setAdapter(new CallDetailsAdapter(this, contact, entries, this));
+ recyclerView.setAdapter(adapter);
PerformanceReport.logOnScrollStateChange(recyclerView);
}
@@ -151,6 +177,58 @@ public class CallDetailsActivity extends AppCompatActivity
return getIntent().getExtras().getBoolean(EXTRA_CAN_REPORT_CALLER_ID, false);
}
+ @Override
+ public void onHistoricalDataChanged() {
+ Map<CallDetailsEntry, List<HistoryResult>> mappedResults =
+ getAllHistoricalData(contact.getNumber(), entries);
+
+ entries =
+ generateAndMapNewCallDetailsEntriesHistoryResults(
+ contact.getNumber(), entries, mappedResults);
+
+ adapter.updateCallDetailsEntries(entries.getEntriesList());
+ }
+
+ @NonNull
+ private Map<CallDetailsEntry, List<HistoryResult>> getAllHistoricalData(
+ @Nullable String number, @NonNull CallDetailsEntries entries) {
+ if (number == null) {
+ return Collections.emptyMap();
+ }
+
+ Map<CallDetailsEntry, List<HistoryResult>> historicalData =
+ EnrichedCallComponent.get(this)
+ .getEnrichedCallManager()
+ .getAllHistoricalData(number, entries);
+ if (historicalData == null) {
+ return Collections.emptyMap();
+ }
+ return historicalData;
+ }
+
+ private static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults(
+ @Nullable String number,
+ @NonNull CallDetailsEntries callDetailsEntries,
+ @NonNull Map<CallDetailsEntry, List<HistoryResult>> mappedResults) {
+ if (number == null) {
+ return callDetailsEntries;
+ }
+ CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder();
+ for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
+ CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry);
+ List<HistoryResult> results = mappedResults.get(entry);
+ if (results != null) {
+ newEntry.addAllHistoryResults(mappedResults.get(entry));
+ LogUtil.v(
+ "CallLogAdapter.generateAndMapNewCallDetailsEntriesHistoryResults",
+ "mapped %d results",
+ newEntry.getHistoryResultsList().size());
+ }
+ mutableCallDetailsEntries.addEntries(newEntry.build());
+ }
+ return mutableCallDetailsEntries.build();
+ }
+
/** Delete specified calls from the call log. */
private class DeleteCallsTask extends AsyncTask<Void, Void, Void> {
@@ -158,7 +236,7 @@ public class CallDetailsActivity extends AppCompatActivity
DeleteCallsTask() {
StringBuilder callIds = new StringBuilder();
- for (CallDetailsEntry entry : entries) {
+ for (CallDetailsEntry entry : entries.getEntriesList()) {
if (callIds.length() != 0) {
callIds.append(",");
}
@@ -178,7 +256,7 @@ public class CallDetailsActivity extends AppCompatActivity
public void onPostExecute(Void result) {
Intent data = new Intent();
data.putExtra(EXTRA_PHONE_NUMBER, contact.getNumber());
- for (CallDetailsEntry entry : entries) {
+ for (CallDetailsEntry entry : entries.getEntriesList()) {
if (entry.getHistoryResultsCount() > 0) {
data.putExtra(EXTRA_HAS_ENRICHED_CALL_DATA, true);
break;
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
index 66a736c8d..645587461 100644
--- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java
+++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
@@ -37,9 +37,9 @@ final class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private static final int FOOTER_VIEW_TYPE = 3;
private final DialerContact contact;
- private final List<CallDetailsEntry> callDetailsEntries;
private final CallDetailsFooterViewHolder.ReportCallIdListener listener;
private final CallTypeHelper callTypeHelper;
+ private List<CallDetailsEntry> callDetailsEntries;
CallDetailsAdapter(
Context context,
@@ -105,4 +105,9 @@ final class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public int getItemCount() {
return callDetailsEntries.size() + 2; // Header + footer
}
+
+ void updateCallDetailsEntries(List<CallDetailsEntry> entries) {
+ callDetailsEntries = entries;
+ notifyDataSetChanged();
+ }
}
diff --git a/java/com/android/dialer/enrichedcall/EnrichedCallManager.java b/java/com/android/dialer/enrichedcall/EnrichedCallManager.java
index 4d00854ef..0606a00e5 100644
--- a/java/com/android/dialer/enrichedcall/EnrichedCallManager.java
+++ b/java/com/android/dialer/enrichedcall/EnrichedCallManager.java
@@ -177,6 +177,34 @@ public interface EnrichedCallManager {
@NonNull
Filter createOutgoingCallComposerFilter();
+ /** Receives updates when the state of an historical data changes. */
+ interface HistoricalDataChangedListener {
+
+ /**
+ * Callback fired when historical data changes. Listeners should call {@link
+ * #getAllHistoricalData(String, CallDetailsEntries)} to retrieve the new data.
+ */
+ void onHistoricalDataChanged();
+ }
+
+ /**
+ * Registers the given {@link HistoricalDataChangedListener}.
+ *
+ * <p>As a result of this method, the listener will receive updates when the state of any enriched
+ * call historical data changes.
+ */
+ @MainThread
+ void registerHistoricalDataChangedListener(@NonNull HistoricalDataChangedListener listener);
+
+ /**
+ * Unregisters the given {@link HistoricalDataChangedListener}.
+ *
+ * <p>As a result of this method, the listener will not receive updates when the state of enriched
+ * call historical data changes.
+ */
+ @MainThread
+ void unregisterHistoricalDataChangedListener(@NonNull HistoricalDataChangedListener listener);
+
/**
* Starts an asynchronous process to get all historical data for the given number and set of
* {@link CallDetailsEntries}.
diff --git a/java/com/android/dialer/enrichedcall/stub/EnrichedCallManagerStub.java b/java/com/android/dialer/enrichedcall/stub/EnrichedCallManagerStub.java
index de95e0725..87d99def8 100644
--- a/java/com/android/dialer/enrichedcall/stub/EnrichedCallManagerStub.java
+++ b/java/com/android/dialer/enrichedcall/stub/EnrichedCallManagerStub.java
@@ -107,6 +107,14 @@ public final class EnrichedCallManagerStub implements EnrichedCallManager {
return session -> false;
}
+ @Override
+ public void registerHistoricalDataChangedListener(
+ @NonNull HistoricalDataChangedListener listener) {}
+
+ @Override
+ public void unregisterHistoricalDataChangedListener(
+ @NonNull HistoricalDataChangedListener listener) {}
+
@Nullable
@Override
@MainThread