summaryrefslogtreecommitdiffstats
path: root/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/incallui/widget/multiwaveview/GlowPadView.java')
-rw-r--r--src/com/android/incallui/widget/multiwaveview/GlowPadView.java81
1 files changed, 80 insertions, 1 deletions
diff --git a/src/com/android/incallui/widget/multiwaveview/GlowPadView.java b/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
index 23200279..acbcdba6 100644
--- a/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
+++ b/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
@@ -29,6 +29,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -37,6 +38,10 @@ import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.support.v4.widget.ExploreByTouchHelper;
+import android.text.DynamicLayout;
+import android.text.Layout.Alignment;
+import android.text.SpannableStringBuilder;
+import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -137,6 +142,14 @@ public class GlowPadView extends View {
private AccessibilityNodeProvider mAccessibilityNodeProvider;
private GlowpadExploreByTouchHelper mExploreByTouchHelper;
+ private ArrayList<String> mTargetDisplayText;
+ private boolean mShowHintText = false;
+ private int mTargetDisplayTextResourceId;
+ private TextPaint mTextPaint;
+ private DynamicLayout mTextLayout;
+ private SpannableStringBuilder mDisplayText;
+ private int mDisplayTextWidth;
+
private class AnimationBundle extends ArrayList<Tweener> {
private static final long serialVersionUID = 0xA84D78726F127468L;
private boolean mSuspended;
@@ -274,12 +287,36 @@ public class GlowPadView extends View {
setDirectionDescriptionsResourceId(resourceId);
}
+ // Read array of display text
+ if (a.getValue(R.styleable.GlowPadView_targetDisplayText, outValue)) {
+ final int resourceId = outValue.resourceId;
+ if (resourceId == 0) {
+ throw new IllegalStateException("Must specify display text");
+ }
+ setTargetDisplayTextResourceId(resourceId);
+ }
+
+ mTextPaint = new TextPaint();
+ mTextPaint.setColor(getResources().getColor(R.color.incoming_call_display_text));
+
+ // This SpannableStringBuilder is used as first parameter when creating DynamicLayout.
+ // DynamicLayout creates instance of internal static class DynamicLayout.ChangeWatcher
+ // and attaches it to SpannableStringBuilder. As a result, whenever
+ // SpannableStringBuilder is updated, DynamicLayout receives change notification
+ mDisplayText = new SpannableStringBuilder("");
+
+ mDisplayTextWidth = (int) (getRingWidth() - mMaxTargetWidth - getResources()
+ .getDimensionPixelSize(R.dimen.incoming_call_widget_display_text_side_offset));
+ mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen
+ .incoming_call_display_text_size));
+ mTextLayout = new DynamicLayout(mDisplayText, mTextPaint, mDisplayTextWidth,
+ android.text.Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
+
// Use gravity attribute from LinearLayout
//a = context.obtainStyledAttributes(attrs, R.styleable.LinearLayout);
mGravity = a.getInt(R.styleable.GlowPadView_android_gravity, Gravity.TOP);
a.recycle();
-
setVibrateEnabled(mVibrationDuration > 0);
assignDefaultsIfNeeded();
@@ -678,6 +715,18 @@ public class GlowPadView extends View {
}
/**
+ * Sets the resource id specifying the target display text
+ *
+ * @param resourceId The resource id.
+ */
+ public void setTargetDisplayTextResourceId(int resourceId) {
+ mTargetDisplayTextResourceId = resourceId;
+ if (mTargetDisplayText != null) {
+ mTargetDisplayText.clear();
+ }
+ }
+
+ /**
* Gets the resource id specifying the target descriptions for accessibility.
*
* @return The resource id.
@@ -943,9 +992,11 @@ public class GlowPadView extends View {
if (activeTarget != -1) {
switchToState(STATE_SNAP, x,y);
updateGlowPosition(x, y);
+ mShowHintText = true;
} else {
switchToState(STATE_TRACKING, x, y);
updateGlowPosition(x, y);
+ mShowHintText = false;
}
if (mActiveTarget != activeTarget) {
@@ -1196,6 +1247,18 @@ public class GlowPadView extends View {
target.draw(canvas);
}
}
+ if (mShowHintText && mActiveTarget >= 0) {
+ String displayText = getTargetDisplayText(mActiveTarget);
+
+ if (displayText != null && !TextUtils.equals(displayText, mDisplayText.toString())) {
+ mDisplayText.replace(0, mDisplayText.length(), displayText);
+ }
+ int textHeight = mTextLayout.getHeight();
+ canvas.save();
+ canvas.translate(mWaveCenterX-mDisplayTextWidth/2, mWaveCenterY-textHeight/2);
+ mTextLayout.draw(canvas);
+ canvas.restore();
+ }
mHandleDrawable.draw(canvas);
}
@@ -1253,6 +1316,22 @@ public class GlowPadView extends View {
return mTargetDescriptions.get(index);
}
+ private String getTargetDisplayText(int index) {
+ if (mTargetDisplayText == null || mTargetDisplayText.isEmpty()) {
+ mTargetDisplayText = loadDescriptions(mTargetDisplayTextResourceId);
+ if (mTargetDrawables.size() > mTargetDisplayText.size()) {
+ Log.w(TAG, "The number of target drawables must be"
+ + " less than or equal to the number of target display text.");
+ return null;
+ }
+ }
+ if (index < mTargetDisplayText.size()) {
+ return mTargetDisplayText.get(index);
+ } else {
+ return null;
+ }
+ }
+
private String getDirectionDescription(int index) {
if (mDirectionDescriptions == null || mDirectionDescriptions.isEmpty()) {
mDirectionDescriptions = loadDescriptions(mDirectionDescriptionsResourceId);