From 936e4436535aa7ee2f7a47ada8914d038c43b295 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Mon, 29 Jul 2013 09:54:42 -0700 Subject: Fix fragment-related issues in new Dialer Fix fragment lifecycle issues that occur when resuming the Dialer from recents after some time. To better reproduce fragment lifecycle issues more easily, remove the attribute android:screenOrientation="nosensor" to simulate activity creation and destruction. Change-Id: I9972121e6e06690d2a4823f9480ff9a993854059 --- src/com/android/dialer/NewDialtactsActivity.java | 73 +++++++++++++++--------- 1 file changed, 46 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/com/android/dialer/NewDialtactsActivity.java b/src/com/android/dialer/NewDialtactsActivity.java index 0229c6bfe..6d2bb3fdb 100644 --- a/src/com/android/dialer/NewDialtactsActivity.java +++ b/src/com/android/dialer/NewDialtactsActivity.java @@ -183,7 +183,13 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - final boolean smartDialSearch = isDialpadShowing(); + // TODO krelease: populate the search fragments with the correct + // search query at the correct point in time of the fragment lifecycle. + // The current behavior is to simply return to the favorites screen + // (when docked), or returning to the Dialer after it has been + // swapped out of memory. + if (mDialpadFragment == null) return; + final boolean smartDialSearch = isDialpadShowing(); final String newText = s.toString(); // Show search result with non-empty text. Show a bare list otherwise. if (TextUtils.isEmpty(newText) && mInSearchUi) { @@ -194,7 +200,7 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie enterSearchUi(smartDialSearch); } - if (isDialpadShowing()) { + if (smartDialSearch) { mSmartDialSearchFragment.setQueryString(newText, false); } else { mRegularSearchFragment.setQueryString(newText, false); @@ -209,7 +215,7 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie }; private boolean isDialpadShowing() { - return mDialpadFragment.isVisible(); + return mDialpadFragment != null && mDialpadFragment.isVisible(); } @Override @@ -223,23 +229,24 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie getActionBar().hide(); - mPhoneFavoriteFragment = new NewPhoneFavoriteFragment(); - mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener); - - mRegularSearchFragment = new NewSearchFragment(); - mSmartDialSearchFragment = new SmartDialSearchFragment(); - mDialpadFragment = new NewDialpadFragment(); - - // TODO krelease: load fragments on demand instead of creating all of them at run time - final FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.add(R.id.dialtacts_frame, mPhoneFavoriteFragment, TAG_FAVORITES_FRAGMENT); - ft.add(R.id.dialtacts_frame, mRegularSearchFragment, TAG_REGULAR_SEARCH_FRAGMENT); - ft.add(R.id.dialtacts_frame, mSmartDialSearchFragment, TAG_SMARTDIAL_SEARCH_FRAGMENT); - ft.add(R.id.dialtacts_container, mDialpadFragment, TAG_DIALPAD_FRAGMENT); - ft.hide(mRegularSearchFragment); - ft.hide(mDialpadFragment); - ft.hide(mSmartDialSearchFragment); - ft.commit(); + if (savedInstanceState == null) { + mPhoneFavoriteFragment = new NewPhoneFavoriteFragment(); + mPhoneFavoriteFragment.setRetainInstance(true); + mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener); + + mRegularSearchFragment = new NewSearchFragment(); + mSmartDialSearchFragment = new SmartDialSearchFragment(); + mDialpadFragment = new NewDialpadFragment(); + + // TODO krelease: load fragments on demand instead of creating all of them at run time + final FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.add(R.id.dialtacts_frame, mPhoneFavoriteFragment, TAG_FAVORITES_FRAGMENT); + ft.add(R.id.dialtacts_frame, mRegularSearchFragment, TAG_REGULAR_SEARCH_FRAGMENT); + ft.add(R.id.dialtacts_frame, mSmartDialSearchFragment, TAG_SMARTDIAL_SEARCH_FRAGMENT); + ft.add(R.id.dialtacts_container, mDialpadFragment, TAG_DIALPAD_FRAGMENT); + // Fragments will be hidden as necessary in onAttachFragment + ft.commit(); + } mBottomPaddingView = findViewById(R.id.dialtacts_bottom_padding); prepareSearchView(); @@ -264,21 +271,23 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie TAG_REGULAR_SEARCH_FRAGMENT); mRegularSearchFragment.setOnPhoneNumberPickerActionListener( mPhoneNumberPickerActionListener); - if (!mRegularSearchFragment.isHidden()) { - final FragmentTransaction transaction = getFragmentManager().beginTransaction(); - transaction.hide(mRegularSearchFragment); - transaction.commit(); - } mSmartDialSearchFragment = (SmartDialSearchFragment) fm.findFragmentByTag( TAG_SMARTDIAL_SEARCH_FRAGMENT); mSmartDialSearchFragment.setOnPhoneNumberPickerActionListener( mPhoneNumberPickerActionListener); - if (!mSmartDialSearchFragment.isHidden()) { + } + + @Override + public void onAttachFragment(Fragment fragment) { + if (fragment instanceof NewDialpadFragment || fragment instanceof NewSearchFragment + || fragment instanceof SmartDialSearchFragment) { final FragmentTransaction transaction = getFragmentManager().beginTransaction(); - transaction.hide(mSmartDialSearchFragment); + transaction.hide(fragment); transaction.commit(); } + // TODO krelease: Save some kind of state here to show the appropriate fragment + // based on the state of the dialer when it was last paused } @Override @@ -397,6 +406,11 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie }; public void hideSearchBar() { + // If the favorites fragment hasn't been fully created before the dialpad fragment + // is hidden (i.e. onResume), don't bother animating + if (mPhoneFavoriteFragment == null || mPhoneFavoriteFragment.getView() == null) { + return; + } mSearchViewContainer.animate().cancel(); mSearchViewContainer.setAlpha(1); mSearchViewContainer.setTranslationY(0); @@ -415,6 +429,11 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie } public void showSearchBar() { + // If the favorites fragment hasn't been fully created before the dialpad fragment + // is hidden (i.e. onResume), don't bother animating + if (mPhoneFavoriteFragment == null || mPhoneFavoriteFragment.getView() == null) { + return; + } mSearchViewContainer.animate().cancel(); mSearchViewContainer.setAlpha(0); mSearchViewContainer.setTranslationY(-mSearchViewContainer.getHeight()); -- cgit v1.2.3