Allow longpress only when valid copy/paste exists.

Bug: 30499529
Change-Id: I9ee0520b51e1643f0912bd8e01be7c6106fa48d6
diff --git a/src/com/android/calculator2/CalculatorText.java b/src/com/android/calculator2/CalculatorText.java
index de2a843..0ae9283 100644
--- a/src/com/android/calculator2/CalculatorText.java
+++ b/src/com/android/calculator2/CalculatorText.java
@@ -25,6 +25,7 @@
 import android.os.Build;
 import android.text.Layout;
 import android.text.TextPaint;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.ActionMode;
@@ -38,7 +39,8 @@
 /**
  * TextView adapted for Calculator display.
  */
-public class CalculatorText extends AlignedTextView implements MenuItem.OnMenuItemClickListener {
+public class CalculatorText extends AlignedTextView implements MenuItem.OnMenuItemClickListener,
+        ClipboardManager.OnPrimaryClipChangedListener {
 
     public static final String TAG_ACTION_MODE = "ACTION_MODE";
 
@@ -49,6 +51,8 @@
     private final float mMinimumTextSize;
     private final float mStepTextSize;
 
+    private final ClipboardManager mClipboardManager;
+
     private int mWidthConstraint = -1;
     private ActionMode mActionMode;
     private ActionMode.Callback mPasteActionModeCallback;
@@ -67,6 +71,8 @@
     public CalculatorText(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);
         mMaximumTextSize = a.getDimension(
@@ -112,6 +118,21 @@
     }
 
     @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
+        mClipboardManager.addPrimaryClipChangedListener(this);
+        onPrimaryClipChanged();
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+
+        mClipboardManager.removePrimaryClipChangedListener(this);
+    }
+
+    @Override
     protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
         super.onTextChanged(text, start, lengthBefore, lengthAfter);
 
@@ -332,6 +353,17 @@
         return false;
     }
 
+    @Override
+    public void onPrimaryClipChanged() {
+        final ClipData clip = mClipboardManager.getPrimaryClip();
+        if (clip == null || clip.getItemCount() == 0) {
+            setLongClickable(false);
+            return;
+        }
+        final CharSequence clipText = clip.getItemAt(0).coerceToText(getContext());
+        setLongClickable(!TextUtils.isEmpty(clipText));
+    }
+
     public interface OnTextSizeChangeListener {
         void onTextSizeChanged(TextView textView, float oldSize);
     }