Merge "More test-related changes" into lmp-mr1-dev
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index aacf208..5494b7b 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -176,6 +176,11 @@
      */
     private ListsFragment mListsFragment;
 
+    /**
+     * Tracks whether onSaveInstanceState has been called. If true, no fragment transactions can
+     * be commited.
+     */
+    private boolean mStateSaved;
     private boolean mInDialpadSearch;
     private boolean mInRegularSearch;
     private boolean mClearSearchOnPause;
@@ -460,6 +465,7 @@
     @Override
     protected void onResume() {
         super.onResume();
+        mStateSaved = false;
         if (mFirstLaunch) {
             displayFragment(getIntent());
         } else if (!phoneIsInUse() && mInCallDialpadUp) {
@@ -481,6 +487,9 @@
             hideDialpadAndSearchUi();
             mClearSearchOnPause = false;
         }
+        if (mSlideOut.hasStarted() && !mSlideOut.hasEnded()) {
+            commitDialpadFragmentHide();
+        }
         super.onPause();
     }
 
@@ -493,6 +502,7 @@
         outState.putBoolean(KEY_FIRST_LAUNCH, mFirstLaunch);
         outState.putBoolean(KEY_IS_DIALPAD_SHOWN, mIsDialpadShown);
         mActionBarController.saveInstanceState(outState);
+        mStateSaved = true;
     }
 
     @Override
@@ -608,7 +618,7 @@
      * @see #onDialpadShown
      */
     private void showDialpadFragment(boolean animate) {
-        if (mIsDialpadShown) {
+        if (mIsDialpadShown || mStateSaved) {
             return;
         }
         mIsDialpadShown = true;
@@ -684,10 +694,11 @@
      * Finishes hiding the dialpad fragment after any animations are completed.
      */
     private void commitDialpadFragmentHide() {
-        final FragmentTransaction ft = getFragmentManager().beginTransaction();
-        ft.hide(mDialpadFragment);
-        ft.commit();
-
+        if (!mStateSaved && !mDialpadFragment.isHidden()) {
+            final FragmentTransaction ft = getFragmentManager().beginTransaction();
+            ft.hide(mDialpadFragment);
+            ft.commit();
+        }
         mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY);
     }
 
@@ -840,7 +851,7 @@
      * Shows the search fragment
      */
     private void enterSearchUi(boolean smartDialSearch, String query) {
-        if (getFragmentManager().isDestroyed()) {
+        if (mStateSaved || getFragmentManager().isDestroyed()) {
             // Weird race condition where fragment is doing work after the activity is destroyed
             // due to talkback being on (b/10209937). Just return since we can't do any
             // constructive here.
@@ -893,7 +904,7 @@
      */
     private void exitSearchUi() {
         // See related bug in enterSearchUI();
-        if (getFragmentManager().isDestroyed()) {
+        if (getFragmentManager().isDestroyed() || mStateSaved) {
             return;
         }
 
@@ -914,15 +925,11 @@
         mActionBarController.onSearchUiExited();
     }
 
-    /** Returns an Intent to launch Call Settings screen */
-    public static Intent getCallSettingsIntent() {
-        final Intent intent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
-        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        return intent;
-    }
-
     @Override
     public void onBackPressed() {
+        if (mStateSaved) {
+            return;
+        }
         if (mIsDialpadShown) {
             if (TextUtils.isEmpty(mSearchQuery) ||
                     (mSmartDialSearchFragment != null && mSmartDialSearchFragment.isVisible()
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index 4318666..53c23c4 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -52,17 +52,20 @@
         // Only show call setting menus if the current user is the primary/owner user.
         if (isPrimaryUser()) {
             final TelephonyManager telephonyManager =
-                    (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
+                    (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             // Show "Call Settings" if there is one SIM and "Phone Accounts" if there are more.
             if (telephonyManager.getPhoneCount() <= 1) {
                 final Header callSettingsHeader = new Header();
+                Intent callSettingsIntent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
+                callSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+
                 callSettingsHeader.titleRes = R.string.call_settings_label;
                 callSettingsHeader.summaryRes = R.string.call_settings_description;
-                callSettingsHeader.intent = DialtactsActivity.getCallSettingsIntent();
+                callSettingsHeader.intent = callSettingsIntent;
                 target.add(callSettingsHeader);
             } else {
                 final Header phoneAccountSettingsHeader = new Header();
-                final Intent phoneAccountSettingsIntent =
+                Intent phoneAccountSettingsIntent =
                         new Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS);
                 phoneAccountSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);