Merge "Reset view state to unmarked when binding." into ub-contactsdialer-a-dev
diff --git a/res/layout/call_detail_header.xml b/res/layout/call_detail_header.xml
index 5931445..6eceb80 100644
--- a/res/layout/call_detail_header.xml
+++ b/res/layout/call_detail_header.xml
@@ -59,7 +59,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textSize="@dimen/call_log_detail_text_size"
android:layout_marginBottom="1dp"
android:singleLine="true" />
@@ -68,7 +68,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textSize="@dimen/call_log_detail_text_size"
android:singleLine="true"
android:visibility="gone" />
diff --git a/res/layout/call_detail_history_item.xml b/res/layout/call_detail_history_item.xml
index cbe8442..10d9605 100644
--- a/res/layout/call_detail_history_item.xml
+++ b/res/layout/call_detail_history_item.xml
@@ -46,11 +46,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size" />
+ android:textSize="@dimen/call_log_detail_text_size" />
<TextView
android:id="@+id/duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size" />
+ android:textSize="@dimen/call_log_detail_text_size" />
</LinearLayout>
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index ec512b6..95de268 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -30,8 +30,8 @@
android:layout_marginStart="@dimen/call_log_start_margin"
android:layout_marginEnd="@dimen/call_log_outer_margin"
android:fontFamily="sans-serif-medium"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textColor="@color/call_log_day_group_heading_color"
+ android:textSize="@dimen/call_log_day_group_heading_size"
android:paddingTop="@dimen/call_log_day_group_padding_top"
android:paddingBottom="@dimen/call_log_day_group_padding_bottom" />
@@ -83,21 +83,10 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/call_log_name_margin_bottom"
android:layout_marginEnd="@dimen/call_log_icon_margin"
- android:textColor="?attr/call_log_primary_text_color"
+ android:textColor="@color/call_log_primary_color"
android:textSize="@dimen/call_log_primary_text_size"
android:singleLine="true" />
- <TextView
- android:id="@+id/voicemail_transcription"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginEnd="@dimen/call_log_icon_margin"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:visibility="gone" />
-
<LinearLayout
android:id="@+id/call_type"
android:layout_width="wrap_content"
@@ -118,8 +107,8 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/call_log_icon_margin"
android:layout_gravity="center_vertical"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textColor="@color/call_log_detail_color"
+ android:textSize="@dimen/call_log_detail_text_size"
android:singleLine="true" />
</LinearLayout>
@@ -130,10 +119,22 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/call_log_icon_margin"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textSize="@dimen/call_log_detail_text_size"
android:visibility="gone"
android:singleLine="true" />
+ <TextView
+ android:id="@+id/voicemail_transcription"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/call_log_icon_margin"
+ android:textColor="@color/call_log_voicemail_transcript_color"
+ android:textSize="@dimen/call_log_voicemail_transcription_text_size"
+ android:ellipsize="marquee"
+ android:visibility="gone"
+ android:singleLine="false"
+ android:maxLines="10"/>
+
</LinearLayout>
<ImageView
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index 16a712b..262a176 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -19,6 +19,7 @@
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingBottom="@dimen/call_log_actions_bottom_padding"
android:orientation="vertical"
android:visibility="visible"
android:importantForAccessibility="1">
@@ -35,16 +36,27 @@
<LinearLayout
android:id="@+id/call_action"
+ android:paddingTop="@dimen/call_log_actions_top_padding"
style="@style/CallLogActionStyle">
<ImageView
style="@style/CallLogActionIconStyle"
android:src="@drawable/ic_call_24dp" />
- <TextView
- android:id="@+id/call_action_text"
- style="@style/CallLogActionTextStyle"
- android:text="@string/description_call_log_call_action" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+ <TextView
+ android:id="@+id/call_action_text"
+ style="@style/CallLogActionTextStyle"
+ android:text="@string/description_call_log_call_action" />
+
+ <TextView
+ android:id="@+id/call_type_or_location_text"
+ style="@style/CallLogActionSupportTextStyle"/>
+ </LinearLayout>
</LinearLayout>
diff --git a/res/layout/voicemail_promo_card.xml b/res/layout/voicemail_promo_card.xml
index 891f096..ba4ac59 100644
--- a/res/layout/voicemail_promo_card.xml
+++ b/res/layout/voicemail_promo_card.xml
@@ -57,7 +57,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/background_dialer_white"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textSize="@dimen/call_log_detail_text_size"
android:text="@string/visual_voicemail_text"
android:lineSpacingExtra="@dimen/promo_card_line_spacing"
android:singleLine="false"/>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index d0f7ed0..8b7b150 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -33,8 +33,20 @@
<color name="setting_background_color">#ffffff</color>
<color name="setting_button_color">#eee</color>
+ <!-- 54% black -->
+ <color name="call_log_icon_tint">#8a000000</color>
+ <!-- 87% black -->
+ <color name="call_log_primary_color">#de000000</color>
+ <!-- 54% black -->
+ <color name="call_log_detail_color">#8a000000</color>
+ <!-- 87% black -->
+ <color name="call_log_voicemail_transcript_color">#de000000</color>
<!-- 70% black -->
- <color name="call_log_icon_tint">#b3000000</color>
+ <color name="call_log_action_color">#b3000000</color>
+ <!-- 54% black -->
+ <color name="call_log_day_group_heading_color">#8a000000</color>
+ <!-- 87% black-->
+ <color name="call_log_unread_text_color">#de000000</color>
<color name="call_log_list_item_primary_action_icon_tint">@color/call_log_icon_tint</color>
<!-- Color of the text describing an unconsumed missed call. -->
<color name="call_log_missed_call_highlight_color">@color/dialer_red_highlight_color</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d3c52a3..18f33d5 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -108,17 +108,19 @@
<dimen name="search_list_padding_top">16dp</dimen>
<dimen name="search_box_elevation">3dp</dimen>
- <dimen name="call_log_action_height">48dp</dimen>
<dimen name="call_log_action_icon_margin_start">16dp</dimen>
<dimen name="call_log_action_icon_dimen">24dp</dimen>
<dimen name="call_log_action_horizontal_padding">24dp</dimen>
<dimen name="call_log_actions_left_padding">64dp</dimen>
- <dimen name="call_log_primary_text_size">14sp</dimen>
- <dimen name="call_log_secondary_text_size">14sp</dimen>
- <dimen name="call_log_list_item_actions_text_size">12sp</dimen>
+ <dimen name="call_log_actions_top_padding">8dp</dimen>
+ <dimen name="call_log_actions_bottom_padding">8dp</dimen>
+ <dimen name="call_log_primary_text_size">16sp</dimen>
+ <dimen name="call_log_detail_text_size">12sp</dimen>
+ <dimen name="call_log_day_group_heading_size">14sp</dimen>
+ <dimen name="call_log_voicemail_transcription_text_size">14sp</dimen>
<!-- Height of the call log actions section for each call log entry -->
- <dimen name="call_log_action_height">44dp</dimen>
+ <dimen name="call_log_action_height">48dp</dimen>
<dimen name="call_log_day_group_padding_top">15dp</dimen>
<dimen name="call_log_day_group_padding_bottom">9dp</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 3d86442..7828a20 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -222,14 +222,19 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingStart">@dimen/call_log_action_horizontal_padding</item>
<item name="android:paddingEnd">@dimen/call_log_action_horizontal_padding</item>
- <item name="android:textColor">?attr/call_log_secondary_text_color</item>
- <item name="android:textSize">@dimen/call_log_list_item_actions_text_size</item>
- <item name="android:fontFamily">"sans-serif-medium"</item>
+ <item name="android:textColor">@color/call_log_action_color</item>
+ <item name="android:textSize">@dimen/call_log_primary_text_size</item>
+ <item name="android:fontFamily">"sans-serif"</item>
<item name="android:focusable">true</item>
<item name="android:singleLine">true</item>
<item name="android:importantForAccessibility">no</item>
</style>
+ <style name="CallLogActionSupportTextStyle" parent="@style/CallLogActionTextStyle">
+ <item name="android:textSize">@dimen/call_log_detail_text_size</item>
+ <item name="android:textColor">@color/call_log_detail_color</item>
+ </style>
+
<style name="CallLogActionIconStyle">
<item name="android:layout_width">@dimen/call_log_action_icon_dimen</item>
<item name="android:layout_height">@dimen/call_log_action_icon_dimen</item>
@@ -299,7 +304,7 @@
<style name="PromoCardActionStyle" parent="TextActionStyle">
<item name="android:textColor">@color/promo_card_text</item>
- <item name="android:textSize">@dimen/call_log_list_item_actions_text_size</item>
+ <item name="android:textSize">@dimen/call_log_primary_text_size</item>
</style>
<style name="VoicemailPlaybackLayoutTextStyle">
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index d44e8e7..0893b1c 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -90,6 +90,7 @@
import com.android.dialer.widget.SearchEditTextLayout;
import com.android.dialer.widget.SearchEditTextLayout.Callback;
import com.android.dialerbind.DatabaseHelperManager;
+import com.android.dialerbind.ObjectFactory;
import com.android.incallui.Call.LogState;
import com.android.phone.common.animation.AnimUtils;
import com.android.phone.common.animation.AnimationListenerAdapter;
@@ -110,7 +111,6 @@
ListsFragment.HostInterface,
SpeedDialFragment.HostInterface,
SearchFragment.HostInterface,
- RegularSearchFragment.CapabilityChecker,
OnDragDropListener,
OnPhoneNumberPickerActionListener,
PopupMenu.OnMenuItemClickListener,
@@ -230,6 +230,7 @@
private View mVoiceSearchButton;
private String mSearchQuery;
+ private String mDialpadQuery;
private DialerDatabaseHelper mDialerDatabaseHelper;
private DragDropController mDragDropController;
@@ -604,10 +605,12 @@
} else if (fragment instanceof SmartDialSearchFragment) {
mSmartDialSearchFragment = (SmartDialSearchFragment) fragment;
mSmartDialSearchFragment.setOnPhoneNumberPickerActionListener(this);
+ if (!TextUtils.isEmpty(mDialpadQuery)) {
+ mSmartDialSearchFragment.setAddToContactNumber(mDialpadQuery);
+ }
} else if (fragment instanceof SearchFragment) {
mRegularSearchFragment = (RegularSearchFragment) fragment;
mRegularSearchFragment.setOnPhoneNumberPickerActionListener(this);
- mRegularSearchFragment.setCapabilityChecker(this);
} else if (fragment instanceof ListsFragment) {
mListsFragment = (ListsFragment) fragment;
mListsFragment.addOnPageChangeListener(this);
@@ -872,7 +875,6 @@
}
}
- @Override
public boolean isNearbyPlacesSearchEnabled() {
return false;
}
@@ -1020,7 +1022,7 @@
if (smartDialSearch) {
fragment = new SmartDialSearchFragment();
} else {
- fragment = new RegularSearchFragment();
+ fragment = ObjectFactory.newRegularSearchFragment();
fragment.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
@@ -1144,6 +1146,7 @@
@Override
public void onDialpadQueryChanged(String query) {
+ mDialpadQuery = query;
if (mSmartDialSearchFragment != null) {
mSmartDialSearchFragment.setAddToContactNumber(query);
}
diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java
index 2bcd8d4..c1923b2 100644
--- a/src/com/android/dialer/calllog/CallLogActivity.java
+++ b/src/com/android/dialer/calllog/CallLogActivity.java
@@ -40,6 +40,7 @@
import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
import com.android.dialer.TransactionSafeActivity;
+import com.android.dialer.util.DialerUtils;
public class CallLogActivity extends TransactionSafeActivity implements ViewPager.OnPageChangeListener {
private ViewPager mViewPager;
@@ -63,8 +64,13 @@
}
@Override
+ public long getItemId(int position) {
+ return getRtlPosition(position);
+ }
+
+ @Override
public Fragment getItem(int position) {
- switch (position) {
+ switch (getRtlPosition(position)) {
case TAB_INDEX_ALL:
return new CallLogFragment(
CallLogQueryHandler.CALL_TYPE_ALL, true /* isCallLogActivity */);
@@ -233,4 +239,11 @@
}
return null;
}
+
+ private int getRtlPosition(int position) {
+ if (DialerUtils.isRtl()) {
+ return mViewPagerAdapter.getCount() - 1 - position;
+ }
+ return position;
+ }
}
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 703b18f..0353170 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -367,7 +367,7 @@
* TODO: This gets called 20-30 times when Dialer starts up for a single call log entry and
* should not. It invokes cross-process methods and the repeat execution can get costly.
*
- * @param ViewHolder The view corresponding to this entry.
+ * @param viewHolder The view corresponding to this entry.
* @param position The position of the entry.
*/
public void onBindViewHolder(ViewHolder viewHolder, int position) {
@@ -419,7 +419,7 @@
c.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME),
c.getString(CallLogQuery.ACCOUNT_ID));
final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
- final ContactInfo cachedContactInfo = mContactInfoHelper.getContactInfo(c);
+ final ContactInfo cachedContactInfo = ContactInfoHelper.getContactInfo(c);
final boolean isVoicemailNumber =
mTelecomCallLogCache.isVoicemailNumber(accountHandle, number);
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index b7f068e..dff213b 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -18,20 +18,14 @@
import static android.Manifest.permission.READ_CALL_LOG;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
import android.app.Activity;
-import android.app.DialogFragment;
import android.app.Fragment;
import android.app.KeyguardManager;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
-import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -44,28 +38,16 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.ListView;
-import android.widget.TextView;
import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.util.PermissionsUtil;
-import com.android.contacts.common.util.ViewUtil;
import com.android.dialer.R;
-import com.android.dialer.list.ListsFragment.HostInterface;
-import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.EmptyLoader;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
-import com.android.dialer.voicemail.VoicemailStatusHelper;
-import com.android.dialer.voicemail.VoicemailStatusHelper.StatusMessage;
-import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
import com.android.dialer.widget.EmptyContentView;
import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
import com.android.dialerbind.ObjectFactory;
-import java.util.List;
-
/**
* Displays a list of call log entries. To filter for a particular kind of call
* (all, missed or voicemails), specify it in the constructor.
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index 8e45dd3..84d0364 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -57,7 +57,6 @@
/**
* Sets the name, label, and number for a contact.
*
- * @param context The application context.
* @param views the views to populate
* @param details the details of a phone call needed to fill in the data
*/
@@ -76,6 +75,10 @@
// when the actions ViewStub is inflated.
views.nameOrNumber = getNameOrNumber(details);
+ // The call type or Location associated with the call. Use when setting text for a
+ // voicemail log's call button
+ views.callTypeOrLocation = mPhoneCallDetailsHelper.getCallTypeOrLocation(details);
+
// Cache country iso. Used for number filtering.
views.countryIso = details.countryIso;
}
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 0e234e3..b70ea07 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -162,6 +162,12 @@
public CharSequence nameOrNumber;
/**
+ * The call type or Location associated with the call. Cached here for use when setting text
+ * for a voicemail log's call button
+ */
+ public CharSequence callTypeOrLocation;
+
+ /**
* Whether this row is for a business or not.
*/
public boolean isBusiness;
@@ -171,8 +177,6 @@
*/
public ContactInfo info;
- private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10;
-
private final Context mContext;
private final TelecomCallLogCache mTelecomCallLogCache;
private final CallLogListItemHelper mCallLogListItemHelper;
@@ -342,8 +346,6 @@
* Configures the action buttons in the expandable actions ViewStub. The ViewStub is not
* inflated during initial binding, so click handlers, tags and accessibility text must be set
* here, if necessary.
- *
- * @param callLogItem The call log list item view.
*/
public void inflateActionViewStub() {
ViewStub stub = (ViewStub) rootView.findViewById(R.id.call_log_entry_actions_stub);
@@ -427,6 +429,14 @@
.setText(TextUtils.expandTemplate(
mContext.getString(R.string.call_log_action_call),
nameOrNumber));
+ TextView callTypeOrLocationView = ((TextView) callButtonView.findViewById(
+ R.id.call_type_or_location_text));
+ if (callType == Calls.VOICEMAIL_TYPE && !TextUtils.isEmpty(callTypeOrLocation)) {
+ callTypeOrLocationView.setText(callTypeOrLocation);
+ callTypeOrLocationView.setVisibility(View.VISIBLE);
+ } else {
+ callTypeOrLocationView.setVisibility(View.GONE);
+ }
callButtonView.setVisibility(View.VISIBLE);
} else {
callButtonView.setVisibility(View.GONE);
@@ -455,9 +465,13 @@
voicemailPlaybackView.setVisibility(View.GONE);
}
- detailsButtonView.setVisibility(View.VISIBLE);
- detailsButtonView.setTag(
+ if (callType == Calls.VOICEMAIL_TYPE) {
+ detailsButtonView.setVisibility(View.GONE);
+ } else {
+ detailsButtonView.setVisibility(View.VISIBLE);
+ detailsButtonView.setTag(
IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));
+ }
if (info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {
createNewContactButtonView.setTag(IntentProvider.getAddContactIntentProvider(
@@ -495,7 +509,7 @@
* If the action views have never been shown yet for this view, inflate the view stub.
*/
public void showActions(boolean show) {
- expandVoicemailTranscriptionView(show);
+ showOrHideVoicemailTranscriptionView(show);
if (show) {
// Inflate the view stub if necessary, and wire up the event handlers.
@@ -514,17 +528,17 @@
updatePrimaryActionButton(show);
}
- public void expandVoicemailTranscriptionView(boolean isExpanded) {
+ public void showOrHideVoicemailTranscriptionView(boolean isExpanded) {
if (callType != Calls.VOICEMAIL_TYPE) {
return;
}
final TextView view = phoneCallDetailsViews.voicemailTranscriptionView;
- if (TextUtils.isEmpty(view.getText())) {
+ if (!isExpanded || TextUtils.isEmpty(view.getText())) {
+ view.setVisibility(View.GONE);
return;
}
- view.setMaxLines(isExpanded ? VOICEMAIL_TRANSCRIPTION_MAX_LINES : 1);
- view.setSingleLine(!isExpanded);
+ view.setVisibility(View.VISIBLE);
}
public void updatePhoto() {
diff --git a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
index 3792056..b16079a 100644
--- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
@@ -16,6 +16,7 @@
package com.android.dialer.calllog;
+import com.google.common.base.MoreObjects;
import com.google.common.collect.Lists;
import android.content.Context;
@@ -50,6 +51,9 @@
private final Resources mResources;
/** The injected current time in milliseconds since the epoch. Used only by tests. */
private Long mCurrentTimeMillisForTest;
+
+ private CharSequence mPhoneTypeLabelForTest;
+
private final TelecomCallLogCache mTelecomCallLogCache;
/** Calendar used to construct dates */
@@ -138,12 +142,9 @@
views.nameView.setText(nameText);
- if (isVoicemail && !TextUtils.isEmpty(details.transcription)) {
- views.voicemailTranscriptionView.setText(details.transcription);
- views.voicemailTranscriptionView.setVisibility(View.VISIBLE);
- } else {
- views.voicemailTranscriptionView.setText(null);
- views.voicemailTranscriptionView.setVisibility(View.GONE);
+ if (isVoicemail) {
+ views.voicemailTranscriptionView.setText(TextUtils.isEmpty(details.transcription) ? null
+ : details.transcription);
}
// Bold if not read
@@ -151,10 +152,14 @@
views.nameView.setTypeface(typeface);
views.voicemailTranscriptionView.setTypeface(typeface);
views.callLocationAndDate.setTypeface(typeface);
+ views.callLocationAndDate.setTextColor(mResources.getColor(
+ details.isRead ? R.color.call_log_detail_color : R.color.call_log_unread_text_color,
+ mContext.getTheme()));
}
/**
- * Builds a string containing the call location and date.
+ * Builds a string containing the call location and date. For voicemail logs only the call date
+ * is returned because location information is displayed in the call action button
*
* @param details The call details.
* @return The call location and date string.
@@ -162,15 +167,18 @@
private CharSequence getCallLocationAndDate(PhoneCallDetails details) {
mDescriptionItems.clear();
- // Get type of call (ie mobile, home, etc) if known, or the caller's location.
- CharSequence callTypeOrLocation = getCallTypeOrLocation(details);
+ if (details.callTypes[0] != Calls.VOICEMAIL_TYPE) {
+ // Get type of call (ie mobile, home, etc) if known, or the caller's location.
+ CharSequence callTypeOrLocation = getCallTypeOrLocation(details);
- // Only add the call type or location if its not empty. It will be empty for unknown
- // callers.
- if (!TextUtils.isEmpty(callTypeOrLocation)) {
- mDescriptionItems.add(callTypeOrLocation);
+ // Only add the call type or location if its not empty. It will be empty for unknown
+ // callers.
+ if (!TextUtils.isEmpty(callTypeOrLocation)) {
+ mDescriptionItems.add(callTypeOrLocation);
+ }
}
- // The date of this call, relative to the current time.
+
+ // The date of this call
mDescriptionItems.add(getCallDate(details));
// Create a comma separated list from the call type or location, and call date.
@@ -197,8 +205,8 @@
} else if (!(details.numberType == Phone.TYPE_CUSTOM
&& TextUtils.isEmpty(details.numberLabel))) {
// Get type label only if it will not be "Custom" because of an empty number label.
- numberFormattedLabel = Phone.getTypeLabel(
- mResources, details.numberType, details.numberLabel);
+ numberFormattedLabel = MoreObjects.firstNonNull(mPhoneTypeLabelForTest,
+ Phone.getTypeLabel(mResources, details.numberType, details.numberLabel));
}
}
@@ -208,6 +216,11 @@
return numberFormattedLabel;
}
+ @NeededForTesting
+ public void setPhoneTypeLabelForTest(CharSequence phoneTypeLabel) {
+ this.mPhoneTypeLabelForTest = phoneTypeLabel;
+ }
+
/**
* Get the call date/time of the call. For the call log this is relative to the current time.
* e.g. 3 minutes ago. For voicemail, see {@link #getGranularDateTime(PhoneCallDetails)}
diff --git a/src/com/android/dialer/filterednumber/BlockedNumberFragment.java b/src/com/android/dialer/filterednumber/BlockedNumberFragment.java
index e12fd6b..5740305 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumberFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumberFragment.java
@@ -21,7 +21,9 @@
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
+import android.os.AsyncTask;
import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -32,7 +34,16 @@
public class BlockedNumberFragment extends ListFragment implements
LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
+ private static class SendToVoicemailContactQuery {
+ static final String[] PROJECTION = {
+ Contacts._ID
+ };
+
+ static final String SELECT_SEND_TO_VOICEMAIL_TRUE = Contacts.SEND_TO_VOICEMAIL + "=1";
+ }
+
private BlockedNumberAdapter mAdapter;
+ private View mImportSettings;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
@@ -47,6 +58,8 @@
getActivity().findViewById(R.id.add_number_button).setOnClickListener(this);
getListView().getEmptyView().findViewById(R.id.add_number_button).setOnClickListener(this);
+
+ mImportSettings = getActivity().findViewById(R.id.importsettings);
}
@Override
@@ -62,6 +75,12 @@
}
@Override
+ public void onResume() {
+ super.onResume();
+ checkForSendToVoicemailContact();
+ }
+
+ @Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.blocked_number_fragment, container, false);
@@ -102,4 +121,44 @@
manageBlockedNumbersActivity.enterSearchUi();
}
}
+
+ /**
+ * Checks if there exists a contact with {@code Contacts.SEND_TO_VOICEMAIL} set to true,
+ * and updates the visibility of the import settings buttons accordingly.
+ */
+ private void checkForSendToVoicemailContact() {
+ final AsyncTask task = new AsyncTask<Object, Void, Boolean>() {
+ @Override
+ public Boolean doInBackground(Object[] params) {
+ if (getActivity() == null) {
+ return false;
+ }
+
+ final Cursor cursor = getActivity().getContentResolver().query(
+ Contacts.CONTENT_URI,
+ SendToVoicemailContactQuery.PROJECTION,
+ SendToVoicemailContactQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
+ null,
+ null);
+
+ boolean hasSendToVoicemailContacts = false;
+ if (cursor != null) {
+ try {
+ hasSendToVoicemailContacts = cursor.getCount() > 0;
+ } finally {
+ cursor.close();
+ }
+ }
+
+ return hasSendToVoicemailContacts;
+ }
+
+ @Override
+ public void onPostExecute(Boolean hasSendToVoicemailContact) {
+ final int visibility = hasSendToVoicemailContact ? View.VISIBLE : View.GONE;
+ mImportSettings.setVisibility(visibility);
+ }
+ };
+ task.execute();
+ }
}
diff --git a/src/com/android/dialer/list/RegularSearchFragment.java b/src/com/android/dialer/list/RegularSearchFragment.java
index 33ce95f..6b89ef0 100644
--- a/src/com/android/dialer/list/RegularSearchFragment.java
+++ b/src/com/android/dialer/list/RegularSearchFragment.java
@@ -16,7 +16,6 @@
package com.android.dialer.list;
import static android.Manifest.permission.READ_CONTACTS;
-import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import android.app.Activity;
import android.content.pm.PackageManager;
@@ -38,7 +37,7 @@
public class RegularSearchFragment extends SearchFragment
implements OnEmptyViewActionButtonClickedListener {
- private static final int PERMISSION_REQUEST_CODE = 1;
+ public static final int PERMISSION_REQUEST_CODE = 1;
private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5;
@@ -49,8 +48,7 @@
public boolean isNearbyPlacesSearchEnabled();
}
- private String mPermissionToRequest;
- private CapabilityChecker mCapabilityChecker;
+ protected String mPermissionToRequest;
public RegularSearchFragment() {
configureDirectorySearch();
@@ -64,7 +62,6 @@
@Override
public void onDetach() {
- mCapabilityChecker = null;
super.onDetach();
}
@@ -110,13 +107,6 @@
descriptionResource = R.string.permission_no_search;
listener = this;
mPermissionToRequest = READ_CONTACTS;
- } else if (isNearbyPlacesSearchEnabled()
- && !PermissionsUtil.hasPermission(getActivity(), ACCESS_FINE_LOCATION)) {
- imageResource = R.drawable.empty_contacts;
- actionLabelResource = R.string.permission_single_turn_on;
- descriptionResource = R.string.permission_no_location_for_search;
- listener = this;
- mPermissionToRequest = ACCESS_FINE_LOCATION;
} else {
imageResource = EmptyContentView.NO_IMAGE;
actionLabelResource = EmptyContentView.NO_LABEL;
@@ -141,8 +131,7 @@
return;
}
- if (READ_CONTACTS.equals(mPermissionToRequest)
- || ACCESS_FINE_LOCATION.equals(mPermissionToRequest)) {
+ if (READ_CONTACTS.equals(mPermissionToRequest)) {
requestPermissions(new String[] {mPermissionToRequest}, PERMISSION_REQUEST_CODE);
}
}
@@ -164,15 +153,4 @@
return isRemoteDirectory ? LogState.INITIATION_REMOTE_DIRECTORY
: LogState.INITIATION_REGULAR_SEARCH;
}
-
- public void setCapabilityChecker(CapabilityChecker capabilityChecker) {
- mCapabilityChecker = capabilityChecker;
- }
-
- private boolean isNearbyPlacesSearchEnabled() {
- if (mCapabilityChecker != null) {
- return mCapabilityChecker.isNearbyPlacesSearchEnabled();
- }
- return false;
- }
}
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index 8b8b7c5..9b4e20d 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -625,7 +625,7 @@
* playing.
*/
public void resumePlayback() {
- if (mView == null) {
+ if (mView == null || mContext == null) {
return;
}
@@ -638,7 +638,7 @@
mIsPlaying = true;
- if (!mMediaPlayer.isPlaying()) {
+ if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
// Clamp the start position between 0 and the duration.
mPosition = Math.max(0, Math.min(mPosition, mDuration.get()));
diff --git a/src/com/android/dialerbind/ObjectFactory.java b/src/com/android/dialerbind/ObjectFactory.java
index c64afe8..f346a7e 100644
--- a/src/com/android/dialerbind/ObjectFactory.java
+++ b/src/com/android/dialerbind/ObjectFactory.java
@@ -22,6 +22,7 @@
import com.android.dialer.calllog.CallLogAdapter;
import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.list.RegularSearchFragment;
import com.android.dialer.logging.Logger;
import com.android.dialer.service.CachedNumberLookupService;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
@@ -65,4 +66,8 @@
// no-op
return null;
}
+
+ public static RegularSearchFragment newRegularSearchFragment() {
+ return new RegularSearchFragment();
+ }
}
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
index 263642c..b255edf 100644
--- a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
@@ -116,14 +116,14 @@
// Voicemail date string has 3 different formats depending on how long ago the call was placed
public void testSetVoicemailPhoneCallDetails_Today() {
setVoicemailPhoneCallDetailsWithDate(System.currentTimeMillis());
- assertDateEquals("Today at");
+ assertLocationAndDateContains("Today at");
}
public void testSetVoicemailPhoneCallDetails_WithinCurrentYear() {
mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
String formattedTestDate = "Jun 3 at 1:00 PM";
setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
- assertDateEquals(formattedTestDate);
+ assertLocationAndDateContains(formattedTestDate);
}
public void testSetVoicemailPhoneCallDetails_OutsideCurrentYear() {
@@ -131,7 +131,12 @@
long testDate = new GregorianCalendar(2009, 5, 3, 13, 0, 0).getTimeInMillis();
String formattedTestDate = "Jun 3, 2009 at 1:00 PM";
setVoicemailPhoneCallDetailsWithDate(testDate);
- assertDateEquals(formattedTestDate);
+ assertLocationAndDateContains(formattedTestDate);
+ }
+
+ public void testVoicemailLocationNotShownWithDate() {
+ setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
+ assertLocationAndDateExactEquals("Jun 3 at 1:00 PM");
}
/** Asserts that a char sequence is actually a Spanned corresponding to the expected HTML. */
@@ -150,19 +155,19 @@
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
- assertDateEquals("0 min. ago");
+ assertLocationAndDateContains("0 min. ago");
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 3, 12, 0, 0).getTimeInMillis());
- assertDateEquals("1 hr. ago");
+ assertLocationAndDateContains("1 hr. ago");
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 2, 13, 0, 0).getTimeInMillis());
- assertDateEquals("Yesterday");
+ assertLocationAndDateContains("Yesterday");
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 1, 13, 0, 0).getTimeInMillis());
- assertDateEquals("2 days ago");
+ assertLocationAndDateContains("2 days ago");
}
public void testSetPhoneCallDetails_CallTypeIcons() {
@@ -232,24 +237,24 @@
public void testSetPhoneCallDetails_Geocode() {
setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "Pennsylvania");
assertNameEquals("1-412-555-5555"); // The phone number is shown as the name.
- assertLabelEquals("Pennsylvania"); // The geocode is shown as the label.
+ assertLocationAndDateContains("Pennsylvania"); // The geocode is shown as the label.
}
public void testSetPhoneCallDetails_NoGeocode() {
setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", null);
assertNameEquals("1-412-555-5555"); // The phone number is shown as the name.
- assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+ assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
}
public void testSetPhoneCallDetails_EmptyGeocode() {
setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "");
assertNameEquals("1-412-555-5555"); // The phone number is shown as the name.
- assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+ assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
}
public void testSetPhoneCallDetails_NoGeocodeForVoicemail() {
setPhoneCallDetailsWithNumberAndGeocode(TEST_VOICEMAIL_NUMBER, "", "United States");
- assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+ assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
}
public void testSetPhoneCallDetails_Highlighted() {
@@ -297,6 +302,25 @@
assertEquals("John Doe", mNameView.getText().toString());
}
+ public void testGetCallTypeOrLocation_Geocode() {
+ assertEquals(TEST_GEOCODE, mHelper.getCallTypeOrLocation(getPhoneCallDetails()));
+ }
+
+ public void testGetCallTypeOrLocation_CallType() {
+ PhoneCallDetails details = getPhoneCallDetails();
+ details.geocode = null;
+ details.numberType = Calls.INCOMING_TYPE;
+ mHelper.setPhoneTypeLabelForTest("mobile");
+ assertEquals("mobile", mHelper.getCallTypeOrLocation(details));
+ }
+
+ public void testGetCallTypeOrLocation_DisplayNumber() {
+ PhoneCallDetails details = getPhoneCallDetails("", Calls.PRESENTATION_ALLOWED,
+ TEST_FORMATTED_NUMBER);
+ details.name = "name";
+ assertEquals(TEST_FORMATTED_NUMBER, mHelper.getCallTypeOrLocation(details));
+ }
+
/** Asserts that the name text field contains the value of the given string resource. */
private void assertNameEqualsResource(int resId) {
assertNameEquals(getContext().getString(resId));
@@ -307,14 +331,14 @@
assertEquals(text, mViews.nameView.getText().toString());
}
- /** Asserts that the label text field contains the given string value. */
- private void assertLabelEquals(String text) {
+ /** Asserts that the location and date text field contains the given string value. */
+ private void assertLocationAndDateContains(String text) {
assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
}
- /** Asserts that the date text field contains the given string value. */
- private void assertDateEquals(String text) {
- assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
+ /** Asserts that the location and date text field exactly equals the given string value. */
+ private void assertLocationAndDateExactEquals(String text) {
+ assertEquals(text, mViews.callLocationAndDate.getText());
}
/** Asserts that the video icon is shown. */