From cdd957b7f6f3a91433bb2e138eb7bff654256dcd Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Wed, 9 Jul 2014 14:06:10 -0700 Subject: 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 --- .../android/dialer/calllog/CallLogActivity.java | 49 +++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) (limited to 'src/com/android/dialer/calllog/CallLogActivity.java') diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java index 4e969e189..9bcd639c2 100644 --- a/src/com/android/dialer/calllog/CallLogActivity.java +++ b/src/com/android/dialer/calllog/CallLogActivity.java @@ -22,6 +22,8 @@ import android.app.FragmentManager; 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.VoicemailStatusHelper; 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 @@ public class CallLogActivity extends Activity implements CallLogQueryHandler.Lis 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 @@ public class CallLogActivity extends Activity implements CallLogQueryHandler.Lis 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 @@ public class CallLogActivity extends Activity implements CallLogQueryHandler.Lis protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mHandler = new Handler(); + setContentView(R.layout.call_log_activity); getWindow().setBackgroundDrawable(null); @@ -100,6 +117,17 @@ public class CallLogActivity extends Activity implements CallLogQueryHandler.Lis 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 @@ public class CallLogActivity extends Activity implements CallLogQueryHandler.Lis 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 @@ public class CallLogActivity extends Activity implements CallLogQueryHandler.Lis 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); } } -- cgit v1.2.3