summaryrefslogtreecommitdiff
path: root/java/com/android/dialer
diff options
context:
space:
mode:
authorEric Erfanian <erfanian@google.com>2017-10-24 14:05:52 -0700
committerEric Erfanian <erfanian@google.com>2017-10-24 14:05:52 -0700
commit938468da6f5c225ebb161a68bd949c9cf3261892 (patch)
tree232533fa35dc9d140fdfe0dac82b2bd21ad1b5c4 /java/com/android/dialer
parent958b292fc04ad15879fff47df929d6d1a826615c (diff)
Rename the new bubble package name from "bubble" to "newbubble".
It fixes AOSP for package name conflict. Test: manual PiperOrigin-RevId: 173298696 Change-Id: Id10ebe0bcf029e61f65cf6580c7198abd8395081
Diffstat (limited to 'java/com/android/dialer')
-rwxr-xr-xjava/com/android/dialer/about/res/raw/third_party_license_metadata20
-rwxr-xr-xjava/com/android/dialer/about/res/raw/third_party_licenses22
-rw-r--r--java/com/android/dialer/app/DialtactsActivity.java2
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAdapter.java2
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java2
-rw-r--r--java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java5
-rw-r--r--java/com/android/dialer/app/calllog/MissedCallNotifier.java2
-rw-r--r--java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java2
-rw-r--r--java/com/android/dialer/app/list/RemoveView.java2
-rw-r--r--java/com/android/dialer/app/manifests/activities/AndroidManifest.xml9
-rw-r--r--java/com/android/dialer/app/res/layout/call_log_list_item.xml4
-rw-r--r--java/com/android/dialer/app/settings/DialerSettingsActivity.java21
-rw-r--r--java/com/android/dialer/app/voicemail/VoicemailErrorManager.java2
-rw-r--r--java/com/android/dialer/app/voicemail/error/AndroidManifest.xml24
-rw-r--r--java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java2
-rw-r--r--java/com/android/dialer/app/voicemail/error/PackageReplacedReceiver.java109
-rw-r--r--java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java2
-rw-r--r--java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java221
-rw-r--r--java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java2
-rw-r--r--java/com/android/dialer/app/voicemail/error/res/layout/voicemail_tos_fragment.xml3
-rw-r--r--java/com/android/dialer/app/voicemail/error/res/values/strings.xml21
-rw-r--r--java/com/android/dialer/app/voicemail/error/res/values/styles.xml10
-rw-r--r--java/com/android/dialer/app/widget/SearchEditTextLayout.java6
-rw-r--r--java/com/android/dialer/assisteddialing/ConcreteCreator.java2
-rw-r--r--java/com/android/dialer/assisteddialing/Constraints.java8
-rw-r--r--java/com/android/dialer/assisteddialing/ui/res/xml/assisted_dialing_setting.xml4
-rw-r--r--java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java2
-rw-r--r--java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java30
-rw-r--r--java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java30
-rw-r--r--java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java30
-rw-r--r--java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java30
-rw-r--r--java/com/android/dialer/callcomposer/CallComposerActivity.java2
-rw-r--r--java/com/android/dialer/callcomposer/GalleryComposerFragment.java4
-rw-r--r--java/com/android/dialer/callcomposer/camera/CameraPreview.java2
-rw-r--r--java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java2
-rw-r--r--java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java4
-rw-r--r--java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java5
-rw-r--r--java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java14
-rw-r--r--java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java8
-rw-r--r--java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java6
-rw-r--r--java/com/android/dialer/constants/Constants.java3
-rw-r--r--java/com/android/dialer/constants/aospdialer/ConstantsImpl.java6
-rw-r--r--java/com/android/dialer/constants/googledialer/ConstantsImpl.java6
-rw-r--r--java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java2
-rw-r--r--java/com/android/dialer/database/DialerDatabaseHelper.java2
-rw-r--r--java/com/android/dialer/enrichedcall/EnrichedCallManager.java2
-rw-r--r--java/com/android/dialer/interactions/PhoneNumberInteraction.java12
-rw-r--r--java/com/android/dialer/logging/contact_source.proto2
-rw-r--r--java/com/android/dialer/logging/dialer_impression.proto150
-rw-r--r--java/com/android/dialer/main/impl/AndroidManifest.xml4
-rw-r--r--java/com/android/dialer/notification/NotificationChannelManager.java2
-rw-r--r--java/com/android/dialer/notification/VoicemailChannelUtils.java37
-rw-r--r--java/com/android/dialer/oem/CequintCallerIdManager.java2
-rw-r--r--java/com/android/dialer/oem/MotorolaUtils.java2
-rw-r--r--java/com/android/dialer/phonenumbercache/ContactInfoHelper.java2
-rw-r--r--java/com/android/dialer/phonenumberproto/dialer_phone_number.proto3
-rw-r--r--java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java125
-rw-r--r--java/com/android/dialer/proguard/proguard_base.flags1
-rw-r--r--java/com/android/dialer/proguard/proguard_release.flags1
-rw-r--r--java/com/android/dialer/searchfragment/common/Projections.java18
-rw-r--r--java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java16
-rw-r--r--java/com/android/dialer/searchfragment/cp2/Cp2Contact.java2
-rw-r--r--java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java2
-rw-r--r--java/com/android/dialer/searchfragment/list/NewSearchFragment.java2
-rw-r--r--java/com/android/dialer/searchfragment/remote/RemoteContactsCursorLoader.java5
-rw-r--r--java/com/android/dialer/searchfragment/testing/TestCursorSchema.java2
-rw-r--r--java/com/android/dialer/simulator/Simulator.java2
-rw-r--r--java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java4
-rw-r--r--java/com/android/dialer/theme/res/values/colors.xml4
-rw-r--r--java/com/android/dialer/util/PermissionsUtil.java4
-rw-r--r--java/com/android/dialer/util/ViewUtil.java44
-rw-r--r--java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java7
-rw-r--r--java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java2
-rw-r--r--java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java25
-rw-r--r--java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java12
-rw-r--r--java/com/android/dialer/voicemail/listui/VoicemailEntryText.java66
-rw-r--r--java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_entry.xml1
-rw-r--r--java/com/android/dialer/voicemail/listui/res/values/strings.xml5
-rw-r--r--java/com/android/dialer/voicemail/model/VoicemailEntry.java10
79 files changed, 924 insertions, 351 deletions
diff --git a/java/com/android/dialer/about/res/raw/third_party_license_metadata b/java/com/android/dialer/about/res/raw/third_party_license_metadata
index b20ef89d7..49c22731f 100755
--- a/java/com/android/dialer/about/res/raw/third_party_license_metadata
+++ b/java/com/android/dialer/about/res/raw/third_party_license_metadata
@@ -30,13 +30,13 @@
321603:11358 OpenCensus
332972:11358 Volley
344341:10695 bubble
-355050:10402 gRPC Java
-365471:10173 libphonenumber
-375663:10699 shortcutbadger
-386378:16013 Android SDK
-402410:1096 Animal Sniffer
-403516:4771 Glide
-408299:1602 JSR 305
-409919:12847 jibercsclient
-422777:18982 mime4j
-441776:12847 rcsclientlib
+355050:11358 gRPC Java
+366427:10173 libphonenumber
+376619:10699 shortcutbadger
+387334:16013 Android SDK
+403366:1096 Animal Sniffer
+404472:4771 Glide
+409255:1602 JSR 305
+410875:12847 jibercsclient
+423733:18982 mime4j
+442732:12847 rcsclientlib
diff --git a/java/com/android/dialer/about/res/raw/third_party_licenses b/java/com/android/dialer/about/res/raw/third_party_licenses
index 443c510a0..64f7dc780 100755
--- a/java/com/android/dialer/about/res/raw/third_party_licenses
+++ b/java/com/android/dialer/about/res/raw/third_party_licenses
@@ -6424,13 +6424,14 @@ gRPC Java:
Apache License
Version 2.0, January 2004
- https://www.apache.org/licenses/
+ http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
@@ -6509,6 +6510,7 @@ gRPC Java:
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
+ 4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
@@ -6526,6 +6528,7 @@ gRPC Java:
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
@@ -6543,7 +6546,9 @@ gRPC Java:
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
@@ -6594,13 +6599,24 @@ gRPC Java:
END OF TERMS AND CONDITIONS
- Copyright 2015-2017 gRPC authors.
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
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
- https://www.apache.org/licenses/LICENSE-2.0
+ 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,
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index b96b127e2..5f4b62c22 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -1163,7 +1163,7 @@ public class DialtactsActivity extends TransactionSafeActivity
LogUtil.i("DialtactsActivity.enterSearchUi", "smart dial: %b", smartDialSearch);
if (mStateSaved || getFragmentManager().isDestroyed()) {
// Weird race condition where fragment is doing work after the activity is destroyed
- // due to talkback being on (b/10209937). Just return since we can't do any
+ // due to talkback being on (a bug). Just return since we can't do any
// constructive here.
LogUtil.i(
"DialtactsActivity.enterSearchUi",
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 016bce322..589029827 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -361,7 +361,7 @@ public class CallLogAdapter extends GroupingListAdapter
"mExpandCollapseListener.onClick",
"%s is temporarily unavailable, requesting capabilities",
LogUtil.sanitizePhoneNumber(viewHolder.number));
- // Refresh the capabilities when temporarily unavailable, see go/ec-temp-unavailable.
+ // Refresh the capabilities when temporarily unavailable.
// Similarly to when we request capabilities the first time, the 'Share and call' button
// won't pop in with the new capabilities. Instead the row needs to be collapsed and
// expanded again.
diff --git a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java
index 78ec7a695..c0d30f53a 100644
--- a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java
+++ b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java
@@ -103,7 +103,7 @@ public class CallLogAsyncTaskUtil {
ContentValues values = new ContentValues();
values.put(Voicemails.DELETED, "1");
context.getContentResolver().update(voicemailUri, values, null, null);
- // TODO(b/35440541): check which source package is changed. Don't need
+ // TODO(a bug): check which source package is changed. Don't need
// to upload changes on foreign voicemails, they will get a PROVIDER_CHANGED
uploadVoicemailLocalChangesToServer(context);
}
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index d5dfb06dc..fa73bb251 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -536,8 +536,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
CallIntentBuilder.increaseLightbringerCallButtonAppearInCollapsedCallLogItemCount();
primaryActionButtonView.setTag(IntentProvider.getDuoVideoIntentProvider(number));
} else {
- primaryActionButtonView.setTag(
- IntentProvider.getReturnVideoCallIntentProvider(number, accountHandle));
+ primaryActionButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));
}
primaryActionButtonView.setContentDescription(
TextUtils.expandTemplate(
@@ -793,7 +792,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
if (show) {
if (!isLoaded) {
- // b/31268128 for some unidentified reason showActions() can be called before the item is
+ // a bug for some unidentified reason showActions() can be called before the item is
// loaded, causing NPE on uninitialized fields. Just log and return here, showActions() will
// be called again once the item is loaded.
LogUtil.e(
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index fff68d4c4..8e09cf8df 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -470,7 +470,7 @@ public class MissedCallNotifier implements Worker<Pair<Integer, String>, Void> {
private PendingIntent createCallLogPendingIntent(@Nullable Uri callUri) {
Intent contentIntent =
DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_HISTORY);
- // TODO (b/35486204): scroll to call
+ // TODO (a bug): scroll to call
contentIntent.setData(callUri);
return PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
index 4fc956fa8..f9cb4bf6c 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
@@ -274,7 +274,7 @@ final class VisualVoicemailNotifier {
@NonNull Context context, @Nullable NewCall voicemail) {
Intent intent =
DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
- // TODO (b/35486204): scroll to this voicemail
+ // TODO (a bug): scroll to this voicemail
if (voicemail != null) {
intent.setData(voicemail.voicemailUri);
}
diff --git a/java/com/android/dialer/app/list/RemoveView.java b/java/com/android/dialer/app/list/RemoveView.java
index 1d566c5a0..244f2da24 100644
--- a/java/com/android/dialer/app/list/RemoveView.java
+++ b/java/com/android/dialer/app/list/RemoveView.java
@@ -68,7 +68,7 @@ public class RemoveView extends FrameLayout {
switch (action) {
case DragEvent.ACTION_DRAG_ENTERED:
// TODO: This is temporary solution and should be removed once accessibility for
- // drag and drop is supported by framework(b/26871588).
+ // drag and drop is supported by framework(a bug).
sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
setAppearanceHighlighted();
break;
diff --git a/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml b/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml
index 0729d7293..9e08f5f5d 100644
--- a/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml
+++ b/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml
@@ -27,6 +27,11 @@
android:name="com.android.dialer.app.settings.DialerSettingsActivity"
android:parentActivityName="com.android.dialer.app.DialtactsActivity"
android:theme="@style/SettingsStyle">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT"/>
+ <data android:scheme="header"/>
+ </intent-filter>
</activity>
<!-- The entrance point for Phone UI.
@@ -41,7 +46,7 @@
android:resizeableActivity="true"
android:theme="@style/DialtactsActivityTheme"
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing">
- <!-- LINT.IfChange -->
+
<intent-filter>
<action android:name="android.intent.action.DIAL"/>
@@ -107,7 +112,7 @@
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.TAB"/>
</intent-filter>
- <!-- LINT.ThenChange(//depot/google3/third_party/java_src/android_app/dialer/java/com/android/dialer/dialtacts/impl/AndroidManifest.xml) -->
+
<meta-data
android:name="com.android.keyguard.layout"
diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item.xml b/java/com/android/dialer/app/res/layout/call_log_list_item.xml
index 4382008d4..e0f9e63b4 100644
--- a/java/com/android/dialer/app/res/layout/call_log_list_item.xml
+++ b/java/com/android/dialer/app/res/layout/call_log_list_item.xml
@@ -162,6 +162,8 @@
android:layout_height="wrap_content"
android:textColor="@color/call_log_voicemail_transcript_color"
android:textSize="@dimen/call_log_voicemail_transcription_text_size"
+ android:focusable="true"
+ android:nextFocusDown="@+id/voicemail_transcription_branding"
android:textIsSelectable="true"/>
<TextView
@@ -170,6 +172,8 @@
android:layout_height="wrap_content"
android:textColor="@color/call_log_voicemail_transcript_branding_color"
android:textSize="@dimen/call_log_voicemail_transcription_text_size"
+ android:focusable="true"
+ android:nextFocusUp="@id/voicemail_transcription"
android:paddingTop="2dp"/>
</LinearLayout>
diff --git a/java/com/android/dialer/app/settings/DialerSettingsActivity.java b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
index 706f0985a..89c69ca45 100644
--- a/java/com/android/dialer/app/settings/DialerSettingsActivity.java
+++ b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
@@ -18,6 +18,7 @@ package com.android.dialer.app.settings;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.net.Uri;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
@@ -51,11 +52,28 @@ public class DialerSettingsActivity extends AppCompatPreferenceActivity {
protected SharedPreferences mPreferences;
private boolean migrationStatusOnBuildHeaders;
+ private List<Header> headers;
@Override
protected void onCreate(Bundle savedInstanceState) {
+ LogUtil.enterBlock("DialerSettingsActivity.onCreate");
super.onCreate(savedInstanceState);
mPreferences = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
+
+ Intent intent = getIntent();
+ Uri data = intent.getData();
+ if (data != null) {
+ String headerToOpen = data.getSchemeSpecificPart();
+ if (headerToOpen != null && headers != null) {
+ for (Header header : headers) {
+ if (headerToOpen.equals(header.fragment)) {
+ LogUtil.i("DialerSettingsActivity.onCreate", "switching to header: " + headerToOpen);
+ switchToHeader(header);
+ break;
+ }
+ }
+ }
+ }
}
@Override
@@ -72,6 +90,9 @@ public class DialerSettingsActivity extends AppCompatPreferenceActivity {
@Override
public void onBuildHeaders(List<Header> target) {
+ // Keep a reference to the list of headers (since PreferenceActivity.getHeaders() is @Hide)
+ headers = target;
+
if (showDisplayOptions()) {
Header displayOptionsHeader = new Header();
displayOptionsHeader.titleRes = R.string.display_options_title;
diff --git a/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java b/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
index bc6ffb5a7..39ef3fab8 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
@@ -92,7 +92,7 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
}
}
alertItem.updateStatus(statuses, this);
- // TODO(twyen): b/30668323 support error from multiple sources.
+ // TODO(twyen): a bug support error from multiple sources.
return;
}
diff --git a/java/com/android/dialer/app/voicemail/error/AndroidManifest.xml b/java/com/android/dialer/app/voicemail/error/AndroidManifest.xml
index 65d043034..bb6c55f5c 100644
--- a/java/com/android/dialer/app/voicemail/error/AndroidManifest.xml
+++ b/java/com/android/dialer/app/voicemail/error/AndroidManifest.xml
@@ -1,5 +1,29 @@
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.dialer.app.voicemail.error">
<uses-permission android:name="android.permission.CALL_PHONE"/>
+
+ <application>
+ <receiver android:name=".PackageReplacedReceiver" android:exported="false">
+ <intent-filter>
+ <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
+ </intent-filter>
+ </receiver>
+ </application>
+
</manifest>
diff --git a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
index 79e038332..9c8b1469e 100644
--- a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
@@ -129,7 +129,7 @@ public class OmtpVoicemailMessageCreator {
VoicemailErrorMessage.createRetryAction(context, status));
}
- // This should be an assertion error, but there's a bug in NYC-DR (b/31069259) that will
+ // This should be an assertion error, but there's a bug in NYC-DR (a bug) that will
// sometimes give status mixed from multiple SIMs. There's no meaningful message to be displayed
// from it, so just suppress the message.
LogUtil.e("OmtpVoicemailMessageCreator.create", "Unhandled status: " + status);
diff --git a/java/com/android/dialer/app/voicemail/error/PackageReplacedReceiver.java b/java/com/android/dialer/app/voicemail/error/PackageReplacedReceiver.java
new file mode 100644
index 000000000..64d72b18f
--- /dev/null
+++ b/java/com/android/dialer/app/voicemail/error/PackageReplacedReceiver.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.app.voicemail.error;
+
+import android.annotation.TargetApi;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.net.Uri;
+import android.preference.PreferenceManager;
+import android.provider.CallLog.Calls;
+import android.provider.VoicemailContract.Voicemails;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.common.concurrent.DialerExecutorComponent;
+
+/** Receives MY_PACKAGE_REPLACED to check for legacy voicemail users. */
+public class PackageReplacedReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ LogUtil.enterBlock("PackageReplacedReceiver.onReceive");
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ if (!prefs.contains(VoicemailTosMessageCreator.PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY)) {
+ setVoicemailFeatureVersionAsync(context);
+ }
+ }
+
+ private void setVoicemailFeatureVersionAsync(Context context) {
+ LogUtil.enterBlock("PackageReplacedReceiver.setVoicemailFeatureVersionAsync");
+
+ // Check if user is already using voicemail (ie do they have any voicemails), and set the
+ // acknowledged feature value accordingly.
+ PendingResult pendingResult = goAsync();
+ DialerExecutorComponent.get(context)
+ .dialerExecutorFactory()
+ .createNonUiTaskBuilder(new ExistingVoicemailCheck(context))
+ .onSuccess(
+ output -> {
+ LogUtil.i("PackageReplacedReceiver.setVoicemailFeatureVersionAsync", "success");
+ pendingResult.finish();
+ })
+ .onFailure(
+ throwable -> {
+ LogUtil.i("PackageReplacedReceiver.setVoicemailFeatureVersionAsync", "failure");
+ pendingResult.finish();
+ })
+ .build()
+ .executeParallel(null);
+ }
+
+ private static class ExistingVoicemailCheck implements Worker<Void, Void> {
+ private static final String[] PROJECTION = new String[] {Voicemails._ID};
+
+ private final Context context;
+
+ ExistingVoicemailCheck(Context context) {
+ this.context = context;
+ }
+
+ @TargetApi(android.os.Build.VERSION_CODES.M) // used for try with resources
+ @Override
+ public Void doInBackground(Void arg) throws Throwable {
+ LogUtil.i("PackageReplacedReceiver.ExistingVoicemailCheck.doInBackground", "");
+
+ // Check the database for existing voicemails.
+ boolean hasVoicemails = false;
+ Uri uri = Voicemails.buildSourceUri(context.getPackageName());
+ String whereClause = Calls.TYPE + " = " + Calls.VOICEMAIL_TYPE;
+ try (Cursor cursor =
+ context.getContentResolver().query(uri, PROJECTION, whereClause, null, null)) {
+ if (cursor == null) {
+ LogUtil.e(
+ "PackageReplacedReceiver.ExistingVoicemailCheck.doInBackground",
+ "failed to check for existing voicemails");
+ } else if (cursor.moveToNext()) {
+ hasVoicemails = true;
+ }
+ }
+
+ LogUtil.i(
+ "PackageReplacedReceiver.ExistingVoicemailCheck.doInBackground",
+ "has voicemails: " + hasVoicemails);
+ int version = hasVoicemails ? VoicemailTosMessageCreator.LEGACY_VOICEMAIL_FEATURE_VERSION : 0;
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .putInt(VoicemailTosMessageCreator.PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, version)
+ .apply();
+ return null;
+ }
+ }
+}
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java b/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java
index bbba7ac76..b357f9a4d 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java
@@ -82,7 +82,7 @@ public class VoicemailStatusCorruptionHandler {
// If visual voicemail is enabled, the CONFIGURATION_STATE should be either OK, PIN_NOT_SET,
// or other failure code. CONFIGURATION_STATE_NOT_CONFIGURED means that the client has been
- // shut down improperly (b/32371710). The client should be reset or the VVM tab will be
+ // shut down improperly (a bug). The client should be reset or the VVM tab will be
// missing.
if (Status.CONFIGURATION_STATE_NOT_CONFIGURED == status.configurationState
&& visualVoicemailEnabled) {
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java b/java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java
index 63ebd1959..96850ad02 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.net.Uri;
import android.os.Build;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
@@ -40,6 +41,7 @@ import com.android.dialer.app.voicemail.error.VoicemailErrorMessage.Action;
import com.android.dialer.common.LogUtil;
import com.android.dialer.compat.telephony.TelephonyManagerCompat;
import com.android.dialer.configprovider.ConfigProviderBindings;
+import com.android.dialer.constants.Constants;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.voicemail.VisualVoicemailTypeExtensions;
@@ -52,14 +54,21 @@ import java.util.Locale;
* terms of service for Verizon and for other carriers.
*/
public class VoicemailTosMessageCreator {
- // Flag to check which version of the Verizon ToS that the user has accepted.
- public static final String VVM3_TOS_VERSION_ACCEPTED_KEY = "vvm3_tos_version_accepted";
+ // Preference key to check which version of the Verizon ToS that the user has accepted.
+ static final String PREF_VVM3_TOS_VERSION_ACCEPTED_KEY = "vvm3_tos_version_accepted";
- // Flag to check which version of the Google Dialer ToS that the user has accepted.
- public static final String DIALER_TOS_VERSION_ACCEPTED_KEY = "dialer_tos_version_accepted";
+ // Preference key to check which version of the Google Dialer ToS that the user has accepted.
+ static final String PREF_DIALER_TOS_VERSION_ACCEPTED_KEY = "dialer_tos_version_accepted";
- public static final int CURRENT_VVM3_TOS_VERSION = 2;
- public static final int CURRENT_DIALER_TOS_VERSION = 1;
+ // Preference key to check which feature version the user has acknowledged
+ static final String PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY =
+ "dialer_feature_version_acknowledged";
+
+ static final int CURRENT_VVM3_TOS_VERSION = 2;
+ static final int CURRENT_DIALER_TOS_VERSION = 1;
+ static final int LEGACY_VOICEMAIL_FEATURE_VERSION = 1; // original visual voicemail
+ static final int TRANSCRIPTION_VOICEMAIL_FEATURE_VERSION = 2; // adds voicemail transcription
+ static final int CURRENT_VOICEMAIL_FEATURE_VERSION = TRANSCRIPTION_VOICEMAIL_FEATURE_VERSION;
private static final String ISO639_SPANISH = "es";
@@ -81,25 +90,28 @@ public class VoicemailTosMessageCreator {
@Nullable
VoicemailErrorMessage maybeCreateTosMessage() {
- if (hasAcceptedTos()) {
+ if (!canShowTos()) {
return null;
- }
-
- if (!shouldShowTos()) {
+ } else if (shouldShowTos()) {
+ logTosCreatedImpression();
+ return getTosMessage();
+ } else if (shouldShowPromo()) {
+ return getPromoMessage();
+ } else {
return null;
}
+ }
- logTosCreatedImpression();
-
+ private VoicemailErrorMessage getTosMessage() {
return new VoicemailTosMessage(
- getTosTitle(),
- getTosMessage(),
+ getNewUserTosTitle(),
+ getNewUserTosMessageText(),
new Action(
getDeclineText(),
new OnClickListener() {
@Override
public void onClick(View v) {
- LogUtil.i("VoicemailTosMessageCreator.maybeShowTosMessage", "decline clicked");
+ LogUtil.i("VoicemailTosMessageCreator.getTosMessage", "decline clicked");
PhoneAccountHandle handle =
new PhoneAccountHandle(
ComponentName.unflattenFromString(status.phoneAccountComponentName),
@@ -113,8 +125,10 @@ public class VoicemailTosMessageCreator {
new OnClickListener() {
@Override
public void onClick(View v) {
- LogUtil.i("VoicemailTosMessageCreator.maybeShowTosMessage", "accept clicked");
+ LogUtil.i("VoicemailTosMessageCreator.getTosMessage", "accept clicked");
recordTosAcceptance();
+ // Accepting the TOS also acknowledges the latest features
+ recordFeatureAcknowledgement();
logTosAcceptedImpression();
statusReader.refresh();
}
@@ -124,15 +138,65 @@ public class VoicemailTosMessageCreator {
.setImageResourceId(R.drawable.voicemail_tos_image);
}
- private boolean shouldShowTos() {
+ private VoicemailErrorMessage getPromoMessage() {
+ return new VoicemailTosMessage(
+ getExistingUserTosTitle(),
+ getExistingUserTosMessageText(),
+ new Action(
+ context.getString(R.string.dialer_terms_and_conditions_existing_user_setings),
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ LogUtil.i("VoicemailTosMessageCreator.getPromoMessage", "open settings");
+ Intent intent =
+ new Intent(Intent.ACTION_VIEW)
+ .setComponent(
+ new ComponentName(context, Constants.get().getSettingsActivity()))
+ .setData(
+ Uri.fromParts(
+ "header",
+ VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .getSettingsFragment(),
+ null));
+ context.startActivity(intent);
+ }
+ }),
+ new Action(
+ context.getString(R.string.dialer_terms_and_conditions_existing_user_ack),
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ LogUtil.i("VoicemailTosMessageCreator.getPromoMessage", "acknowledge clicked");
+ // Feature acknowledgement also means accepting TOS
+ recordTosAcceptance();
+ recordFeatureAcknowledgement();
+ statusReader.refresh();
+ }
+ },
+ true /* raised */))
+ .setModal(true)
+ .setImageResourceId(R.drawable.voicemail_tos_image);
+ }
+
+ private boolean canShowTos() {
if (!isValidVoicemailType(status.type)) {
- LogUtil.i("VoicemailTosMessageCreator.shouldShowTos", "unsupported type: " + status.type);
+ LogUtil.i("VoicemailTosMessageCreator.canShowTos", "unsupported type: " + status.type);
return false;
}
if (status.getPhoneAccountHandle() == null
|| status.getPhoneAccountHandle().getComponentName() == null) {
- LogUtil.i("VoicemailTosMessageCreator.shouldShowTos", "invalid phone account");
+ LogUtil.i("VoicemailTosMessageCreator.canShowTos", "invalid phone account");
+ return false;
+ }
+
+ return true;
+ }
+
+ private boolean shouldShowTos() {
+ if (hasAcceptedTos()) {
+ LogUtil.i("VoicemailTosMessageCreator.shouldShowTos", "already accepted TOS");
return false;
}
@@ -141,7 +205,7 @@ public class VoicemailTosMessageCreator {
return true;
}
- if (isVoicemailTranscriptionEnabled()) {
+ if (isVoicemailTranscriptionEnabled() && !isLegacyVoicemailUser()) {
LogUtil.i(
"VoicemailTosMessageCreator.shouldShowTos", "showing TOS for Google transcription users");
return true;
@@ -150,6 +214,23 @@ public class VoicemailTosMessageCreator {
return false;
}
+ private boolean shouldShowPromo() {
+ if (hasAcknowledgedFeatures()) {
+ LogUtil.i(
+ "VoicemailTosMessageCreator.shouldShowPromo", "already acknowledeged latest features");
+ return false;
+ }
+
+ if (isVoicemailTranscriptionEnabled()) {
+ LogUtil.i(
+ "VoicemailTosMessageCreator.shouldShowPromo",
+ "showing promo for Google transcription users");
+ return true;
+ }
+
+ return false;
+ }
+
private static boolean isValidVoicemailType(String type) {
if (type == null) {
return false;
@@ -181,6 +262,7 @@ public class VoicemailTosMessageCreator {
"showing decline ToS dialog, status=" + status);
final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle(R.string.terms_and_conditions_decline_dialog_title);
builder.setMessage(getTosDeclinedDialogMessageId());
builder.setPositiveButton(
getTosDeclinedDialogDowngradeId(),
@@ -249,24 +331,49 @@ public class VoicemailTosMessageCreator {
private boolean hasAcceptedTos() {
if (isVvm3()) {
- return preferences.getInt(VVM3_TOS_VERSION_ACCEPTED_KEY, 0) >= CURRENT_VVM3_TOS_VERSION;
+ return preferences.getInt(PREF_VVM3_TOS_VERSION_ACCEPTED_KEY, 0) >= CURRENT_VVM3_TOS_VERSION;
} else {
- return preferences.getInt(DIALER_TOS_VERSION_ACCEPTED_KEY, 0) >= CURRENT_DIALER_TOS_VERSION;
+ return preferences.getInt(PREF_DIALER_TOS_VERSION_ACCEPTED_KEY, 0)
+ >= CURRENT_DIALER_TOS_VERSION;
}
}
private void recordTosAcceptance() {
if (isVvm3()) {
- preferences.edit().putInt(VVM3_TOS_VERSION_ACCEPTED_KEY, CURRENT_VVM3_TOS_VERSION).apply();
+ preferences
+ .edit()
+ .putInt(PREF_VVM3_TOS_VERSION_ACCEPTED_KEY, CURRENT_VVM3_TOS_VERSION)
+ .apply();
} else {
preferences
.edit()
- .putInt(DIALER_TOS_VERSION_ACCEPTED_KEY, CURRENT_DIALER_TOS_VERSION)
+ .putInt(PREF_DIALER_TOS_VERSION_ACCEPTED_KEY, CURRENT_DIALER_TOS_VERSION)
.apply();
}
VoicemailComponent.get(context).getVoicemailClient().onTosAccepted(context);
}
+ private boolean hasAcknowledgedFeatures() {
+ if (isVvm3()) {
+ return true;
+ }
+
+ return preferences.getInt(PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, 0)
+ >= CURRENT_VOICEMAIL_FEATURE_VERSION;
+ }
+
+ private void recordFeatureAcknowledgement() {
+ preferences
+ .edit()
+ .putInt(PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, CURRENT_VOICEMAIL_FEATURE_VERSION)
+ .apply();
+ }
+
+ private boolean isLegacyVoicemailUser() {
+ return preferences.getInt(PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, 0)
+ == LEGACY_VOICEMAIL_FEATURE_VERSION;
+ }
+
private void logTosCreatedImpression() {
if (isVvm3()) {
Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_V2_CREATED);
@@ -299,17 +406,30 @@ public class VoicemailTosMessageCreator {
: context.getString(R.string.verizon_terms_and_conditions_1_1_english, policyUrl);
}
- private CharSequence getDialerTos() {
+ private CharSequence getVvmDialerTos() {
if (!isVoicemailTranscriptionEnabled()) {
return "";
}
- if (isVvm3()) {
- return context.getString(R.string.dialer_terms_and_conditions_for_verizon_1_0);
- } else {
- String learnMoreText = context.getString(R.string.dialer_terms_and_conditions_learn_more);
- return context.getString(R.string.dialer_terms_and_conditions_1_0, learnMoreText);
+ return context.getString(R.string.dialer_terms_and_conditions_for_verizon_1_0);
+ }
+
+ private CharSequence getNewUserDialerTos() {
+ if (!isVoicemailTranscriptionEnabled()) {
+ return "";
+ }
+
+ String learnMoreText = context.getString(R.string.dialer_terms_and_conditions_learn_more);
+ return context.getString(R.string.dialer_terms_and_conditions_1_0, learnMoreText);
+ }
+
+ private CharSequence getExistingUserDialerTos() {
+ if (!isVoicemailTranscriptionEnabled()) {
+ return "";
}
+
+ String learnMoreText = context.getString(R.string.dialer_terms_and_conditions_learn_more);
+ return context.getString(R.string.dialer_terms_and_conditions_existing_user, learnMoreText);
}
private CharSequence getAcceptText() {
@@ -336,13 +456,19 @@ public class VoicemailTosMessageCreator {
}
}
- private CharSequence getTosTitle() {
+ private CharSequence getNewUserTosTitle() {
return isVvm3()
? context.getString(R.string.verizon_terms_and_conditions_title)
: context.getString(R.string.dialer_terms_and_conditions_title);
}
- private CharSequence getTosMessage() {
+ private CharSequence getExistingUserTosTitle() {
+ return isVvm3()
+ ? context.getString(R.string.verizon_terms_and_conditions_title)
+ : context.getString(R.string.dialer_terms_and_conditions_existing_user_title);
+ }
+
+ private CharSequence getNewUserTosMessageText() {
SpannableString spannableTos;
if (isVvm3()) {
// For verizon the TOS consist of three pieces: google dialer TOS, Verizon TOS message and
@@ -350,7 +476,7 @@ public class VoicemailTosMessageCreator {
CharSequence vvm3Details = getVvm3Tos();
CharSequence tos =
context.getString(
- R.string.verizon_terms_and_conditions_message, getDialerTos(), vvm3Details);
+ R.string.verizon_terms_and_conditions_message, getVvmDialerTos(), vvm3Details);
spannableTos = new SpannableString(tos);
// Set the text style for the details part of the TOS
int start = spannableTos.length() - vvm3Details.length();
@@ -365,7 +491,7 @@ public class VoicemailTosMessageCreator {
} else {
// The TOS for everyone else, there are no details, but change to center alignment.
CharSequence tos =
- context.getString(R.string.dialer_terms_and_conditions_message, getDialerTos());
+ context.getString(R.string.dialer_terms_and_conditions_message, getNewUserDialerTos());
spannableTos = new SpannableString(tos);
spannableTos.setSpan(
new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
@@ -375,11 +501,27 @@ public class VoicemailTosMessageCreator {
// Add 'Learn more' link for dialer TOS
String learnMore = context.getString(R.string.dialer_terms_and_conditions_learn_more);
- String linkUrl = context.getString(R.string.dialer_terms_and_conditions_learn_more_url);
- return addLink(spannableTos, learnMore, linkUrl);
+ return addLink(spannableTos, learnMore, getLearnMoreUrl());
}
}
+ private CharSequence getExistingUserTosMessageText() {
+ SpannableString spannableTos;
+ // Change to center alignment.
+ CharSequence tos =
+ context.getString(R.string.dialer_terms_and_conditions_message, getExistingUserDialerTos());
+ spannableTos = new SpannableString(tos);
+ spannableTos.setSpan(
+ new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
+ 0,
+ tos.length(),
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ // Add 'Learn more' link for dialer TOS
+ String learnMore = context.getString(R.string.dialer_terms_and_conditions_learn_more);
+ return addLink(spannableTos, learnMore, getLearnMoreUrl());
+ }
+
private SpannableString addLink(SpannableString spannable, String linkText, String linkUrl) {
if (TextUtils.isEmpty(linkUrl) || TextUtils.isEmpty(linkText)) {
return spannable;
@@ -398,6 +540,13 @@ public class VoicemailTosMessageCreator {
return spannable;
}
+ private String getLearnMoreUrl() {
+ return ConfigProviderBindings.get(context)
+ .getString(
+ "voicemail_transcription_learn_more_url",
+ context.getString(R.string.dialer_terms_and_conditions_learn_more_url));
+ }
+
private int getTosDeclinedDialogMessageId() {
return isVvm3()
? R.string.verizon_terms_and_conditions_decline_dialog_message
diff --git a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
index 8e8106b44..748b8142a 100644
--- a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
@@ -39,7 +39,7 @@ import com.android.dialer.logging.Logger;
public class Vvm3VoicemailMessageCreator {
// Copied from com.android.phone.vvm.omtp.protocol.Vvm3EventHandler
- // TODO(b/28380841): unbundle VVM client so we can access these values directly
+ // TODO(a bug): unbundle VVM client so we can access these values directly
public static final int VMS_DNS_FAILURE = -9001;
public static final int VMG_DNS_FAILURE = -9002;
public static final int SPG_DNS_FAILURE = -9003;
diff --git a/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_tos_fragment.xml b/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_tos_fragment.xml
index 184a81fec..4e143a59a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_tos_fragment.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_tos_fragment.xml
@@ -73,6 +73,7 @@
android:paddingEnd="16dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
+ android:background="#ffffffff"
android:orientation="horizontal">
<TextView
android:id="@+id/voicemail_tos_button_decline"
@@ -82,7 +83,7 @@
android:layout_height="wrap_content"
android:text="@string/verizon_terms_and_conditions_decline_english"/>
<android.support.v4.widget.Space
- android:layout_width="0dp"
+ android:layout_width="8dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<TextView
diff --git a/java/com/android/dialer/app/voicemail/error/res/values/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values/strings.xml
index eb4877a4b..05082d8d9 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values/strings.xml
@@ -140,6 +140,8 @@
<string name="verizon_terms_and_conditions_message"><xliff:g>%1$s</xliff:g> By turning on visual voicemail you agree to the Verizon Wireless terms and conditions:\n\n<xliff:g>%2$s</xliff:g></string>
<string name="dialer_terms_and_conditions_title">Turn on visual voicemail</string>
+
+ <string name="dialer_terms_and_conditions_existing_user_title">New! Read your voicemail</string>
<string name="dialer_terms_and_conditions_message"><xliff:g>%s</xliff:g></string>
<string translatable="false" name="verizon_terms_and_conditions_1.1_english">
@@ -173,14 +175,16 @@ Si no acepta todos estos términos y condiciones, no use el buzón de voz visual
See and listen to your messages, without having to call voicemail. Transcripts of your voicemail are provided by Google’s free transcription service. <xliff:g>%s</xliff:g>
</string>
+ <string name="dialer_terms_and_conditions_existing_user">
+ Transcripts of your voicemail are now provided by Google’s free transcription service. %s
+ </string>
+
<string name="dialer_terms_and_conditions_for_verizon_1.0">
See and listen to your messages, without having to call voicemail.
</string>
<string name="dialer_terms_and_conditions_learn_more">Learn&#160;more</string>
-
- <!-- TODO(mdooley): STOP SHIP, get real url, b/65734734 -->
- <string translatable="false" name="dialer_terms_and_conditions_learn_more_url">https://www.google.com</string>
+ <string translatable="false" name="dialer_terms_and_conditions_learn_more_url">https://support.google.com/phoneapp/answer/2811844?hl=en%26ref_topic=7539039</string>
<string translatable="false" name="verizon_terms_and_conditions_policy_url">http://www.verizon.com/about/privacy/policy/</string>
@@ -194,11 +198,16 @@ Si no acepta todos estos términos y condiciones, no use el buzón de voz visual
<string translatable="false" name="dialer_terms_and_conditions_decline_english">No Thanks</string>
<string translatable="false" name="dialer_terms_and_conditions_decline_spanish">Rechazar</string>
+ <string name="dialer_terms_and_conditions_existing_user_ack">Ok, got it</string>
+ <string name="dialer_terms_and_conditions_existing_user_setings">Settings</string>
+
+ <string name="terms_and_conditions_decline_dialog_title">Disable visual voicemail?</string>
+
<string name="verizon_terms_and_conditions_decline_dialog_message">Visual voicemail will be disabled if the terms and conditions are declined.</string>
- <string name="verizon_terms_and_conditions_decline_dialog_downgrade">Disable visual voicemail</string>
+ <string name="verizon_terms_and_conditions_decline_dialog_downgrade">Disable</string>
- <string name="dialer_terms_and_conditions_decline_dialog_message">Visual voicemail will be disabled if the terms and conditions are declined.</string>
- <string name="dialer_terms_and_conditions_decline_dialog_downgrade">Disable visual voicemail</string>
+ <string name="dialer_terms_and_conditions_decline_dialog_message">Visual voicemail will be disabled if you turn off visual voicemail.</string>
+ <string name="dialer_terms_and_conditions_decline_dialog_downgrade">Disable</string>
<string name="verizon_terms_and_conditions_decline_set_pin_dialog_message">Voicemail will only be accessible by calling *86. Set a new voicemail PIN to proceed.</string>
<string name="verizon_terms_and_conditions_decline_set_pin_dialog_set_pin">Set PIN</string>
diff --git a/java/com/android/dialer/app/voicemail/error/res/values/styles.xml b/java/com/android/dialer/app/voicemail/error/res/values/styles.xml
index 938c77a01..bf70240b6 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values/styles.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values/styles.xml
@@ -20,32 +20,32 @@
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">48dp</item>
<item name="android:gravity">end|center_vertical</item>
- <item name="android:paddingStart">8dp</item>
- <item name="android:paddingEnd">8dp</item>
<item name="android:layout_marginStart">8dp</item>
<item name="android:layout_marginEnd">8dp</item>
+ <item name="android:padding">8dp</item>
<item name="android:textColor">@color/dialer_theme_color</item>
<item name="android:fontFamily">"sans-serif-medium"</item>
<item name="android:focusable">true</item>
<item name="android:singleLine">true</item>
<item name="android:textAllCaps">true</item>
<item name="android:textSize">14sp</item>
+ <item name="android:minHeight">48dp</item>
</style>
<style name="ErrorActionDeclineStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">48dp</item>
<item name="android:gravity">end|center_vertical</item>
- <item name="android:paddingStart">8dp</item>
- <item name="android:paddingEnd">8dp</item>
<item name="android:layout_marginStart">8dp</item>
<item name="android:layout_marginEnd">8dp</item>
- <item name="android:textColor">#80000000</item>
+ <item name="android:padding">8dp</item>
+ <item name="android:textColor">#757575</item>
<item name="android:fontFamily">"sans-serif-medium"</item>
<item name="android:focusable">true</item>
<item name="android:singleLine">true</item>
<item name="android:textAllCaps">true</item>
<item name="android:textSize">14sp</item>
+ <item name="android:minHeight">48dp</item>
</style>
<style name="RaisedErrorActionStyle" parent="Widget.AppCompat.Button.Colored">
diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
index e7a707feb..ebd62080b 100644
--- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java
+++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
@@ -51,7 +51,6 @@ public class SearchEditTextLayout extends FrameLayout {
private View mCollapsedSearchBox;
private View mVoiceSearchButtonView;
private View mOverflowButtonView;
- private View mBackButtonView;
private View mClearButtonView;
private ValueAnimator mAnimator;
@@ -95,11 +94,6 @@ public class SearchEditTextLayout extends FrameLayout {
mCollapsedSearchBox = findViewById(R.id.search_box_start_search);
mVoiceSearchButtonView = findViewById(R.id.voice_search_button);
mOverflowButtonView = findViewById(R.id.dialtacts_options_menu_button);
- mBackButtonView = findViewById(R.id.search_back_button);
- mBackButtonView
- .getResources()
- .getDrawable(R.drawable.quantum_ic_arrow_back_vd_theme_24, null)
- .setAutoMirrored(true);
mClearButtonView = findViewById(R.id.search_close_button);
// Convert a long click into a click to expand the search box. Touch events are also
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index 1790b8f3f..9dc197c89 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -71,7 +71,7 @@ public final class ConcreteCreator {
}
if (!PreferenceManager.getDefaultSharedPreferences(context)
- .getBoolean(context.getString(R.string.assisted_dialing_setting_toggle_key), false)) {
+ .getBoolean(context.getString(R.string.assisted_dialing_setting_toggle_key), true)) {
LogUtil.i("ConcreteCreator.createNewAssistedDialingMediator", "disabled by local setting");
return new AssistedDialingMediatorStub();
diff --git a/java/com/android/dialer/assisteddialing/Constraints.java b/java/com/android/dialer/assisteddialing/Constraints.java
index c4b5278cb..3766a6daa 100644
--- a/java/com/android/dialer/assisteddialing/Constraints.java
+++ b/java/com/android/dialer/assisteddialing/Constraints.java
@@ -25,6 +25,8 @@ import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.ArraySet;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
@@ -216,6 +218,8 @@ final class Constraints {
// framework
return Optional.of(phoneNumberUtil.parseAndKeepRawInput(numberToParse, userHomeCountryCode));
} catch (NumberParseException e) {
+ Logger.get(context)
+ .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_PARSING_FAILURE);
LogUtil.i("Constraints.parsePhoneNumber", "could not parse the number");
return Optional.empty();
}
@@ -227,6 +231,8 @@ final class Constraints {
if (parsedPhoneNumber.get().hasCountryCode()
&& parsedPhoneNumber.get().getCountryCodeSource()
!= CountryCodeSource.FROM_DEFAULT_COUNTRY) {
+ Logger.get(context)
+ .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_NUMBER_HAS_COUNTRY_CODE);
LogUtil.i(
"Constraints.isNotInternationalNumber", "phone number already provided the country code");
return false;
@@ -244,6 +250,8 @@ final class Constraints {
if (parsedPhoneNumber.get().hasExtension()
&& !TextUtils.isEmpty(parsedPhoneNumber.get().getExtension())) {
+ Logger.get(context)
+ .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_NUMBER_HAS_EXTENSION);
LogUtil.i("Constraints.doesNotHaveExtension", "phone number has an extension");
return false;
}
diff --git a/java/com/android/dialer/assisteddialing/ui/res/xml/assisted_dialing_setting.xml b/java/com/android/dialer/assisteddialing/ui/res/xml/assisted_dialing_setting.xml
index 8e3c62dde..806edfcf9 100644
--- a/java/com/android/dialer/assisteddialing/ui/res/xml/assisted_dialing_setting.xml
+++ b/java/com/android/dialer/assisteddialing/ui/res/xml/assisted_dialing_setting.xml
@@ -18,9 +18,9 @@
xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
- android:defaultValue="false"
+ android:defaultValue="true"
android:key="@string/assisted_dialing_setting_toggle_key"
android:title="@string/assisted_dialing_setting_title"
android:summary="@string/assisted_dialing_setting_summary" />
-</PreferenceScreen> \ No newline at end of file
+</PreferenceScreen>
diff --git a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
index 62bb9f39b..09fd5f0a8 100644
--- a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
+++ b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
@@ -262,7 +262,7 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
}
/*
- * TODO(maxwelb): b/27779827, non-e164 numbers can be blocked in the new form of blocking. As a
+ * TODO(maxwelb): a bug, non-e164 numbers can be blocked in the new form of blocking. As a
* temporary workaround, determine which column of the database to query based on whether the
* number is e164 or not.
*/
diff --git a/java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java
deleted file mode 100644
index 45d72e05c..000000000
--- a/java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.dialer.buildtype;
-
-import com.android.dialer.proguard.UsedByReflection;
-
-/** Gets the build type. */
-@UsedByReflection(value = "BuildType.java")
-public class BuildTypeAccessorImpl implements BuildTypeAccessor {
-
- @Override
- @BuildType.Type
- public int getBuildType() {
- return BuildType.BUGFOOD;
- }
-}
diff --git a/java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java
deleted file mode 100644
index e1f2cdc79..000000000
--- a/java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.dialer.buildtype;
-
-import com.android.dialer.proguard.UsedByReflection;
-
-/** Gets the build type. */
-@UsedByReflection(value = "BuildType.java")
-public class BuildTypeAccessorImpl implements BuildTypeAccessor {
-
- @Override
- @BuildType.Type
- public int getBuildType() {
- return BuildType.DOGFOOD;
- }
-}
diff --git a/java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java
deleted file mode 100644
index e5ad9015f..000000000
--- a/java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.dialer.buildtype;
-
-import com.android.dialer.proguard.UsedByReflection;
-
-/** Gets the build type. */
-@UsedByReflection(value = "BuildType.java")
-public class BuildTypeAccessorImpl implements BuildTypeAccessor {
-
- @Override
- @BuildType.Type
- public int getBuildType() {
- return BuildType.FISHFOOD;
- }
-}
diff --git a/java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java
deleted file mode 100644
index 80a1cb728..000000000
--- a/java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.dialer.buildtype;
-
-import com.android.dialer.proguard.UsedByReflection;
-
-/** Gets the build type. */
-@UsedByReflection(value = "BuildType.java")
-public class BuildTypeAccessorImpl implements BuildTypeAccessor {
-
- @Override
- @BuildType.Type
- public int getBuildType() {
- return BuildType.TEST;
- }
-}
diff --git a/java/com/android/dialer/callcomposer/CallComposerActivity.java b/java/com/android/dialer/callcomposer/CallComposerActivity.java
index 83fe2d9de..60826fd5d 100644
--- a/java/com/android/dialer/callcomposer/CallComposerActivity.java
+++ b/java/com/android/dialer/callcomposer/CallComposerActivity.java
@@ -242,7 +242,7 @@ public class CallComposerActivity extends AppCompatActivity
}
private void onCopyAndResizeImageFailure(Throwable throwable) {
- // TODO(b/34279096) - gracefully handle message failure
+ // TODO(a bug) - gracefully handle message failure
LogUtil.e("CallComposerActivity.onCopyAndResizeImageFailure", "copy Failed", throwable);
}
diff --git a/java/com/android/dialer/callcomposer/GalleryComposerFragment.java b/java/com/android/dialer/callcomposer/GalleryComposerFragment.java
index 01e067440..2e6a28c33 100644
--- a/java/com/android/dialer/callcomposer/GalleryComposerFragment.java
+++ b/java/com/android/dialer/callcomposer/GalleryComposerFragment.java
@@ -137,7 +137,7 @@ public class GalleryComposerFragment extends CallComposerFragment
})
.onFailure(
throwable -> {
- // TODO(b/34279096) - gracefully handle message failure
+ // TODO(a bug) - gracefully handle message failure
LogUtil.e(
"GalleryComposerFragment.onFailure", "data preparation failed", throwable);
})
@@ -303,7 +303,7 @@ public class GalleryComposerFragment extends CallComposerFragment
if (url != null) {
copyAndResizeImage.executeParallel(Uri.parse(url));
} else {
- // TODO(b/34279096) - gracefully handle message failure
+ // TODO(a bug) - gracefully handle message failure
}
}
}
diff --git a/java/com/android/dialer/callcomposer/camera/CameraPreview.java b/java/com/android/dialer/callcomposer/camera/CameraPreview.java
index 6581ad67b..eaea78961 100644
--- a/java/com/android/dialer/callcomposer/camera/CameraPreview.java
+++ b/java/com/android/dialer/callcomposer/camera/CameraPreview.java
@@ -65,7 +65,7 @@ public class CameraPreview {
}
// Opening camera is very expensive. Most of the ANR reports seem to be related to the camera.
- // So we delay until the camera is actually needed. See b/23287938
+ // So we delay until the camera is actually needed. See a bug
private void maybeOpenCamera() {
boolean visible = mHost.getView().getVisibility() == View.VISIBLE;
if (mTabHasBeenShown && visible && PermissionsUtil.hasCameraPermissions(getContext())) {
diff --git a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
index a713c55a4..b98dce76a 100644
--- a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
@@ -57,7 +57,7 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
private final ImageView multimediaImage;
- // TODO(maxwelb): Display this when location is stored - b/36160042
+ // TODO(maxwelb): Display this when location is stored - a bug
@SuppressWarnings("unused")
private final TextView multimediaAttachmentsNumber;
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
index 39a806568..68298e356 100644
--- a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
+++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
@@ -148,7 +148,7 @@ public class AnnotatedCallLogContentProvider extends ContentProvider {
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
- // Javadoc states values is not nullable, even though it is annotated as such (b/38123194)!
+ // Javadoc states values is not nullable, even though it is annotated as such (a bug)!
Assert.checkArgument(values != null);
SQLiteDatabase database = databaseHelper.getWritableDatabase();
@@ -228,7 +228,7 @@ public class AnnotatedCallLogContentProvider extends ContentProvider {
@Nullable ContentValues values,
@Nullable String selection,
@Nullable String[] selectionArgs) {
- // Javadoc states values is not nullable, even though it is annotated as such (b/38123194)!
+ // Javadoc states values is not nullable, even though it is annotated as such (a bug)!
Assert.checkArgument(values != null);
SQLiteDatabase database = databaseHelper.getWritableDatabase();
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
index 589fe6384..a3180a0b9 100644
--- a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
+++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
@@ -44,6 +44,7 @@ class AnnotatedCallLogDatabaseHelper extends SQLiteOpenHelper {
.append(AnnotatedCallLog.PHOTO_URI + " string, ")
.append(AnnotatedCallLog.PHOTO_ID + " integer, ")
.append(AnnotatedCallLog.LOOKUP_URI + " string, ")
+ .append(AnnotatedCallLog.DURATION + " integer, ")
.append(AnnotatedCallLog.NUMBER_TYPE_LABEL + " string, ")
.append(AnnotatedCallLog.IS_READ + " integer, ")
.append(AnnotatedCallLog.NEW + " integer, ")
@@ -55,7 +56,9 @@ class AnnotatedCallLogDatabaseHelper extends SQLiteOpenHelper {
.append(AnnotatedCallLog.FEATURES + " integer, ")
.append(AnnotatedCallLog.IS_BUSINESS + " integer, ")
.append(AnnotatedCallLog.IS_VOICEMAIL + " integer, ")
- .append(AnnotatedCallLog.CALL_TYPE + " integer")
+ .append(AnnotatedCallLog.TRANSCRIPTION + " integer, ")
+ .append(AnnotatedCallLog.CALL_TYPE)
+ .append(" integer")
.append(");")
.toString();
diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
index e79ffd090..832a9c2c0 100644
--- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
+++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
@@ -218,6 +218,20 @@ public class AnnotatedCallLogContract {
/** The MIME type of a {@link android.content.ContentProvider#getType(Uri)} single entry. */
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/annotated_call_log";
+
+ /**
+ * See {@link android.provider.CallLog.Calls#DURATION}.
+ *
+ * <p>TYPE: INTEGER (int)
+ */
+ public static final String DURATION = "duration";
+
+ /**
+ * See {@link android.provider.CallLog.Calls#TRANSCRIPTION}.
+ *
+ * <p>TYPE: TEXT
+ */
+ public static final String TRANSCRIPTION = "transcription";
}
/**
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 681a86da7..5c73933a9 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -216,6 +216,8 @@ public class SystemCallLogDataSource implements CallLogDataSource {
Calls.CACHED_LOOKUP_URI,
Calls.CACHED_NUMBER_TYPE,
Calls.CACHED_NUMBER_LABEL,
+ Calls.DURATION,
+ Calls.TRANSCRIPTION,
Calls.IS_READ,
Calls.NEW,
Calls.GEOCODED_LOCATION,
@@ -252,6 +254,8 @@ public class SystemCallLogDataSource implements CallLogDataSource {
int cachedLookupUriColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_LOOKUP_URI);
int cachedNumberTypeColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_NUMBER_TYPE);
int cachedNumberLabelColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_NUMBER_LABEL);
+ int durationsColumn = cursor.getColumnIndexOrThrow(Calls.DURATION);
+ int transcriptionColumn = cursor.getColumnIndexOrThrow(Calls.TRANSCRIPTION);
int isReadColumn = cursor.getColumnIndexOrThrow(Calls.IS_READ);
int newColumn = cursor.getColumnIndexOrThrow(Calls.NEW);
int geocodedLocationColumn = cursor.getColumnIndexOrThrow(Calls.GEOCODED_LOCATION);
@@ -276,6 +280,8 @@ public class SystemCallLogDataSource implements CallLogDataSource {
String cachedLookupUri = cursor.getString(cachedLookupUriColumn);
int cachedNumberType = cursor.getInt(cachedNumberTypeColumn);
String cachedNumberLabel = cursor.getString(cachedNumberLabelColumn);
+ int duration = cursor.getInt(durationsColumn);
+ String transcription = cursor.getString(transcriptionColumn);
int isRead = cursor.getInt(isReadColumn);
int isNew = cursor.getInt(newColumn);
String geocodedLocation = cursor.getString(geocodedLocationColumn);
@@ -321,6 +327,8 @@ public class SystemCallLogDataSource implements CallLogDataSource {
populatePhoneAccountLabelAndColor(
appContext, contentValues, phoneAccountComponentName, phoneAccountId);
contentValues.put(AnnotatedCallLog.FEATURES, features);
+ contentValues.put(AnnotatedCallLog.DURATION, duration);
+ contentValues.put(AnnotatedCallLog.TRANSCRIPTION, transcription);
if (existingAnnotatedCallLogIds.contains(id)) {
mutations.update(id, contentValues);
diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
index fbc789900..cadce4d48 100644
--- a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
+++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
@@ -51,7 +51,7 @@ public class TelephonyManagerCompat {
private static final String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";
- // TODO(erfanian): b/63995261 Replace with the platform/telecom constant when available.
+ // TODO(erfanian): a bug Replace with the platform/telecom constant when available.
/**
* Indicates that the call being placed originated from a known contact.
*
@@ -59,7 +59,7 @@ public class TelephonyManagerCompat {
*/
public static final String ALLOW_ASSISTED_DIAL = "android.telecom.extra.ALLOW_ASSISTED_DIAL";
- // TODO(erfanian): b/63995261 Replace with the platform/telecom constant when available.
+ // TODO(erfanian): a bug Replace with the platform/telecom constant when available.
/**
* Indicates that an outgoing call has undergone assisted dialing.
*
@@ -68,7 +68,7 @@ public class TelephonyManagerCompat {
*/
public static final String IS_ASSISTED_DIALED = "android.telecom.extra.IS_ASSISTED_DIALED";
- // TODO(erfanian): b/63995261 Replace with the platform/telecom API when available.
+ // TODO(erfanian): a bug Replace with the platform/telecom API when available.
/** Additional information relating to the assisted dialing transformation. */
public static final String ASSISTED_DIALING_EXTRAS =
"android.telecom.extra.ASSISTED_DIALING_EXTRAS";
diff --git a/java/com/android/dialer/constants/Constants.java b/java/com/android/dialer/constants/Constants.java
index f9d07e31d..a0c11f5a8 100644
--- a/java/com/android/dialer/constants/Constants.java
+++ b/java/com/android/dialer/constants/Constants.java
@@ -59,5 +59,8 @@ public abstract class Constants {
public abstract String getUserAgent(Context context);
+ @NonNull
+ public abstract String getSettingsActivity();
+
protected Constants() {}
}
diff --git a/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java b/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java
index 38fd24b8a..c332e8281 100644
--- a/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java
+++ b/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java
@@ -46,4 +46,10 @@ public class ConstantsImpl extends Constants {
public String getUserAgent(Context context) {
return null;
}
+
+ @NonNull
+ @Override
+ public String getSettingsActivity() {
+ return "com.android.dialer.app.settings.DialerSettingsActivity";
+ }
}
diff --git a/java/com/android/dialer/constants/googledialer/ConstantsImpl.java b/java/com/android/dialer/constants/googledialer/ConstantsImpl.java
index e151344ba..003f748af 100644
--- a/java/com/android/dialer/constants/googledialer/ConstantsImpl.java
+++ b/java/com/android/dialer/constants/googledialer/ConstantsImpl.java
@@ -58,4 +58,10 @@ public class ConstantsImpl extends Constants {
return userAgent.toString();
}
+
+ @NonNull
+ @Override
+ public String getSettingsActivity() {
+ return "com.google.android.apps.dialer.settings.GoogleDialerSettingsActivity";
+ }
}
diff --git a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
index 5dbdf5e48..a225072fd 100644
--- a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
+++ b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
@@ -931,7 +931,7 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
/**
* Maximum number of photos to preload. If the cache size is 2Mb and the expected average size
- * of a photo is 4kb, then this number should be 2Mb/4kb = 500.
+ * of a photo is 4kb, then this number should be 2Ma bugkb = 500.
*/
private static final int MAX_PHOTOS_TO_PRELOAD = 100;
diff --git a/java/com/android/dialer/database/DialerDatabaseHelper.java b/java/com/android/dialer/database/DialerDatabaseHelper.java
index 6dd7cf462..9a2581221 100644
--- a/java/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/java/com/android/dialer/database/DialerDatabaseHelper.java
@@ -1028,7 +1028,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
* Ignores contacts that have an unreasonably long lookup key. These are likely to be the result
* of multiple (> 50) merged raw contacts, and are likely to cause OutOfMemoryExceptions within
* SQLite, or cause memory allocation problems later on when iterating through the cursor set
- * (see b/13133579)
+ * (see a bug)
*/
String SELECT_IGNORE_LOOKUP_KEY_TOO_LONG_CLAUSE = "length(" + Phone.LOOKUP_KEY + ") < 1000";
diff --git a/java/com/android/dialer/enrichedcall/EnrichedCallManager.java b/java/com/android/dialer/enrichedcall/EnrichedCallManager.java
index 9f68978b5..681193c52 100644
--- a/java/com/android/dialer/enrichedcall/EnrichedCallManager.java
+++ b/java/com/android/dialer/enrichedcall/EnrichedCallManager.java
@@ -274,7 +274,7 @@ public interface EnrichedCallManager {
* when dialer is not in the foreground, and can not start {@link
* com.android.dialer.app.calllog.CallLogNotificationsService} to handle the event. The
* pendingResult allows dialer to hold on to resources when the event is handled in a
- * background thread. TODO(b/67015768): migrate CallLogNotificationsService to a
+ * background thread. TODO(a bug): migrate CallLogNotificationsService to a
* JobIntentService so it can be used in the background.
* @throws IllegalStateException if there's no session for the given id
*/
diff --git a/java/com/android/dialer/interactions/PhoneNumberInteraction.java b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
index 9692dae0f..ac744cce7 100644
--- a/java/com/android/dialer/interactions/PhoneNumberInteraction.java
+++ b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
@@ -15,6 +15,7 @@
*/
package com.android.dialer.interactions;
+import android.Manifest.permission;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
@@ -227,15 +228,10 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
// It's possible for a shortcut to have been created, and then permissions revoked. To avoid a
// crash when the user tries to use such a shortcut, check for this condition and ask the user
// for the permission.
- String[] deniedPhonePermissions =
- PermissionsUtil.getPermissionsCurrentlyDenied(
- mContext, PermissionsUtil.allPhoneGroupPermissionsUsedInDialer);
- if (deniedPhonePermissions.length > 0) {
- LogUtil.i(
- "PhoneNumberInteraction.startInteraction",
- "Need phone permissions: " + Arrays.toString(deniedPhonePermissions));
+ if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+ LogUtil.i("PhoneNumberInteraction.startInteraction", "Need phone permissions: CALL_PHONE");
ActivityCompat.requestPermissions(
- (Activity) mContext, deniedPhonePermissions, REQUEST_CALL_PHONE);
+ (Activity) mContext, new String[] {permission.CALL_PHONE}, REQUEST_CALL_PHONE);
return;
}
diff --git a/java/com/android/dialer/logging/contact_source.proto b/java/com/android/dialer/logging/contact_source.proto
index 3a24da1d0..96ef9e18e 100644
--- a/java/com/android/dialer/logging/contact_source.proto
+++ b/java/com/android/dialer/logging/contact_source.proto
@@ -15,7 +15,7 @@ message ContactSource {
// time they made the spam report, which could be different from the
// number's status at the time they made or received the call.
// Type definitions are from the CachedContactInfo interface in
- // google3/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java
+ // CachedNumberLookupService.java
enum Type {
UNKNOWN_SOURCE_TYPE = 0;
diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto
index 098391877..cafcae3e3 100644
--- a/java/com/android/dialer/logging/dialer_impression.proto
+++ b/java/com/android/dialer/logging/dialer_impression.proto
@@ -13,7 +13,6 @@ message DialerImpression {
// It's perfectly acceptable for this enum to be large
// Values should be from 1000 to 100000.
enum Type {
-
UNKNOWN_AOSP_EVENT_TYPE = 1000;
// User opened the app
@@ -25,88 +24,94 @@ message DialerImpression {
// User pressed the speaker phone button again
IN_CALL_SCREEN_TURN_ON_WIRED_OR_EARPIECE = 1003;
- // Number not identified as spam and the user tapped the block/report spam button in the
- // call log
+ // Number not identified as spam and the user tapped the block/report spam
+ // button in the call log
CALL_LOG_BLOCK_REPORT_SPAM = 1004;
- // Number identified as spam and the user tapped on the block number call log item
+ // Number identified as spam and the user tapped on the block number call
+ // log item
CALL_LOG_BLOCK_NUMBER = 1005;
// User tapped on the unblock number in the call log
- // This does not deal with whether the user reported this spam or not while initially blocking
- // For that refer to REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER. If the user had not reported it as
- // spam they then have the option of directly unblocking the number, a success of which is
- // logged in USER_ACTION_UNBLOCKED_NUMBER
+ // This does not deal with whether the user reported this spam or not while
+ // initially blocking For that refer to
+ // REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER. If the user had not reported it as
+ // spam they then have the option of directly unblocking the number, a
+ // success of which is logged in USER_ACTION_UNBLOCKED_NUMBER
CALL_LOG_UNBLOCK_NUMBER = 1006;
// Number was identified as spam, and the user tapped that it was not spam
CALL_LOG_REPORT_AS_NOT_SPAM = 1007;
- // Confirmation dialog in which the user confirmed that the number was not spam
+ // Confirmation dialog in which the user confirmed that the number was not
+ // spam
DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM = 1008;
// User unblocked a number and also acknowledged that the number is not spam
- // This happens when the user had initially blocked a number and also claimed the number was
- // spam and had now proceeded to undo that.
+ // This happens when the user had initially blocked a number and also
+ // claimed the number was spam and had now proceeded to undo that.
REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER = 1009
- ;
+ ;
- // A number that was identified as spam and the user proceeded to block it. However this
- // impression was to make sure that while blocking the number the user also acknowledged that
- // they were going to be reporting this as spam. There is no option for the user in this case
- // to not report it as spam and block it only. The only flow is:
- // system identified number as spam -> user wants to block it -> confirmation dialog shows up
- // asking user to acknowledge they want to block and report as spam -> user acknowledges and
- // this is when this impression is sent
+ // A number that was identified as spam and the user proceeded to block it.
+ // However this impression was to make sure that while blocking the number
+ // the user also acknowledged that they were going to be reporting this as
+ // spam. There is no option for the user in this case to not report it as
+ // spam and block it only. The only flow is: system identified number as
+ // spam -> user wants to block it -> confirmation dialog shows up asking
+ // user to acknowledge they want to block and report as spam -> user
+ // acknowledges and this is when this impression is sent
DIALOG_ACTION_CONFIRM_NUMBER_SPAM_INDIRECTLY_VIA_BLOCK_NUMBER = 1010;
- // User reported the number as spam by tick marking on report spam when blocking
- // the number via call log. This is for case where the user wants to block a number and also
- // report it as spam
- REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG = 1011
+ // User reported the number as spam by tick marking on report spam when
+ // blocking the number via call log. This is for case where the user wants
+ // to block a number and also report it as spam
+ REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG =
+ 1011
- ;
+ ;
// User made it to the last step and actually blocked the number
USER_ACTION_BLOCKED_NUMBER = 1012
- ;
+ ;
// User made it to the last step and actually unblocked the number
USER_ACTION_UNBLOCKED_NUMBER = 1013;
- // User blocked a number, does not guarantee if the number was reported as spam or not
- // To compute the number of blocked numbers that were reported as not spam and yet blocked
- // Subtract this value from SPAM_AFTER_CALL_NOTIFICATION_MARKED_NUMBER_AS_SPAM. It would be
+ // User blocked a number, does not guarantee if the number was reported as
+ // spam or not To compute the number of blocked numbers that were reported
+ // as not spam and yet blocked Subtract this value from
+ // SPAM_AFTER_CALL_NOTIFICATION_MARKED_NUMBER_AS_SPAM. It would be
// interesting to see how this value compares with
// SPAM_AFTER_CALL_NOTIFICATION_REPORT_NUMBER_AS_NOT_SPAM
SPAM_AFTER_CALL_NOTIFICATION_BLOCK_NUMBER = 1014;
- // Displays the dialog for first time spam calls with actions "Not spam", "Block", and
- // "Dismiss".
+ // Displays the dialog for first time spam calls with actions "Not spam",
+ // "Block", and "Dismiss".
SPAM_AFTER_CALL_NOTIFICATION_SHOW_SPAM_DIALOG = 1015;
- // Displays the dialog for the first time unknown calls with actions "Add contact",
- // "Block/report spam", and "Dismiss".
+ // Displays the dialog for the first time unknown calls with actions "Add
+ // contact", "Block/report spam", and "Dismiss".
SPAM_AFTER_CALL_NOTIFICATION_SHOW_NON_SPAM_DIALOG = 1016;
// User added the number to contacts from the after call notification
SPAM_AFTER_CALL_NOTIFICATION_ADD_TO_CONTACTS = 1019
- ;
+ ;
// User marked the number as spam on the after call notification flow
SPAM_AFTER_CALL_NOTIFICATION_MARKED_NUMBER_AS_SPAM = 1020
- ;
+ ;
SPAM_AFTER_CALL_NOTIFICATION_MARKED_NUMBER_AS_NOT_SPAM_AND_BLOCKED = 1021;
// User reported the number as not spam
SPAM_AFTER_CALL_NOTIFICATION_REPORT_NUMBER_AS_NOT_SPAM = 1022
- ;
+ ;
// User dismissed the spam notification
SPAM_AFTER_CALL_NOTIFICATION_ON_DISMISS_SPAM_DIALOG = 1024;
@@ -114,21 +119,22 @@ message DialerImpression {
// User dismissed the non spam notification
SPAM_AFTER_CALL_NOTIFICATION_ON_DISMISS_NON_SPAM_DIALOG = 1025;
- // From the service instead of an activity logs the number of times the number was marked as
- // Spam by the user (e.g from the feedback prompt)
+ // From the service instead of an activity logs the number of times the
+ // number was marked as Spam by the user (e.g from the feedback prompt)
SPAM_NOTIFICATION_SERVICE_ACTION_MARK_NUMBER_AS_SPAM = 1026;
- // From the service instead of an activity logs the number of times the number was marked as
- // Not Spam by the user (e.g from the feedback prompt)
+ // From the service instead of an activity logs the number of times the
+ // number was marked as Not Spam by the user (e.g from the feedback prompt)
SPAM_NOTIFICATION_SERVICE_ACTION_MARK_NUMBER_AS_NOT_SPAM = 1027;
// User is in a active call i.e either incoming or outgoing
- // This is mainly so we can assign an impression event to a call event i.e so that we may be
- // able to stitch different types of events if they make sense e.g user pressed a speaker button
- // and we want to associate that to a call event
+ // This is mainly so we can assign an impression event to a call event i.e
+ // so that we may be able to stitch different types of events if they make
+ // sense e.g user pressed a speaker button and we want to associate that to
+ // a call event
USER_PARTICIPATED_IN_A_CALL = 1028
- ;
+ ;
// Incoming call is a spam call
INCOMING_SPAM_CALL = 1029;
@@ -155,60 +161,64 @@ message DialerImpression {
// User has clicked the change PIN action in the voicemail tab
VOICEMAIL_ALERT_SET_PIN_CLICKED = 1046;
- // User was not able to or did not participate in the call e.g missed calls, rejected calls
+ // User was not able to or did not participate in the call e.g missed calls,
+ // rejected calls
USER_DID_NOT_PARTICIPATE_IN_CALL = 1047;
// User deleted a call log entry
USER_DELETED_CALL_LOG_ITEM = 1048
- ;
+ ;
// User tapped on "Send a message"
CALL_LOG_SEND_MESSAGE = 1049
- ;
+ ;
// User tapped on "Add to contact"
CALL_LOG_ADD_TO_CONTACT = 1050
- ;
+ ;
// User tapped on "Create new contact"
CALL_LOG_CREATE_NEW_CONTACT = 1051
- ;
+ ;
// User deleted an entry from the voicemail tab
VOICEMAIL_DELETE_ENTRY = 1052
- ;
+ ;
- // Voicemail call log entry was expanded. Could be either if the user tapped the voicemail
- // call log entry or pressed the play button when the voicemail call log entry was not expanded
+ // Voicemail call log entry was expanded. Could be either if the user tapped
+ // the voicemail call log entry or pressed the play button when the
+ // voicemail call log entry was not expanded
VOICEMAIL_EXPAND_ENTRY = 1053
- ;
+ ;
- // The play button for voicemail call log entry was tapped directly (i.e when the voicemail
- // call log entry was not expanded and the playbutton was tapped)
- VOICEMAIL_PLAY_AUDIO_DIRECTLY= 1054
+ // The play button for voicemail call log entry was tapped directly (i.e
+ // when the voicemail call log entry was not expanded and the playbutton was
+ // tapped)
+ VOICEMAIL_PLAY_AUDIO_DIRECTLY = 1054
- ;
+ ;
// The play button after expanding the voicemail call log entry was tapped
- VOICEMAIL_PLAY_AUDIO_AFTER_EXPANDING_ENTRY= 1055
+ VOICEMAIL_PLAY_AUDIO_AFTER_EXPANDING_ENTRY = 1055
- ;
+ ;
// Incoming call was rejected from the notifications
- REJECT_INCOMING_CALL_FROM_NOTIFICATION= 1056
+ REJECT_INCOMING_CALL_FROM_NOTIFICATION = 1056
- ;
+ ;
- // Incoming call was rejected from the answer screen including rejecting via sms and talkback
- REJECT_INCOMING_CALL_FROM_ANSWER_SCREEN= 1057
+ // Incoming call was rejected from the answer screen including rejecting via
+ // sms and talkback
+ REJECT_INCOMING_CALL_FROM_ANSWER_SCREEN = 1057
- ;
+ ;
// User tapped block and spam buttons in context menu, same as buttons in
// call log drop down
@@ -441,7 +451,7 @@ message DialerImpression {
MULTISELECT_DELETE_ENTRY_VIA_CONFIRMATION_DIALOG = 1209;
MULTISELECT_CANCEL_CONFIRMATION_DIALOG_VIA_CANCEL_BUTTON = 1210;
MULTISELECT_CANCEL_CONFIRMATION_DIALOG_VIA_CANCEL_TOUCH = 1211;
- MULTISELECT_ROTATE_AND_SHOW_ACTION_MODE= 1212;
+ MULTISELECT_ROTATE_AND_SHOW_ACTION_MODE = 1212;
// Impressions for verizon VVM with backup and transcription ToS
VOICEMAIL_VVM3_TOS_V2_CREATED = 1213;
@@ -559,5 +569,17 @@ message DialerImpression {
CALL_DETAILS_IMS_VIDEO_CALL_BACK = 1284;
CALL_DETAILS_LIGHTBRINGER_CALL_BACK = 1285;
CALL_DETAILS_VOICE_CALL_BACK = 1286;
+
+ // Assisted Dialing related impressions tracking failures modes within the
+ // library.
+
+ // Indicates a failure to parse a provided number string in libphonenumber.
+ ASSISTED_DIALING_CONSTRAINT_PARSING_FAILURE = 1287;
+ // Indicates that the number attempting to be assisted dialed already
+ // specified a country code.
+ ASSISTED_DIALING_CONSTRAINT_NUMBER_HAS_COUNTRY_CODE = 1288;
+ // Indicates that the number attempting to be assisted dialed had an
+ // extension.
+ ASSISTED_DIALING_CONSTRAINT_NUMBER_HAS_EXTENSION = 1289;
}
}
diff --git a/java/com/android/dialer/main/impl/AndroidManifest.xml b/java/com/android/dialer/main/impl/AndroidManifest.xml
index 8edde507c..6b7475f97 100644
--- a/java/com/android/dialer/main/impl/AndroidManifest.xml
+++ b/java/com/android/dialer/main/impl/AndroidManifest.xml
@@ -32,7 +32,7 @@
android:theme="@style/NuiMainActivityTheme"
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing">
- <!-- LINT.IfChange -->
+
<intent-filter>
<action android:name="android.intent.action.DIAL"/>
@@ -98,7 +98,7 @@
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.TAB"/>
</intent-filter>
- <!-- LINT.ThenChange(//depot/google3/third_party/java_src/android_app/dialer/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml) -->
+
<meta-data
android:name="com.android.keyguard.layout"
diff --git a/java/com/android/dialer/notification/NotificationChannelManager.java b/java/com/android/dialer/notification/NotificationChannelManager.java
index 93caed503..790aac36f 100644
--- a/java/com/android/dialer/notification/NotificationChannelManager.java
+++ b/java/com/android/dialer/notification/NotificationChannelManager.java
@@ -133,7 +133,7 @@ public final class NotificationChannelManager {
new NotificationChannel(
NotificationChannelId.ONGOING_CALL,
context.getText(R.string.notification_channel_ongoing_call),
- NotificationManager.IMPORTANCE_MAX);
+ NotificationManager.IMPORTANCE_DEFAULT);
channel.setShowBadge(false);
channel.enableLights(false);
channel.enableVibration(false);
diff --git a/java/com/android/dialer/notification/VoicemailChannelUtils.java b/java/com/android/dialer/notification/VoicemailChannelUtils.java
index e2d0f3a21..374619ade 100644
--- a/java/com/android/dialer/notification/VoicemailChannelUtils.java
+++ b/java/com/android/dialer/notification/VoicemailChannelUtils.java
@@ -16,6 +16,7 @@
package com.android.dialer.notification;
+import android.Manifest.permission;
import android.annotation.TargetApi;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -25,6 +26,8 @@ import android.os.Build.VERSION_CODES;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.annotation.RequiresPermission;
+import android.support.annotation.VisibleForTesting;
import android.support.v4.os.BuildCompat;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
@@ -34,6 +37,7 @@ import android.text.TextUtils;
import android.util.ArraySet;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.util.PermissionsUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -41,9 +45,10 @@ import java.util.Set;
/** Utilities for working with voicemail channels. */
@TargetApi(VERSION_CODES.O)
/* package */ final class VoicemailChannelUtils {
- private static final String GLOBAL_VOICEMAIL_CHANNEL_ID = "phone_voicemail";
+ @VisibleForTesting static final String GLOBAL_VOICEMAIL_CHANNEL_ID = "phone_voicemail";
private static final String PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX = "phone_voicemail_account_";
+ @SuppressWarnings("MissingPermission") // isSingleSimDevice() returns true if no permission
static Set<String> getAllChannelIds(@NonNull Context context) {
Assert.checkArgument(BuildCompat.isAtLeastO());
Assert.isNotNull(context);
@@ -59,6 +64,7 @@ import java.util.Set;
return result;
}
+ @SuppressWarnings("MissingPermission") // isSingleSimDevice() returns true if no permission
static void createAllChannels(@NonNull Context context) {
Assert.checkArgument(BuildCompat.isAtLeastO());
Assert.isNotNull(context);
@@ -127,24 +133,38 @@ import java.util.Set;
*/
private static void createGlobalVoicemailChannel(@NonNull Context context) {
NotificationChannel channel = newChannel(context, GLOBAL_VOICEMAIL_CHANNEL_ID, null);
+ migrateGlobalVoicemailSoundSettings(context, channel);
+ context.getSystemService(NotificationManager.class).createNotificationChannel(channel);
+ }
+ @SuppressWarnings("MissingPermission") // checked with PermissionsUtil
+ private static void migrateGlobalVoicemailSoundSettings(
+ Context context, NotificationChannel channel) {
+ if (!PermissionsUtil.hasReadPhoneStatePermissions(context)) {
+ LogUtil.i(
+ "VoicemailChannelUtils.migrateGlobalVoicemailSoundSettings",
+ "missing phone permission, not migrating sound settings");
+ return;
+ }
TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
PhoneAccountHandle handle =
telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
if (handle == null) {
LogUtil.i(
- "VoicemailChannelUtils.createGlobalVoicemailChannel",
+ "VoicemailChannelUtils.migrateGlobalVoicemailSoundSettings",
"phone account is null, not migrating sound settings");
- } else if (!isChannelAllowedForAccount(context, handle)) {
+ return;
+ }
+ if (!isChannelAllowedForAccount(context, handle)) {
LogUtil.i(
- "VoicemailChannelUtils.createGlobalVoicemailChannel",
+ "VoicemailChannelUtils.migrateGlobalVoicemailSoundSettings",
"phone account is not eligable, not migrating sound settings");
- } else {
- migrateVoicemailSoundSettings(context, channel, handle);
+ return;
}
- context.getSystemService(NotificationManager.class).createNotificationChannel(channel);
+ migrateVoicemailSoundSettings(context, channel, handle);
}
+ @RequiresPermission(permission.READ_PHONE_STATE)
private static List<PhoneAccountHandle> getAllEligableAccounts(@NonNull Context context) {
List<PhoneAccountHandle> handles = new ArrayList<>();
TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
@@ -210,6 +230,9 @@ import java.util.Set;
}
private static boolean isSingleSimDevice(@NonNull Context context) {
+ if (!PermissionsUtil.hasReadPhoneStatePermissions(context)) {
+ return true;
+ }
return context.getSystemService(TelephonyManager.class).getPhoneCount() <= 1;
}
diff --git a/java/com/android/dialer/oem/CequintCallerIdManager.java b/java/com/android/dialer/oem/CequintCallerIdManager.java
index 7b6ddbc3a..df624e06a 100644
--- a/java/com/android/dialer/oem/CequintCallerIdManager.java
+++ b/java/com/android/dialer/oem/CequintCallerIdManager.java
@@ -166,7 +166,7 @@ public class CequintCallerIdManager {
Assert.isWorkerThread();
Assert.isNotNull(number);
- // Cequint is using custom arguments for content provider. See more details in b/35766080.
+ // Cequint is using custom arguments for content provider. See more details in a bug.
try (Cursor cursor =
context.getContentResolver().query(uri, EMPTY_PROJECTION, number, flags, null)) {
if (cursor != null && cursor.moveToFirst()) {
diff --git a/java/com/android/dialer/oem/MotorolaUtils.java b/java/com/android/dialer/oem/MotorolaUtils.java
index 5f5bde61a..a2757d3ce 100644
--- a/java/com/android/dialer/oem/MotorolaUtils.java
+++ b/java/com/android/dialer/oem/MotorolaUtils.java
@@ -102,7 +102,7 @@ public class MotorolaUtils {
* @return true if the input is consumed and the intent is launched
*/
public static boolean handleSpecialCharSequence(Context context, String input) {
- // TODO(b/35395377): Add check for Motorola devices.
+ // TODO(a bug): Add check for Motorola devices.
return MotorolaHiddenMenuKeySequence.handleCharSequence(context, input);
}
diff --git a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
index f501792f9..8e08fb20d 100644
--- a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
+++ b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
@@ -159,7 +159,7 @@ public class ContactInfoHelper {
// ENTERPRISE_CONTENT_FILTER_URI in M doesn't support directory lookup
uri = PhoneLookup.CONTENT_FILTER_URI;
} else {
- // b/25900607 in M. PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, encodes twice.
+ // a bug in M. PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, encodes twice.
number = Uri.encode(number);
}
}
diff --git a/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto b/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto
index 97b7519dd..cd2ed50e0 100644
--- a/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto
+++ b/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto
@@ -97,8 +97,7 @@ message DialerInternalPhoneNumber {
// leading zeros.
//
// Clients who use the parsing or conversion functionality of the i18n phone
- // number libraries (go/phonenumbers) will have these fields set if necessary
- // automatically.
+ // number libraries will have these fields set if necessary automatically.
optional bool italian_leading_zero = 4;
optional int32 number_of_leading_zeros = 8 [default = 1];
diff --git a/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java b/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
index a53676b9a..40a338588 100644
--- a/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
+++ b/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
@@ -21,11 +21,13 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Trace;
import android.provider.CallLog;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.SparseIntArray;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.compat.CompatUtils;
@@ -43,6 +45,71 @@ public class PhoneNumberHelper {
private static final Set<String> LEGACY_UNKNOWN_NUMBERS =
new HashSet<>(Arrays.asList("-1", "-2", "-3"));
+ /** The phone keypad letter mapping (see ITU E.161 or ISO/IEC 9995-8.) */
+ private static final SparseIntArray KEYPAD_MAP = new SparseIntArray();
+
+ static {
+ KEYPAD_MAP.put('a', '2');
+ KEYPAD_MAP.put('b', '2');
+ KEYPAD_MAP.put('c', '2');
+ KEYPAD_MAP.put('A', '2');
+ KEYPAD_MAP.put('B', '2');
+ KEYPAD_MAP.put('C', '2');
+
+ KEYPAD_MAP.put('d', '3');
+ KEYPAD_MAP.put('e', '3');
+ KEYPAD_MAP.put('f', '3');
+ KEYPAD_MAP.put('D', '3');
+ KEYPAD_MAP.put('E', '3');
+ KEYPAD_MAP.put('F', '3');
+
+ KEYPAD_MAP.put('g', '4');
+ KEYPAD_MAP.put('h', '4');
+ KEYPAD_MAP.put('i', '4');
+ KEYPAD_MAP.put('G', '4');
+ KEYPAD_MAP.put('H', '4');
+ KEYPAD_MAP.put('I', '4');
+
+ KEYPAD_MAP.put('j', '5');
+ KEYPAD_MAP.put('k', '5');
+ KEYPAD_MAP.put('l', '5');
+ KEYPAD_MAP.put('J', '5');
+ KEYPAD_MAP.put('K', '5');
+ KEYPAD_MAP.put('L', '5');
+
+ KEYPAD_MAP.put('m', '6');
+ KEYPAD_MAP.put('n', '6');
+ KEYPAD_MAP.put('o', '6');
+ KEYPAD_MAP.put('M', '6');
+ KEYPAD_MAP.put('N', '6');
+ KEYPAD_MAP.put('O', '6');
+
+ KEYPAD_MAP.put('p', '7');
+ KEYPAD_MAP.put('q', '7');
+ KEYPAD_MAP.put('r', '7');
+ KEYPAD_MAP.put('s', '7');
+ KEYPAD_MAP.put('P', '7');
+ KEYPAD_MAP.put('Q', '7');
+ KEYPAD_MAP.put('R', '7');
+ KEYPAD_MAP.put('S', '7');
+
+ KEYPAD_MAP.put('t', '8');
+ KEYPAD_MAP.put('u', '8');
+ KEYPAD_MAP.put('v', '8');
+ KEYPAD_MAP.put('T', '8');
+ KEYPAD_MAP.put('U', '8');
+ KEYPAD_MAP.put('V', '8');
+
+ KEYPAD_MAP.put('w', '9');
+ KEYPAD_MAP.put('x', '9');
+ KEYPAD_MAP.put('y', '9');
+ KEYPAD_MAP.put('z', '9');
+ KEYPAD_MAP.put('W', '9');
+ KEYPAD_MAP.put('X', '9');
+ KEYPAD_MAP.put('Y', '9');
+ KEYPAD_MAP.put('Z', '9');
+ }
+
/** Returns true if it is possible to place a call to the given number. */
public static boolean canPlaceCallsTo(CharSequence number, int presentation) {
return presentation == CallLog.Calls.PRESENTATION_ALLOWED
@@ -60,29 +127,59 @@ public class PhoneNumberHelper {
* <li>their corresponding raw numbers are both global phone numbers (i.e., they can be accepted
* by {@link PhoneNumberUtils#isGlobalPhoneNumber(String)}) and {@link
* PhoneNumberUtils#compare(String, String)} deems them as "identical enough"; OR
- * <li>at least one of the raw numbers is not a global phone number and the two raw numbers are
- * exactly the same.
+ * <li>neither of the raw numbers is a global phone number and they are identical.
* </ul>
*
- * The raw number of a phone number is obtained by first translating any alphabetic letters
- * ([A-Za-z]) into the equivalent numeric digits and then removing all separators. See {@link
- * PhoneNumberUtils#convertKeypadLettersToDigits(String)} and {@link
- * PhoneNumberUtils#stripSeparators(String)}.
+ * See {@link #convertAndStrip(String)} for how a raw number is obtained.
*/
public static boolean compare(@Nullable String number1, @Nullable String number2) {
if (number1 == null || number2 == null) {
return Objects.equals(number1, number2);
}
- String rawNumber1 =
- PhoneNumberUtils.stripSeparators(PhoneNumberUtils.convertKeypadLettersToDigits(number1));
- String rawNumber2 =
- PhoneNumberUtils.stripSeparators(PhoneNumberUtils.convertKeypadLettersToDigits(number2));
+ String rawNumber1 = convertAndStrip(number1);
+ String rawNumber2 = convertAndStrip(number2);
+
+ boolean isGlobalPhoneNumber1 = PhoneNumberUtils.isGlobalPhoneNumber(rawNumber1);
+ boolean isGlobalPhoneNumber2 = PhoneNumberUtils.isGlobalPhoneNumber(rawNumber2);
+
+ if (isGlobalPhoneNumber1 && isGlobalPhoneNumber2) {
+ return PhoneNumberUtils.compare(rawNumber1, rawNumber2);
+ }
+ if (!isGlobalPhoneNumber1 && !isGlobalPhoneNumber2) {
+ return rawNumber1.equals(rawNumber2);
+ }
+ return false;
+ }
+
+ /**
+ * Translating any alphabetic letters ([A-Za-z]) in the given phone number into the equivalent
+ * numeric digits and then removing all separators. The caller should ensure the number passed to
+ * this method is not null.
+ */
+ private static String convertAndStrip(@NonNull String number) {
+ int len = number.length();
+ if (len == 0) {
+ return number;
+ }
+
+ StringBuilder ret = new StringBuilder(len);
+ for (int i = 0; i < len; i++) {
+ char c = number.charAt(i);
+
+ // If the char isn't in KEYPAD_MAP, leave it alone for now.
+ c = (char) KEYPAD_MAP.get(c, c);
+
+ // Append the char to the result if it's a digit or non-separator.
+ int digit = Character.digit(c, 10);
+ if (digit != -1) {
+ ret.append(digit);
+ } else if (PhoneNumberUtils.isNonSeparator(c)) {
+ ret.append(c);
+ }
+ }
- return PhoneNumberUtils.isGlobalPhoneNumber(rawNumber1)
- && PhoneNumberUtils.isGlobalPhoneNumber(rawNumber2)
- ? PhoneNumberUtils.compare(rawNumber1, rawNumber2)
- : rawNumber1.equals(rawNumber2);
+ return ret.toString();
}
/**
diff --git a/java/com/android/dialer/proguard/proguard_base.flags b/java/com/android/dialer/proguard/proguard_base.flags
index 7b5794ec7..6d5d373fd 100644
--- a/java/com/android/dialer/proguard/proguard_base.flags
+++ b/java/com/android/dialer/proguard/proguard_base.flags
@@ -1,4 +1,3 @@
-# Copied from http://google3/java/com/google/android/apps/common/proguard/base.flags
# This file is intended to contain proguard options that *nobody* would ever
# not want, in *any* configuration - they ensure basic correctness, and have
diff --git a/java/com/android/dialer/proguard/proguard_release.flags b/java/com/android/dialer/proguard/proguard_release.flags
index 1429740f4..5c7aa83f3 100644
--- a/java/com/android/dialer/proguard/proguard_release.flags
+++ b/java/com/android/dialer/proguard/proguard_release.flags
@@ -1,4 +1,3 @@
-# Copied from http://google3/java/com/google/android/apps/common/proguard/release.flags
# Used for building release binaries. Obfuscates, optimizes, and shrinks.
diff --git a/java/com/android/dialer/searchfragment/common/Projections.java b/java/com/android/dialer/searchfragment/common/Projections.java
index aaf9e80f1..63fac4ca0 100644
--- a/java/com/android/dialer/searchfragment/common/Projections.java
+++ b/java/com/android/dialer/searchfragment/common/Projections.java
@@ -42,7 +42,7 @@ public class Projections {
public static final int COMPANY_NAME = 12;
public static final int NICKNAME = 13;
- public static final String[] DATA_PROJECTION =
+ public static final String[] CP2_PROJECTION =
new String[] {
Data._ID, // 0
Phone.TYPE, // 1
@@ -59,4 +59,20 @@ public class Projections {
Organization.COMPANY, // 12
Nickname.NAME // 13
};
+
+ public static final String[] DATA_PROJECTION =
+ new String[] {
+ Data._ID, // 0
+ Phone.TYPE, // 1
+ Phone.LABEL, // 2
+ Phone.NUMBER, // 3
+ Data.DISPLAY_NAME_PRIMARY, // 4
+ Data.PHOTO_ID, // 5
+ Data.PHOTO_THUMBNAIL_URI, // 6
+ Data.LOOKUP_KEY, // 7
+ Data.CARRIER_PRESENCE, // 8
+ Data.CONTACT_ID, // 9
+ Data.MIMETYPE, // 10
+ Data.SORT_KEY_PRIMARY, // 11
+ };
}
diff --git a/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java b/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
index 9a0ca0088..84c22a2cf 100644
--- a/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
+++ b/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
@@ -31,7 +31,6 @@ import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.v4.util.ArraySet;
import android.text.TextUtils;
-import com.android.dialer.common.Assert;
import com.android.dialer.searchfragment.common.Projections;
import com.android.dialer.searchfragment.common.QueryFilteringUtil;
import java.lang.annotation.Retention;
@@ -71,7 +70,7 @@ final class ContactFilterCursor implements Cursor {
}
/**
- * @param cursor with projection {@link Projections#DATA_PROJECTION}.
+ * @param cursor with projection {@link Projections#CP2_PROJECTION}.
* @param query to filter cursor results.
*/
ContactFilterCursor(Cursor cursor, @Nullable String query) {
@@ -123,8 +122,7 @@ final class ContactFilterCursor implements Cursor {
// Sort by display name, then build new cursor from coalesced contacts.
// We sort the contacts so that they are displayed to the user in lexicographic order.
Collections.sort(coalescedContacts, (o1, o2) -> o1.displayName().compareTo(o2.displayName()));
- MatrixCursor newCursor =
- new MatrixCursor(Projections.DATA_PROJECTION, coalescedContacts.size());
+ MatrixCursor newCursor = new MatrixCursor(Projections.CP2_PROJECTION, coalescedContacts.size());
for (Cp2Contact contact : coalescedContacts) {
newCursor.addRow(contact.toCursorRow());
}
@@ -139,11 +137,13 @@ final class ContactFilterCursor implements Cursor {
if (contact.mimeType().equals(Phone.CONTENT_ITEM_TYPE)) {
phoneContacts.add(contact);
} else if (contact.mimeType().equals(Organization.CONTENT_ITEM_TYPE)) {
- Assert.checkArgument(TextUtils.isEmpty(companyName));
- companyName = contact.companyName();
+ // Since a contact can have more than one company name but they aren't visible to the user
+ // in our search UI, we can lazily concatenate them together to make them all searchable.
+ companyName += " " + contact.companyName();
} else if (contact.mimeType().equals(Nickname.CONTENT_ITEM_TYPE)) {
- Assert.checkArgument(TextUtils.isEmpty(nickName));
- nickName = contact.nickName();
+ // Since a contact can have more than one nickname but they aren't visible to the user
+ // in our search UI, we can lazily concatenate them together to make them all searchable.
+ nickName += " " + contact.nickName();
}
}
diff --git a/java/com/android/dialer/searchfragment/cp2/Cp2Contact.java b/java/com/android/dialer/searchfragment/cp2/Cp2Contact.java
index f199f679b..8e5e3e781 100644
--- a/java/com/android/dialer/searchfragment/cp2/Cp2Contact.java
+++ b/java/com/android/dialer/searchfragment/cp2/Cp2Contact.java
@@ -111,7 +111,7 @@ public abstract class Cp2Contact {
}
public Object[] toCursorRow() {
- Object[] row = new Object[Projections.DATA_PROJECTION.length];
+ Object[] row = new Object[Projections.CP2_PROJECTION.length];
row[Projections.ID] = phoneId();
row[Projections.PHONE_TYPE] = phoneType();
row[Projections.PHONE_LABEL] = phoneLabel();
diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
index f1230c6d9..d3abbffca 100644
--- a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
@@ -36,7 +36,7 @@ public final class SearchContactsCursorLoader extends CursorLoader {
super(
context,
Data.CONTENT_URI,
- Projections.DATA_PROJECTION,
+ Projections.CP2_PROJECTION,
whereStatement(),
null,
Phone.SORT_KEY_PRIMARY + " ASC");
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index 254453508..ef1b4fc19 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -412,7 +412,7 @@ public final class NewSearchFragment extends Fragment
// Currently, setting up multiple FakeContentProviders doesn't work and results in this fragment
// being untestable while it can query multiple datasources. This is a temporary fix.
- // TODO(b/64099602): Remove this method and test this fragment with multiple data sources
+ // TODO(a bug): Remove this method and test this fragment with multiple data sources
@VisibleForTesting
public void setRemoteDirectoriesDisabled(boolean disabled) {
remoteDirectoriesDisabledForTesting = disabled;
diff --git a/java/com/android/dialer/searchfragment/remote/RemoteContactsCursorLoader.java b/java/com/android/dialer/searchfragment/remote/RemoteContactsCursorLoader.java
index eb472732f..64175bebc 100644
--- a/java/com/android/dialer/searchfragment/remote/RemoteContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/remote/RemoteContactsCursorLoader.java
@@ -44,7 +44,8 @@ public final class RemoteContactsCursorLoader extends CursorLoader {
Uri.withAppendedPath(Phone.CONTENT_URI, "filter_enterprise");
private static final String IGNORE_NUMBER_TOO_LONG_CLAUSE = "length(" + Phone.NUMBER + ") < 1000";
- private static final String MAX_RESULTS = "20";
+ private static final String PHONE_NUMBER_NOT_NULL = Phone.NUMBER + " IS NOT NULL";
+ private static final String MAX_RESULTS = "10";
private final String query;
private final List<Directory> directories;
@@ -55,7 +56,7 @@ public final class RemoteContactsCursorLoader extends CursorLoader {
context,
null,
Projections.DATA_PROJECTION,
- IGNORE_NUMBER_TOO_LONG_CLAUSE,
+ IGNORE_NUMBER_TOO_LONG_CLAUSE + " AND " + PHONE_NUMBER_NOT_NULL,
null,
Phone.SORT_KEY_PRIMARY);
this.query = query;
diff --git a/java/com/android/dialer/searchfragment/testing/TestCursorSchema.java b/java/com/android/dialer/searchfragment/testing/TestCursorSchema.java
index 375fdb50c..9117f72cd 100644
--- a/java/com/android/dialer/searchfragment/testing/TestCursorSchema.java
+++ b/java/com/android/dialer/searchfragment/testing/TestCursorSchema.java
@@ -23,7 +23,7 @@ public final class TestCursorSchema {
/**
* If new rows are added to {@link
- * com.android.dialer.searchfragment.common.Projections#DATA_PROJECTION}, this schema should be
+ * com.android.dialer.searchfragment.common.Projections#CP2_PROJECTION}, this schema should be
* updated.
*/
// TODO(67909522): remove these extra columns and remove all references to "Phone."
diff --git a/java/com/android/dialer/simulator/Simulator.java b/java/com/android/dialer/simulator/Simulator.java
index 4812fa5d6..bfa202c5c 100644
--- a/java/com/android/dialer/simulator/Simulator.java
+++ b/java/com/android/dialer/simulator/Simulator.java
@@ -31,7 +31,7 @@ public interface Simulator {
ActionProvider getActionProvider(Context context);
/** The type of conference to emulate. */
- // TODO(b/67785540): add VoLTE and CDMA conference call
+ // TODO(a bug): add VoLTE and CDMA conference call
@Retention(RetentionPolicy.SOURCE)
@IntDef({
CONFERENCE_TYPE_GSM,
diff --git a/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java b/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java
index b974ab18a..09fdf5cda 100644
--- a/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java
+++ b/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java
@@ -53,7 +53,7 @@ final class SystemDialerStrictMode implements DialerStrictMode {
// Because Android resets StrictMode policies after Application.onCreate is done, we set it
// again right after.
// See cl/105932355 for the discussion.
- // See b/36951662 for the public bug.
+ // See a bug for the public bug.
Handler handler = new Handler(Looper.myLooper());
handler.postAtFrontOfQueue(() -> setRecommendedMainThreadPolicy(THREAD_DEATH_PENALTY));
}
@@ -93,7 +93,7 @@ final class SystemDialerStrictMode implements DialerStrictMode {
.detectLeakedSqlLiteObjects();
if (Build.VERSION.SDK_INT >= 26) {
vmPolicyBuilder.detectContentUriWithoutPermission();
- // TODO(azlatin): Enable detecting untagged sockets once: b/64840386 is fixed.
+ // TODO(azlatin): Enable detecting untagged sockets once: a bug is fixed.
// vmPolicyBuilder.detectUntaggedSockets();
}
StrictMode.setVmPolicy(vmPolicyBuilder.build());
diff --git a/java/com/android/dialer/theme/res/values/colors.xml b/java/com/android/dialer/theme/res/values/colors.xml
index 3c8cabbc5..f44a7ccc6 100644
--- a/java/com/android/dialer/theme/res/values/colors.xml
+++ b/java/com/android/dialer/theme/res/values/colors.xml
@@ -38,6 +38,7 @@
<!-- Primary text color in the Phone app -->
<color name="dialer_primary_text_color">#333333</color>
+ <color name="dialer_primary_text_color_white">#ffffff</color>
<color name="dialer_edit_text_hint_color">#DE78909C</color>
<!-- Secondary text color in the Phone app -->
@@ -69,4 +70,7 @@
<!-- Color of call type icons in call log, e.g. voicemail, video, WiFi, HD etc. -->
<color name="call_type_icon_color">#89000000</color>
+
+ <!-- Color for bubble -->
+ <color name="dialer_end_call_button_color">#FFDF0000</color>
</resources>
diff --git a/java/com/android/dialer/util/PermissionsUtil.java b/java/com/android/dialer/util/PermissionsUtil.java
index cb973680d..02ea91093 100644
--- a/java/com/android/dialer/util/PermissionsUtil.java
+++ b/java/com/android/dialer/util/PermissionsUtil.java
@@ -77,6 +77,10 @@ public class PermissionsUtil {
return hasPermission(context, permission.CALL_PHONE);
}
+ public static boolean hasReadPhoneStatePermissions(Context context) {
+ return hasPermission(context, permission.READ_PHONE_STATE);
+ }
+
public static boolean hasContactsReadPermissions(Context context) {
return hasPermission(context, permission.READ_CONTACTS);
}
diff --git a/java/com/android/dialer/util/ViewUtil.java b/java/com/android/dialer/util/ViewUtil.java
index 81a32f985..211b3ed12 100644
--- a/java/com/android/dialer/util/ViewUtil.java
+++ b/java/com/android/dialer/util/ViewUtil.java
@@ -19,16 +19,19 @@ package com.android.dialer.util;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Paint;
+import android.graphics.Point;
import android.os.PowerManager;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.TypedValue;
+import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.ViewTreeObserver.OnPreDrawListener;
+import android.view.WindowManager;
import android.widget.TextView;
import java.util.Locale;
@@ -139,4 +142,45 @@ public class ViewUtil {
return Settings.Global.getFloat(contentResolver, Global.ANIMATOR_DURATION_SCALE, 1.0f) == 0
|| powerManager.isPowerSaveMode();
}
+
+ /**
+ * Get navigation bar height by calculating difference between app usable size and real screen
+ * size. Note that this won't work in multi-window mode so it's caller's responsibility to check
+ * if the app is in multi-window mode before using this.
+ *
+ * @param context Context
+ * @return Navigation bar height
+ */
+ public static int getNavigationBarHeight(Context context) {
+ WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ Display display = windowManager.getDefaultDisplay();
+ Point appUsableSize = getAppUsableScreenSize(display);
+ Point realScreenSize = getRealScreenSize(display);
+
+ // Navigation bar on the right.
+ if (appUsableSize.x < realScreenSize.x) {
+ return appUsableSize.y;
+ }
+
+ // Navigation bar at the bottom.
+ if (appUsableSize.y < realScreenSize.y) {
+ return realScreenSize.y - appUsableSize.y;
+ }
+
+ // Navigation bar is not present.
+ return 0;
+ }
+
+ private static Point getAppUsableScreenSize(Display display) {
+ Point size = new Point();
+ display.getSize(size);
+ return size;
+ }
+
+ private static Point getRealScreenSize(Display display) {
+ Point size = new Point();
+ display.getRealSize(size);
+
+ return size;
+ }
}
diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java b/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java
index d50be1ab6..ca0b5dcb0 100644
--- a/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java
+++ b/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java
@@ -21,22 +21,25 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.time.Clock;
/** {@link RecyclerView.Adapter} for the new voicemail call log fragment. */
final class NewVoicemailAdapter extends RecyclerView.Adapter<NewVoicemailViewHolder> {
private final Cursor cursor;
+ private final Clock clock;
/** @param cursor whose projection is {@link VoicemailCursorLoader.VOICEMAIL_COLUMNS} */
- NewVoicemailAdapter(Cursor cursor) {
+ NewVoicemailAdapter(Cursor cursor, Clock clock) {
this.cursor = cursor;
+ this.clock = clock;
}
@Override
public NewVoicemailViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
View view = inflater.inflate(R.layout.new_voicemail_entry, viewGroup, false);
- NewVoicemailViewHolder newVoicemailViewHolder = new NewVoicemailViewHolder(view);
+ NewVoicemailViewHolder newVoicemailViewHolder = new NewVoicemailViewHolder(view, clock);
return newVoicemailViewHolder;
}
diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java b/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java
index 1912e1e3f..9c1fd8b85 100644
--- a/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java
+++ b/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java
@@ -54,7 +54,7 @@ public final class NewVoicemailFragment extends Fragment implements LoaderCallba
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
LogUtil.i("NewVoicemailFragment.onCreateLoader", "cursor size is %d", data.getCount());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
- recyclerView.setAdapter(new NewVoicemailAdapter(data));
+ recyclerView.setAdapter(new NewVoicemailAdapter(data, System::currentTimeMillis));
}
@Override
diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java b/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java
index daa24c86c..8016563ce 100644
--- a/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java
+++ b/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java
@@ -19,11 +19,13 @@ import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
import android.view.View;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import com.android.dialer.contactphoto.ContactPhotoManager;
import com.android.dialer.lettertile.LetterTileDrawable;
+import com.android.dialer.time.Clock;
import com.android.dialer.voicemail.model.VoicemailEntry;
/** {@link RecyclerView.ViewHolder} for the new voicemail tab. */
@@ -31,18 +33,37 @@ final class NewVoicemailViewHolder extends RecyclerView.ViewHolder {
private final Context context;
private final TextView primaryTextView;
+ private final TextView secondaryTextView;
+ private final TextView transcriptionTextView;
private final QuickContactBadge quickContactBadge;
+ private final Clock clock;
- NewVoicemailViewHolder(View view) {
+ NewVoicemailViewHolder(View view, Clock clock) {
super(view);
this.context = view.getContext();
- primaryTextView = (TextView) view.findViewById(R.id.primary_text);
+ primaryTextView = view.findViewById(R.id.primary_text);
+ secondaryTextView = view.findViewById(R.id.secondary_text);
+ transcriptionTextView = view.findViewById(R.id.transcription_text);
quickContactBadge = view.findViewById(R.id.quick_contact_photo);
+ this.clock = clock;
}
void bind(Cursor cursor) {
VoicemailEntry voicemailEntry = VoicemailCursorLoader.toVoicemailEntry(cursor);
primaryTextView.setText(VoicemailEntryText.buildPrimaryVoicemailText(context, voicemailEntry));
+ secondaryTextView.setText(
+ VoicemailEntryText.buildSecondaryVoicemailText(context, clock, voicemailEntry));
+
+ String voicemailTranscription = voicemailEntry.transcription();
+
+ if (TextUtils.isEmpty(voicemailTranscription)) {
+ transcriptionTextView.setVisibility(View.GONE);
+ transcriptionTextView.setText(null);
+ } else {
+ transcriptionTextView.setVisibility(View.VISIBLE);
+ transcriptionTextView.setText(voicemailTranscription);
+ }
+
setPhoto(voicemailEntry);
}
diff --git a/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java b/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java
index 5a4176542..e371e5ebf 100644
--- a/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java
+++ b/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java
@@ -39,8 +39,10 @@ final class VoicemailCursorLoader extends CursorLoader {
AnnotatedCallLog.PHOTO_URI,
AnnotatedCallLog.PHOTO_ID,
AnnotatedCallLog.LOOKUP_URI,
+ AnnotatedCallLog.DURATION,
AnnotatedCallLog.GEOCODED_LOCATION,
- AnnotatedCallLog.CALL_TYPE
+ AnnotatedCallLog.CALL_TYPE,
+ AnnotatedCallLog.TRANSCRIPTION
};
// Indexes for VOICEMAIL_COLUMNS
@@ -52,8 +54,10 @@ final class VoicemailCursorLoader extends CursorLoader {
private static final int PHOTO_URI = 5;
private static final int PHOTO_ID = 6;
private static final int LOOKUP_URI = 7;
- private static final int GEOCODED_LOCATION = 8;
- private static final int CALL_TYPE = 9;
+ private static final int DURATION = 8;
+ private static final int GEOCODED_LOCATION = 9;
+ private static final int CALL_TYPE = 10;
+ private static final int TRANSCRIPTION = 11;
// TODO(zachh): Optimize indexes
VoicemailCursorLoader(Context context) {
@@ -84,6 +88,8 @@ final class VoicemailCursorLoader extends CursorLoader {
.setPhotoUri(cursor.getString(PHOTO_URI))
.setPhotoId(cursor.getLong(PHOTO_ID))
.setLookupUri(cursor.getString(LOOKUP_URI))
+ .setDuration(cursor.getLong(DURATION))
+ .setTranscription(cursor.getString(TRANSCRIPTION))
.setGeocodedLocation(cursor.getString(GEOCODED_LOCATION))
.setCallType(cursor.getInt(CALL_TYPE))
.build();
diff --git a/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java b/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java
index cf2fef253..f59220105 100644
--- a/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java
+++ b/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java
@@ -18,7 +18,11 @@ package com.android.dialer.voicemail.listui;
import android.content.Context;
import android.text.TextUtils;
+import com.android.dialer.calllogutils.CallLogDates;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.time.Clock;
import com.android.dialer.voicemail.model.VoicemailEntry;
+import java.util.concurrent.TimeUnit;
/**
* Computes the primary text for voicemail entries.
@@ -39,4 +43,66 @@ public class VoicemailEntryText {
}
return primaryText.toString();
}
+
+ /**
+ * Uses the new date and location formatting rules to format the location and date in the new
+ * voicemail tab.
+ *
+ * <p>Rules: $Location • Date
+ *
+ * <p>Examples:
+ *
+ * <p>Jun 20 San Francisco • Now
+ *
+ * <p>Markham, ON • Jul 27
+ *
+ * <p>Toledo, OH • 12:15 PM
+ *
+ * <p>Date rules: if < 1 minute ago: "Now"; else if today: HH:MM(am|pm); else if < 3 days: day;
+ * else: MON D *
+ *
+ * @return $Location • Date
+ */
+ public static String buildSecondaryVoicemailText(
+ Context context, Clock clock, VoicemailEntry voicemailEntry) {
+ return secondaryTextPrefix(context, clock, voicemailEntry);
+ }
+
+ private static String secondaryTextPrefix(
+ Context context, Clock clock, VoicemailEntry voicemailEntry) {
+ StringBuilder secondaryText = new StringBuilder();
+ String location = voicemailEntry.geocodedLocation();
+ if (!TextUtils.isEmpty(location)) {
+ secondaryText.append(location);
+ }
+ if (secondaryText.length() > 0) {
+ secondaryText.append(" • ");
+ }
+ secondaryText.append(
+ CallLogDates.newCallLogTimestampLabel(
+ context, clock.currentTimeMillis(), voicemailEntry.timestamp()));
+
+ long duration = voicemailEntry.duration();
+ if (duration >= 0) {
+ secondaryText.append(" • ");
+ String formattedDuration = getVoicemailDuration(context, voicemailEntry);
+ secondaryText.append(formattedDuration);
+ }
+ return secondaryText.toString();
+ }
+
+ private static String getVoicemailDuration(Context context, VoicemailEntry voicemailEntry) {
+ long minutes = TimeUnit.SECONDS.toMinutes(voicemailEntry.duration());
+ long seconds = voicemailEntry.duration() - TimeUnit.MINUTES.toSeconds(minutes);
+
+ // The format for duration is "MM:SS" and we never expect the duration to be > 5 minutes
+ // However an incorrect duration could be set by the framework/someone to be >99, and in that
+ // case cap it at 99, for the UI to still be able to display it in "MM:SS" format.
+ if (minutes > 99) {
+ LogUtil.w(
+ "VoicemailEntryText.getVoicemailDuration", "Duration was %d", voicemailEntry.duration());
+ minutes = 99;
+ }
+ return context.getString(R.string.voicemailDurationFormat, minutes, seconds);
+ }
}
diff --git a/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_entry.xml b/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_entry.xml
index bc1506751..fe009922e 100644
--- a/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_entry.xml
+++ b/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_entry.xml
@@ -72,6 +72,7 @@
android:layout_marginStart="@dimen/call_log_entry_photo_text_margin"/>
</LinearLayout>
+ <!-- TODO(uabdullah): Fix text cropping issue -->
<TextView
android:id="@+id/transcription_text"
style="@style/SecondaryText"
diff --git a/java/com/android/dialer/voicemail/listui/res/values/strings.xml b/java/com/android/dialer/voicemail/listui/res/values/strings.xml
index 39c368a5a..a7df0ce8f 100644
--- a/java/com/android/dialer/voicemail/listui/res/values/strings.xml
+++ b/java/com/android/dialer/voicemail/listui/res/values/strings.xml
@@ -14,7 +14,10 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- String used to display voicemails from unknown numbers in the voicemail tab. [CHAR LIMIT=30] -->
<string name="voicemail_entry_unknown">Unknown</string>
+
+ <!-- Format for duration of voicemails which are displayed when viewing voicemail. For example "01:22" -->
+ <string name="voicemailDurationFormat"><xliff:g example="10" id="minutes">%1$02d</xliff:g>:<xliff:g example="20" id="seconds">%2$02d</xliff:g></string>
</resources> \ No newline at end of file
diff --git a/java/com/android/dialer/voicemail/model/VoicemailEntry.java b/java/com/android/dialer/voicemail/model/VoicemailEntry.java
index 00e1757dc..fc548f18c 100644
--- a/java/com/android/dialer/voicemail/model/VoicemailEntry.java
+++ b/java/com/android/dialer/voicemail/model/VoicemailEntry.java
@@ -31,6 +31,7 @@ public abstract class VoicemailEntry {
.setTimestamp(0)
.setNumber(DialerPhoneNumber.getDefaultInstance())
.setPhotoId(0)
+ .setDuration(0)
.setCallType(0);
}
@@ -58,6 +59,11 @@ public abstract class VoicemailEntry {
@Nullable
public abstract String geocodedLocation();
+ public abstract long duration();
+
+ @Nullable
+ public abstract String transcription();
+
public abstract int callType();
/** Builder for {@link VoicemailEntry}. */
@@ -80,6 +86,10 @@ public abstract class VoicemailEntry {
public abstract Builder setLookupUri(@Nullable String lookupUri);
+ public abstract Builder setDuration(long duration);
+
+ public abstract Builder setTranscription(@Nullable String transcription);
+
public abstract Builder setGeocodedLocation(@Nullable String geocodedLocation);
public abstract Builder setCallType(int callType);