summaryrefslogtreecommitdiffstats
path: root/src/com/android/calculator2/CalculatorText.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/calculator2/CalculatorText.java')
-rw-r--r--src/com/android/calculator2/CalculatorText.java125
1 files changed, 59 insertions, 66 deletions
diff --git a/src/com/android/calculator2/CalculatorText.java b/src/com/android/calculator2/CalculatorText.java
index c6f38ae..b41b6d3 100644
--- a/src/com/android/calculator2/CalculatorText.java
+++ b/src/com/android/calculator2/CalculatorText.java
@@ -20,8 +20,7 @@ import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.res.TypedArray;
-import android.graphics.Paint;
-import android.net.Uri;
+import android.text.Layout;
import android.text.TextPaint;
import android.text.method.ScrollingMovementMethod;
import android.util.AttributeSet;
@@ -38,26 +37,21 @@ import android.widget.TextView;
*/
public class CalculatorText extends AlignedTextView implements View.OnLongClickListener {
- private ActionMode mActionMode;
-
private final ActionMode.Callback mPasteActionModeCallback = new ActionMode.Callback() {
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_paste:
- pasteContent();
+ if (item.getItemId() == R.id.menu_paste) {
+ paste();
mode.finish();
return true;
- default:
- return false;
}
+ return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- ClipboardManager clipboard =
- (ClipboardManager) getContext().getSystemService(
- Context.CLIPBOARD_SERVICE);
+ final ClipboardManager clipboard = (ClipboardManager) getContext()
+ .getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard.hasPrimaryClip()) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.paste, menu);
@@ -68,75 +62,59 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
}
@Override
- public void onDestroyActionMode(ActionMode mode) {
- mActionMode = null;
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
}
@Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- return false;
+ public void onDestroyActionMode(ActionMode mode) {
+ mActionMode = null;
}
};
- private PasteListener mPasteListener;
-
- public void setPasteListener(PasteListener pasteListener) {
- mPasteListener = pasteListener;
- }
-
- private void pasteContent() {
- ClipboardManager clipboard =
- (ClipboardManager) getContext().getSystemService(
- Context.CLIPBOARD_SERVICE);
- ClipData cd = clipboard.getPrimaryClip();
- ClipData.Item item = cd.getItemAt(0);
- // TODO: Should we handle multiple selections?
- Uri uri = item.getUri();
- if (uri == null || !mPasteListener.paste(uri)) {
- mPasteListener.paste(item.coerceToText(getContext()).toString());
- }
- }
+ // Temporary paint for use in layout methods.
+ private final TextPaint mTempPaint = new TextPaint();
private final float mMaximumTextSize;
private final float mMinimumTextSize;
private final float mStepTextSize;
- // Temporary paint for use in layout methods.
- private final Paint mTempPaint = new TextPaint();
-
private int mWidthConstraint = -1;
+
+ private ActionMode mActionMode;
+
+ private OnPasteListener mOnPasteListener;
private OnTextSizeChangeListener mOnTextSizeChangeListener;
public CalculatorText(Context context) {
- this(context, null);
+ this(context, null /* attrs */);
}
public CalculatorText(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
+ this(context, attrs, 0 /* defStyleAttr */);
}
- public CalculatorText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public CalculatorText(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
final TypedArray a = context.obtainStyledAttributes(
- attrs, R.styleable.CalculatorText, defStyle, 0);
+ attrs, R.styleable.CalculatorText, defStyleAttr, 0);
mMaximumTextSize = a.getDimension(
R.styleable.CalculatorText_maxTextSize, getTextSize());
mMinimumTextSize = a.getDimension(
R.styleable.CalculatorText_minTextSize, getTextSize());
mStepTextSize = a.getDimension(R.styleable.CalculatorText_stepTextSize,
(mMaximumTextSize - mMinimumTextSize) / 3);
-
a.recycle();
- // Paste ActionMode is triggered explicitly, not through
- // setCustomSelectionActionModeCallback.
- setOnLongClickListener(this);
-
- // Enable scrolling
+ // Allow scrolling by default.
setMovementMethod(ScrollingMovementMethod.getInstance());
- setTextSize(TypedValue.COMPLEX_UNIT_PX, mMaximumTextSize);
+ // Reset the clickable flag, which is added when specifying a movement method.
+ setClickable(false);
+
+ // Add a long click to start the ActionMode manually.
+ setOnLongClickListener(this);
}
@Override
@@ -147,16 +125,21 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
// Prevent shrinking/resizing with our variable textSize.
if (!isLaidOut()) {
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, mMaximumTextSize);
setMinHeight(getLineHeight() + getCompoundPaddingBottom() + getCompoundPaddingTop());
}
- mWidthConstraint = MeasureSpec.getSize(widthMeasureSpec)
+ // Re-calculate our textSize based on new width.
+ final int width = MeasureSpec.getSize(widthMeasureSpec)
- getPaddingLeft() - getPaddingRight();
- setTextSize(TypedValue.COMPLEX_UNIT_PX, getVariableTextSize(getText().toString()));
+ if (mWidthConstraint != width) {
+ mWidthConstraint = width;
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, getVariableTextSize(getText()));
+ }
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public int getWidthConstraint() { return mWidthConstraint; }
@@ -178,10 +161,6 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
}
}
- public void setOnTextSizeChangeListener(OnTextSizeChangeListener listener) {
- mOnTextSizeChangeListener = listener;
- }
-
public float getMinimumTextSize() {
return mMinimumTextSize;
}
@@ -190,7 +169,7 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
return mMaximumTextSize;
}
- public float getVariableTextSize(String text) {
+ public float getVariableTextSize(CharSequence text) {
if (mWidthConstraint < 0 || mMaximumTextSize <= mMinimumTextSize) {
// Not measured, bail early.
return getTextSize();
@@ -202,13 +181,11 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
// Step through increasing text sizes until the text would no longer fit.
float lastFitTextSize = mMinimumTextSize;
while (lastFitTextSize < mMaximumTextSize) {
- final float nextSize = Math.min(lastFitTextSize + mStepTextSize, mMaximumTextSize);
- mTempPaint.setTextSize(nextSize);
- if (mTempPaint.measureText(text) > mWidthConstraint) {
+ mTempPaint.setTextSize(Math.min(lastFitTextSize + mStepTextSize, mMaximumTextSize));
+ if (Layout.getDesiredWidth(text, mTempPaint) > mWidthConstraint) {
break;
- } else {
- lastFitTextSize = nextSize;
}
+ lastFitTextSize = mTempPaint.getTextSize();
}
return lastFitTextSize;
@@ -222,12 +199,28 @@ public class CalculatorText extends AlignedTextView implements View.OnLongClickL
return false;
}
+ public void setOnTextSizeChangeListener(OnTextSizeChangeListener listener) {
+ mOnTextSizeChangeListener = listener;
+ }
+
+ public void setOnPasteListener(OnPasteListener listener) {
+ mOnPasteListener = listener;
+ }
+
+ private void paste() {
+ final ClipboardManager clipboard = (ClipboardManager) getContext()
+ .getSystemService(Context.CLIPBOARD_SERVICE);
+ final ClipData primaryClip = clipboard.getPrimaryClip();
+ if (primaryClip != null && mOnPasteListener != null) {
+ mOnPasteListener.onPaste(primaryClip);
+ }
+ }
+
public interface OnTextSizeChangeListener {
void onTextSizeChanged(TextView textView, float oldSize);
}
- public interface PasteListener {
- void paste(String s);
- boolean paste(Uri u);
+ public interface OnPasteListener {
+ boolean onPaste(ClipData clip);
}
}