Allow intents to go directly to call log tabs

If the voicemail tab is preselected via an intent extra, wait (with a
timeout) until the list of voicemail providers is retrieved, before
setting the selected item in the viewpager.

Bug: 15830957

Change-Id: I0ef244cf38a2d5597292e78d30e3155afea6bc4e
diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java
index 4e969e1..9bcd639 100644
--- a/src/com/android/dialer/calllog/CallLogActivity.java
+++ b/src/com/android/dialer/calllog/CallLogActivity.java
@@ -22,6 +22,8 @@
 import android.content.Intent;
 import android.database.Cursor;
 import android.os.Bundle;
+import android.os.Handler;
+import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.support.v13.app.FragmentPagerAdapter;
 import android.support.v4.view.ViewPager;
@@ -36,6 +38,7 @@
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 
 public class CallLogActivity extends Activity implements CallLogQueryHandler.Listener {
+    private Handler mHandler;
     private ViewPager mViewPager;
     private ViewPagerTabs mViewPagerTabs;
     private ViewPagerAdapter mViewPagerAdapter;
@@ -44,6 +47,9 @@
     private CallLogFragment mVoicemailFragment;
     private VoicemailStatusHelper mVoicemailStatusHelper;
 
+    private static final int WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS = 300;
+    private boolean mSwitchToVoicemailTab;
+
     private String[] mTabTitles;
 
     private static final int TAB_INDEX_ALL = 0;
@@ -55,6 +61,15 @@
 
     private boolean mHasActiveVoicemailProvider;
 
+    private final Runnable mWaitForVoicemailTimeoutRunnable = new Runnable() {
+        @Override
+        public void run() {
+            mViewPagerTabs.setViewPager(mViewPager);
+            mViewPager.setCurrentItem(TAB_INDEX_ALL);
+            mSwitchToVoicemailTab = false;
+        }
+    };
+
     public class ViewPagerAdapter extends FragmentPagerAdapter {
         public ViewPagerAdapter(FragmentManager fm) {
             super(fm);
@@ -92,6 +107,8 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        mHandler = new Handler();
+
         setContentView(R.layout.call_log_activity);
         getWindow().setBackgroundDrawable(null);
 
@@ -100,6 +117,17 @@
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.setDisplayShowTitleEnabled(true);
 
+        int startingTab = TAB_INDEX_ALL;
+        final Intent intent = getIntent();
+        if (intent != null) {
+            final int callType = intent.getIntExtra(CallLog.Calls.EXTRA_CALL_TYPE_FILTER, -1);
+            if (callType == CallLog.Calls.MISSED_TYPE) {
+                startingTab = TAB_INDEX_MISSED;
+            } else if (callType == CallLog.Calls.VOICEMAIL_TYPE) {
+                startingTab = TAB_INDEX_VOICEMAIL;
+            }
+        }
+
         mTabTitles = new String[TAB_INDEX_COUNT_WITH_VOICEMAIL];
         mTabTitles[0] = getString(R.string.call_log_all_title);
         mTabTitles[1] = getString(R.string.call_log_missed_title);
@@ -112,9 +140,20 @@
         mViewPager.setOffscreenPageLimit(2);
 
         mViewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header);
-        mViewPagerTabs.setViewPager(mViewPager);
         mViewPager.setOnPageChangeListener(mViewPagerTabs);
 
+        if (startingTab == TAB_INDEX_VOICEMAIL) {
+            // The addition of the voicemail tab is an asynchronous process, so wait till the tab
+            // is added, before attempting to switch to it. If the querying of CP2 for voicemail
+            // providers takes too long, give up and show the first tab instead.
+            mSwitchToVoicemailTab = true;
+            mHandler.postDelayed(mWaitForVoicemailTimeoutRunnable,
+                    WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS);
+        } else {
+            mViewPagerTabs.setViewPager(mViewPager);
+            mViewPager.setCurrentItem(startingTab);
+        }
+
         mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
     }
 
@@ -166,12 +205,20 @@
             return;
         }
 
+        mHandler.removeCallbacks(mWaitForVoicemailTimeoutRunnable);
         // Update mHasActiveVoicemailProvider, which controls the number of tabs displayed.
         int activeSources = mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor);
         if (activeSources > 0 != mHasActiveVoicemailProvider) {
             mHasActiveVoicemailProvider = activeSources > 0;
             mViewPagerAdapter.notifyDataSetChanged();
             mViewPagerTabs.setViewPager(mViewPager);
+            if (mSwitchToVoicemailTab) {
+                mViewPager.setCurrentItem(TAB_INDEX_VOICEMAIL, false);
+            }
+        } else if (mSwitchToVoicemailTab) {
+            // The voicemail tab was requested, but it does not exist because there are no
+            // voicemail sources. Just fallback to the first item instead.
+            mViewPagerTabs.setViewPager(mViewPager);
         }
     }