summaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-02-27 08:23:07 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-02-27 08:23:07 +0000
commit40cc9a48485dab480e0337e92962792ce3747d1d (patch)
treeb4edf335d4d88c9e9285cfcc047f790f4532006d /java
parent53f2beb5441a784a227998c7643d568362b1e635 (diff)
parent3a813aa263151e63eab3b1a39221016314d99720 (diff)
downloadandroid_packages_apps_Dialer-40cc9a48485dab480e0337e92962792ce3747d1d.tar.gz
android_packages_apps_Dialer-40cc9a48485dab480e0337e92962792ce3747d1d.tar.bz2
android_packages_apps_Dialer-40cc9a48485dab480e0337e92962792ce3747d1d.zip
Snap for 4623514 from 3a813aa263151e63eab3b1a39221016314d99720 to pi-release
Change-Id: I745582c2cdd41037e3dea3d84db73113168ca310
Diffstat (limited to 'java')
-rw-r--r--java/com/android/dialer/app/calllog/BlockReportSpamListener.java2
-rw-r--r--java/com/android/dialer/blocking/res/values/colors.xml3
-rw-r--r--java/com/android/dialer/blocking/res/values/strings.xml88
-rw-r--r--java/com/android/dialer/blockreportspam/AndroidManifest.xml18
-rw-r--r--java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java (renamed from java/com/android/dialer/blocking/BlockReportSpamDialogs.java)61
-rw-r--r--java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java76
-rw-r--r--java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java171
-rw-r--r--java/com/android/dialer/blockreportspam/res/layout/block_report_spam_dialog.xml (renamed from java/com/android/dialer/blocking/res/layout/block_report_spam_dialog.xml)0
-rw-r--r--java/com/android/dialer/blockreportspam/res/values/colors.xml21
-rw-r--r--java/com/android/dialer/blockreportspam/res/values/dimens.xml (renamed from java/com/android/dialer/blocking/res/values/dimens.xml)0
-rw-r--r--java/com/android/dialer/blockreportspam/res/values/strings.xml63
-rw-r--r--java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java2
-rw-r--r--java/com/android/dialer/calllog/ui/menu/Modules.java4
-rw-r--r--java/com/android/dialer/calllogutils/NumberAttributesConverter.java2
-rw-r--r--java/com/android/dialer/contactactions/SharedModules.java64
-rw-r--r--java/com/android/dialer/dialpadview/res/layout/row_deviceid.xml6
-rw-r--r--java/com/android/dialer/main/MainActivityPeer.java2
-rw-r--r--java/com/android/dialer/main/impl/MainActivity.java6
-rw-r--r--java/com/android/dialer/main/impl/MainSearchController.java4
-rw-r--r--java/com/android/dialer/main/impl/NewMainActivityPeer.java17
-rw-r--r--java/com/android/dialer/main/impl/OldMainActivityPeer.java3
-rw-r--r--java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml15
-rw-r--r--java/com/android/dialer/main/impl/toolbar/res/values/strings.xml4
-rw-r--r--java/com/android/dialer/phonelookup/PhoneLookupModule.java12
-rw-r--r--java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java135
-rw-r--r--java/com/android/dialer/phonelookup/cp2/Cp2DefaultDirectoryPhoneLookup.java (renamed from java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java)45
-rw-r--r--java/com/android/dialer/phonelookup/cp2/Cp2ExtendedDirectoryPhoneLookup.java (renamed from java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java)77
-rw-r--r--java/com/android/dialer/phonelookup/phone_lookup_info.proto51
-rw-r--r--java/com/android/dialer/searchfragment/directories/DirectoryContactViewHolder.java2
-rw-r--r--java/com/android/dialer/searchfragment/directories/DirectoryContactsCursor.java2
-rw-r--r--java/com/android/dialer/searchfragment/directories/DirectoryContactsCursorLoader.java3
-rw-r--r--java/com/android/dialer/simulator/impl/NonSimulatorConnectionListener.java5
-rw-r--r--java/com/android/dialer/voicemail/listui/menu/Modules.java4
-rw-r--r--java/com/android/incallui/CallCardPresenter.java63
-rw-r--r--java/com/android/incallui/answer/impl/AnswerFragment.java10
-rw-r--r--java/com/android/incallui/callpending/CallPendingActivity.java6
-rw-r--r--java/com/android/incallui/contactgrid/BottomRow.java18
-rw-r--r--java/com/android/incallui/contactgrid/ContactGridManager.java15
-rw-r--r--java/com/android/incallui/contactgrid/TopRow.java65
-rw-r--r--java/com/android/incallui/incall/impl/InCallFragment.java7
-rw-r--r--java/com/android/incallui/incall/protocol/PrimaryCallState.java261
-rw-r--r--java/com/android/incallui/rtt/impl/RttChatFragment.java4
-rw-r--r--java/com/android/incallui/spam/SpamNotificationActivity.java2
43 files changed, 932 insertions, 487 deletions
diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 092c0982e..c8f8f0cf4 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -20,8 +20,8 @@ import android.app.FragmentManager;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
-import com.android.dialer.blocking.BlockReportSpamDialogs;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs;
import com.android.dialer.common.LogUtil;
import com.android.dialer.logging.ContactSource;
import com.android.dialer.logging.DialerImpression;
diff --git a/java/com/android/dialer/blocking/res/values/colors.xml b/java/com/android/dialer/blocking/res/values/colors.xml
index d1a567d9e..374ba8d14 100644
--- a/java/com/android/dialer/blocking/res/values/colors.xml
+++ b/java/com/android/dialer/blocking/res/values/colors.xml
@@ -15,9 +15,6 @@
-->
<resources>
- <!-- 87% black -->
- <color name="block_report_spam_primary_text_color">#de000000</color>
-
<!-- Note, this is also used by InCallUi. -->
<color name="blocked_contact_background">#A52714</color>
diff --git a/java/com/android/dialer/blocking/res/values/strings.xml b/java/com/android/dialer/blocking/res/values/strings.xml
index 8abff4561..a660731b4 100644
--- a/java/com/android/dialer/blocking/res/values/strings.xml
+++ b/java/com/android/dialer/blocking/res/values/strings.xml
@@ -24,54 +24,59 @@
<!-- Positive confirmation button for the dialog which opens when the user needs to migrate to the framework blocking implementation [CHAR LIMIT=NONE]-->
<string name="migrate_blocked_numbers_dialog_allow_button">Allow</string>
- <!-- Do not translate -->
- <string name="migrate_blocked_numbers_dialog_cancel_button">@android:string/cancel</string>
+ <string name="migrate_blocked_numbers_dialog_cancel_button" translatable="false">
+ @android:string/cancel
+ </string>
<!-- Confirmation dialog title for blocking a number. [CHAR LIMIT=NONE] -->
- <string name="block_number_confirmation_title">Block
- <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?</string>
+ <string name="block_number_confirmation_title">
+ Block<xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?
+ </string>
<!-- Confirmation dialog message for blocking a number with visual voicemail active.
[CHAR LIMIT=NONE] -->
- <string name="block_number_confirmation_message_vvm">
- Calls from this number will be blocked and voicemails will be automatically deleted.
- </string>
+ <string name="block_number_confirmation_message_vvm">
+ Calls from this number will be blocked and voicemails will be automatically deleted.
+ </string>
<!-- Confirmation dialog message for blocking a number with no visual voicemail.
[CHAR LIMIT=NONE] -->
- <string name="block_number_confirmation_message_no_vvm">
- Calls from this number will be blocked, but the caller may still be able to leave you voicemails.
- </string>
+ <string name="block_number_confirmation_message_no_vvm">
+ Calls from this number will be blocked, but the caller may still be able to leave you voicemails.
+ </string>
<!-- Confirmation dialog message for blocking a number with new filtering enabled.
[CHAR LIMIT=NONE] -->
- <string name="block_number_confirmation_message_new_filtering">
- You will no longer receive calls or texts from this number.
- </string>
+ <string name="block_number_confirmation_message_new_filtering">
+ You will no longer receive calls or texts from this number.
+ </string>
<!-- Block number alert dialog button [CHAR LIMIT=32] -->
<string name="block_number_ok">BLOCK</string>
<!-- Confirmation dialog for unblocking a number. [CHAR LIMIT=NONE] -->
- <string name="unblock_number_confirmation_title">Unblock
- <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?</string>
+ <string name="unblock_number_confirmation_title">
+ Unblock<xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?
+ </string>
<!-- Unblock number alert dialog button [CHAR LIMIT=32] -->
<string name="unblock_number_ok">UNBLOCK</string>
<!-- Error message shown when user tries to add invalid number to the block list.
[CHAR LIMIT=64] -->
- <string name="invalidNumber"><xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>
- is invalid.</string>
+ <string name="invalidNumber">
+ <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>is invalid.
+ </string>
<!-- Text for snackbar to undo blocking a number. [CHAR LIMIT=64] -->
- <string name="snackbar_number_blocked">
- <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g> blocked</string>
+ <string name="snackbar_number_blocked">
+ <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g> blocked
+ </string>
<!-- Text for snackbar to undo unblocking a number. [CHAR LIMIT=64] -->
- <string name="snackbar_number_unblocked">
- <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>
- unblocked</string>
+ <string name="snackbar_number_unblocked">
+ <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>unblocked
+ </string>
<!-- Text for undo button in snackbar for blocking/unblocking number. [CHAR LIMIT=10] -->
<string name="block_number_undo">UNDO</string>
@@ -81,42 +86,15 @@
<!-- Title of notification telling the user that call blocking has been temporarily disabled.
[CHAR LIMIT=56] -->
- <string name="call_blocking_disabled_notification_title">
- Call blocking disabled for 48 hours
- </string>
+ <string name="call_blocking_disabled_notification_title">
+ Call blocking disabled for 48 hours
+ </string>
<!-- Text for notification which provides the reason that call blocking has been temporarily
disabled. Namely, we disable call blocking after an emergency call in case of return
phone calls made by emergency services. [CHAR LIMIT=64] -->
- <string name="call_blocking_disabled_notification_text">
- Disabled because an emergency call was made.
- </string>
-
- <!-- Title of alert dialog after clicking on Block/report as spam. [CHAR LIMIT=100] -->
- <string name="block_report_number_alert_title">Block <xliff:g id="number">%1$s</xliff:g>?</string>
-
- <!-- Text in alert dialog after clicking on Block/report as spam. [CHAR LIMIT=100] -->
- <string name="block_report_number_alert_details">You will no longer receive calls from this number.</string>
-
- <!-- Text in alert dialog after clicking on Block. [CHAR LIMIT=100] -->
- <string name="block_number_alert_details"><xliff:g id="text">%1$s</xliff:g> This call will be reported as spam.</string>
-
- <!-- Text in alert dialog after clicking on Unblock. [CHAR LIMIT=100] -->
- <string name="unblock_number_alert_details">This number will be unblocked and reported as not spam. Future calls won\'t be identified as spam.</string>
-
- <!-- Title of alert dialog after clicking on Unblock. [CHAR LIMIT=100] -->
- <string name="unblock_report_number_alert_title">Unblock <xliff:g id="number">%1$s</xliff:g>?</string>
-
- <!-- Report not spam number alert dialog button [CHAR LIMIT=32] -->
- <string name="report_not_spam_alert_button">Report</string>
-
- <!-- Title of alert dialog after clicking on Report as not spam. [CHAR LIMIT=100] -->
- <string name="report_not_spam_alert_title">Report a mistake?</string>
-
- <!-- Text in alert dialog after clicking on Report as not spam. [CHAR LIMIT=100] -->
- <string name="report_not_spam_alert_details">Future calls from <xliff:g id="number">%1$s</xliff:g> will no longer be identified as spam.</string>
-
- <!-- Label for checkbox in the Alert dialog to allow the user to report the number as spam as well. [CHAR LIMIT=30] -->
- <string name="checkbox_report_as_spam_action">Report call as spam</string>
+ <string name="call_blocking_disabled_notification_text">
+ Disabled because an emergency call was made.
+ </string>
</resources>
diff --git a/java/com/android/dialer/blockreportspam/AndroidManifest.xml b/java/com/android/dialer/blockreportspam/AndroidManifest.xml
new file mode 100644
index 000000000..6e08043de
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+
+<manifest package="com.android.dialer.blockreportspam"/> \ No newline at end of file
diff --git a/java/com/android/dialer/blocking/BlockReportSpamDialogs.java b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
index 255d7cbf9..b75669fa3 100644
--- a/java/com/android/dialer/blocking/BlockReportSpamDialogs.java
+++ b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.dialer.blocking;
+package com.android.dialer.blockreportspam;
import android.app.Activity;
import android.app.AlertDialog;
@@ -26,11 +26,13 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.CheckBox;
-import android.widget.CompoundButton;
import android.widget.TextView;
+import com.android.dialer.blocking.FilteredNumberCompat;
-/** Helper class for creating block/report dialog fragments. */
-public class BlockReportSpamDialogs {
+/**
+ * Helper class for creating dialog fragments to block a number and/or report it as spam/not spam.
+ */
+public final class BlockReportSpamDialogs {
public static final String BLOCK_REPORT_SPAM_DIALOG_TAG = "BlockReportSpamDialog";
public static final String BLOCK_DIALOG_TAG = "BlockDialog";
@@ -42,14 +44,7 @@ public class BlockReportSpamDialogs {
Activity activity, final DialogFragment fragment) {
return new AlertDialog.Builder(activity, R.style.AlertDialogTheme)
.setCancelable(true)
- .setNegativeButton(
- android.R.string.cancel,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- fragment.dismiss();
- }
- });
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> fragment.dismiss());
}
/**
@@ -58,12 +53,9 @@ public class BlockReportSpamDialogs {
*/
private static DialogInterface.OnClickListener createGenericOnClickListener(
final DialogFragment fragment, final OnConfirmListener listener) {
- return new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- fragment.dismiss();
- listener.onClick();
- }
+ return (dialog, which) -> {
+ fragment.dismiss();
+ listener.onClick();
};
}
@@ -98,8 +90,8 @@ public class BlockReportSpamDialogs {
void onClick();
}
- /** Contains the common attributes between all block/unblock/report dialog fragments. */
- private static class CommonDialogsFragment extends DialogFragment {
+ /** Contains the common attributes between all block/unblock/report spam dialog fragments. */
+ private abstract static class CommonDialogsFragment extends DialogFragment {
/** The number to display in the dialog title. */
protected String displayNumber;
@@ -133,7 +125,7 @@ public class BlockReportSpamDialogs {
public static class BlockReportSpamDialogFragment extends CommonDialogsFragment {
/** Called when dialog positive button is pressed. */
- private OnSpamDialogClickListener positiveListener;
+ private OnSpamDialogClickListener onSpamDialogClickListener;
/** Whether the mark as spam checkbox is checked before displaying the dialog. */
private boolean spamChecked;
@@ -141,12 +133,12 @@ public class BlockReportSpamDialogs {
public static DialogFragment newInstance(
String displayNumber,
boolean spamChecked,
- OnSpamDialogClickListener positiveListener,
+ OnSpamDialogClickListener onSpamDialogClickListener,
@Nullable DialogInterface.OnDismissListener dismissListener) {
BlockReportSpamDialogFragment fragment = new BlockReportSpamDialogFragment();
fragment.spamChecked = spamChecked;
fragment.displayNumber = displayNumber;
- fragment.positiveListener = positiveListener;
+ fragment.onSpamDialogClickListener = onSpamDialogClickListener;
fragment.dismissListener = dismissListener;
return fragment;
}
@@ -159,34 +151,25 @@ public class BlockReportSpamDialogs {
(CheckBox) dialogView.findViewById(R.id.report_number_as_spam_action);
// Listen for changes on the checkbox and update if orientation changes
isSpamCheckbox.setChecked(spamChecked);
- isSpamCheckbox.setOnCheckedChangeListener(
- new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- spamChecked = isChecked;
- }
- });
+ isSpamCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> spamChecked = isChecked);
TextView details = (TextView) dialogView.findViewById(R.id.block_details);
details.setText(getBlockMessage(getContext()));
AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
- Dialog dialog =
+ Dialog blockReportSpamDialog =
alertDialogBuilder
.setView(dialogView)
.setTitle(getString(R.string.block_report_number_alert_title, displayNumber))
.setPositiveButton(
R.string.block_number_ok,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- positiveListener.onClick(isSpamCheckbox.isChecked());
- }
+ (dialog, which) -> {
+ dismiss();
+ onSpamDialogClickListener.onClick(isSpamCheckbox.isChecked());
})
.create();
- dialog.setCanceledOnTouchOutside(true);
- return dialog;
+ blockReportSpamDialog.setCanceledOnTouchOutside(true);
+ return blockReportSpamDialog;
}
}
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
new file mode 100644
index 000000000..fd6a807cc
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 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.dialer.blockreportspam;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.content.LocalBroadcastManager;
+import com.android.dialer.common.LogUtil;
+
+/**
+ * Notifies that a dialog for blocking a number and/or marking it as spam/not spam should be shown.
+ */
+public final class ShowBlockReportSpamDialogNotifier {
+
+ private ShowBlockReportSpamDialogNotifier() {}
+
+ /**
+ * Notifies that a dialog for blocking a number and optionally report it as spam should be shown.
+ *
+ * @param context Context
+ * @param normalizedNumber The number to be blocked/marked as spam
+ * @param countryIso The ISO 3166-1 two letters country code for the number
+ * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+ */
+ public static void notifyShowDialogToBlockNumberAndOptionallyReportSpam(
+ Context context, String normalizedNumber, String countryIso, int callType) {
+ LogUtil.enterBlock(
+ "ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumberAndOptionallyReportSpam");
+
+ Intent intent = new Intent();
+ intent.setAction(
+ ShowBlockReportSpamDialogReceiver
+ .ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM);
+
+ intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_NUMBER, normalizedNumber);
+ intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_COUNTRY_ISO, countryIso);
+ intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_CALL_TYPE, callType);
+
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ }
+
+ /**
+ * Notifies that a dialog for reporting a number as not spam should be shown.
+ *
+ * @param context Context
+ * @param normalizedNumber The number to be reported as not spam
+ * @param countryIso The ISO 3166-1 two letters country code for the number
+ * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+ */
+ public static void notifyShowDialogToReportNotSpam(
+ Context context, String normalizedNumber, String countryIso, int callType) {
+ LogUtil.enterBlock("ShowBlockReportSpamDialogNotifier.notifyShowDialogToReportNotSpam");
+
+ Intent intent = new Intent();
+ intent.setAction(ShowBlockReportSpamDialogReceiver.ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM);
+ intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_NUMBER, normalizedNumber);
+ intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_COUNTRY_ISO, countryIso);
+ intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_CALL_TYPE, callType);
+
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ }
+}
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
new file mode 100644
index 000000000..9642468cb
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2018 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.dialer.blockreportspam;
+
+import android.app.FragmentManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.widget.Toast;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs.OnConfirmListener;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs.OnSpamDialogClickListener;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.ContactSource;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ReportingLocation;
+import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
+import java.util.Locale;
+
+/**
+ * A {@link BroadcastReceiver} that shows an appropriate dialog upon receiving notifications from
+ * {@link ShowBlockReportSpamDialogNotifier}.
+ */
+public final class ShowBlockReportSpamDialogReceiver extends BroadcastReceiver {
+
+ static final String ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM =
+ "show_dialog_to_block_number_and_optionally_report_spam";
+ static final String ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM = "show_dialog_to_report_not_spam";
+ static final String EXTRA_NUMBER = "number";
+ static final String EXTRA_COUNTRY_ISO = "country_iso";
+ static final String EXTRA_CALL_TYPE = "call_type";
+
+ /** {@link FragmentManager} needed to show a {@link android.app.DialogFragment}. */
+ private final FragmentManager fragmentManager;
+
+ /** Returns an {@link IntentFilter} containing all actions accepted by this broadcast receiver. */
+ public static IntentFilter getIntentFilter() {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM);
+ intentFilter.addAction(ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM);
+ return intentFilter;
+ }
+
+ public ShowBlockReportSpamDialogReceiver(FragmentManager fragmentManager) {
+ this.fragmentManager = fragmentManager;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ LogUtil.enterBlock("ShowBlockReportSpamDialogReceiver.onReceive");
+
+ String action = intent.getAction();
+
+ switch (Assert.isNotNull(action)) {
+ case ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM:
+ showDialogToBlockNumberAndOptionallyReportSpam(context, intent);
+ break;
+ case ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM:
+ showDialogToReportNotSpam(context, intent);
+ break;
+ default:
+ throw new IllegalStateException("Unsupported action: " + action);
+ }
+ }
+
+ private void showDialogToBlockNumberAndOptionallyReportSpam(Context context, Intent intent) {
+ LogUtil.enterBlock(
+ "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam");
+
+ Assert.checkArgument(intent.hasExtra(EXTRA_NUMBER));
+ Assert.checkArgument(intent.hasExtra(EXTRA_COUNTRY_ISO));
+ Assert.checkArgument(intent.hasExtra(EXTRA_CALL_TYPE));
+
+ String normalizedNumber = intent.getStringExtra(EXTRA_NUMBER);
+ String countryIso = intent.getStringExtra(EXTRA_COUNTRY_ISO);
+ int callType = intent.getIntExtra(EXTRA_CALL_TYPE, 0);
+
+ Spam spam = SpamComponent.get(context).spam();
+
+ // Set up the positive listener for the dialog.
+ OnSpamDialogClickListener onSpamDialogClickListener =
+ reportSpam -> {
+ LogUtil.i(
+ "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam",
+ "confirmed");
+
+ if (reportSpam && spam.isSpamEnabled()) {
+ LogUtil.i(
+ "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam",
+ "report spam");
+ Logger.get(context)
+ .logImpression(
+ DialerImpression.Type
+ .REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG);
+ spam.reportSpamFromCallHistory(
+ normalizedNumber,
+ countryIso,
+ callType,
+ ReportingLocation.Type.UNKNOWN_REPORTING_LOCATION /* TODO(a bug): Fix. */,
+ ContactSource.Type.UNKNOWN_SOURCE_TYPE /* TODO(a bug): Fix. */);
+ }
+
+ // TODO(a bug): Block the number.
+ Toast.makeText(
+ context,
+ String.format(Locale.ENGLISH, "TODO: " + "Block number %s.", normalizedNumber),
+ Toast.LENGTH_SHORT)
+ .show();
+ };
+
+ // Create and show the dialog.
+ BlockReportSpamDialogs.BlockReportSpamDialogFragment.newInstance(
+ normalizedNumber,
+ spam.isDialogReportSpamCheckedByDefault(),
+ onSpamDialogClickListener,
+ /* dismissListener = */ null)
+ .show(fragmentManager, BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
+ }
+
+ private void showDialogToReportNotSpam(Context context, Intent intent) {
+ LogUtil.enterBlock("ShowBlockReportSpamDialogReceiver.showDialogToReportNotSpam");
+
+ Assert.checkArgument(intent.hasExtra(EXTRA_NUMBER));
+ Assert.checkArgument(intent.hasExtra(EXTRA_COUNTRY_ISO));
+ Assert.checkArgument(intent.hasExtra(EXTRA_CALL_TYPE));
+
+ String normalizedNumber = intent.getStringExtra(EXTRA_NUMBER);
+ String countryIso = intent.getStringExtra(EXTRA_COUNTRY_ISO);
+ int callType = intent.getIntExtra(EXTRA_CALL_TYPE, 0);
+
+ // Set up the positive listener for the dialog.
+ OnConfirmListener onConfirmListener =
+ () -> {
+ LogUtil.i("ShowBlockReportSpamDialogReceiver.showDialogToReportNotSpam", "confirmed");
+
+ Spam spam = SpamComponent.get(context).spam();
+ if (spam.isSpamEnabled()) {
+ Logger.get(context)
+ .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
+ spam.reportNotSpamFromCallHistory(
+ normalizedNumber,
+ countryIso,
+ callType,
+ ReportingLocation.Type.UNKNOWN_REPORTING_LOCATION /* TODO(a bug): Fix. */,
+ ContactSource.Type.UNKNOWN_SOURCE_TYPE /* TODO(a bug): Fix. */);
+ }
+ };
+
+ // Create & show the dialog.
+ BlockReportSpamDialogs.ReportNotSpamDialogFragment.newInstance(
+ normalizedNumber, onConfirmListener, /* dismissListener = */ null)
+ .show(fragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
+ }
+}
diff --git a/java/com/android/dialer/blocking/res/layout/block_report_spam_dialog.xml b/java/com/android/dialer/blockreportspam/res/layout/block_report_spam_dialog.xml
index 82e8d80b3..82e8d80b3 100644
--- a/java/com/android/dialer/blocking/res/layout/block_report_spam_dialog.xml
+++ b/java/com/android/dialer/blockreportspam/res/layout/block_report_spam_dialog.xml
diff --git a/java/com/android/dialer/blockreportspam/res/values/colors.xml b/java/com/android/dialer/blockreportspam/res/values/colors.xml
new file mode 100644
index 000000000..5fa45eba3
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/res/values/colors.xml
@@ -0,0 +1,21 @@
+<!--
+ ~ Copyright (C) 2012 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
+-->
+<resources>
+
+ <!-- 87% black -->
+ <color name="block_report_spam_primary_text_color">#de000000</color>
+
+</resources>
diff --git a/java/com/android/dialer/blocking/res/values/dimens.xml b/java/com/android/dialer/blockreportspam/res/values/dimens.xml
index cd7cfe2fd..cd7cfe2fd 100644
--- a/java/com/android/dialer/blocking/res/values/dimens.xml
+++ b/java/com/android/dialer/blockreportspam/res/values/dimens.xml
diff --git a/java/com/android/dialer/blockreportspam/res/values/strings.xml b/java/com/android/dialer/blockreportspam/res/values/strings.xml
new file mode 100644
index 000000000..e803a162f
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/res/values/strings.xml
@@ -0,0 +1,63 @@
+<!--
+ ~ Copyright (C) 2016 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
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Confirmation dialog title for blocking a number. [CHAR LIMIT=NONE] -->
+ <string name="block_number_confirmation_title">
+ Block<xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?
+ </string>
+
+ <!-- Confirmation dialog message for blocking a number with new filtering enabled.
+ [CHAR LIMIT=NONE] -->
+ <string name="block_number_confirmation_message_new_filtering">
+ You will no longer receive calls or texts from this number.
+ </string>
+
+ <!-- Block number alert dialog button [CHAR LIMIT=32] -->
+ <string name="block_number_ok">BLOCK</string>
+
+ <!-- Unblock number alert dialog button [CHAR LIMIT=32] -->
+ <string name="unblock_number_ok">UNBLOCK</string>
+
+ <!-- Title of alert dialog after clicking on Block/report as spam. [CHAR LIMIT=100] -->
+ <string name="block_report_number_alert_title">Block <xliff:g id="number">%1$s</xliff:g>?</string>
+
+ <!-- Text in alert dialog after clicking on Block/report as spam. [CHAR LIMIT=100] -->
+ <string name="block_report_number_alert_details">You will no longer receive calls from this number.</string>
+
+ <!-- Text in alert dialog after clicking on Block. [CHAR LIMIT=100] -->
+ <string name="block_number_alert_details"><xliff:g id="text">%1$s</xliff:g> This call will be reported as spam.</string>
+
+ <!-- Text in alert dialog after clicking on Unblock. [CHAR LIMIT=100] -->
+ <string name="unblock_number_alert_details">This number will be unblocked and reported as not spam. Future calls won\'t be identified as spam.</string>
+
+ <!-- Title of alert dialog after clicking on Unblock. [CHAR LIMIT=100] -->
+ <string name="unblock_report_number_alert_title">Unblock <xliff:g id="number">%1$s</xliff:g>?</string>
+
+ <!-- Report not spam number alert dialog button [CHAR LIMIT=32] -->
+ <string name="report_not_spam_alert_button">Report</string>
+
+ <!-- Title of alert dialog after clicking on Report as not spam. [CHAR LIMIT=100] -->
+ <string name="report_not_spam_alert_title">Report a mistake?</string>
+
+ <!-- Text in alert dialog after clicking on Report as not spam. [CHAR LIMIT=100] -->
+ <string name="report_not_spam_alert_details">Future calls from <xliff:g id="number">%1$s</xliff:g> will no longer be identified as spam.</string>
+
+ <!-- Label for checkbox in the Alert dialog to allow the user to report the number as spam as well. [CHAR LIMIT=30] -->
+ <string name="checkbox_report_as_spam_action">Report call as spam</string>
+
+</resources>
diff --git a/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java b/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
index 22c3a3c11..b7cb6d727 100644
--- a/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
+++ b/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
@@ -96,7 +96,7 @@ public final class RealtimeRowProcessor {
*/
@MainThread
ListenableFuture<CoalescedRow> applyRealtimeProcessing(final CoalescedRow row) {
- // Cp2LocalPhoneLookup can not always efficiently process all rows.
+ // Cp2DefaultDirectoryPhoneLookup can not always efficiently process all rows.
if (!row.numberAttributes().getIsCp2InfoIncomplete()) {
return Futures.immediateFuture(row);
}
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index a13f2e333..48de03e60 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -75,7 +75,9 @@ final class Modules {
SharedModules.addModulesHandlingBlockedOrSpamNumber(
context,
modules,
- normalizedNumber,
+ row.number().getNormalizedNumber(),
+ row.number().getCountryIso(),
+ row.callType(),
row.numberAttributes().getIsBlocked(),
row.numberAttributes().getIsSpam());
SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber);
diff --git a/java/com/android/dialer/calllogutils/NumberAttributesConverter.java b/java/com/android/dialer/calllogutils/NumberAttributesConverter.java
index efd1d72c2..ceb8d57ce 100644
--- a/java/com/android/dialer/calllogutils/NumberAttributesConverter.java
+++ b/java/com/android/dialer/calllogutils/NumberAttributesConverter.java
@@ -56,6 +56,6 @@ public final class NumberAttributesConverter {
.setIsBlocked(phoneLookupInfoConsolidator.isBlocked())
.setIsSpam(phoneLookupInfoConsolidator.isSpam())
.setCanReportAsInvalidNumber(phoneLookupInfoConsolidator.canReportAsInvalidNumber())
- .setIsCp2InfoIncomplete(phoneLookupInfoConsolidator.isCp2LocalInfoIncomplete());
+ .setIsCp2InfoIncomplete(phoneLookupInfoConsolidator.isDefaultCp2InfoIncomplete());
}
}
diff --git a/java/com/android/dialer/contactactions/SharedModules.java b/java/com/android/dialer/contactactions/SharedModules.java
index 6d97fcb61..0689f98fc 100644
--- a/java/com/android/dialer/contactactions/SharedModules.java
+++ b/java/com/android/dialer/contactactions/SharedModules.java
@@ -24,6 +24,7 @@ import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.widget.Toast;
import com.android.dialer.DialerPhoneNumber;
+import com.android.dialer.blockreportspam.ShowBlockReportSpamDialogNotifier;
import com.android.dialer.clipboard.ClipboardUtils;
import com.android.dialer.util.IntentUtil;
import com.android.dialer.util.UriUtils;
@@ -38,7 +39,7 @@ public class SharedModules {
public static void maybeAddModuleForAddingToContacts(
Context context,
List<ContactActionModule> modules,
- DialerPhoneNumber number,
+ DialerPhoneNumber dialerPhoneNumber,
String name,
String lookupUri,
boolean isBlocked,
@@ -54,7 +55,7 @@ public class SharedModules {
}
// Skip showing the menu item if there is no number.
- String normalizedNumber = number.getNormalizedNumber();
+ String normalizedNumber = dialerPhoneNumber.getNormalizedNumber();
if (TextUtils.isEmpty(normalizedNumber)) {
return;
}
@@ -111,17 +112,26 @@ public class SharedModules {
}
}
+ /**
+ * Add modules related to blocking/unblocking a number and/or reporting it as spam/not spam.
+ *
+ * @param normalizedNumber The number to be blocked / unblocked / marked as spam/not spam
+ * @param countryIso The ISO 3166-1 two letters country code for the number
+ * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+ */
public static void addModulesHandlingBlockedOrSpamNumber(
Context context,
List<ContactActionModule> modules,
String normalizedNumber,
+ String countryIso,
+ int callType,
boolean isBlocked,
boolean isSpam) {
// For a spam number, add two options:
// (1) "Not spam" and "Block", or
// (2) "Not spam" and "Unblock".
if (isSpam) {
- addModuleForMarkingNumberAsNonSpam(context, modules, normalizedNumber);
+ addModuleForMarkingNumberAsNonSpam(context, modules, normalizedNumber, countryIso, callType);
addModuleForBlockingOrUnblockingNumber(context, modules, normalizedNumber, isBlocked);
return;
}
@@ -133,11 +143,23 @@ public class SharedModules {
}
// For a number that is neither a spam number nor blocked, add "Block/Report spam" option.
- addModuleForBlockingNumberAndOptionallyReportingSpam(context, modules, normalizedNumber);
+ addModuleForBlockingNumberAndOptionallyReportingSpam(
+ context, modules, normalizedNumber, countryIso, callType);
}
+ /**
+ * Add "Not spam" module.
+ *
+ * @param normalizedNumber The number to be marked as not spam
+ * @param countryIso The ISO 3166-1 two letters country code for the number
+ * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+ */
private static void addModuleForMarkingNumberAsNonSpam(
- Context context, List<ContactActionModule> modules, String normalizedNumber) {
+ Context context,
+ List<ContactActionModule> modules,
+ String normalizedNumber,
+ String countryIso,
+ int callType) {
modules.add(
new ContactActionModule() {
@Override
@@ -152,12 +174,8 @@ public class SharedModules {
@Override
public boolean onClick() {
- // TODO(a bug): implement this method.
- Toast.makeText(
- context,
- String.format(Locale.ENGLISH, "TODO: Report %s as non-spam", normalizedNumber),
- Toast.LENGTH_SHORT)
- .show();
+ ShowBlockReportSpamDialogNotifier.notifyShowDialogToReportNotSpam(
+ context, normalizedNumber, countryIso, callType);
return true; // Close the bottom sheet.
}
});
@@ -198,8 +216,19 @@ public class SharedModules {
});
}
+ /**
+ * Add "Block/Report spam" module
+ *
+ * @param normalizedNumber The number to be blocked / unblocked / marked as spam/not spam
+ * @param countryIso The ISO 3166-1 two letters country code for the number
+ * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+ */
private static void addModuleForBlockingNumberAndOptionallyReportingSpam(
- Context context, List<ContactActionModule> modules, String normalizedNumber) {
+ Context context,
+ List<ContactActionModule> modules,
+ String normalizedNumber,
+ String countryIso,
+ int callType) {
modules.add(
new ContactActionModule() {
@Override
@@ -214,15 +243,8 @@ public class SharedModules {
@Override
public boolean onClick() {
- // TODO(a bug): implement this method.
- Toast.makeText(
- context,
- String.format(
- Locale.ENGLISH,
- "TODO: Block and optionally report as spam %s.",
- normalizedNumber),
- Toast.LENGTH_SHORT)
- .show();
+ ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumberAndOptionallyReportSpam(
+ context, normalizedNumber, countryIso, callType);
return true; // Close the bottom sheet.
}
});
diff --git a/java/com/android/dialer/dialpadview/res/layout/row_deviceid.xml b/java/com/android/dialer/dialpadview/res/layout/row_deviceid.xml
index efeeb5f1e..6eab46b40 100644
--- a/java/com/android/dialer/dialpadview/res/layout/row_deviceid.xml
+++ b/java/com/android/dialer/dialpadview/res/layout/row_deviceid.xml
@@ -28,7 +28,8 @@
android:id="@+id/deviceid_hex"
style="@style/DeviceIdBody"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
+ android:layout_height="wrap_content"
+ android:textIsSelectable="true"/>
<TextView
android:id="@+id/deviceid_dec_label"
style="@style/DeviceIdBody"
@@ -40,7 +41,8 @@
android:id="@+id/deviceid_dec"
style="@style/DeviceIdBody"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
+ android:layout_height="wrap_content"
+ android:textIsSelectable="true"/>
<ImageView
android:id="@+id/deviceid_barcode"
android:layout_width="match_parent"
diff --git a/java/com/android/dialer/main/MainActivityPeer.java b/java/com/android/dialer/main/MainActivityPeer.java
index 9c5627be8..31af9adbd 100644
--- a/java/com/android/dialer/main/MainActivityPeer.java
+++ b/java/com/android/dialer/main/MainActivityPeer.java
@@ -28,6 +28,8 @@ public interface MainActivityPeer {
void onUserLeaveHint();
+ void onActivityPause();
+
void onActivityStop();
void onActivityDestroyed();
diff --git a/java/com/android/dialer/main/impl/MainActivity.java b/java/com/android/dialer/main/impl/MainActivity.java
index 1646becf4..fbcbeff38 100644
--- a/java/com/android/dialer/main/impl/MainActivity.java
+++ b/java/com/android/dialer/main/impl/MainActivity.java
@@ -99,6 +99,12 @@ public class MainActivity extends TransactionSafeActivity
}
@Override
+ protected void onPause() {
+ super.onPause();
+ activePeer.onActivityPause();
+ }
+
+ @Override
protected void onStop() {
super.onStop();
activePeer.onActivityStop();
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 0c2374c96..33e0981dd 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -32,6 +32,7 @@ import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.widget.Toast;
import com.android.contacts.common.dialog.ClearFrequentsDialog;
+import com.android.dialer.app.calllog.CallLogActivity;
import com.android.dialer.app.settings.DialerSettingsActivity;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.common.Assert;
@@ -402,6 +403,9 @@ public class MainSearchController implements SearchBarListener {
ClearFrequentsDialog.show(mainActivity.getFragmentManager());
Logger.get(mainActivity).logScreenView(ScreenEvent.Type.CLEAR_FREQUENTS, mainActivity);
return true;
+ } else if (menuItem.getItemId() == R.id.menu_call_history) {
+ final Intent intent = new Intent(mainActivity, CallLogActivity.class);
+ mainActivity.startActivity(intent);
}
return false;
}
diff --git a/java/com/android/dialer/main/impl/NewMainActivityPeer.java b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
index 6f5c18623..081559a2b 100644
--- a/java/com/android/dialer/main/impl/NewMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
@@ -22,6 +22,8 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
+import android.support.v4.content.LocalBroadcastManager;
+import com.android.dialer.blockreportspam.ShowBlockReportSpamDialogReceiver;
import com.android.dialer.calllog.CallLogComponent;
import com.android.dialer.calllog.ui.NewCallLogFragment;
import com.android.dialer.common.concurrent.DefaultFutureCallback;
@@ -37,9 +39,12 @@ import com.google.common.util.concurrent.MoreExecutors;
public class NewMainActivityPeer implements MainActivityPeer {
private final MainActivity mainActivity;
+ private final ShowBlockReportSpamDialogReceiver showBlockReportSpamDialogReceiver;
public NewMainActivityPeer(MainActivity mainActivity) {
this.mainActivity = mainActivity;
+ this.showBlockReportSpamDialogReceiver =
+ new ShowBlockReportSpamDialogReceiver(mainActivity.getFragmentManager());
}
@Override
@@ -54,12 +59,22 @@ public class NewMainActivityPeer implements MainActivityPeer {
}
@Override
- public void onActivityResume() {}
+ public void onActivityResume() {
+ LocalBroadcastManager.getInstance(mainActivity)
+ .registerReceiver(
+ showBlockReportSpamDialogReceiver, ShowBlockReportSpamDialogReceiver.getIntentFilter());
+ }
@Override
public void onUserLeaveHint() {}
@Override
+ public void onActivityPause() {
+ LocalBroadcastManager.getInstance(mainActivity)
+ .unregisterReceiver(showBlockReportSpamDialogReceiver);
+ }
+
+ @Override
public void onActivityStop() {}
@Override
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index cdbab5cc1..9ceea28bf 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -398,6 +398,9 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
}
@Override
+ public void onActivityPause() {}
+
+ @Override
public void onActivityStop() {
lastTabController.onActivityStop();
callLogFragmentListener.onActivityStop(
diff --git a/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml b/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml
index e2ff57f28..ab25aa451 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml
@@ -18,21 +18,24 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
+ android:id="@+id/menu_call_history"
+ android:title="@string/main_menu_call_history"
+ app:showAsAction="collapseActionView"/>
+
+ <item
android:id="@+id/clear_frequents"
android:title="@string/main_menu_clear_frequents"
app:showAsAction="collapseActionView"
android:visible="false"/>
- <!-- TODO(calderwoodra): add clear call log -->
-
<item
android:id="@+id/settings"
android:title="@string/settings"
app:showAsAction="collapseActionView"/>
<item
- android:id="@+id/menu_simulator_submenu"
- android:title="@string/nui_simulator_submenu_label"
- app:showAsAction="collapseActionView"
- android:visible="false"/>
+ android:id="@+id/menu_simulator_submenu"
+ android:title="@string/nui_simulator_submenu_label"
+ app:showAsAction="collapseActionView"
+ android:visible="false"/>
</menu> \ No newline at end of file
diff --git a/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml b/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml
index 96f0cc0f9..00b175edf 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml
@@ -38,6 +38,10 @@
<!-- Show users their settings [CHAR LIMIT=20] -->
<string name="settings">Settings</string>
+ <!-- Content description for the fake action menu button that brings up the call history
+ activity [CHAR LIMIT=20] -->
+ <string name="main_menu_call_history">Call history</string>
+
<!-- The menu item to clear frequents [CHAR LIMIT=30] -->
<string name="main_menu_clear_frequents">Clear frequents</string>
diff --git a/java/com/android/dialer/phonelookup/PhoneLookupModule.java b/java/com/android/dialer/phonelookup/PhoneLookupModule.java
index 3e21e7c77..a4cc5c7a4 100644
--- a/java/com/android/dialer/phonelookup/PhoneLookupModule.java
+++ b/java/com/android/dialer/phonelookup/PhoneLookupModule.java
@@ -18,8 +18,8 @@ package com.android.dialer.phonelookup;
import com.android.dialer.phonelookup.blockednumber.DialerBlockedNumberPhoneLookup;
import com.android.dialer.phonelookup.blockednumber.SystemBlockedNumberPhoneLookup;
-import com.android.dialer.phonelookup.cp2.Cp2LocalPhoneLookup;
-import com.android.dialer.phonelookup.cp2.Cp2RemotePhoneLookup;
+import com.android.dialer.phonelookup.cp2.Cp2DefaultDirectoryPhoneLookup;
+import com.android.dialer.phonelookup.cp2.Cp2ExtendedDirectoryPhoneLookup;
import com.android.dialer.phonelookup.spam.SpamPhoneLookup;
import com.google.common.collect.ImmutableList;
import dagger.Module;
@@ -32,14 +32,14 @@ public abstract class PhoneLookupModule {
@Provides
@SuppressWarnings({"unchecked", "rawtype"})
static ImmutableList<PhoneLookup> providePhoneLookupList(
- Cp2LocalPhoneLookup cp2LocalPhoneLookup,
- Cp2RemotePhoneLookup cp2RemotePhoneLookup,
+ Cp2DefaultDirectoryPhoneLookup cp2DefaultDirectoryPhoneLookup,
+ Cp2ExtendedDirectoryPhoneLookup cp2ExtendedDirectoryPhoneLookup,
DialerBlockedNumberPhoneLookup dialerBlockedNumberPhoneLookup,
SystemBlockedNumberPhoneLookup systemBlockedNumberPhoneLookup,
SpamPhoneLookup spamPhoneLookup) {
return ImmutableList.of(
- cp2LocalPhoneLookup,
- cp2RemotePhoneLookup,
+ cp2DefaultDirectoryPhoneLookup,
+ cp2ExtendedDirectoryPhoneLookup,
dialerBlockedNumberPhoneLookup,
systemBlockedNumberPhoneLookup,
spamPhoneLookup);
diff --git a/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java b/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java
index 9c5411081..3a48fd538 100644
--- a/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java
+++ b/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java
@@ -40,11 +40,16 @@ public final class PhoneLookupInfoConsolidator {
/** Integers representing {@link PhoneLookup} implementations that can provide a contact's name */
@Retention(RetentionPolicy.SOURCE)
- @IntDef({NameSource.NONE, NameSource.CP2_LOCAL, NameSource.CP2_REMOTE, NameSource.PEOPLE_API})
+ @IntDef({
+ NameSource.NONE,
+ NameSource.CP2_DEFAULT_DIRECTORY,
+ NameSource.CP2_EXTENDED_DIRECTORY,
+ NameSource.PEOPLE_API
+ })
@interface NameSource {
int NONE = 0; // used when none of the other sources can provide the name
- int CP2_LOCAL = 1;
- int CP2_REMOTE = 2;
+ int CP2_DEFAULT_DIRECTORY = 1;
+ int CP2_EXTENDED_DIRECTORY = 2;
int PEOPLE_API = 3;
}
@@ -53,31 +58,35 @@ public final class PhoneLookupInfoConsolidator {
*
* <p>Each source is one of the values in NameSource, as defined above.
*
- * <p>Sources are sorted in the order of priority. For example, if source CP2_LOCAL can provide
- * the name, we will use that name in the UI and ignore all the other sources. If source CP2_LOCAL
- * can't provide the name, source CP2_REMOTE will be consulted.
+ * <p>Sources are sorted in the order of priority. For example, if source CP2_DEFAULT_DIRECTORY
+ * can provide the name, we will use that name in the UI and ignore all the other sources. If
+ * source CP2_DEFAULT_DIRECTORY can't provide the name, source CP2_EXTENDED_DIRECTORY will be
+ * consulted.
*
* <p>The reason for defining a name source is to avoid mixing info from different sub-messages in
* PhoneLookupInfo proto when we are supposed to stick with only one sub-message. For example, if
- * a PhoneLookupInfo proto has both cp2_local_info and cp2_remote_info but only cp2_remote_info
- * has a photo URI, PhoneLookupInfoConsolidator should provide an empty photo URI as CP2_LOCAL has
- * higher priority and we should not use cp2_remote_info's photo URI to display the contact's
- * photo.
+ * a PhoneLookupInfo proto has both default_cp2_info and extended_cp2_info but only
+ * extended_cp2_info has a photo URI, PhoneLookupInfoConsolidator should provide an empty photo
+ * URI as CP2_DEFAULT_DIRECTORY has higher priority and we should not use extended_cp2_info's
+ * photo URI to display the contact's photo.
*/
private static final ImmutableList<Integer> NAME_SOURCES_IN_PRIORITY_ORDER =
- ImmutableList.of(NameSource.CP2_LOCAL, NameSource.CP2_REMOTE, NameSource.PEOPLE_API);
+ ImmutableList.of(
+ NameSource.CP2_DEFAULT_DIRECTORY,
+ NameSource.CP2_EXTENDED_DIRECTORY,
+ NameSource.PEOPLE_API);
private final @NameSource int nameSource;
private final PhoneLookupInfo phoneLookupInfo;
- @Nullable private final Cp2ContactInfo firstCp2LocalContact;
- @Nullable private final Cp2ContactInfo firstCp2RemoteContact;
+ @Nullable private final Cp2ContactInfo firstDefaultCp2Contact;
+ @Nullable private final Cp2ContactInfo firstExtendedCp2Contact;
public PhoneLookupInfoConsolidator(PhoneLookupInfo phoneLookupInfo) {
this.phoneLookupInfo = phoneLookupInfo;
- this.firstCp2LocalContact = getFirstLocalContact();
- this.firstCp2RemoteContact = getFirstRemoteContact();
+ this.firstDefaultCp2Contact = getFirstContactInDefaultDirectory();
+ this.firstExtendedCp2Contact = getFirstContactInExtendedDirectories();
this.nameSource = selectNameSource();
}
@@ -92,10 +101,10 @@ public final class PhoneLookupInfoConsolidator {
*/
public String getName() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- return Assert.isNotNull(firstCp2LocalContact).getName();
- case NameSource.CP2_REMOTE:
- return Assert.isNotNull(firstCp2RemoteContact).getName();
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ return Assert.isNotNull(firstDefaultCp2Contact).getName();
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ return Assert.isNotNull(firstExtendedCp2Contact).getName();
case NameSource.PEOPLE_API:
return phoneLookupInfo.getPeopleApiInfo().getDisplayName();
case NameSource.NONE:
@@ -115,10 +124,10 @@ public final class PhoneLookupInfoConsolidator {
*/
public String getPhotoThumbnailUri() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- return Assert.isNotNull(firstCp2LocalContact).getPhotoThumbnailUri();
- case NameSource.CP2_REMOTE:
- return Assert.isNotNull(firstCp2RemoteContact).getPhotoThumbnailUri();
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ return Assert.isNotNull(firstDefaultCp2Contact).getPhotoThumbnailUri();
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ return Assert.isNotNull(firstExtendedCp2Contact).getPhotoThumbnailUri();
case NameSource.PEOPLE_API:
case NameSource.NONE:
return "";
@@ -137,10 +146,10 @@ public final class PhoneLookupInfoConsolidator {
*/
public String getPhotoUri() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- return Assert.isNotNull(firstCp2LocalContact).getPhotoUri();
- case NameSource.CP2_REMOTE:
- return Assert.isNotNull(firstCp2RemoteContact).getPhotoUri();
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ return Assert.isNotNull(firstDefaultCp2Contact).getPhotoUri();
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ return Assert.isNotNull(firstExtendedCp2Contact).getPhotoUri();
case NameSource.PEOPLE_API:
case NameSource.NONE:
return "";
@@ -156,10 +165,10 @@ public final class PhoneLookupInfoConsolidator {
*/
public long getPhotoId() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- return Math.max(Assert.isNotNull(firstCp2LocalContact).getPhotoId(), 0);
- case NameSource.CP2_REMOTE:
- return Math.max(Assert.isNotNull(firstCp2RemoteContact).getPhotoId(), 0);
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ return Math.max(Assert.isNotNull(firstDefaultCp2Contact).getPhotoId(), 0);
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ return Math.max(Assert.isNotNull(firstExtendedCp2Contact).getPhotoId(), 0);
case NameSource.PEOPLE_API:
case NameSource.NONE:
return 0;
@@ -176,10 +185,10 @@ public final class PhoneLookupInfoConsolidator {
*/
public String getLookupUri() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- return Assert.isNotNull(firstCp2LocalContact).getLookupUri();
- case NameSource.CP2_REMOTE:
- return Assert.isNotNull(firstCp2RemoteContact).getLookupUri();
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ return Assert.isNotNull(firstDefaultCp2Contact).getLookupUri();
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ return Assert.isNotNull(firstExtendedCp2Contact).getLookupUri();
case NameSource.PEOPLE_API:
return Assert.isNotNull(phoneLookupInfo.getPeopleApiInfo().getLookupUri());
case NameSource.NONE:
@@ -200,10 +209,10 @@ public final class PhoneLookupInfoConsolidator {
*/
public String getNumberLabel() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- return Assert.isNotNull(firstCp2LocalContact).getLabel();
- case NameSource.CP2_REMOTE:
- return Assert.isNotNull(firstCp2RemoteContact).getLabel();
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ return Assert.isNotNull(firstDefaultCp2Contact).getLabel();
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ return Assert.isNotNull(firstExtendedCp2Contact).getLabel();
case NameSource.PEOPLE_API:
case NameSource.NONE:
return "";
@@ -259,11 +268,11 @@ public final class PhoneLookupInfoConsolidator {
}
/**
- * Returns true if the {@link PhoneLookupInfo} passed to the constructor has incomplete CP2 local
- * info.
+ * Returns true if the {@link PhoneLookupInfo} passed to the constructor has incomplete default
+ * CP2 info (info from the default directory).
*/
- public boolean isCp2LocalInfoIncomplete() {
- return phoneLookupInfo.getCp2LocalInfo().getIsIncomplete();
+ public boolean isDefaultCp2InfoIncomplete() {
+ return phoneLookupInfo.getDefaultCp2Info().getIsIncomplete();
}
/**
@@ -275,8 +284,8 @@ public final class PhoneLookupInfoConsolidator {
*/
public boolean canReportAsInvalidNumber() {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- case NameSource.CP2_REMOTE:
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ case NameSource.CP2_EXTENDED_DIRECTORY:
return false;
case NameSource.PEOPLE_API:
PeopleApiInfo peopleApiInfo = phoneLookupInfo.getPeopleApiInfo();
@@ -291,26 +300,26 @@ public final class PhoneLookupInfoConsolidator {
}
/**
- * Arbitrarily select the first local CP2 contact. In the future, it may make sense to display
- * contact information from all contacts with the same number (for example show the name as "Mom,
- * Dad" or show a synthesized photo containing photos of both "Mom" and "Dad").
+ * Arbitrarily select the first CP2 contact in the default directory. In the future, it may make
+ * sense to display contact information from all contacts with the same number (for example show
+ * the name as "Mom, Dad" or show a synthesized photo containing photos of both "Mom" and "Dad").
*/
@Nullable
- private Cp2ContactInfo getFirstLocalContact() {
- return phoneLookupInfo.getCp2LocalInfo().getCp2ContactInfoCount() > 0
- ? phoneLookupInfo.getCp2LocalInfo().getCp2ContactInfo(0)
+ private Cp2ContactInfo getFirstContactInDefaultDirectory() {
+ return phoneLookupInfo.getDefaultCp2Info().getCp2ContactInfoCount() > 0
+ ? phoneLookupInfo.getDefaultCp2Info().getCp2ContactInfo(0)
: null;
}
/**
- * Arbitrarily select the first remote CP2 contact. In the future, it may make sense to display
- * contact information from all contacts with the same number (for example show the name as "Mom,
- * Dad" or show a synthesized photo containing photos of both "Mom" and "Dad").
+ * Arbitrarily select the first CP2 contact in extended directories. In the future, it may make
+ * sense to display contact information from all contacts with the same number (for example show
+ * the name as "Mom, Dad" or show a synthesized photo containing photos of both "Mom" and "Dad").
*/
@Nullable
- private Cp2ContactInfo getFirstRemoteContact() {
- return phoneLookupInfo.getCp2RemoteInfo().getCp2ContactInfoCount() > 0
- ? phoneLookupInfo.getCp2RemoteInfo().getCp2ContactInfo(0)
+ private Cp2ContactInfo getFirstContactInExtendedDirectories() {
+ return phoneLookupInfo.getExtendedCp2Info().getCp2ContactInfoCount() > 0
+ ? phoneLookupInfo.getExtendedCp2Info().getCp2ContactInfo(0)
: null;
}
@@ -318,14 +327,14 @@ public final class PhoneLookupInfoConsolidator {
private @NameSource int selectNameSource() {
for (int nameSource : NAME_SOURCES_IN_PRIORITY_ORDER) {
switch (nameSource) {
- case NameSource.CP2_LOCAL:
- if (firstCp2LocalContact != null && !firstCp2LocalContact.getName().isEmpty()) {
- return NameSource.CP2_LOCAL;
+ case NameSource.CP2_DEFAULT_DIRECTORY:
+ if (firstDefaultCp2Contact != null && !firstDefaultCp2Contact.getName().isEmpty()) {
+ return NameSource.CP2_DEFAULT_DIRECTORY;
}
break;
- case NameSource.CP2_REMOTE:
- if (firstCp2RemoteContact != null && !firstCp2RemoteContact.getName().isEmpty()) {
- return NameSource.CP2_REMOTE;
+ case NameSource.CP2_EXTENDED_DIRECTORY:
+ if (firstExtendedCp2Contact != null && !firstExtendedCp2Contact.getName().isEmpty()) {
+ return NameSource.CP2_EXTENDED_DIRECTORY;
}
break;
case NameSource.PEOPLE_API:
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2DefaultDirectoryPhoneLookup.java
index 8db308892..a79eb19db 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2DefaultDirectoryPhoneLookup.java
@@ -58,11 +58,11 @@ import java.util.Set;
import java.util.concurrent.Callable;
import javax.inject.Inject;
-/** PhoneLookup implementation for local contacts. */
-public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
+/** PhoneLookup implementation for contacts in the default directory. */
+public final class Cp2DefaultDirectoryPhoneLookup implements PhoneLookup<Cp2Info> {
private static final String PREF_LAST_TIMESTAMP_PROCESSED =
- "cp2LocalPhoneLookupLastTimestampProcessed";
+ "cp2DefaultDirectoryPhoneLookupLastTimestampProcessed";
// We cannot efficiently process invalid numbers because batch queries cannot be constructed which
// accomplish the necessary loose matching. We'll attempt to process a limited number of them,
@@ -77,7 +77,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
@Nullable private Long currentLastTimestampProcessed;
@Inject
- Cp2LocalPhoneLookup(
+ Cp2DefaultDirectoryPhoneLookup(
@ApplicationContext Context appContext,
@Unencrypted SharedPreferences sharedPreferences,
@BackgroundExecutor ListeningExecutorService backgroundExecutorService,
@@ -121,7 +121,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
Iterables.getOnlyElement(partitionedNumbers.invalidNumbers()));
}
if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.lookupInternal", "null cursor");
+ LogUtil.w("Cp2DefaultDirectoryPhoneLookup.lookupInternal", "null cursor");
return Cp2Info.getDefaultInstance();
}
while (cursor.moveToNext()) {
@@ -144,7 +144,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
// check, simply return true. The expectation is that this should rarely be the case as the
// vast majority of numbers in call logs should be valid.
LogUtil.v(
- "Cp2LocalPhoneLookup.isDirty",
+ "Cp2DefaultDirectoryPhoneLookup.isDirty",
"returning true because too many invalid numbers (%d)",
partitionedNumbers.invalidNumbers().size());
return Futures.immediateFuture(true);
@@ -164,7 +164,8 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
anyContactsDeleted -> {
if (anyContactsDeleted) {
LogUtil.v(
- "Cp2LocalPhoneLookup.isDirty", "returning true because contacts deleted");
+ "Cp2DefaultDirectoryPhoneLookup.isDirty",
+ "returning true because contacts deleted");
return Futures.immediateFuture(true);
}
// Hopefully the most common case is there are no contacts updated; we can detect
@@ -176,7 +177,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
noContactsModifiedSince -> {
if (noContactsModifiedSince) {
LogUtil.v(
- "Cp2LocalPhoneLookup.isDirty",
+ "Cp2DefaultDirectoryPhoneLookup.isDirty",
"returning false because no contacts modified since last run");
return Futures.immediateFuture(false);
}
@@ -194,7 +195,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
contactsUpdated -> {
if (contactsUpdated) {
LogUtil.v(
- "Cp2LocalPhoneLookup.isDirty",
+ "Cp2DefaultDirectoryPhoneLookup.isDirty",
"returning true because a previously called contact was updated");
return Futures.immediateFuture(true);
}
@@ -267,7 +268,9 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
null)) {
if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.queryPhoneLookupHistoryForContactIds", "null cursor");
+ LogUtil.w(
+ "Cp2DefaultDirectoryPhoneLookup.queryPhoneLookupHistoryForContactIds",
+ "null cursor");
return contactIds;
}
@@ -283,7 +286,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
throw new IllegalStateException(e);
}
for (Cp2ContactInfo info :
- phoneLookupInfo.getCp2LocalInfo().getCp2ContactInfoList()) {
+ phoneLookupInfo.getDefaultCp2Info().getCp2ContactInfoList()) {
contactIds.add(info.getContactId());
}
} while (cursor.moveToNext());
@@ -305,7 +308,8 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
queryPhoneTableBasedOnE164(new String[] {Phone.CONTACT_ID}, validE164Numbers)) {
if (cursor == null) {
LogUtil.w(
- "Cp2LocalPhoneLookup.queryPhoneTableForContactIdsBasedOnE164", "null cursor");
+ "Cp2DefaultDirectoryPhoneLookup.queryPhoneTableForContactIdsBasedOnE164",
+ "null cursor");
return contactIds;
}
while (cursor.moveToNext()) {
@@ -328,7 +332,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
queryPhoneLookup(new String[] {ContactsContract.PhoneLookup.CONTACT_ID}, rawNumber)) {
if (cursor == null) {
LogUtil.w(
- "Cp2LocalPhoneLookup.queryPhoneLookupTableForContactIdsBasedOnRawNumber",
+ "Cp2DefaultDirectoryPhoneLookup.queryPhoneLookupTableForContactIdsBasedOnRawNumber",
"null cursor");
return contactIds;
}
@@ -391,7 +395,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
new String[] {Long.toString(lastModified)},
Contacts._ID + " limit 1")) {
if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.noContactsModifiedSince", "null cursor");
+ LogUtil.w("Cp2DefaultDirectoryPhoneLookup.noContactsModifiedSince", "null cursor");
return false;
}
return cursor.getCount() == 0;
@@ -413,7 +417,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
new String[] {Long.toString(lastModified)},
DeletedContacts.CONTACT_DELETED_TIMESTAMP + " limit 1")) {
if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.anyContactsDeletedSince", "null cursor");
+ LogUtil.w("Cp2DefaultDirectoryPhoneLookup.anyContactsDeletedSince", "null cursor");
return false;
}
return cursor.getCount() > 0;
@@ -423,12 +427,12 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
@Override
public void setSubMessage(PhoneLookupInfo.Builder destination, Cp2Info subMessage) {
- destination.setCp2LocalInfo(subMessage);
+ destination.setDefaultCp2Info(subMessage);
}
@Override
public Cp2Info getSubMessage(PhoneLookupInfo phoneLookupInfo) {
- return phoneLookupInfo.getCp2LocalInfo();
+ return phoneLookupInfo.getDefaultCp2Info();
}
@Override
@@ -712,7 +716,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
map.put(dialerPhoneNumber, ImmutableSet.of());
}
LogUtil.v(
- "Cp2LocalPhoneLookup.buildMapForUpdatedOrAddedContacts",
+ "Cp2DefaultDirectoryPhoneLookup.buildMapForUpdatedOrAddedContacts",
"found %d numbers that may need updating",
updatedNumbers.size());
return map;
@@ -735,7 +739,7 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
queryPhoneTableBasedOnE164(
Cp2Projections.getProjectionForPhoneTable(), validE164Numbers)) {
if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.batchQueryForValidNumbers", "null cursor");
+ LogUtil.w("Cp2DefaultDirectoryPhoneLookup.batchQueryForValidNumbers", "null cursor");
} else {
while (cursor.moveToNext()) {
String validE164Number = Cp2Projections.getNormalizedNumberFromCursor(cursor);
@@ -764,7 +768,8 @@ public final class Cp2LocalPhoneLookup implements PhoneLookup<Cp2Info> {
try (Cursor cursor =
queryPhoneLookup(Cp2Projections.getProjectionForPhoneLookupTable(), invalidNumber)) {
if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.individualQueryForInvalidNumber", "null cursor");
+ LogUtil.w(
+ "Cp2DefaultDirectoryPhoneLookup.individualQueryForInvalidNumber", "null cursor");
} else {
while (cursor.moveToNext()) {
cp2ContactInfos.add(
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2ExtendedDirectoryPhoneLookup.java
index 7efe039eb..df164bd1b 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2ExtendedDirectoryPhoneLookup.java
@@ -42,15 +42,20 @@ import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
-/** PhoneLookup implementation for remote contacts. */
-public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
+/**
+ * PhoneLookup implementation for contacts in both local and remote directories other than the
+ * default directory.
+ *
+ * <p>Contacts in these directories are accessible only by specifying a directory ID.
+ */
+public final class Cp2ExtendedDirectoryPhoneLookup implements PhoneLookup<Cp2Info> {
private final Context appContext;
private final ListeningExecutorService backgroundExecutorService;
private final ListeningExecutorService lightweightExecutorService;
@Inject
- Cp2RemotePhoneLookup(
+ Cp2ExtendedDirectoryPhoneLookup(
@ApplicationContext Context appContext,
@BackgroundExecutor ListeningExecutorService backgroundExecutorService,
@LightweightExecutor ListeningExecutorService lightweightExecutorService) {
@@ -62,15 +67,15 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
@Override
public ListenableFuture<Cp2Info> lookup(DialerPhoneNumber dialerPhoneNumber) {
return Futures.transformAsync(
- queryCp2ForRemoteDirectoryIds(),
- remoteDirectoryIds -> queryCp2ForRemoteContact(dialerPhoneNumber, remoteDirectoryIds),
+ queryCp2ForExtendedDirectoryIds(),
+ directoryIds -> queryCp2ForDirectoryContact(dialerPhoneNumber, directoryIds),
lightweightExecutorService);
}
- private ListenableFuture<List<Long>> queryCp2ForRemoteDirectoryIds() {
+ private ListenableFuture<List<Long>> queryCp2ForExtendedDirectoryIds() {
return backgroundExecutorService.submit(
() -> {
- List<Long> remoteDirectoryIds = new ArrayList<>();
+ List<Long> directoryIds = new ArrayList<>();
try (Cursor cursor =
appContext
.getContentResolver()
@@ -81,34 +86,34 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
/* selectionArgs = */ null,
/* sortOrder = */ ContactsContract.Directory._ID)) {
if (cursor == null) {
- LogUtil.e("Cp2RemotePhoneLookup.queryCp2ForDirectoryIds", "null cursor");
- return remoteDirectoryIds;
+ LogUtil.e(
+ "Cp2ExtendedDirectoryPhoneLookup.queryCp2ForExtendedDirectoryIds", "null cursor");
+ return directoryIds;
}
if (!cursor.moveToFirst()) {
- LogUtil.i("Cp2RemotePhoneLookup.queryCp2ForDirectoryIds", "empty cursor");
- return remoteDirectoryIds;
+ LogUtil.i(
+ "Cp2ExtendedDirectoryPhoneLookup.queryCp2ForExtendedDirectoryIds",
+ "empty cursor");
+ return directoryIds;
}
int idColumnIndex = cursor.getColumnIndexOrThrow(ContactsContract.Directory._ID);
do {
long directoryId = cursor.getLong(idColumnIndex);
- // Note that IDs of non-remote directories will be included in the result, such as
- // android.provider.ContactsContract.Directory.DEFAULT (the default directory that
- // represents locally stored contacts).
- if (isRemoteDirectory(directoryId)) {
- remoteDirectoryIds.add(cursor.getLong(idColumnIndex));
+ if (isExtendedDirectory(directoryId)) {
+ directoryIds.add(cursor.getLong(idColumnIndex));
}
} while (cursor.moveToNext());
- return remoteDirectoryIds;
+ return directoryIds;
}
});
}
- private ListenableFuture<Cp2Info> queryCp2ForRemoteContact(
- DialerPhoneNumber dialerPhoneNumber, List<Long> remoteDirectoryIds) {
- if (remoteDirectoryIds.isEmpty()) {
+ private ListenableFuture<Cp2Info> queryCp2ForDirectoryContact(
+ DialerPhoneNumber dialerPhoneNumber, List<Long> directoryIds) {
+ if (directoryIds.isEmpty()) {
return Futures.immediateFuture(Cp2Info.getDefaultInstance());
}
@@ -116,8 +121,8 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
String number = dialerPhoneNumber.getNormalizedNumber();
List<ListenableFuture<Cp2Info>> cp2InfoFutures = new ArrayList<>();
- for (long remoteDirectoryId : remoteDirectoryIds) {
- cp2InfoFutures.add(queryCp2ForRemoteContact(number, remoteDirectoryId));
+ for (long directoryId : directoryIds) {
+ cp2InfoFutures.add(queryCp2ForDirectoryContact(number, directoryId));
}
return Futures.transform(
@@ -132,8 +137,7 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
lightweightExecutorService);
}
- private ListenableFuture<Cp2Info> queryCp2ForRemoteContact(
- String number, long remoteDirectoryId) {
+ private ListenableFuture<Cp2Info> queryCp2ForDirectoryContact(String number, long directoryId) {
return backgroundExecutorService.submit(
() -> {
Cp2Info.Builder cp2InfoBuilder = Cp2Info.newBuilder();
@@ -141,24 +145,24 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
appContext
.getContentResolver()
.query(
- getContentUriForContacts(number, remoteDirectoryId),
+ getContentUriForContacts(number, directoryId),
Cp2Projections.getProjectionForPhoneLookupTable(),
/* selection = */ null,
/* selectionArgs = */ null,
/* sortOrder = */ null)) {
if (cursor == null) {
LogUtil.e(
- "Cp2RemotePhoneLookup.queryCp2ForRemoteContact",
+ "Cp2ExtendedDirectoryPhoneLookup.queryCp2ForDirectoryContact",
"null cursor returned when querying directory %d",
- remoteDirectoryId);
+ directoryId);
return cp2InfoBuilder.build();
}
if (!cursor.moveToFirst()) {
LogUtil.i(
- "Cp2RemotePhoneLookup.queryCp2ForRemoteContact",
+ "Cp2ExtendedDirectoryPhoneLookup.queryCp2ForDirectoryContact",
"empty cursor returned when querying directory %d",
- remoteDirectoryId);
+ directoryId);
return cp2InfoBuilder.build();
}
@@ -199,14 +203,13 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
return builder.build();
}
- private static boolean isRemoteDirectory(long directoryId) {
+ private static boolean isExtendedDirectory(long directoryId) {
+ // TODO(a bug): Moving the logic to utility shared with the search fragment.
return VERSION.SDK_INT >= VERSION_CODES.N
? Directory.isRemoteDirectoryId(directoryId)
+ || Directory.isEnterpriseDirectoryId(directoryId)
: (directoryId != Directory.DEFAULT
&& directoryId != Directory.LOCAL_INVISIBLE
- // Directory.ENTERPRISE_DEFAULT is the default work profile directory for locally stored
- // contacts
- && directoryId != Directory.ENTERPRISE_DEFAULT
&& directoryId != Directory.ENTERPRISE_LOCAL_INVISIBLE);
}
@@ -223,12 +226,12 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
@Override
public void setSubMessage(PhoneLookupInfo.Builder destination, Cp2Info subMessage) {
- destination.setCp2RemoteInfo(subMessage);
+ destination.setExtendedCp2Info(subMessage);
}
@Override
public Cp2Info getSubMessage(PhoneLookupInfo phoneLookupInfo) {
- return phoneLookupInfo.getCp2RemoteInfo();
+ return phoneLookupInfo.getExtendedCp2Info();
}
@Override
@@ -238,6 +241,8 @@ public final class Cp2RemotePhoneLookup implements PhoneLookup<Cp2Info> {
@Override
public void registerContentObservers(Context appContext) {
- // No content observer needed for remote contacts
+ // For contacts in remote directories, no content observer can be registered.
+ // For contacts in local (but not default) directories (e.g., the local work directory), we
+ // don't register a content observer for now.
}
}
diff --git a/java/com/android/dialer/phonelookup/phone_lookup_info.proto b/java/com/android/dialer/phonelookup/phone_lookup_info.proto
index dd6bf664c..44c237bd1 100644
--- a/java/com/android/dialer/phonelookup/phone_lookup_info.proto
+++ b/java/com/android/dialer/phonelookup/phone_lookup_info.proto
@@ -10,59 +10,58 @@ package com.android.dialer.phonelookup;
// Contains information about a phone number, possibly from many sources.
//
// This message is organized into sub-message fields where each one corresponds
-// to an implementation of PhoneLookup. For example, field "cp2_local_info"
-// corresponds to class Cp2LocalPhoneLookup, and class Cp2LocalPhoneLookup
-// alone is responsible for populating it.
-// Next ID: 7
+// to an implementation of PhoneLookup. For example, field
+// "cp2_info_in_default_directory" corresponds to class
+// Cp2DefaultDirectoryPhoneLookup, and class Cp2DefaultDirectoryPhoneLookup
+// alone is responsible for populating it. Next ID: 7
message PhoneLookupInfo {
// Information about a PhoneNumber retrieved from CP2.
message Cp2Info {
- // Information about a single contact, which can be a local contact or a
- // remote one.
+ // Information about a single contact.
// Next ID: 8
message Cp2ContactInfo {
- // For a local contact:
+ // For a contact in the default directory:
// android.provider.ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY
- // For a remote contact:
+ // For a contact in other directories:
// android.provider.ContactsContract.PhoneLookup.DISPLAY_NAME_PRIMARY
optional string name = 1;
- // For a local contact:
+ // For a contact in the default directory:
// android.provider.ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI
- // For a remote contact:
+ // For a contact in other directories:
// android.provider.ContactsContract.PhoneLookup.PHOTO_THUMBNAIL_URI
optional string photo_thumbnail_uri = 2;
- // For a local contact:
+ // For a contact in the default directory:
// android.provider.ContactsContract.CommonDataKinds.Phone.PHOTO_URI
- // For a remote contact:
+ // For a contact in other directories:
// android.provider.ContactsContract.PhoneLookup.PHOTO_URI
optional string photo_uri = 3;
- // For a local contact:
+ // For a contact in the default directory:
// android.provider.ContactsContract.CommonDataKinds.Phone.PHOTO_ID
- // For a remote contact:
+ // For a contact in other directories:
// android.provider.ContactsContract.PhoneLookup.PHOTO_ID
optional fixed64 photo_id = 4;
- // For a local contact:
+ // For a contact in the default directory:
// android.provider.ContactsContract.CommonDataKinds.Phone.LABEL
- // For a remote contact:
+ // For a contact in other directories:
// android.provider.ContactsContract.PhoneLookup.LABEL
//
// The value can be "Home", "Mobile", ect.
optional string label = 5;
- // For a local contact:
+ // For a contact in the default directory:
// android.provider.ContactsContract.CommonDataKinds.Phone.CONTACT_ID
- // For a remote contact:
+ // For a contact in other directories:
// android.provider.ContactsContract.PhoneLookup.CONTACT_ID
optional fixed64 contact_id = 6;
- // For a local contact:
+ // For a contact in the default directory:
// constructed based on
// android.provider.ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY
- // For a remote contact:
+ // For a contact in other directories:
// constructed based on
// android.provider.ContactsContract.PhoneLookup.LOOKUP_KEY
optional string lookup_uri = 7;
@@ -80,13 +79,13 @@ message PhoneLookupInfo {
optional bool is_incomplete = 2;
}
- // Information about a local contact retrieved via CP2.
- // Cp2LocalPhoneLookup is responsible for populating this field.
- optional Cp2Info cp2_local_info = 1;
+ // Information about a contact in the default directory, retrieved via CP2.
+ // Cp2DefaultDirectoryPhoneLookup is responsible for populating this field.
+ optional Cp2Info default_cp2_info = 1;
- // Information about a remote contact retrieved via CP2.
- // Cp2RemotePhoneLookup is responsible for populating this field.
- optional Cp2Info cp2_remote_info = 6;
+ // Information about a contact in other directories, retrieved via CP2.
+ // Cp2ExtendedDirectoryPhoneLookup is responsible for populating this field.
+ optional Cp2Info extended_cp2_info = 6;
// Message for spam info.
// SpamPhoneLookup is responsible for populating this message.
diff --git a/java/com/android/dialer/searchfragment/directories/DirectoryContactViewHolder.java b/java/com/android/dialer/searchfragment/directories/DirectoryContactViewHolder.java
index ff321fc75..fc5bce1b2 100644
--- a/java/com/android/dialer/searchfragment/directories/DirectoryContactViewHolder.java
+++ b/java/com/android/dialer/searchfragment/directories/DirectoryContactViewHolder.java
@@ -79,6 +79,8 @@ public final class DirectoryContactViewHolder extends RecyclerView.ViewHolder
nameView.setText(QueryBoldingUtil.getNameWithQueryBolded(query, name, context));
numberView.setText(QueryBoldingUtil.getNameWithQueryBolded(query, secondaryInfo, context));
workBadge.setVisibility(
+ // TODO(a bug): Consider moving DirectoryCompat out of "contacts/common" and share it
+ // with PhoneLookups.
DirectoryCompat.isOnlyEnterpriseDirectoryId(cursor.getDirectoryId())
? View.VISIBLE
: View.GONE);
diff --git a/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursor.java b/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursor.java
index bf0bdc057..8f9ab0e60 100644
--- a/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursor.java
+++ b/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursor.java
@@ -101,6 +101,8 @@ public final class DirectoryContactsCursor extends MergeCursor implements Search
private static MatrixCursor createHeaderCursor(Context context, String name, long id) {
MatrixCursor headerCursor = new MatrixCursor(PROJECTION, 1);
+ // TODO(a bug): Consider moving DirectoryCompat out of "contacts/common" and share it
+ // with PhoneLookups.
if (DirectoryCompat.isOnlyEnterpriseDirectoryId(id)) {
headerCursor.addRow(
new Object[] {context.getString(R.string.directory_search_label_work), id});
diff --git a/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursorLoader.java b/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursorLoader.java
index fc36f59bb..a94878577 100644
--- a/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/directories/DirectoryContactsCursorLoader.java
@@ -71,7 +71,8 @@ public final class DirectoryContactsCursorLoader extends CursorLoader {
for (int i = 0; i < directories.size(); i++) {
Directory directory = directories.get(i);
- // Only load contacts in the enterprise directory & remote directories.
+ // TODO(a bug): Consider moving DirectoryCompat out of "contacts/common" and share it
+ // with PhoneLookups.
if (!DirectoryCompat.isRemoteDirectoryId(directory.getId())
&& !DirectoryCompat.isEnterpriseDirectoryId(directory.getId())) {
cursors[i] = null;
diff --git a/java/com/android/dialer/simulator/impl/NonSimulatorConnectionListener.java b/java/com/android/dialer/simulator/impl/NonSimulatorConnectionListener.java
index 333d66c34..66027fc61 100644
--- a/java/com/android/dialer/simulator/impl/NonSimulatorConnectionListener.java
+++ b/java/com/android/dialer/simulator/impl/NonSimulatorConnectionListener.java
@@ -30,6 +30,11 @@ final class NonSimulatorConnectionListener implements SimulatorConnection.Listen
@Override
public void onEvent(@NonNull SimulatorConnection connection, @NonNull Event event) {
switch (event.type) {
+ case Event.STATE_CHANGE:
+ LogUtil.i(
+ "SimulatorVoiceCall.onEvent",
+ String.format("state changed from %s to %s ", event.data1, event.data2));
+ break;
case Event.REJECT:
connection.setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
break;
diff --git a/java/com/android/dialer/voicemail/listui/menu/Modules.java b/java/com/android/dialer/voicemail/listui/menu/Modules.java
index 7254ad651..84921bd65 100644
--- a/java/com/android/dialer/voicemail/listui/menu/Modules.java
+++ b/java/com/android/dialer/voicemail/listui/menu/Modules.java
@@ -56,7 +56,9 @@ final class Modules {
SharedModules.addModulesHandlingBlockedOrSpamNumber(
context,
modules,
- normalizedNumber,
+ voicemailEntry.number().getNormalizedNumber(),
+ voicemailEntry.number().getCountryIso(),
+ voicemailEntry.callType(),
voicemailEntry.numberAttributes().getIsBlocked(),
voicemailEntry.numberAttributes().getIsSpam());
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index b945b0810..ad92f57c9 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -352,7 +352,7 @@ public class CallCardPresenter
callState = this.primary.getState();
updatePrimaryCallState();
} else {
- getUi().setCallState(PrimaryCallState.createEmptyPrimaryCallState());
+ getUi().setCallState(PrimaryCallState.empty());
}
maybeShowManageConferenceCallButton();
@@ -472,34 +472,39 @@ public class CallCardPresenter
!VideoCallPresenter.showIncomingVideo(primary.getVideoState(), primary.getState());
getUi()
.setCallState(
- new PrimaryCallState(
- primary.getState(),
- primary.isVideoCall(),
- primary.getVideoTech().getSessionModificationState(),
- primary.getDisconnectCause(),
- getConnectionLabel(),
- getCallStateIcon(),
- getGatewayNumber(),
- shouldShowCallSubject(primary) ? primary.getCallSubject() : null,
- PhoneNumberHelper.formatNumber(
- primary.getCallbackNumber(), primary.getSimCountryIso()),
- primary.hasProperty(Details.PROPERTY_WIFI),
- primary.isConferenceCall()
- && !primary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE),
- isWorkCall,
- isAttemptingHdAudioCall,
- isHdAudioCall,
- !TextUtils.isEmpty(primary.getLastForwardedNumber()) || primary.isCallForwarded(),
- shouldShowContactPhoto,
- primary.getConnectTimeMillis(),
- primary.isVoiceMailNumber(),
- primary.isRemotelyHeld(),
- isBusiness,
- supports2ndCallOnHold(),
- getSwapToSecondaryButtonState(),
- primary.isAssistedDialed(),
- null,
- primary.getAssistedDialingExtras()));
+ PrimaryCallState.builder()
+ .setState(primary.getState())
+ .setIsVideoCall(primary.isVideoCall())
+ .setSessionModificationState(primary.getVideoTech().getSessionModificationState())
+ .setDisconnectCause(primary.getDisconnectCause())
+ .setConnectionLabel(getConnectionLabel())
+ .setConnectionIcon(getCallStateIcon())
+ .setGatewayNumber(getGatewayNumber())
+ .setCallSubject(shouldShowCallSubject(primary) ? primary.getCallSubject() : null)
+ .setCallbackNumber(
+ PhoneNumberHelper.formatNumber(
+ primary.getCallbackNumber(), primary.getSimCountryIso()))
+ .setIsWifi(primary.hasProperty(Details.PROPERTY_WIFI))
+ .setIsConference(
+ primary.isConferenceCall()
+ && !primary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE))
+ .setIsWorkCall(isWorkCall)
+ .setIsHdAttempting(isAttemptingHdAudioCall)
+ .setIsHdAudioCall(isHdAudioCall)
+ .setIsForwardedNumber(
+ !TextUtils.isEmpty(primary.getLastForwardedNumber())
+ || primary.isCallForwarded())
+ .setShouldShowContactPhoto(shouldShowContactPhoto)
+ .setConnectTimeMillis(primary.getConnectTimeMillis())
+ .setIsVoiceMailNumber(primary.isVoiceMailNumber())
+ .setIsRemotelyHeld(primary.isRemotelyHeld())
+ .setIsBusinessNumber(isBusiness)
+ .setSupportsCallOnHold(supports2ndCallOnHold())
+ .setSwapToSecondaryButtonState(getSwapToSecondaryButtonState())
+ .setIsAssistedDialed(primary.isAssistedDialed())
+ .setCustomLabel(null)
+ .setAssistedDialingExtras(primary.getAssistedDialingExtras())
+ .build());
InCallActivity activity =
(InCallActivity) (inCallScreen.getInCallScreenFragment().getActivity());
diff --git a/java/com/android/incallui/answer/impl/AnswerFragment.java b/java/com/android/incallui/answer/impl/AnswerFragment.java
index 3439a3e3c..4729b41ba 100644
--- a/java/com/android/incallui/answer/impl/AnswerFragment.java
+++ b/java/com/android/incallui/answer/impl/AnswerFragment.java
@@ -858,7 +858,7 @@ public class AnswerFragment extends Fragment
public void onAnswerProgressUpdate(@FloatRange(from = -1f, to = 1f) float answerProgress) {
// Don't fade the window background for call waiting or video upgrades. Fading the background
// shows the system wallpaper which looks bad because on reject we switch to another call.
- if (primaryCallState.state == State.INCOMING && !isVideoCall()) {
+ if (primaryCallState.state() == State.INCOMING && !isVideoCall()) {
answerScreenDelegate.updateWindowBackgroundColor(answerProgress);
}
@@ -969,7 +969,7 @@ public class AnswerFragment extends Fragment
if (hasCallOnHold()) {
getAnswerMethod()
.setHintText(getText(R.string.call_incoming_default_label_answer_and_release_third));
- } else if (primaryCallState.supportsCallOnHold) {
+ } else if (primaryCallState.supportsCallOnHold()) {
getAnswerMethod()
.setHintText(getText(R.string.call_incoming_default_label_answer_and_release_second));
}
@@ -1048,9 +1048,9 @@ public class AnswerFragment extends Fragment
private boolean canRejectCallWithSms() {
return primaryCallState != null
- && !(primaryCallState.state == State.DISCONNECTED
- || primaryCallState.state == State.DISCONNECTING
- || primaryCallState.state == State.IDLE);
+ && !(primaryCallState.state() == State.DISCONNECTED
+ || primaryCallState.state() == State.DISCONNECTING
+ || primaryCallState.state() == State.IDLE);
}
private void createInCallScreenDelegate() {
diff --git a/java/com/android/incallui/callpending/CallPendingActivity.java b/java/com/android/incallui/callpending/CallPendingActivity.java
index 306eed8fb..c7ce2b108 100644
--- a/java/com/android/incallui/callpending/CallPendingActivity.java
+++ b/java/com/android/incallui/callpending/CallPendingActivity.java
@@ -147,8 +147,10 @@ public class CallPendingActivity extends FragmentActivity
(InCallScreen) getSupportFragmentManager().findFragmentByTag(TAG_IN_CALL_SCREEN);
inCallScreen.setPrimary(createPrimaryInfo());
inCallScreen.setCallState(
- PrimaryCallState.createEmptyPrimaryCallStateWithState(
- State.CALL_PENDING, getCallPendingLabel()));
+ PrimaryCallState.builder()
+ .setState(State.CALL_PENDING)
+ .setCustomLabel(getCallPendingLabel())
+ .build());
inCallScreen.setEndCallButtonEnabled(true, true);
}
diff --git a/java/com/android/incallui/contactgrid/BottomRow.java b/java/com/android/incallui/contactgrid/BottomRow.java
index 610eeca39..dc86d819b 100644
--- a/java/com/android/incallui/contactgrid/BottomRow.java
+++ b/java/com/android/incallui/contactgrid/BottomRow.java
@@ -74,11 +74,11 @@ public class BottomRow {
public static Info getInfo(Context context, PrimaryCallState state, PrimaryInfo primaryInfo) {
CharSequence label;
- boolean isTimerVisible = state.state == State.ACTIVE;
- boolean isForwardIconVisible = state.isForwardedNumber;
- boolean isWorkIconVisible = state.isWorkCall;
- boolean isHdIconVisible = state.isHdAudioCall && !isForwardIconVisible;
- boolean isHdAttemptingIconVisible = state.isHdAttempting;
+ boolean isTimerVisible = state.state() == State.ACTIVE;
+ boolean isForwardIconVisible = state.isForwardedNumber();
+ boolean isWorkIconVisible = state.isWorkCall();
+ boolean isHdIconVisible = state.isHdAudioCall() && !isForwardIconVisible;
+ boolean isHdAttemptingIconVisible = state.isHdAttempting();
boolean isSpamIconVisible = false;
boolean shouldPopulateAccessibilityEvent = true;
@@ -86,14 +86,14 @@ public class BottomRow {
label = context.getString(R.string.contact_grid_incoming_suspected_spam);
isSpamIconVisible = true;
isHdIconVisible = false;
- } else if (state.state == State.DISCONNECTING) {
+ } else if (state.state() == State.DISCONNECTING) {
// While in the DISCONNECTING state we display a "Hanging up" message in order to make the UI
// feel more responsive. (In GSM it's normal to see a delay of a couple of seconds while
// negotiating the disconnect with the network, so the "Hanging up" state at least lets the
// user know that we're doing something. This state is currently not used with CDMA.)
label = context.getString(R.string.incall_hanging_up);
- } else if (state.state == State.DISCONNECTED) {
- label = state.disconnectCause.getLabel();
+ } else if (state.state() == State.DISCONNECTED) {
+ label = state.disconnectCause().getLabel();
if (TextUtils.isEmpty(label)) {
label = context.getString(R.string.incall_call_ended);
}
@@ -134,6 +134,6 @@ public class BottomRow {
}
private static boolean isIncoming(PrimaryCallState state) {
- return state.state == State.INCOMING || state.state == State.CALL_WAITING;
+ return state.state() == State.INCOMING || state.state() == State.CALL_WAITING;
}
}
diff --git a/java/com/android/incallui/contactgrid/ContactGridManager.java b/java/com/android/incallui/contactgrid/ContactGridManager.java
index 6dec7646f..1b76958dc 100644
--- a/java/com/android/incallui/contactgrid/ContactGridManager.java
+++ b/java/com/android/incallui/contactgrid/ContactGridManager.java
@@ -86,7 +86,7 @@ public class ContactGridManager {
private final View deviceNumberDivider;
private PrimaryInfo primaryInfo = PrimaryInfo.empty();
- private PrimaryCallState primaryCallState = PrimaryCallState.createEmptyPrimaryCallState();
+ private PrimaryCallState primaryCallState = PrimaryCallState.empty();
private final LetterTileDrawable letterTile;
private boolean isInMultiWindowMode;
@@ -305,11 +305,11 @@ public class ContactGridManager {
primaryInfo.contactInfoLookupKey(),
LetterTileDrawable.SHAPE_CIRCLE,
LetterTileDrawable.getContactTypeFromPrimitives(
- primaryCallState.isVoiceMailNumber,
+ primaryCallState.isVoiceMailNumber(),
primaryInfo.isSpam(),
- primaryCallState.isBusinessNumber,
+ primaryCallState.isBusinessNumber(),
primaryInfo.numberPresentation(),
- primaryCallState.isConference));
+ primaryCallState.isConference()));
// By invalidating the avatarImageView we force a redraw of the letter tile.
// This is required to properly display the updated letter tile iconography based on the
// contact type, because the background drawable reference cached in the view, and the
@@ -381,7 +381,7 @@ public class ContactGridManager {
if (info.isTimerVisible) {
bottomTextSwitcher.setDisplayedChild(1);
bottomTimerView.setBase(
- primaryCallState.connectTimeMillis
+ primaryCallState.connectTimeMillis()
- System.currentTimeMillis()
+ SystemClock.elapsedRealtime());
if (!isTimerStarted) {
@@ -404,14 +404,15 @@ public class ContactGridManager {
if (deviceNumberTextView == null) {
return;
}
- if (isInMultiWindowMode || TextUtils.isEmpty(primaryCallState.callbackNumber)) {
+ if (isInMultiWindowMode || TextUtils.isEmpty(primaryCallState.callbackNumber())) {
deviceNumberTextView.setVisibility(View.GONE);
deviceNumberDivider.setVisibility(View.GONE);
return;
}
// This is used for carriers like Project Fi to show the callback number for emergency calls.
deviceNumberTextView.setText(
- context.getString(R.string.contact_grid_callback_number, primaryCallState.callbackNumber));
+ context.getString(
+ R.string.contact_grid_callback_number, primaryCallState.callbackNumber()));
deviceNumberTextView.setVisibility(View.VISIBLE);
if (primaryInfo.shouldShowLocation()) {
deviceNumberDivider.setVisibility(View.VISIBLE);
diff --git a/java/com/android/incallui/contactgrid/TopRow.java b/java/com/android/incallui/contactgrid/TopRow.java
index 5eb38f98c..f551092d4 100644
--- a/java/com/android/incallui/contactgrid/TopRow.java
+++ b/java/com/android/incallui/contactgrid/TopRow.java
@@ -62,19 +62,19 @@ public class TopRow {
public static Info getInfo(Context context, PrimaryCallState state, PrimaryInfo primaryInfo) {
CharSequence label = null;
- Drawable icon = state.connectionIcon;
+ Drawable icon = state.connectionIcon();
boolean labelIsSingleLine = true;
- if (state.isWifi && icon == null) {
+ if (state.isWifi() && icon == null) {
icon = context.getDrawable(R.drawable.quantum_ic_network_wifi_vd_theme_24);
}
- if (state.state == State.INCOMING || state.state == State.CALL_WAITING) {
+ if (state.state() == State.INCOMING || state.state() == State.CALL_WAITING) {
// Call from
// [Wi-Fi icon] Video call from
// Hey Jake, pick up!
- if (!TextUtils.isEmpty(state.callSubject)) {
- label = state.callSubject;
+ if (!TextUtils.isEmpty(state.callSubject())) {
+ label = state.callSubject();
labelIsSingleLine = false;
} else {
label = getLabelForIncoming(context, state);
@@ -84,22 +84,22 @@ public class TopRow {
label = TextUtils.concat(label, " ", spanDisplayNumber(primaryInfo.number()));
}
}
- } else if (VideoUtils.hasSentVideoUpgradeRequest(state.sessionModificationState)
- || VideoUtils.hasReceivedVideoUpgradeRequest(state.sessionModificationState)) {
+ } else if (VideoUtils.hasSentVideoUpgradeRequest(state.sessionModificationState())
+ || VideoUtils.hasReceivedVideoUpgradeRequest(state.sessionModificationState())) {
label = getLabelForVideoRequest(context, state);
- } else if (state.state == State.PULLING) {
+ } else if (state.state() == State.PULLING) {
label = context.getString(R.string.incall_transferring);
- } else if (state.state == State.DIALING || state.state == State.CONNECTING) {
+ } else if (state.state() == State.DIALING || state.state() == State.CONNECTING) {
// [Wi-Fi icon] Calling via Google Guest
// Calling...
label = getLabelForDialing(context, state);
- } else if (state.state == State.ACTIVE && state.isRemotelyHeld) {
+ } else if (state.state() == State.ACTIVE && state.isRemotelyHeld()) {
label = context.getString(R.string.incall_remotely_held);
- } else if (state.state == State.ACTIVE
+ } else if (state.state() == State.ACTIVE
&& shouldShowNumber(primaryInfo, false /* isIncoming */)) {
label = spanDisplayNumber(primaryInfo.number());
- } else if (state.state == State.CALL_PENDING && !TextUtils.isEmpty(state.customLabel)) {
- label = state.customLabel;
+ } else if (state.state() == State.CALL_PENDING && !TextUtils.isEmpty(state.customLabel())) {
+ label = state.customLabel();
} else {
// Video calling...
// [Wi-Fi icon] Starbucks Wi-Fi
@@ -133,13 +133,14 @@ public class TopRow {
}
private static CharSequence getLabelForIncoming(Context context, PrimaryCallState state) {
- if (state.isVideoCall) {
- return getLabelForIncomingVideo(context, state.sessionModificationState, state.isWifi);
- } else if (state.isWifi && !TextUtils.isEmpty(state.connectionLabel)) {
- return state.connectionLabel;
+ if (state.isVideoCall()) {
+ return getLabelForIncomingVideo(context, state.sessionModificationState(), state.isWifi());
+ } else if (state.isWifi() && !TextUtils.isEmpty(state.connectionLabel())) {
+ return state.connectionLabel();
} else if (isAccount(state)) {
- return context.getString(R.string.contact_grid_incoming_via_template, state.connectionLabel);
- } else if (state.isWorkCall) {
+ return context.getString(
+ R.string.contact_grid_incoming_via_template, state.connectionLabel());
+ } else if (state.isWorkCall()) {
return context.getString(R.string.contact_grid_incoming_work_call);
} else {
return context.getString(R.string.contact_grid_incoming_voice_call);
@@ -164,43 +165,43 @@ public class TopRow {
}
private static CharSequence getLabelForDialing(Context context, PrimaryCallState state) {
- if (!TextUtils.isEmpty(state.connectionLabel) && !state.isWifi) {
- return context.getString(R.string.incall_calling_via_template, state.connectionLabel);
+ if (!TextUtils.isEmpty(state.connectionLabel()) && !state.isWifi()) {
+ return context.getString(R.string.incall_calling_via_template, state.connectionLabel());
} else {
- if (state.isVideoCall) {
- if (state.isWifi) {
+ if (state.isVideoCall()) {
+ if (state.isWifi()) {
return context.getString(R.string.incall_wifi_video_call_requesting);
} else {
return context.getString(R.string.incall_video_call_requesting);
}
}
- if (state.isAssistedDialed && state.assistedDialingExtras != null) {
+ if (state.isAssistedDialed() && state.assistedDialingExtras() != null) {
LogUtil.i("TopRow.getLabelForDialing", "using assisted dialing label.");
String countryCode =
- String.valueOf(state.assistedDialingExtras.transformedNumberCountryCallingCode());
+ String.valueOf(state.assistedDialingExtras().transformedNumberCountryCallingCode());
return context.getString(
R.string.incall_connecting_assited_dialed,
countryCode,
- state.assistedDialingExtras.userHomeCountryCode());
+ state.assistedDialingExtras().userHomeCountryCode());
}
return context.getString(R.string.incall_connecting);
}
}
private static CharSequence getConnectionLabel(PrimaryCallState state) {
- if (!TextUtils.isEmpty(state.connectionLabel)
- && (isAccount(state) || state.isWifi || state.isConference)) {
+ if (!TextUtils.isEmpty(state.connectionLabel())
+ && (isAccount(state) || state.isWifi() || state.isConference())) {
// We normally don't show a "call state label" at all when active
// (but we can use the call state label to display the provider name).
- return state.connectionLabel;
+ return state.connectionLabel();
} else {
return null;
}
}
private static CharSequence getLabelForVideoRequest(Context context, PrimaryCallState state) {
- switch (state.sessionModificationState) {
+ switch (state.sessionModificationState()) {
case SessionModificationState.WAITING_FOR_UPGRADE_TO_VIDEO_RESPONSE:
return context.getString(R.string.incall_video_call_upgrade_request);
case SessionModificationState.REQUEST_FAILED:
@@ -211,7 +212,7 @@ public class TopRow {
case SessionModificationState.UPGRADE_TO_VIDEO_REQUEST_TIMED_OUT:
return context.getString(R.string.incall_video_call_request_timed_out);
case SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST:
- return getLabelForIncomingVideo(context, state.sessionModificationState, state.isWifi);
+ return getLabelForIncomingVideo(context, state.sessionModificationState(), state.isWifi());
case SessionModificationState.NO_REQUEST:
default:
Assert.fail();
@@ -220,6 +221,6 @@ public class TopRow {
}
private static boolean isAccount(PrimaryCallState state) {
- return !TextUtils.isEmpty(state.connectionLabel) && TextUtils.isEmpty(state.gatewayNumber);
+ return !TextUtils.isEmpty(state.connectionLabel()) && TextUtils.isEmpty(state.gatewayNumber());
}
}
diff --git a/java/com/android/incallui/incall/impl/InCallFragment.java b/java/com/android/incallui/incall/impl/InCallFragment.java
index 9a6d1c41e..29160abef 100644
--- a/java/com/android/incallui/incall/impl/InCallFragment.java
+++ b/java/com/android/incallui/incall/impl/InCallFragment.java
@@ -321,11 +321,12 @@ public class InCallFragment extends Fragment
LogUtil.i("InCallFragment.setCallState", primaryCallState.toString());
contactGridManager.setCallState(primaryCallState);
getButtonController(InCallButtonIds.BUTTON_SWITCH_TO_SECONDARY)
- .setAllowed(primaryCallState.swapToSecondaryButtonState != ButtonState.NOT_SUPPORT);
+ .setAllowed(primaryCallState.swapToSecondaryButtonState() != ButtonState.NOT_SUPPORT);
getButtonController(InCallButtonIds.BUTTON_SWITCH_TO_SECONDARY)
- .setEnabled(primaryCallState.swapToSecondaryButtonState == ButtonState.ENABLED);
+ .setEnabled(primaryCallState.swapToSecondaryButtonState() == ButtonState.ENABLED);
buttonChooser =
- ButtonChooserFactory.newButtonChooser(voiceNetworkType, primaryCallState.isWifi, phoneType);
+ ButtonChooserFactory.newButtonChooser(
+ voiceNetworkType, primaryCallState.isWifi(), phoneType);
updateButtonStates();
}
diff --git a/java/com/android/incallui/incall/protocol/PrimaryCallState.java b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
index 7a3abedcd..1d536e9b9 100644
--- a/java/com/android/incallui/incall/protocol/PrimaryCallState.java
+++ b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
@@ -26,12 +26,14 @@ import com.android.dialer.common.Assert;
import com.android.incallui.call.DialerCall;
import com.android.incallui.call.DialerCall.State;
import com.android.incallui.videotech.utils.SessionModificationState;
+import com.google.auto.value.AutoValue;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Locale;
/** State of the primary call. */
-public class PrimaryCallState {
+@AutoValue
+public abstract class PrimaryCallState {
/**
* Button state that will be invisible if not supported, visible but invalid if disabled, or
@@ -45,126 +47,159 @@ public class PrimaryCallState {
int ENABLED = 2;
}
- public final int state;
- public final boolean isVideoCall;
- @SessionModificationState public final int sessionModificationState;
- public final DisconnectCause disconnectCause;
- public final String connectionLabel;
- public final Drawable connectionIcon;
- public final String gatewayNumber;
- public final String callSubject;
- public final String callbackNumber;
- public final boolean isWifi;
- public final boolean isConference;
- public final boolean isWorkCall;
- public final boolean isHdAttempting;
- public final boolean isHdAudioCall;
- public final boolean isForwardedNumber;
- public final boolean shouldShowContactPhoto;
- public final long connectTimeMillis;
- public final boolean isVoiceMailNumber;
- public final boolean isRemotelyHeld;
- public final boolean isBusinessNumber;
- public final boolean supportsCallOnHold;
- public final @ButtonState int swapToSecondaryButtonState;
- public final boolean isAssistedDialed;
- @Nullable public final String customLabel;
- @Nullable public final TransformationInfo assistedDialingExtras;
-
- // TODO: Convert to autovalue. a bug
- public static PrimaryCallState createEmptyPrimaryCallState() {
- return createEmptyPrimaryCallStateWithState(DialerCall.State.IDLE, null);
- }
+ public abstract int state();
+
+ public abstract boolean isVideoCall();
+
+ @SessionModificationState
+ public abstract int sessionModificationState();
+
+ public abstract DisconnectCause disconnectCause();
+
+ @Nullable
+ public abstract String connectionLabel();
+
+ @Nullable
+ public abstract Drawable connectionIcon();
+
+ @Nullable
+ public abstract String gatewayNumber();
+
+ @Nullable
+ public abstract String callSubject();
+
+ @Nullable
+ public abstract String callbackNumber();
+
+ public abstract boolean isWifi();
+
+ public abstract boolean isConference();
+
+ public abstract boolean isWorkCall();
+
+ public abstract boolean isHdAttempting();
+
+ public abstract boolean isHdAudioCall();
- public static PrimaryCallState createEmptyPrimaryCallStateWithState(
- int state, String customLabel) {
- return new PrimaryCallState(
- state,
- false, /* isVideoCall */
- SessionModificationState.NO_REQUEST,
- new DisconnectCause(DisconnectCause.UNKNOWN),
- null, /* connectionLabel */
- null, /* connectionIcon */
- null, /* gatewayNumber */
- null, /* callSubject */
- null, /* callbackNumber */
- false /* isWifi */,
- false /* isConference */,
- false /* isWorkCall */,
- false /* isHdAttempting */,
- false /* isHdAudioCall */,
- false /* isForwardedNumber */,
- false /* shouldShowContactPhoto */,
- 0,
- false /* isVoiceMailNumber */,
- false /* isRemotelyHeld */,
- false /* isBusinessNumber */,
- true /* supportsCallOnHold */,
- ButtonState.NOT_SUPPORT /* swapToSecondaryButtonState */,
- false /* isAssistedDialed */,
- customLabel,
- null /* assistedDialingExtras */);
+ public abstract boolean isForwardedNumber();
+
+ public abstract boolean shouldShowContactPhoto();
+
+ public abstract long connectTimeMillis();
+
+ public abstract boolean isVoiceMailNumber();
+
+ public abstract boolean isRemotelyHeld();
+
+ public abstract boolean isBusinessNumber();
+
+ public abstract boolean supportsCallOnHold();
+
+ public abstract @ButtonState int swapToSecondaryButtonState();
+
+ public abstract boolean isAssistedDialed();
+
+ @Nullable
+ public abstract String customLabel();
+
+ @Nullable
+ public abstract TransformationInfo assistedDialingExtras();
+
+ public static Builder builder() {
+ return new AutoValue_PrimaryCallState.Builder()
+ .setState(DialerCall.State.IDLE)
+ .setIsVideoCall(false)
+ .setSessionModificationState(SessionModificationState.NO_REQUEST)
+ .setDisconnectCause(new DisconnectCause(DisconnectCause.UNKNOWN))
+ .setIsWifi(false)
+ .setIsConference(false)
+ .setIsWorkCall(false)
+ .setIsHdAttempting(false)
+ .setIsHdAudioCall(false)
+ .setIsForwardedNumber(false)
+ .setShouldShowContactPhoto(false)
+ .setConnectTimeMillis(0)
+ .setIsVoiceMailNumber(false)
+ .setIsRemotelyHeld(false)
+ .setIsBusinessNumber(false)
+ .setSupportsCallOnHold(true)
+ .setSwapToSecondaryButtonState(ButtonState.NOT_SUPPORT)
+ .setIsAssistedDialed(false);
}
- public PrimaryCallState(
- int state,
- boolean isVideoCall,
- @SessionModificationState int sessionModificationState,
- DisconnectCause disconnectCause,
- String connectionLabel,
- Drawable connectionIcon,
- String gatewayNumber,
- String callSubject,
- String callbackNumber,
- boolean isWifi,
- boolean isConference,
- boolean isWorkCall,
- boolean isHdAttempting,
- boolean isHdAudioCall,
- boolean isForwardedNumber,
- boolean shouldShowContactPhoto,
- long connectTimeMillis,
- boolean isVoiceMailNumber,
- boolean isRemotelyHeld,
- boolean isBusinessNumber,
- boolean supportsCallOnHold,
- @ButtonState int swapToSecondaryButtonState,
- boolean isAssistedDialed,
- @Nullable String customLabel,
- @Nullable TransformationInfo assistedDialingExtras) {
- this.state = state;
- this.isVideoCall = isVideoCall;
- this.sessionModificationState = sessionModificationState;
- this.disconnectCause = disconnectCause;
- this.connectionLabel = connectionLabel;
- this.connectionIcon = connectionIcon;
- this.gatewayNumber = gatewayNumber;
- this.callSubject = callSubject;
- this.callbackNumber = callbackNumber;
- this.isWifi = isWifi;
- this.isConference = isConference;
- this.isWorkCall = isWorkCall;
- this.isHdAttempting = isHdAttempting;
- this.isHdAudioCall = isHdAudioCall;
- this.isForwardedNumber = isForwardedNumber;
- this.shouldShowContactPhoto = shouldShowContactPhoto;
- this.connectTimeMillis = connectTimeMillis;
- this.isVoiceMailNumber = isVoiceMailNumber;
- this.isRemotelyHeld = isRemotelyHeld;
- this.isBusinessNumber = isBusinessNumber;
- this.supportsCallOnHold = supportsCallOnHold;
- this.swapToSecondaryButtonState = swapToSecondaryButtonState;
- this.isAssistedDialed = isAssistedDialed;
- if (!TextUtils.isEmpty(customLabel)) {
- Assert.checkArgument(state == State.CALL_PENDING);
+ /** Builder class for primary call state info. */
+ @AutoValue.Builder
+ public abstract static class Builder {
+ public abstract Builder setState(int state);
+
+ public abstract Builder setIsVideoCall(boolean isVideoCall);
+
+ public abstract Builder setSessionModificationState(
+ @SessionModificationState int sessionModificationState);
+
+ public abstract Builder setDisconnectCause(DisconnectCause disconnectCause);
+
+ public abstract Builder setConnectionLabel(String connectionLabel);
+
+ public abstract Builder setConnectionIcon(Drawable connectionIcon);
+
+ public abstract Builder setGatewayNumber(String gatewayNumber);
+
+ public abstract Builder setCallSubject(String callSubject);
+
+ public abstract Builder setCallbackNumber(String callbackNumber);
+
+ public abstract Builder setIsWifi(boolean isWifi);
+
+ public abstract Builder setIsConference(boolean isConference);
+
+ public abstract Builder setIsWorkCall(boolean isWorkCall);
+
+ public abstract Builder setIsHdAttempting(boolean isHdAttempting);
+
+ public abstract Builder setIsHdAudioCall(boolean isHdAudioCall);
+
+ public abstract Builder setIsForwardedNumber(boolean isForwardedNumber);
+
+ public abstract Builder setShouldShowContactPhoto(boolean shouldShowContactPhoto);
+
+ public abstract Builder setConnectTimeMillis(long connectTimeMillis);
+
+ public abstract Builder setIsVoiceMailNumber(boolean isVoiceMailNumber);
+
+ public abstract Builder setIsRemotelyHeld(boolean isRemotelyHeld);
+
+ public abstract Builder setIsBusinessNumber(boolean isBusinessNumber);
+
+ public abstract Builder setSupportsCallOnHold(boolean supportsCallOnHold);
+
+ public abstract Builder setSwapToSecondaryButtonState(
+ @ButtonState int swapToSecondaryButtonState);
+
+ public abstract Builder setIsAssistedDialed(boolean isAssistedDialed);
+
+ public abstract Builder setCustomLabel(String customLabel);
+
+ public abstract Builder setAssistedDialingExtras(TransformationInfo assistedDialingExtras);
+
+ abstract PrimaryCallState autoBuild();
+
+ public PrimaryCallState build() {
+ PrimaryCallState primaryCallState = autoBuild();
+ if (!TextUtils.isEmpty(primaryCallState.customLabel())) {
+ Assert.checkArgument(primaryCallState.state() == State.CALL_PENDING);
+ }
+ return primaryCallState;
}
- this.customLabel = customLabel;
- this.assistedDialingExtras = assistedDialingExtras;
+ }
+
+ public static PrimaryCallState empty() {
+ return PrimaryCallState.builder().build();
}
@Override
public String toString() {
return String.format(
- Locale.US, "PrimaryCallState, state: %d, connectionLabel: %s", state, connectionLabel);
+ Locale.US, "PrimaryCallState, state: %d, connectionLabel: %s", state(), connectionLabel());
}
}
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index 2c8de09f4..deb205ce6 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -288,11 +288,11 @@ public class RttChatFragment extends Fragment
@Override
public void setCallState(@NonNull PrimaryCallState primaryCallState) {
LogUtil.i("RttChatFragment.setCallState", primaryCallState.toString());
- if (!isTimerStarted && primaryCallState.state == State.ACTIVE) {
+ if (!isTimerStarted && primaryCallState.state() == State.ACTIVE) {
LogUtil.i(
"RttChatFragment.setCallState", "starting timer with base: %d", chronometer.getBase());
chronometer.setBase(
- primaryCallState.connectTimeMillis
+ primaryCallState.connectTimeMillis()
- System.currentTimeMillis()
+ SystemClock.elapsedRealtime());
chronometer.start();
diff --git a/java/com/android/incallui/spam/SpamNotificationActivity.java b/java/com/android/incallui/spam/SpamNotificationActivity.java
index f6da2a3b0..6ba7c30f8 100644
--- a/java/com/android/incallui/spam/SpamNotificationActivity.java
+++ b/java/com/android/incallui/spam/SpamNotificationActivity.java
@@ -28,10 +28,10 @@ import android.provider.ContactsContract;
import android.support.v4.app.FragmentActivity;
import android.telephony.PhoneNumberUtils;
import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
-import com.android.dialer.blocking.BlockReportSpamDialogs;
import com.android.dialer.blocking.BlockedNumbersMigrator;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
import com.android.dialer.blocking.FilteredNumberCompat;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs;
import com.android.dialer.common.LogUtil;
import com.android.dialer.location.GeoUtil;
import com.android.dialer.logging.ContactLookupResult;