diff options
-rw-r--r-- | AndroidManifest.xml | 1 | ||||
-rw-r--r-- | res/layout/voicemail_promo_card.xml | 99 | ||||
-rw-r--r-- | res/values/colors.xml | 5 | ||||
-rw-r--r-- | res/values/dimens.xml | 11 | ||||
-rw-r--r-- | res/values/styles.xml | 14 | ||||
-rw-r--r-- | src/com/android/dialer/DialtactsActivity.java | 7 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/CallLogAdapter.java | 167 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/DefaultVoicemailNotifier.java | 49 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/PromoCardViewHolder.java | 71 | ||||
-rw-r--r-- | src/com/android/dialer/list/AllContactsFragment.java | 2 | ||||
-rw-r--r-- | src/com/android/dialer/list/ListsFragment.java | 33 | ||||
-rw-r--r-- | src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java | 4 |
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; |