Merge "Add "Send SMS" shortcut to Dialer."
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index 34dd137..f84d75b 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -198,14 +198,14 @@
                 this, mLogLimit);
         mKeyguardManager =
                 (KeyguardManager) getActivity().getSystemService(Context.KEYGUARD_SERVICE);
-        getActivity().getContentResolver().registerContentObserver(CallLog.CONTENT_URI, true,
-                mCallLogObserver);
+        getActivity().getContentResolver().registerContentObserver(
+                CallLog.CONTENT_URI, true, mCallLogObserver);
         getActivity().getContentResolver().registerContentObserver(
                 ContactsContract.Contacts.CONTENT_URI, true, mContactsObserver);
         getActivity().getContentResolver().registerContentObserver(
                 Status.CONTENT_URI, true, mVoicemailStatusObserver);
         setHasOptionsMenu(true);
-        updateCallList(mCallTypeFilter, mDateLimit);
+        fetchCalls();
 
         mExpandedItemTranslationZ =
                 getResources().getDimension(R.dimen.call_log_expanded_translation_z);
@@ -270,13 +270,21 @@
      */
     @Override
     public void onVoicemailStatusFetched(Cursor statusCursor) {
-        if (getActivity() == null || getActivity().isFinishing()) {
+        Activity activity = getActivity();
+        if (activity == null || activity.isFinishing()) {
             return;
         }
         updateVoicemailStatusMessage(statusCursor);
 
-        int activeSources = mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor);
-        setVoicemailSourcesAvailable(activeSources != 0);
+        // If there are any changes to the presence of active voicemail services, invalidate the
+        // options menu so that it will be updated.
+        boolean hasActiveVoicemailSources =
+                mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) != 0;
+        if (mVoicemailSourcesAvailable != hasActiveVoicemailSources) {
+            mVoicemailSourcesAvailable = hasActiveVoicemailSources;
+            activity.invalidateOptionsMenu();
+        }
+
         mVoicemailStatusFetched = true;
         destroyEmptyLoaderIfAllDataFetched();
     }
@@ -288,18 +296,6 @@
         }
     }
 
-    /** Sets whether there are any voicemail sources available in the platform. */
-    private void setVoicemailSourcesAvailable(boolean voicemailSourcesAvailable) {
-        if (mVoicemailSourcesAvailable == voicemailSourcesAvailable) return;
-        mVoicemailSourcesAvailable = voicemailSourcesAvailable;
-
-        Activity activity = getActivity();
-        if (activity != null) {
-            // This is so that the options menu content is updated.
-            activity.invalidateOptionsMenu();
-        }
-    }
-
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
         View view = inflater.inflate(R.layout.call_log_fragment, container, false);
@@ -389,7 +385,8 @@
     @Override
     public void onStop() {
         super.onStop();
-        updateOnExit();
+
+        updateOnTransition(false /* onEntry */);
     }
 
     @Override
@@ -418,19 +415,6 @@
         mCallLogQueryHandler.fetchCalls(mCallTypeFilter, mDateLimit);
     }
 
-    public void startCallsQuery() {
-        mAdapter.setLoading(true);
-        mCallLogQueryHandler.fetchCalls(mCallTypeFilter, mDateLimit);
-    }
-
-    private void startVoicemailStatusQuery() {
-        mCallLogQueryHandler.fetchVoicemailStatus();
-    }
-
-    private void updateCallList(int filterType, long dateLimit) {
-        mCallLogQueryHandler.fetchCalls(filterType, dateLimit);
-    }
-
     private void updateEmptyMessage(int filterType) {
         final int messageId;
         switch (filterType) {
@@ -461,7 +445,7 @@
         if (mMenuVisible != menuVisible) {
             mMenuVisible = menuVisible;
             if (!menuVisible) {
-                updateOnExit();
+                updateOnTransition(false /* onEntry */);
             } else if (isResumed()) {
                 refreshData();
             }
@@ -475,24 +459,23 @@
             // Mark all entries in the contact info cache as out of date, so they will be looked up
             // again once being shown.
             mAdapter.invalidateCache();
-            startCallsQuery();
-            startVoicemailStatusQuery();
-            updateOnEntry();
+            mAdapter.setLoading(true);
+
+            fetchCalls();
+            mCallLogQueryHandler.fetchVoicemailStatus();
+
+            updateOnTransition(true /* onEntry */);
             mRefreshDataRequired = false;
         }
     }
 
-    /** Updates call data and notification state while leaving the call log tab. */
-    private void updateOnExit() {
-        updateOnTransition(false);
-    }
-
-    /** Updates call data and notification state while entering the call log tab. */
-    private void updateOnEntry() {
-        updateOnTransition(true);
-    }
-
-    // TODO: Move to CallLogActivity
+    /**
+     * Updates the call data and notification state on entering or leaving the call log tab.
+     *
+     * If we are leaving the call log tab, mark all the missed calls as read.
+     *
+     * TODO: Move to CallLogActivity
+     */
     private void updateOnTransition(boolean onEntry) {
         // We don't want to update any call data when keyguard is on because the user has likely not
         // seen the new calls yet.