summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml1
-rw-r--r--res/layout/voicemail_promo_card.xml99
-rw-r--r--res/values/colors.xml5
-rw-r--r--res/values/dimens.xml11
-rw-r--r--res/values/styles.xml14
-rw-r--r--src/com/android/dialer/DialtactsActivity.java7
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java167
-rw-r--r--src/com/android/dialer/calllog/DefaultVoicemailNotifier.java49
-rw-r--r--src/com/android/dialer/calllog/PromoCardViewHolder.java71
-rw-r--r--src/com/android/dialer/list/AllContactsFragment.java2
-rw-r--r--src/com/android/dialer/list/ListsFragment.java33
-rw-r--r--src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java4
12 files changed, 438 insertions, 25 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index eef8ed62b..86bf4ff2e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -286,6 +286,7 @@
<service android:name="com.android.incallui.InCallServiceImpl"
android:permission="android.permission.BIND_INCALL_SERVICE" >
+ <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
diff --git a/res/layout/voicemail_promo_card.xml b/res/layout/voicemail_promo_card.xml
new file mode 100644
index 000000000..103fa30b3
--- /dev/null
+++ b/res/layout/voicemail_promo_card.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 Google Inc. All Rights Reserved. -->
+
+<android.support.v7.widget.CardView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/promo_card"
+ style="@style/CallLogCardStyle"
+ android:orientation="vertical"
+ android:gravity="center_vertical"
+ card_view:cardBackgroundColor="@color/visual_voicemail_promo_card_background">
+
+ <LinearLayout
+ android:id="@+id/promo_card_content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/promo_card_start_padding"
+ android:paddingEnd="@dimen/promo_card_main_padding"
+ android:paddingTop="@dimen/promo_card_top_padding"
+ android:paddingBottom="@dimen/promo_card_main_padding"
+ android:orientation="horizontal"
+ android:gravity="top">
+
+ <ImageView
+ android:id="@+id/promo_card_icon"
+ android:layout_width="@dimen/promo_card_icon_size"
+ android:layout_height="@dimen/promo_card_icon_size"
+ android:layout_gravity="top"
+ android:src="@drawable/ic_voicemail_24dp"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/promo_card_main_padding"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <TextView
+ android:id="@+id/promo_card_header"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/promo_card_title_padding"
+ android:layout_gravity="center_vertical"
+ android:textColor="@color/background_dialer_white"
+ android:textSize="@dimen/call_log_primary_text_size"
+ android:textStyle="bold"
+ android:text="@string/visual_voicemail_title"
+ android:singleLine="false"/>
+
+ <TextView
+ android:id="@+id/promo_card_details"
+ 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:text="@string/visual_voicemail_text"
+ android:lineSpacingExtra="@dimen/promo_card_line_spacing"
+ android:singleLine="false"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/visual_voicemail_promo_card_divider"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/promo_card_action_end_padding"
+ android:paddingTop="@dimen/promo_card_action_vertical_padding"
+ android:paddingBottom="@dimen/promo_card_action_vertical_padding"
+ android:orientation="horizontal"
+ android:gravity="end">
+
+ <TextView
+ android:id="@+id/settings_action"
+ style="@style/PromoCardActionStyle"
+ android:background="?android:attr/selectableItemBackground"
+ android:text="@string/visual_voicemail_settings"
+ android:nextFocusLeft="@+id/promo_card"
+ android:nextFocusRight="@+id/ok_action"
+ android:paddingEnd="@dimen/promo_card_action_between_padding"/>
+
+ <TextView
+ android:id="@+id/ok_action"
+ style="@style/PromoCardActionStyle"
+ android:background="?android:attr/selectableItemBackground"
+ android:text="@android:string/ok"
+ android:nextFocusLeft="@+id/settings_action"
+ android:nextFocusRight="@+id/promo_card"/>
+ </LinearLayout>
+ </LinearLayout>
+</android.support.v7.widget.CardView>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f83c3284c..c3b0fb5bc 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -36,6 +36,11 @@
<!-- Color of the text describing an unconsumed voicemail. -->
<color name="call_log_voicemail_highlight_color">#33b5e5</color>
+ <!-- Background color of visual voicemail promo card. -->
+ <color name="visual_voicemail_promo_card_background">#673ab7</color>
+ <color name="visual_voicemail_promo_card_divider">#7d57c1</color>
+ <color name="promo_card_text">#ffffff</color>
+
<!-- Tint of the recent card phone icon; 30% black -->
<color name="call_log_list_item_primary_action_icon_tint">#4d000000</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index bcde855b5..206b44740 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -134,4 +134,15 @@
<dimen name="preference_summary_line_spacing_extra">4dp</dimen>
<dimen name="call_log_list_item_primary_action_dimen">36dp</dimen>
+
+ <!-- Dimensions for promo cards -->
+ <dimen name="promo_card_icon_size">24dp</dimen>
+ <dimen name="promo_card_start_padding">16dp</dimen>
+ <dimen name="promo_card_top_padding">21dp</dimen>
+ <dimen name="promo_card_main_padding">24dp</dimen>
+ <dimen name="promo_card_title_padding">12dp</dimen>
+ <dimen name="promo_card_action_vertical_padding">4dp</dimen>
+ <dimen name="promo_card_action_end_padding">4dp</dimen>
+ <dimen name="promo_card_action_between_padding">11dp</dimen>
+ <dimen name="promo_card_line_spacing">4dp</dimen>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index dab5c6aa1..7d5d42f8f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -218,4 +218,18 @@
<item name="cardCornerRadius">2dp</item>
<item name="cardBackgroundColor">@color/background_dialer_call_log_list_item</item>
</style>
+
+ <style name="PromoCardActionStyle">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">@dimen/call_log_action_height</item>
+ <item name="android:gravity">end|center_vertical</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">@color/promo_card_text</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:focusable">true</item>
+ <item name="android:singleLine">true</item>
+ <item name="android:textAllCaps">true</item>
+ </style>
</resources>
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index fc0f1fb24..b77e910b2 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -133,6 +133,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
* Just for backward compatibility. Should behave as same as {@link Intent#ACTION_DIAL}.
*/
private static final String ACTION_TOUCH_DIALER = "com.android.phone.action.TOUCH_DIALER";
+ public static final String EXTRA_SHOW_TAB = "EXTRA_SHOW_TAB";
private static final int ACTIVITY_REQUEST_CODE_VOICE_SEARCH = 1;
@@ -539,6 +540,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
mIsRestarting = false;
}
+
prepareVoiceSearchButton();
mDialerDatabaseHelper.startSmartDialUpdateThread();
mFloatingActionButtonController.align(getFabAlignment(), false /* animate */);
@@ -903,6 +905,11 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mStateSaved = false;
displayFragment(newIntent);
+ if (newIntent.hasExtra(EXTRA_SHOW_TAB)) {
+ mListsFragment.showTab(
+ getIntent().getIntExtra(EXTRA_SHOW_TAB, mListsFragment.TAB_INDEX_SPEED_DIAL));
+ }
+
invalidateOptionsMenu();
}
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 921ec506c..2ba257a3b 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -18,16 +18,20 @@ package com.android.dialer.calllog;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.os.Bundle;
import android.os.Trace;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
import android.provider.CallLog;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.telecom.PhoneAccountHandle;
import android.telephony.PhoneNumberUtils;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -62,6 +66,21 @@ public class CallLogAdapter extends GroupingListAdapter
private static final int VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM = 10;
private static final int NO_EXPANDED_LIST_ITEM = -1;
+ private static final int VOICEMAIL_PROMO_CARD_POSITION = 0;
+ /**
+ * View type for voicemail promo card. Note: Numbering starts at 20 to avoid collision
+ * with {@link com.android.common.widget.GroupingListAdapter#ITEM_TYPE_IN_GROUP}, and
+ * {@link CallLogAdapter#VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM}.
+ */
+ private static final int VIEW_TYPE_VOICEMAIL_PROMO_CARD = 20;
+
+ /**
+ * The key for the show voicemail promo card preference which will determine whether the promo
+ * card was permanently dismissed or not.
+ */
+ private static final String SHOW_VOICEMAIL_PROMO_CARD = "show_voicemail_promo_card";
+ private static final boolean SHOW_VOICEMAIL_PROMO_CARD_DEFAULT = true;
+
protected final Context mContext;
private final ContactInfoHelper mContactInfoHelper;
private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
@@ -80,6 +99,8 @@ public class CallLogAdapter extends GroupingListAdapter
// Tracks the rowId of the currently expanded list item, so the position can be updated if there
// are any changes to the call log entries, such as additions or removals.
private long mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+ // Whether the first call log list item has been automatically expanded for a new cursor.
+ private boolean mHasBoundFirstView;
/**
* Hashmap, keyed by call Id, used to track the day group for a call. As call log entries are
@@ -97,6 +118,10 @@ public class CallLogAdapter extends GroupingListAdapter
private boolean mLoading = true;
+ private SharedPreferences mPrefs;
+
+ private boolean mShowPromoCard = false;
+
/** Instance of helper class for managing views. */
private final CallLogListItemHelper mCallLogViewsHelper;
@@ -135,6 +160,30 @@ public class CallLogAdapter extends GroupingListAdapter
}
};
+ /**
+ * Click handler used to dismiss the promo card when the user taps the "ok" button.
+ */
+ private final View.OnClickListener mOkActionListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ dismissVoicemailPromoCard();
+ }
+ };
+
+ /**
+ * Click handler used to send the user to the voicemail settings screen and then dismiss the
+ * promo card.
+ */
+ private final View.OnClickListener mVoicemailSettingsActionListener =
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL);
+ mContext.startActivity(intent);
+ dismissVoicemailPromoCard();
+ }
+ };
+
private void expandViewHolderActions(CallLogListItemViewHolder viewHolder) {
// If another item is expanded, notify it that it has changed. Its actions will be
// hidden when it is re-binded because we change mCurrentlyExpandedPosition below.
@@ -212,6 +261,8 @@ public class CallLogAdapter extends GroupingListAdapter
new PhoneCallDetailsHelper(mContext, resources, mPhoneNumberUtilsWrapper);
mCallLogViewsHelper = new CallLogListItemHelper(phoneCallDetailsHelper, resources);
mCallLogGroupBuilder = new CallLogGroupBuilder(this);
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ maybeShowVoicemailPromoCard();
}
public void onSaveInstanceState(Bundle outState) {
@@ -236,6 +287,16 @@ public class CallLogAdapter extends GroupingListAdapter
mCallFetcher.fetchCalls();
}
+ @Override
+ public void changeCursor(Cursor cursor) {
+ // Data has changed; reset so that the first call log list item will be expanded.
+ mHasBoundFirstView = false;
+ mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
+ mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+
+ super.changeCursor(cursor);
+ }
+
public void setLoading(boolean loading) {
mLoading = loading;
}
@@ -279,6 +340,8 @@ public class CallLogAdapter extends GroupingListAdapter
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM) {
return ShowCallHistoryViewHolder.create(mContext, parent);
+ } else if (viewType == VIEW_TYPE_VOICEMAIL_PROMO_CARD) {
+ return createVoicemailPromoCardViewHolder(parent);
}
return createCallLogEntryViewHolder(parent);
}
@@ -313,19 +376,52 @@ public class CallLogAdapter extends GroupingListAdapter
* 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 callLogItemView the view corresponding to this entry
- * @param count the number of entries in the current item, greater than 1 if it is a group
+ * @param ViewHolder The view corresponding to this entry.
+ * @param position The position of the entry.
*/
public void onBindViewHolder(ViewHolder viewHolder, int position) {
- if (getItemViewType(position) == VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM) {
- return;
- }
Trace.beginSection("onBindViewHolder: " + position);
+
+ switch (getItemViewType(position)) {
+ case VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM:
+ break;
+ case VIEW_TYPE_VOICEMAIL_PROMO_CARD:
+ bindVoicemailPromoCardViewHolder(viewHolder);
+ break;
+ default:
+ bindCallLogListViewHolder(viewHolder, position);
+ break;
+ }
+
+ Trace.endSection();
+ }
+
+ /**
+ * Binds the promo card view holder.
+ *
+ * @param viewHolder The promo card view holder.
+ */
+ protected void bindVoicemailPromoCardViewHolder(ViewHolder viewHolder) {
+ PromoCardViewHolder promoCardViewHolder = (PromoCardViewHolder) viewHolder;
+
+ promoCardViewHolder.getSettingsTextView().setOnClickListener(
+ mVoicemailSettingsActionListener);
+ promoCardViewHolder.getOkTextView().setOnClickListener(mOkActionListener);
+ }
+
+ /**
+ * Binds the view holder for the call log list item view.
+ *
+ * @param viewHolder The call log list item view holder.
+ * @param position The position of the list item.
+ */
+
+ private void bindCallLogListViewHolder(ViewHolder viewHolder, int position) {
Cursor c = (Cursor) getItem(position);
if (c == null) {
- Trace.endSection();
return;
}
+
int count = getGroupSize(position);
final String number = c.getString(CallLogQuery.NUMBER);
@@ -405,10 +501,15 @@ public class CallLogAdapter extends GroupingListAdapter
mCallLogViewsHelper.setPhoneCallDetails(mContext, views, details);
- // Update the expanded position if the rowIds match, in case ViewHolders were added/removed.
- // Then restore the state of the row on rebind.
if (mCurrentlyExpandedRowId == views.rowId) {
+ // In case ViewHolders were added/removed, update the expanded position if the rowIds
+ // match so that we can restore the correct expanded state on rebind.
mCurrentlyExpandedPosition = position;
+ } else if (!mHasBoundFirstView) {
+ // Expand the first view when loading the call log to expose the actions.
+ mCurrentlyExpandedRowId = views.rowId;
+ mCurrentlyExpandedPosition = position;
+ mHasBoundFirstView = true;
}
views.showActions(mCurrentlyExpandedPosition == position);
@@ -428,22 +529,35 @@ public class CallLogAdapter extends GroupingListAdapter
mViewTreeObserver = views.rootView.getViewTreeObserver();
mViewTreeObserver.addOnPreDrawListener(this);
}
- Trace.endSection();
}
@Override
public int getItemCount() {
- return super.getItemCount() + (isShowingRecentsTab() ? 1 : 0);
+ return super.getItemCount() + ((isShowingRecentsTab() || mShowPromoCard) ? 1 : 0);
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1 && isShowingRecentsTab()) {
return VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM;
+ } else if (position == VOICEMAIL_PROMO_CARD_POSITION && mShowPromoCard) {
+ return VIEW_TYPE_VOICEMAIL_PROMO_CARD;
}
return super.getItemViewType(position);
}
+ /**
+ * Retrieves an item at the specified position, taking into account the presence of a promo
+ * card.
+ *
+ * @param position The position to retrieve.
+ * @return The item at that position.
+ */
+ @Override
+ public Object getItem(int position) {
+ return super.getItem(position - (mShowPromoCard ? 1 : 0));
+ }
+
protected boolean isShowingRecentsTab() {
return mIsShowingRecentsTab;
}
@@ -597,4 +711,37 @@ public class CallLogAdapter extends GroupingListAdapter
return mContext.getResources().getString(R.string.call_log_header_other);
}
}
+
+ /**
+ * Determines if the voicemail promo card should be shown or not. The voicemail promo card will
+ * be shown as the first item in the voicemail tab.
+ */
+ private void maybeShowVoicemailPromoCard() {
+ boolean showPromoCard = mPrefs.getBoolean(SHOW_VOICEMAIL_PROMO_CARD,
+ SHOW_VOICEMAIL_PROMO_CARD_DEFAULT);
+ mShowPromoCard = (mVoicemailPlaybackPresenter != null) && showPromoCard;
+ }
+
+ /**
+ * Dismisses the voicemail promo card and refreshes the call log.
+ */
+ private void dismissVoicemailPromoCard() {
+ mPrefs.edit().putBoolean(SHOW_VOICEMAIL_PROMO_CARD, false).apply();
+ mShowPromoCard = false;
+ notifyItemRemoved(VOICEMAIL_PROMO_CARD_POSITION);
+ }
+
+ /**
+ * Creates the view holder for the voicemail promo card.
+ *
+ * @param parent The parent view.
+ * @return The {@link ViewHolder}.
+ */
+ protected ViewHolder createVoicemailPromoCardViewHolder(ViewGroup parent) {
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View view = inflater.inflate(R.layout.voicemail_promo_card, parent, false);
+
+ PromoCardViewHolder viewHolder = PromoCardViewHolder.create(view);
+ return viewHolder;
+ }
}
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index 3c9fa1d73..3d6eb0b87 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -32,8 +32,10 @@ import android.text.TextUtils;
import android.util.Log;
import com.android.common.io.MoreCloseables;
+import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
import com.android.dialer.calllog.PhoneAccountUtils;
+import com.android.dialer.list.ListsFragment;
import com.google.common.collect.Maps;
import java.util.Map;
@@ -149,6 +151,12 @@ public class DefaultVoicemailNotifier {
}
}
+ // If there is only one voicemail, set its transcription as the "long text".
+ String transcription = null;
+ if (newCalls.length == 1) {
+ transcription = newCalls[0].transcription;
+ }
+
if (newCallUri != null && callToNotify == null) {
Log.e(TAG, "The new call could not be found in the call log: " + newCallUri);
}
@@ -163,6 +171,7 @@ public class DefaultVoicemailNotifier {
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(callers)
+ .setStyle(new Notification.BigTextStyle().bigText(transcription))
.setColor(resources.getColor(R.color.dialer_theme_color))
.setDefaults(callToNotify != null ? Notification.DEFAULT_ALL : 0)
.setDeleteIntent(createMarkNewVoicemailsAsOldIntent())
@@ -172,10 +181,10 @@ public class DefaultVoicemailNotifier {
final Intent contentIntent;
// Open the call log.
// TODO: Send to recents tab in Dialer instead.
- contentIntent = new Intent(Intent.ACTION_VIEW, Calls.CONTENT_URI);
- contentIntent.putExtra(Calls.EXTRA_CALL_TYPE_FILTER, Calls.VOICEMAIL_TYPE);
- notificationBuilder.setContentIntent(
- PendingIntent.getActivity(mContext, 0, contentIntent, 0));
+ contentIntent = new Intent(mContext, DialtactsActivity.class);
+ contentIntent.putExtra(DialtactsActivity.EXTRA_SHOW_TAB, ListsFragment.TAB_INDEX_VOICEMAIL);
+ notificationBuilder.setContentIntent(PendingIntent.getActivity(
+ mContext, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// The text to show in the ticker, describing the new event.
if (callToNotify != null) {
@@ -205,15 +214,23 @@ public class DefaultVoicemailNotifier {
public final int numberPresentation;
public final String accountComponentName;
public final String accountId;
-
- public NewCall(Uri callsUri, Uri voicemailUri, String number,
- int numberPresentation, String accountComponentName, String accountId) {
+ public final String transcription;
+
+ public NewCall(
+ Uri callsUri,
+ Uri voicemailUri,
+ String number,
+ int numberPresentation,
+ String accountComponentName,
+ String accountId,
+ String transcription) {
this.callsUri = callsUri;
this.voicemailUri = voicemailUri;
this.number = number;
this.numberPresentation = numberPresentation;
this.accountComponentName = accountComponentName;
this.accountId = accountId;
+ this.transcription = transcription;
}
}
@@ -236,8 +253,13 @@ public class DefaultVoicemailNotifier {
*/
private static final class DefaultNewCallsQuery implements NewCallsQuery {
private static final String[] PROJECTION = {
- Calls._ID, Calls.NUMBER, Calls.VOICEMAIL_URI, Calls.NUMBER_PRESENTATION,
- Calls.PHONE_ACCOUNT_COMPONENT_NAME, Calls.PHONE_ACCOUNT_ID
+ Calls._ID,
+ Calls.NUMBER,
+ Calls.VOICEMAIL_URI,
+ Calls.NUMBER_PRESENTATION,
+ Calls.PHONE_ACCOUNT_COMPONENT_NAME,
+ Calls.PHONE_ACCOUNT_ID,
+ Calls.TRANSCRIPTION
};
private static final int ID_COLUMN_INDEX = 0;
private static final int NUMBER_COLUMN_INDEX = 1;
@@ -245,6 +267,7 @@ public class DefaultVoicemailNotifier {
private static final int NUMBER_PRESENTATION_COLUMN_INDEX = 3;
private static final int PHONE_ACCOUNT_COMPONENT_NAME_COLUMN_INDEX = 4;
private static final int PHONE_ACCOUNT_ID_COLUMN_INDEX = 5;
+ private static final int TRANSCRIPTION_COLUMN_INDEX = 6;
private final ContentResolver mContentResolver;
@@ -279,10 +302,14 @@ public class DefaultVoicemailNotifier {
Uri callsUri = ContentUris.withAppendedId(
Calls.CONTENT_URI_WITH_VOICEMAIL, cursor.getLong(ID_COLUMN_INDEX));
Uri voicemailUri = voicemailUriString == null ? null : Uri.parse(voicemailUriString);
- return new NewCall(callsUri, voicemailUri, cursor.getString(NUMBER_COLUMN_INDEX),
+ return new NewCall(
+ callsUri,
+ voicemailUri,
+ cursor.getString(NUMBER_COLUMN_INDEX),
cursor.getInt(NUMBER_PRESENTATION_COLUMN_INDEX),
cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME_COLUMN_INDEX),
- cursor.getString(PHONE_ACCOUNT_ID_COLUMN_INDEX));
+ cursor.getString(PHONE_ACCOUNT_ID_COLUMN_INDEX),
+ cursor.getString(TRANSCRIPTION_COLUMN_INDEX));
}
}
diff --git a/src/com/android/dialer/calllog/PromoCardViewHolder.java b/src/com/android/dialer/calllog/PromoCardViewHolder.java
new file mode 100644
index 000000000..4c9602759
--- /dev/null
+++ b/src/com/android/dialer/calllog/PromoCardViewHolder.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 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.calllog;
+
+import com.android.dialer.R;
+
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+/**
+ * View holder class for a promo card which will appear in the voicemail tab.
+ */
+public class PromoCardViewHolder extends RecyclerView.ViewHolder {
+ public static PromoCardViewHolder create(View rootView) {
+ return new PromoCardViewHolder(rootView);
+ }
+
+ /**
+ * The "Settings" button view.
+ */
+ private View mSettingsTextView;
+
+ /**
+ * The "Ok" button view.
+ */
+ private View mOkTextView;
+
+ /**
+ * Creates an instance of the {@link ViewHolder}.
+ *
+ * @param rootView The root view.
+ */
+ private PromoCardViewHolder(View rootView) {
+ super(rootView);
+
+ mSettingsTextView = rootView.findViewById(R.id.settings_action);
+ mOkTextView = rootView.findViewById(R.id.ok_action);
+ }
+
+ /**
+ * Retrieves the "Settings" button.
+ *
+ * @return The view.
+ */
+ public View getSettingsTextView() {
+ return mSettingsTextView;
+ }
+
+ /**
+ * Retrieves the "Ok" button.
+ *
+ * @return The view.
+ */
+ public View getOkTextView() {
+ return mOkTextView;
+ }
+}
diff --git a/src/com/android/dialer/list/AllContactsFragment.java b/src/com/android/dialer/list/AllContactsFragment.java
index 71c6980f3..d34250b48 100644
--- a/src/com/android/dialer/list/AllContactsFragment.java
+++ b/src/com/android/dialer/list/AllContactsFragment.java
@@ -75,7 +75,7 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
super.onLoadFinished(loader, data);
- if (data.getCount() == 0) {
+ if (data == null || data.getCount() == 0) {
mEmptyListView.setVisibility(View.VISIBLE);
}
}
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index 0e3df5284..e45da0ce0 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -84,6 +84,8 @@ public class ListsFragment extends Fragment
private SharedPreferences mPrefs;
private boolean mHasActiveVoicemailProvider;
+ private boolean mHasFetchedVoicemailStatus;
+ private boolean mShowVoicemailTabAfterVoicemailStatusIsFetched;
private VoicemailStatusHelper mVoicemailStatusHelper;
private ArrayList<OnPageChangeListener> mOnPageChangeListeners =
@@ -167,6 +169,7 @@ public class ListsFragment extends Fragment
Trace.endSection();
mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
+ mHasFetchedVoicemailStatus = false;
mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
mHasActiveVoicemailProvider = mPrefs.getBoolean(
@@ -204,7 +207,7 @@ public class ListsFragment extends Fragment
mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setOffscreenPageLimit(TAB_COUNT_WITH_VOICEMAIL - 1);
mViewPager.setOnPageChangeListener(this);
- mViewPager.setCurrentItem(getRtlPosition(TAB_INDEX_SPEED_DIAL));
+ showTab(TAB_INDEX_SPEED_DIAL);
mTabTitles = new String[TAB_COUNT_WITH_VOICEMAIL];
mTabTitles[TAB_INDEX_SPEED_DIAL] = getResources().getString(R.string.tab_speed_dial);
@@ -237,6 +240,24 @@ public class ListsFragment extends Fragment
}
}
+ /**
+ * Shows the tab with the specified index. If the voicemail tab index is specified, but the
+ * voicemail status hasn't been fetched, it will try to show the tab after the voicemail status
+ * has been fetched.
+ */
+ public void showTab(int index) {
+ if (index == TAB_INDEX_VOICEMAIL) {
+ if (mHasActiveVoicemailProvider) {
+ mViewPager.setCurrentItem(getRtlPosition(TAB_INDEX_VOICEMAIL));
+ } else if (!mHasFetchedVoicemailStatus) {
+ // Try to show the voicemail tab after the voicemail status returns.
+ mShowVoicemailTabAfterVoicemailStatusIsFetched = true;
+ }
+ } else {
+ mViewPager.setCurrentItem(getRtlPosition(index));
+ }
+ }
+
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
mTabIndex = getRtlPosition(position);
@@ -252,6 +273,9 @@ public class ListsFragment extends Fragment
public void onPageSelected(int position) {
mTabIndex = getRtlPosition(position);
+ // Show the tab which has been selected instead.
+ mShowVoicemailTabAfterVoicemailStatusIsFetched = false;
+
final int count = mOnPageChangeListeners.size();
for (int i = 0; i < count; i++) {
mOnPageChangeListeners.get(i).onPageSelected(position);
@@ -269,6 +293,8 @@ public class ListsFragment extends Fragment
@Override
public void onVoicemailStatusFetched(Cursor statusCursor) {
+ mHasFetchedVoicemailStatus = true;
+
if (getActivity() == null || getActivity().isFinishing()) {
return;
}
@@ -285,6 +311,11 @@ public class ListsFragment extends Fragment
.putBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, hasActiveVoicemailProvider)
.commit();
}
+
+ if (mHasActiveVoicemailProvider && mShowVoicemailTabAfterVoicemailStatusIsFetched) {
+ mShowVoicemailTabAfterVoicemailStatusIsFetched = false;
+ showTab(TAB_INDEX_VOICEMAIL);
+ }
}
@Override
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index e1ad20b64..e4f2d4756 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -272,8 +272,8 @@ public class VoicemailPlaybackPresenter
* Must be invoked when the parent activity is paused.
*/
public void onPause() {
- int orientation = mContext.getResources().getConfiguration().orientation;
- if (mInitialOrientation != orientation && mIsPrepared) {
+ if (mContext != null && mIsPrepared
+ && mInitialOrientation != mContext.getResources().getConfiguration().orientation) {
// If an orientation change triggers the pause, retain the MediaPlayer.
Log.d(TAG, "onPause: Orientation changed.");
return;