Merge "Restore Dialer content after permissions granted" into mnc-dev
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index d1a6872..52a33f2 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -547,6 +547,14 @@
         prepareVoiceSearchButton();
         mDialerDatabaseHelper.startSmartDialUpdateThread();
         mFloatingActionButtonController.align(getFabAlignment(), false /* animate */);
+
+        if (getIntent().hasExtra(EXTRA_SHOW_TAB)) {
+            int index = getIntent().getIntExtra(EXTRA_SHOW_TAB, ListsFragment.TAB_INDEX_SPEED_DIAL);
+            if (index < mListsFragment.getTabCount()) {
+                mListsFragment.showTab(index);
+            }
+        }
+
         Trace.endSection();
     }
 
@@ -905,14 +913,10 @@
     @Override
     public void onNewIntent(Intent newIntent) {
         setIntent(newIntent);
+
         mStateSaved = false;
         displayFragment(newIntent);
 
-        if (newIntent.hasExtra(EXTRA_SHOW_TAB)) {
-            mListsFragment.showTab(
-                    getIntent().getIntExtra(EXTRA_SHOW_TAB, mListsFragment.TAB_INDEX_SPEED_DIAL));
-        }
-
         invalidateOptionsMenu();
     }
 
@@ -1217,6 +1221,11 @@
 
     @Override
     public void onCallNumberDirectly(String phoneNumber, boolean isVideoCall) {
+        if (phoneNumber == null) {
+            // Invalid phone number, but let the call go through so that InCallUI can show
+            // an error message.
+            phoneNumber = "";
+        }
         Intent intent = isVideoCall ?
                 IntentUtil.getVideoCallIntent(phoneNumber, getCallOrigin()) :
                 IntentUtil.getCallIntent(phoneNumber, getCallOrigin());
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 83e5594..5108472 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -361,10 +361,13 @@
 
     @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;
+        // Don't auto-expand the first item for the voicemail list fragment since that will
+        // trigger an unwanted voicemail download and playback.
+        if (mVoicemailPlaybackPresenter == null) {
+            mHasBoundFirstView = false;
+            mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
+            mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+        }
 
         super.changeCursor(cursor);
     }
@@ -578,8 +581,10 @@
             // 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) {
+        } else if (!mHasBoundFirstView && mVoicemailPlaybackPresenter == null) {
             // Expand the first view when loading the call log to expose the actions.
+            // Don't auto-expand the first item for the voicemail list fragment since that will
+            // trigger an unwanted voicemail download and playback.
             mCurrentlyExpandedRowId = views.rowId;
             mCurrentlyExpandedPosition = position;
             mHasBoundFirstView = true;
diff --git a/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java b/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
index 6c0ecf7..401b0b6 100644
--- a/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
+++ b/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
@@ -44,11 +44,6 @@
         super(context);
 
         mCountryIso = GeoUtil.getCurrentCountryIso(context);
-
-        // Enable all shortcuts by default
-        for (int i = 0; i < mShortcutEnabled.length; i++) {
-            mShortcutEnabled[i] = true;
-        }
     }
 
     @Override
@@ -67,6 +62,12 @@
         return count;
     }
 
+    public void disableAllShortcuts() {
+        for (int i = 0; i < mShortcutEnabled.length; i++) {
+            mShortcutEnabled[i] = false;
+        }
+    }
+
     @Override
     public int getItemViewType(int position) {
         final int shortcut = getShortcutTypeFromPosition(position);
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index e45da0c..33c9776 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -347,6 +347,10 @@
         return mRemoveView;
     }
 
+    public int getTabCount() {
+        return mViewPagerAdapter.getCount();
+    }
+
     private int getRtlPosition(int position) {
         if (DialerUtils.isRtl()) {
             return mViewPagerAdapter.getCount() - 1 - position;
diff --git a/src/com/android/dialer/list/SearchFragment.java b/src/com/android/dialer/list/SearchFragment.java
index 1f33d5b..106545e 100644
--- a/src/com/android/dialer/list/SearchFragment.java
+++ b/src/com/android/dialer/list/SearchFragment.java
@@ -345,7 +345,9 @@
             super.startLoading();
         } else if (TextUtils.isEmpty(getQueryString())) {
             // Clear out any existing call shortcuts.
-            getAdapter().setQueryString(null);
+            final DialerPhoneNumberListAdapter adapter =
+                    (DialerPhoneNumberListAdapter) getAdapter();
+            adapter.disableAllShortcuts();
         }
     }
 
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index 4597d35..19f7145 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -521,7 +521,9 @@
             mIsPrepared = false;
         }
 
-        mView.onPlaybackError();
+        if (mView != null) {
+            mView.onPlaybackError();
+        }
 
         mPosition = 0;
         mIsPlaying = false;
@@ -536,7 +538,9 @@
 
         // Reset the seekbar position to the beginning.
         mPosition = 0;
-        mView.setClipPosition(0, mDuration.get());
+        if (mView != null) {
+            mView.setClipPosition(0, mDuration.get());
+        }
     }
 
     @Override
@@ -610,7 +614,9 @@
         mPosition = mMediaPlayer.getCurrentPosition();
         Log.d(TAG, "Paused playback at " + mPosition + ".");
 
-        mView.onPlaybackStopped();
+        if (mView != null) {
+            mView.onPlaybackStopped();
+        }
         mAudioManager.abandonAudioFocus(this);
 
         mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);