Retain toolbar visibility on resize/orientation.

Bug: 30038684
Change-Id: I72b722adf41f7a010ba120bcebb241c7664f2006
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index e2c16b3..38b7c22 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -136,6 +136,10 @@
      */
     private static final String KEY_EVAL_STATE = NAME + "_eval_state";
     private static final String KEY_INVERSE_MODE = NAME + "_inverse_mode";
+    /**
+     * Associated value is an boolean holding the visibility state of the toolbar.
+     */
+    private static final String KEY_SHOW_TOOLBAR = NAME + "_show_toolbar";
 
     private final ViewTreeObserver.OnPreDrawListener mPreDrawListener =
             new ViewTreeObserver.OnPreDrawListener() {
@@ -290,7 +294,14 @@
 
         onInverseToggled(savedInstanceState != null
                 && savedInstanceState.getBoolean(KEY_INVERSE_MODE));
+
         onModeChanged(mEvaluator.getDegreeMode());
+        if (savedInstanceState != null &&
+                savedInstanceState.getBoolean(KEY_SHOW_TOOLBAR, true) == false) {
+            mDisplayView.hideToolbar();
+        } else {
+            showAndMaybeHideToolbar();
+        }
 
         if (mCurrentState != CalculatorState.INPUT) {
             // Just reevaluate.
@@ -309,9 +320,9 @@
     @Override
     protected void onResume() {
         super.onResume();
-
-        // Always temporarily show the toolbar initially on launch.
-        showAndMaybeHideToolbar();
+        if (mDisplayView.isToolbarVisible()) {
+            showAndMaybeHideToolbar();
+        }
     }
 
     @Override
@@ -334,6 +345,7 @@
         }
         outState.putByteArray(KEY_EVAL_STATE, byteArrayStream.toByteArray());
         outState.putBoolean(KEY_INVERSE_MODE, mInverseToggle.isSelected());
+        outState.putBoolean(KEY_SHOW_TOOLBAR, mDisplayView.isToolbarVisible());
     }
 
     // Set the state, updating delete label and display colors.
@@ -519,7 +531,8 @@
     }
 
     /**
-     * Invoked whenever the deg/rad mode may have changed to update the UI.
+     * Invoked whenever the deg/rad mode may have changed to update the UI. Note that the mode has
+     * not necessarily actually changed where this is invoked.
      *
      * @param degreeMode {@code true} if in degree mode
      */
@@ -537,9 +550,6 @@
             mModeToggle.setText(R.string.mode_deg);
             mModeToggle.setContentDescription(getString(R.string.desc_switch_deg));
         }
-
-        // Show the toolbar to highlight the mode change.
-        showAndMaybeHideToolbar();
     }
 
     /**
@@ -661,12 +671,14 @@
                 // In input mode, we reinterpret already entered trig functions.
                 mEvaluator.setDegreeMode(mode);
                 onModeChanged(mode);
+                // Show the toolbar to highlight the mode change.
+                showAndMaybeHideToolbar();
                 setState(CalculatorState.INPUT);
                 mResultText.clear();
                 if (!haveUnprocessed() && mEvaluator.getExpr().hasInterestingOps()) {
                     mEvaluator.evaluateAndShowResult();
                 }
-                return;  // onModeChanged adjusted toolbar visibility.
+                return;
             default:
                 cancelIfEvaluating(false);
                 if (haveUnprocessed()) {
diff --git a/src/com/android/calculator2/CalculatorDisplay.java b/src/com/android/calculator2/CalculatorDisplay.java
index 728fc11..341564d 100644
--- a/src/com/android/calculator2/CalculatorDisplay.java
+++ b/src/com/android/calculator2/CalculatorDisplay.java
@@ -191,7 +191,12 @@
      */
     public void hideToolbar() {
         if (!getForceToolbarVisible()) {
-            post(mHideToolbarRunnable);
+            removeCallbacks(mHideToolbarRunnable);
+            mHideToolbarRunnable.run();
         }
     }
+
+    public boolean isToolbarVisible() {
+        return mToolbar.getVisibility() == View.VISIBLE;
+    }
 }