summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzachh <zachh@google.com>2017-12-04 17:53:27 -0800
committerCopybara-Service <copybara-piper@google.com>2017-12-07 11:00:47 -0800
commitb29f58262aef174c0b51c14c7b764e5ee934c67f (patch)
treea11bbc9272eaf4e69e0f61b6384c11b43e7b5187
parent47aa39c7ea423722254b5a70b50dc6c1513b9ee5 (diff)
Added PhoneLookupHistoryRecorder.
When a call is added in InCallUi, it fetches the current PhoneLookupInfo for the call and writes it to PhoneLookupHistory. Required updating PhoneLookupHistoryContentProvider#update to use "replace" to (presumably) atomically insert when a row is missing. Bug: 34672501 Test: unit PiperOrigin-RevId: 177896892 Change-Id: I43f9ded240a81156722be816a9635d586de642a1
-rw-r--r--java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java3
-rw-r--r--java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java30
-rw-r--r--java/com/android/incallui/InCallPresenter.java2
-rw-r--r--java/com/android/incallui/PhoneLookupHistoryRecorder.java116
4 files changed, 139 insertions, 12 deletions
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
index 307f998ea..cfb8fb7b8 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
@@ -82,7 +82,8 @@ public final class Cp2PhoneLookup implements PhoneLookup {
@Override
public ListenableFuture<PhoneLookupInfo> lookup(@NonNull Call call) {
- throw new UnsupportedOperationException();
+ // TODO(zachh): Implementation.
+ return MoreExecutors.newDirectExecutorService().submit(PhoneLookupInfo::getDefaultInstance);
}
@Override
diff --git a/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java b/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java
index 27041e746..e85654e99 100644
--- a/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java
+++ b/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java
@@ -201,6 +201,12 @@ public class PhoneLookupHistoryContentProvider extends ContentProvider {
return rows;
}
+ /**
+ * Note: If the normalized number is included as part of the URI (for example,
+ * "content://com.android.dialer.phonelookuphistory/PhoneLookupHistory/+123") then the update
+ * operation will actually be a "replace" operation, inserting a new row if one does not already
+ * exist.
+ */
@Override
public int update(
@NonNull Uri uri,
@@ -214,7 +220,13 @@ public class PhoneLookupHistoryContentProvider extends ContentProvider {
int match = uriMatcher.match(uri);
switch (match) {
case PHONE_LOOKUP_HISTORY_TABLE_CODE:
- break;
+ int rows = database.update(PhoneLookupHistory.TABLE, values, selection, selectionArgs);
+ if (rows == 0) {
+ LogUtil.w("PhoneLookupHistoryContentProvider.update", "no rows updated");
+ return rows;
+ }
+ notifyChange(uri);
+ return rows;
case PHONE_LOOKUP_HISTORY_TABLE_ID_CODE:
Assert.checkArgument(
!values.containsKey(PhoneLookupHistory.NORMALIZED_NUMBER),
@@ -222,19 +234,15 @@ public class PhoneLookupHistoryContentProvider extends ContentProvider {
Assert.checkArgument(selection == null, "Do not specify selection when updating by ID");
Assert.checkArgument(
selectionArgs == null, "Do not specify selection args when updating by ID");
- selection = PhoneLookupHistory.NORMALIZED_NUMBER + "= ?";
- selectionArgs = new String[] {uri.getLastPathSegment()};
- break;
+
+ String normalizedNumber = uri.getLastPathSegment();
+ values.put(PhoneLookupHistory.NORMALIZED_NUMBER, normalizedNumber);
+ database.replace(PhoneLookupHistory.TABLE, null, values);
+ notifyChange(uri);
+ return 1;
default:
throw new IllegalArgumentException("Unknown uri: " + uri);
}
- int rows = database.update(PhoneLookupHistory.TABLE, values, selection, selectionArgs);
- if (rows == 0) {
- LogUtil.w("PhoneLookupHistoryContentProvider.update", "no rows updated");
- return rows;
- }
- notifyChange(uri);
- return rows;
}
private void notifyChange(Uri uri) {
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index c5310b969..f8605ae7c 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -545,6 +545,8 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud
// Since a call has been added we are no longer waiting for Telecom to send us a call.
setBoundAndWaitingForOutgoingCall(false, null);
call.registerCallback(mCallCallback);
+ // TODO(maxwelb): Return the future in recordPhoneLookupInfo and propagate.
+ PhoneLookupHistoryRecorder.recordPhoneLookupInfo(mContext.getApplicationContext(), call);
Trace.endSection();
}
diff --git a/java/com/android/incallui/PhoneLookupHistoryRecorder.java b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
new file mode 100644
index 000000000..2632e6515
--- /dev/null
+++ b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2017 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.incallui;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.telecom.Call;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionInfo;
+import android.text.TextUtils;
+import com.android.dialer.buildtype.BuildType;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutors;
+import com.android.dialer.location.CountryDetector;
+import com.android.dialer.phonelookup.PhoneLookupComponent;
+import com.android.dialer.phonelookup.PhoneLookupInfo;
+import com.android.dialer.phonelookup.database.contract.PhoneLookupHistoryContract.PhoneLookupHistory;
+import com.android.dialer.telecom.TelecomUtil;
+import com.android.incallui.util.TelecomCallUtil;
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Locale;
+
+/**
+ * Fetches the current {@link PhoneLookupInfo} for the provided call and writes it to the
+ * PhoneLookupHistory.
+ */
+final class PhoneLookupHistoryRecorder {
+
+ /**
+ * If the new UI is enabled, fetches the current {@link PhoneLookupInfo} for the provided call and
+ * writes it to the PhoneLookupHistory. Otherwise does nothing.
+ */
+ static void recordPhoneLookupInfo(Context appContext, Call call) {
+ if (!(BuildType.get() == BuildType.BUGFOOD || LogUtil.isDebugEnabled())) {
+ return;
+ }
+ ListenableFuture<PhoneLookupInfo> future =
+ PhoneLookupComponent.get(appContext).phoneLookup().lookup(call);
+ Futures.addCallback(
+ future,
+ new FutureCallback<PhoneLookupInfo>() {
+ @Override
+ public void onSuccess(@Nullable PhoneLookupInfo result) {
+ Assert.checkArgument(result != null);
+ Optional<String> normalizedNumber = getNormalizedNumber(appContext, call);
+ if (!normalizedNumber.isPresent()) {
+ LogUtil.w("PhoneLookupHistoryRecorder.onSuccess", "couldn't get a number");
+ return;
+ }
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(PhoneLookupHistory.PHONE_LOOKUP_INFO, result.toByteArray());
+ contentValues.put(PhoneLookupHistory.LAST_MODIFIED, System.currentTimeMillis());
+ appContext
+ .getContentResolver()
+ .update(
+ PhoneLookupHistory.CONTENT_URI
+ .buildUpon()
+ .appendEncodedPath(normalizedNumber.get())
+ .build(),
+ contentValues,
+ null,
+ null);
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ // TODO(zachh): Consider how to best handle this; take measures to repair call log?
+ LogUtil.w(
+ "PhoneLookupHistoryRecorder.onFailure", "could not write PhoneLookupHistory", t);
+ }
+ },
+ DialerExecutors.getLowPriorityThreadPool(appContext));
+ }
+
+ private static Optional<String> getNormalizedNumber(Context appContext, Call call) {
+ PhoneAccountHandle phoneAccountHandle = call.getDetails().getAccountHandle();
+ Optional<SubscriptionInfo> subscriptionInfo =
+ TelecomUtil.getSubscriptionInfo(appContext, phoneAccountHandle);
+ String countryCode =
+ subscriptionInfo.isPresent()
+ ? subscriptionInfo.get().getCountryIso()
+ : CountryDetector.getInstance(appContext).getCurrentCountryIso();
+ if (countryCode == null) {
+ LogUtil.w(
+ "PhoneLookupHistoryRecorder.getNormalizedNumber",
+ "couldn't find a country code for call");
+ countryCode = "US";
+ }
+ String rawNumber = TelecomCallUtil.getNumber(call);
+ if (TextUtils.isEmpty(rawNumber)) {
+ return Optional.absent();
+ }
+ String normalizedNumber =
+ PhoneNumberUtils.formatNumberToE164(rawNumber, countryCode.toUpperCase(Locale.US));
+ return normalizedNumber == null ? Optional.of(rawNumber) : Optional.of(normalizedNumber);
+ }
+}