Merge "Use dimens to specify styling for display formula and result." into ub-calculator-euler
diff --git a/res/layout/dialog_message.xml b/res/layout/dialog_message.xml
index 67e6089..233849e 100644
--- a/res/layout/dialog_message.xml
+++ b/res/layout/dialog_message.xml
@@ -15,13 +15,12 @@
   limitations under the License.
   -->
 
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/message"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="20dip"
-    android:paddingEnd="16dip"
-    android:paddingStart="20dip"
-    android:paddingTop="20dip"
+    android:padding="20dip"
+    android:ellipsize="none"
     android:textAppearance="?android:attr/textAppearanceMedium"
     android:textIsSelectable="true" />
diff --git a/res/layout/display_one_line.xml b/res/layout/display_one_line.xml
index c016b15..11760fb 100644
--- a/res/layout/display_one_line.xml
+++ b/res/layout/display_one_line.xml
@@ -39,7 +39,7 @@
             android:overScrollMode="never"
             android:scrollbars="none">
 
-            <com.android.calculator2.CalculatorText
+            <com.android.calculator2.CalculatorFormula
                 android:id="@+id/formula"
                 style="@style/DisplayTextStyle.Formula"
                 android:layout_width="wrap_content"
diff --git a/res/layout/display_two_line.xml b/res/layout/display_two_line.xml
index 3735a85..55e6f7b 100644
--- a/res/layout/display_two_line.xml
+++ b/res/layout/display_two_line.xml
@@ -33,7 +33,7 @@
         android:overScrollMode="never"
         android:scrollbars="none">
 
-       <com.android.calculator2.CalculatorText
+       <com.android.calculator2.CalculatorFormula
             android:id="@+id/formula"
             style="@style/DisplayTextStyle.Formula"
             android:layout_width="wrap_content"
diff --git a/res/values/attr.xml b/res/values/attr.xml
index cfefc9d..825fc9f 100644
--- a/res/values/attr.xml
+++ b/res/values/attr.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <declare-styleable name="CalculatorText">
+    <declare-styleable name="CalculatorFormula">
         <attr name="minTextSize" format="dimension" />
         <attr name="maxTextSize" format="dimension" />
         <attr name="stepTextSize" format="dimension" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fd916a7..50c4535 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -250,9 +250,9 @@
     <string name="text_copied_toast">Text copied</string>
 
     <!-- Dialog message when a computation is cancelled by the user. [CHAR_LIMIT=NONE] -->
-    <string name="cancelled">Computation cancelled</string>
+    <string name="cancelled">Computation cancelled.</string>
     <!-- Dialog message when a computation times out. [CHAR_LIMIT=NONE] -->
-    <string name="timeout">Timed out. Value may be infinite or undefined.</string>
+    <string name="timeout">Value may be infinite or undefined.</string>
     <!--
       Button label to allow future computations with a longer timeout.
 
@@ -285,4 +285,8 @@
     <string name="title_history">History</string>
     <!-- Action bar navigate up description in history page. [CHAR_LIMIT=40] -->
     <string name="desc_navigate_up">Navigate up</string>
+
+    <!-- Title for alert dialog when calculation takes too long (timeout). [CHAR_LIMIT=30] -->
+    <string name="dialog_timeout">Timeout</string>
+
 </resources>
diff --git a/src/com/android/calculator2/AlertDialogFragment.java b/src/com/android/calculator2/AlertDialogFragment.java
index 47f482f..e098022 100644
--- a/src/com/android/calculator2/AlertDialogFragment.java
+++ b/src/com/android/calculator2/AlertDialogFragment.java
@@ -23,6 +23,7 @@
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
 import android.view.LayoutInflater;
 import android.widget.TextView;
 
@@ -47,16 +48,36 @@
     private static final String KEY_MESSAGE = NAME + "_message";
     private static final String KEY_BUTTON_NEGATIVE = NAME + "_button_negative";
     private static final String KEY_BUTTON_POSITIVE = NAME + "_button_positive";
+    private static final String KEY_TITLE = NAME + "_title";
+
+    /**
+     * Convenience method for creating and showing a DialogFragment with the given message and
+     * title.
+     *
+     * @param activity originating Activity
+     * @param title resource id for the title string
+     * @param message resource id for the displayed message string
+     * @param positiveButtonLabel label for second button, if any.  If non-null, activity must
+     * implement AlertDialogFragment.OnClickListener to respond.
+     */
+    public static void showMessageDialog(Activity activity, @StringRes int title,
+            @StringRes int message, @StringRes int positiveButtonLabel) {
+        showMessageDialog(activity, title != 0 ? activity.getString(title) : null,
+                activity.getString(message),
+                positiveButtonLabel != 0 ? activity.getString(positiveButtonLabel) : null);
+    }
 
     /**
      * Create and show a DialogFragment with the given message.
+     *
      * @param activity originating Activity
+     * @param title displayed title, if any
      * @param message displayed message
      * @param positiveButtonLabel label for second button, if any.  If non-null, activity must
      * implement AlertDialogFragment.OnClickListener to respond.
      */
-    public static void showMessageDialog(Activity activity, CharSequence message,
-            @Nullable CharSequence positiveButtonLabel) {
+    public static void showMessageDialog(Activity activity, @Nullable CharSequence title,
+            CharSequence message, @Nullable CharSequence positiveButtonLabel) {
         final AlertDialogFragment dialogFragment = new AlertDialogFragment();
         final Bundle args = new Bundle();
         args.putCharSequence(KEY_MESSAGE, message);
@@ -64,6 +85,7 @@
         if (positiveButtonLabel != null) {
             args.putCharSequence(KEY_BUTTON_POSITIVE, positiveButtonLabel);
         }
+        args.putCharSequence(KEY_TITLE, title);
         dialogFragment.setArguments(args);
         dialogFragment.show(activity.getFragmentManager(), null /* tag */);
     }
@@ -78,11 +100,11 @@
         final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
 
         final LayoutInflater inflater = LayoutInflater.from(builder.getContext());
-        final TextView textView = (TextView) inflater.inflate(
+        final TextView messageView = (TextView) inflater.inflate(
                 R.layout.dialog_message, null /* root */);
-        textView.setText(args.getCharSequence(KEY_MESSAGE));
+        messageView.setText(args.getCharSequence(KEY_MESSAGE));
+        builder.setView(messageView);
 
-        builder.setView(textView);
         builder.setNegativeButton(args.getCharSequence(KEY_BUTTON_NEGATIVE), null /* listener */);
 
         final CharSequence positiveButtonLabel = args.getCharSequence(KEY_BUTTON_POSITIVE);
@@ -90,6 +112,8 @@
             builder.setPositiveButton(positiveButtonLabel, this);
         }
 
+        builder.setTitle(args.getCharSequence(KEY_TITLE));
+
         return builder.create();
     }
 
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index e884de5..b730425 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -67,7 +67,7 @@
 import android.widget.TextView;
 import android.widget.Toolbar;
 
-import com.android.calculator2.CalculatorText.OnTextSizeChangeListener;
+import com.android.calculator2.CalculatorFormula.OnTextSizeChangeListener;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -77,9 +77,8 @@
 import java.io.ObjectOutput;
 import java.io.ObjectOutputStream;
 
-public class Calculator extends Activity
-        implements OnTextSizeChangeListener, OnLongClickListener, CalculatorText.OnPasteListener,
-        AlertDialogFragment.OnClickListener {
+public class Calculator extends Activity implements OnTextSizeChangeListener, OnLongClickListener,
+        CalculatorFormula.OnPasteListener, AlertDialogFragment.OnClickListener {
 
     /**
      * Constant for an invalid resource id.
@@ -178,7 +177,7 @@
 
     private CalculatorDisplay mDisplayView;
     private TextView mModeView;
-    private CalculatorText mFormulaText;
+    private CalculatorFormula mFormulaText;
     private CalculatorResult mResultText;
     private HorizontalScrollView mFormulaContainer;
     private DragLayout mDragLayout;
@@ -229,7 +228,7 @@
 
         mDisplayView = (CalculatorDisplay) findViewById(R.id.display);
         mModeView = (TextView) findViewById(R.id.mode);
-        mFormulaText = (CalculatorText) findViewById(R.id.formula);
+        mFormulaText = (CalculatorFormula) findViewById(R.id.formula);
         mResultText = (CalculatorResult) findViewById(R.id.result);
         mFormulaContainer = (HorizontalScrollView) findViewById(R.id.formula_container);
 
@@ -420,7 +419,7 @@
     @Override
     public void onActionModeStarted(ActionMode mode) {
         super.onActionModeStarted(mode);
-        if (mode.getTag() == CalculatorText.TAG_ACTION_MODE) {
+        if (mode.getTag() == CalculatorFormula.TAG_ACTION_MODE) {
             mFormulaContainer.scrollTo(mFormulaText.getRight(), 0);
         }
     }
@@ -1094,13 +1093,14 @@
                 .commit();
     }
 
-    private void displayMessage(String s) {
-        AlertDialogFragment.showMessageDialog(this, s, null);
+    private void displayMessage(String title, String message) {
+        AlertDialogFragment.showMessageDialog(this, title, message, null);
     }
 
     private void displayFraction() {
         UnifiedReal result = mEvaluator.getResult();
-        displayMessage(KeyMaps.translateResult(result.toNiceString()));
+        displayMessage(getString(R.string.menu_fraction),
+                KeyMaps.translateResult(result.toNiceString()));
     }
 
     // Display full result to currently evaluated precision
@@ -1112,7 +1112,7 @@
         } else {
             msg += res.getString(R.string.approximate);
         }
-        displayMessage(msg);
+        displayMessage(getString(R.string.menu_leading), msg);
     }
 
     /**
diff --git a/src/com/android/calculator2/CalculatorText.java b/src/com/android/calculator2/CalculatorFormula.java
similarity index 94%
rename from src/com/android/calculator2/CalculatorText.java
rename to src/com/android/calculator2/CalculatorFormula.java
index 52b4d13..88f677c 100644
--- a/src/com/android/calculator2/CalculatorText.java
+++ b/src/com/android/calculator2/CalculatorFormula.java
@@ -37,9 +37,9 @@
 import android.widget.TextView;
 
 /**
- * TextView adapted for Calculator display.
+ * TextView adapted for displaying the formula and allowing pasting.
  */
-public class CalculatorText extends AlignedTextView implements MenuItem.OnMenuItemClickListener,
+public class CalculatorFormula extends AlignedTextView implements MenuItem.OnMenuItemClickListener,
         ClipboardManager.OnPrimaryClipChangedListener {
 
     public static final String TAG_ACTION_MODE = "ACTION_MODE";
@@ -60,26 +60,26 @@
     private OnPasteListener mOnPasteListener;
     private OnTextSizeChangeListener mOnTextSizeChangeListener;
 
-    public CalculatorText(Context context) {
+    public CalculatorFormula(Context context) {
         this(context, null /* attrs */);
     }
 
-    public CalculatorText(Context context, AttributeSet attrs) {
+    public CalculatorFormula(Context context, AttributeSet attrs) {
         this(context, attrs, 0 /* defStyleAttr */);
     }
 
-    public CalculatorText(Context context, AttributeSet attrs, int defStyleAttr) {
+    public CalculatorFormula(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
 
         mClipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
 
         final TypedArray a = context.obtainStyledAttributes(
-                attrs, R.styleable.CalculatorText, defStyleAttr, 0);
+                attrs, R.styleable.CalculatorFormula, defStyleAttr, 0);
         mMaximumTextSize = a.getDimension(
-                R.styleable.CalculatorText_maxTextSize, getTextSize());
+                R.styleable.CalculatorFormula_maxTextSize, getTextSize());
         mMinimumTextSize = a.getDimension(
-                R.styleable.CalculatorText_minTextSize, getTextSize());
-        mStepTextSize = a.getDimension(R.styleable.CalculatorText_stepTextSize,
+                R.styleable.CalculatorFormula_minTextSize, getTextSize());
+        mStepTextSize = a.getDimension(R.styleable.CalculatorFormula_stepTextSize,
                 (mMaximumTextSize - mMinimumTextSize) / 3);
         a.recycle();
 
@@ -311,7 +311,7 @@
                 createPasteMenu(inflater, contextMenu);
                 mContextMenu = contextMenu;
                 for(int i = 0; i < contextMenu.size(); i++) {
-                    contextMenu.getItem(i).setOnMenuItemClickListener(CalculatorText.this);
+                    contextMenu.getItem(i).setOnMenuItemClickListener(CalculatorFormula.this);
                 }
             }
         });
diff --git a/src/com/android/calculator2/CalculatorResult.java b/src/com/android/calculator2/CalculatorResult.java
index d81d0d0..e14c8d2 100644
--- a/src/com/android/calculator2/CalculatorResult.java
+++ b/src/com/android/calculator2/CalculatorResult.java
@@ -768,7 +768,7 @@
         int result;
         synchronized(mWidthLock) {
             result = (int) Math.floor(mWidthConstraint / mCharWidth);
-            // We can apparently finish evaluating before onMeasure in CalculatorText has been
+            // We can apparently finish evaluating before onMeasure in CalculatorFormula has been
             // called, in which case we get 0 or -1 as the width constraint.
         }
         if (result <= 0) {
diff --git a/src/com/android/calculator2/Evaluator.java b/src/com/android/calculator2/Evaluator.java
index 89a3e72..fe2862c 100644
--- a/src/com/android/calculator2/Evaluator.java
+++ b/src/com/android/calculator2/Evaluator.java
@@ -224,14 +224,7 @@
     }
 
     private void displayCancelledMessage() {
-        new AlertDialog.Builder(mCalculator)
-            .setMessage(R.string.cancelled)
-            .setPositiveButton(R.string.dismiss,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface d, int which) { }
-                })
-            .create()
-            .show();
+        AlertDialogFragment.showMessageDialog(mCalculator, 0, R.string.cancelled, 0);
     }
 
     // Timeout handling.
@@ -280,8 +273,8 @@
     private final int QUICK_MAX_RESULT_BITS = 50000;
 
     private void displayTimeoutMessage() {
-        AlertDialogFragment.showMessageDialog(mCalculator, mCalculator.getString(R.string.timeout),
-                (mLongTimeout ? null : mCalculator.getString(R.string.ok_remove_timeout)));
+        AlertDialogFragment.showMessageDialog(mCalculator, R.string.dialog_timeout,
+                R.string.timeout, mLongTimeout ? 0 : R.string.ok_remove_timeout);
     }
 
     public void setLongTimeOut() {