summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorKamaljeet Maini <kmaini@cyngn.com>2016-04-22 14:43:25 -0700
committerKamaljeet Maini <kmaini@cyngn.com>2016-05-05 16:55:10 -0700
commitf023f97370cfbe775a1fab04da3699e0f82c066b (patch)
tree06bf876c8db986469aac7e1deb28126734331cc1 /src/com
parent24250966360cb48fc8ed64224ea67a03f34454b6 (diff)
downloadandroid_packages_apps_InCallUI-f023f97370cfbe775a1fab04da3699e0f82c066b.tar.gz
android_packages_apps_InCallUI-f023f97370cfbe775a1fab04da3699e0f82c066b.tar.bz2
android_packages_apps_InCallUI-f023f97370cfbe775a1fab04da3699e0f82c066b.zip
Add new options for call waiting response in InCallUI
When an incoming call is received while there is already an active call, the user will be given four choices for the response: 1) Left button: hold the current call and answer incoming call 2) Bottom button: end the current call and answer the incoming call 3) Right button: decline the incoming call 4) Top button: Send a text message to the incoming caller if texting is enabled The changes in this component include updated icon graphics, display of text hints, and new APIs for additonal flag. Change-Id: Ic97e0fde12ae98afa0124f4bb5326e874a146e91
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/incallui/AnswerFragment.java51
-rw-r--r--src/com/android/incallui/AnswerPresenter.java33
-rw-r--r--src/com/android/incallui/GlowPadWrapper.java12
-rw-r--r--src/com/android/incallui/TelecomAdapter.java9
-rw-r--r--src/com/android/incallui/widget/multiwaveview/GlowPadView.java81
5 files changed, 174 insertions, 12 deletions
diff --git a/src/com/android/incallui/AnswerFragment.java b/src/com/android/incallui/AnswerFragment.java
index 6ed5e558..2dfba187 100644
--- a/src/com/android/incallui/AnswerFragment.java
+++ b/src/com/android/incallui/AnswerFragment.java
@@ -21,6 +21,7 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
import android.text.Editable;
import android.text.TextWatcher;
@@ -57,6 +58,9 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
public static final int TARGET_SET_FOR_VIDEO_WITHOUT_SMS_WITH_BLOCK = 5;
public static final int TARGET_SET_FOR_VIDEO_WITH_SMS = 6;
public static final int TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST = 7;
+ public static final int TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_CALL_WAITING = 8;
+ public static final int TARGET_SET_FOR_AUDIO_WITH_SMS_AND_CALL_WAITING = 9;
+
public static final int TARGET_SET_FOR_QTI_VIDEO_WITHOUT_SMS = 1000;
public static final int TARGET_SET_FOR_QTI_VIDEO_WITH_SMS = 1001;
@@ -71,12 +75,15 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
int targetResourceId;
int targetDescriptionsResourceId;
int directionDescriptionsResourceId;
+ int targetDisplayTextResourceId;
int handleDrawableResourceId;
- public TargetResources(int target, int descs, int directionDescs, int handle) {
+ public TargetResources(int target, int descs, int directionDescs, int displayText, int
+ handle) {
targetResourceId = target;
targetDescriptionsResourceId = descs;
directionDescriptionsResourceId = directionDescs;
+ targetDisplayTextResourceId = displayText;
handleDrawableResourceId = handle;
}
}
@@ -87,66 +94,93 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.incoming_call_widget_audio_without_sms_and_block_targets,
R.array.incoming_call_widget_audio_without_sms_and_block_target_descriptions,
R.array.incoming_call_widget_audio_without_sms_and_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_without_sms_and_block_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_BLOCK, new TargetResources(
R.array.incoming_call_widget_audio_without_sms_with_block_targets,
R.array.incoming_call_widget_audio_without_sms_with_block_target_descriptions,
R.array.incoming_call_widget_audio_without_sms_with_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_without_sms_with_block_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITH_SMS_WITHOUT_BLOCK, new TargetResources(
R.array.incoming_call_widget_audio_with_sms_without_block_targets,
R.array.incoming_call_widget_audio_with_sms_without_block_target_descriptions,
R.array.incoming_call_widget_audio_with_sms_without_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_without_block_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITH_SMS_AND_BLOCK, new TargetResources(
R.array.incoming_call_widget_audio_with_sms_and_block_targets,
R.array.incoming_call_widget_audio_with_sms_and_block_target_descriptions,
R.array.incoming_call_widget_audio_with_sms_and_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_and_block_display_text,
+ R.drawable.ic_incall_audio_handle
+ ));
+ RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_CALL_WAITING, new TargetResources(
+ R.array.incoming_call_widget_audio_without_sms_with_call_waiting_targets,
+ R.array
+ .incoming_call_widget_audio_without_sms_with_call_waiting_target_descriptions,
+ R.array
+ .incoming_call_widget_audio_without_sms_with_call_waiting_direction_descriptions,
+ R.array.incoming_call_widget_audio_without_sms_with_call_waiting_display_text,
+ R.drawable.ic_incall_audio_handle
+ ));
+ RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITH_SMS_AND_CALL_WAITING, new TargetResources(
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_targets,
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_target_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_direction_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_WITHOUT_SMS_AND_BLOCK, new TargetResources(
R.array.incoming_call_widget_video_without_sms_and_block_targets,
R.array.incoming_call_widget_video_without_sms_and_block_target_descriptions,
R.array.incoming_call_widget_video_without_sms_and_block_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_WITHOUT_SMS_WITH_BLOCK, new TargetResources(
R.array.incoming_call_widget_video_without_sms_targets,
R.array.incoming_call_widget_video_without_sms_target_descriptions,
R.array.incoming_call_widget_video_without_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_WITH_SMS, new TargetResources(
R.array.incoming_call_widget_video_with_sms_targets,
R.array.incoming_call_widget_video_with_sms_target_descriptions,
R.array.incoming_call_widget_video_with_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST, new TargetResources(
R.array.incoming_call_widget_video_request_targets,
R.array.incoming_call_widget_video_request_target_descriptions,
R.array.incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_WITHOUT_SMS, new TargetResources(
R.array.qti_incoming_call_widget_video_without_sms_targets,
R.array.qti_incoming_call_widget_video_without_sms_target_descriptions,
R.array.qti_incoming_call_widget_video_without_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_WITH_SMS, new TargetResources(
R.array.qti_incoming_call_widget_video_with_sms_targets,
R.array.qti_incoming_call_widget_video_with_sms_target_descriptions,
R.array.qti_incoming_call_widget_video_with_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_ACCEPT_REJECT_REQUEST, new TargetResources(
R.array.qti_incoming_call_widget_video_request_targets,
R.array.qti_incoming_call_widget_video_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_BIDIRECTIONAL_VIDEO_ACCEPT_REJECT_REQUEST,
@@ -154,6 +188,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.qti_incoming_call_widget_bidirectional_video_accept_reject_request_targets,
R.array.qti_incoming_call_widget_video_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_TRANSMIT_ACCEPT_REJECT_REQUEST,
@@ -161,6 +196,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.qti_incoming_call_widget_video_transmit_accept_reject_request_targets,
R.array.qti_incoming_call_widget_video_transmit_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_RECEIVE_ACCEPT_REJECT_REQUEST,
@@ -168,18 +204,21 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.qti_incoming_call_widget_video_receive_accept_reject_request_targets,
R.array.qti_incoming_call_widget_video_receive_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_AUDIO_WITH_SMS, new TargetResources(
R.array.qti_incoming_call_widget_audio_with_sms_targets,
R.array.qti_incoming_call_widget_audio_with_sms_target_descriptions,
R.array.qti_incoming_call_widget_audio_with_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_AUDIO_WITHOUT_SMS, new TargetResources(
R.array.qti_incoming_call_widget_audio_without_sms_targets,
R.array.qti_incoming_call_widget_audio_without_sms_target_descriptions,
R.array.qti_incoming_call_widget_audio_without_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_audio_handle
));
}
@@ -275,6 +314,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
mGlowpad.setTargetDescriptionsResourceId(res.targetDescriptionsResourceId);
mGlowpad.setDirectionDescriptionsResourceId(res.directionDescriptionsResourceId);
mGlowpad.setHandleDrawable(res.handleDrawableResourceId);
+ mGlowpad.setTargetDisplayTextResourceId(res.targetDisplayTextResourceId);
mGlowpad.reset(false);
}
}
@@ -442,7 +482,14 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
@Override
public void onAnswer(int videoState, Context context) {
Log.d(this, "onAnswer videoState=" + videoState + " context=" + context);
- getPresenter().onAnswer(videoState, context);
+ getPresenter().onAnswer(videoState, context, TelecomManager
+ .CALL_WAITING_RESPONSE_NO_POPUP_END_CALL);
+ }
+
+ @Override
+ public void onAnswer(int videoState, Context context, int callWaitingResponseType) {
+ Log.d(this, "onAnswer videoState=" + videoState + " context=" + context);
+ getPresenter().onAnswer(videoState, context, callWaitingResponseType);
}
@Override
diff --git a/src/com/android/incallui/AnswerPresenter.java b/src/com/android/incallui/AnswerPresenter.java
index 2fdccdb2..ddf6c0dc 100644
--- a/src/com/android/incallui/AnswerPresenter.java
+++ b/src/com/android/incallui/AnswerPresenter.java
@@ -439,7 +439,7 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
return phoneId;
}
- public void onAnswer(int videoState, Context context) {
+ public void onAnswer(int videoState, Context context, int callWaitingResponseType) {
int phoneId = getActivePhoneId();
Log.i(this, "onAnswer mCallId:" + mCallId + "phoneId:" + phoneId);
if (mCallId == null || phoneId == -1) {
@@ -452,7 +452,8 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
InCallPresenter.getInstance().acceptUpgradeRequest(videoState, context);
} else {
Log.d(this, "onAnswer (answerCall) mCallId=" + mCallId + " videoState=" + videoState);
- TelecomAdapter.getInstance().answerCall(mCall[phoneId].getId(), videoState);
+ TelecomAdapter.getInstance().answerCall(mCall[phoneId].getId(), videoState,
+ callWaitingResponseType);
}
}
@@ -554,6 +555,9 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
&& mHasTextMessages;
boolean withBlock = isBlockingEnabled();
+ Call activeCall = CallList.getInstance().getActiveCall();
+ boolean isCallWaiting = activeCall != null && activeCall != call;
+
// Only present the user with the option to answer as a video call if the incoming call is
// a bi-directional video call.
if (call.isVideoCall(getUi().getContext())) {
@@ -575,14 +579,25 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
}
} else {
if (withSms) {
- getUi().showTargets(withBlock
- ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_AND_BLOCK
- : AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_WITHOUT_BLOCK);
- getUi().configureMessageDialog(textMsgs);
+ if (isCallWaiting) {
+ getUi().showTargets(AnswerFragment
+ .TARGET_SET_FOR_AUDIO_WITH_SMS_AND_CALL_WAITING);
+ getUi().configureMessageDialog(textMsgs);
+ } else {
+ getUi().showTargets(withBlock
+ ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_AND_BLOCK
+ : AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_WITHOUT_BLOCK);
+ getUi().configureMessageDialog(textMsgs);
+ }
} else {
- getUi().showTargets(withBlock
- ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_BLOCK
- : AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_AND_BLOCK);
+ if (isCallWaiting) {
+ getUi().showTargets(AnswerFragment
+ .TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_CALL_WAITING);
+ } else {
+ getUi().showTargets(withBlock
+ ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_BLOCK
+ : AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_AND_BLOCK);
+ }
}
}
}
diff --git a/src/com/android/incallui/GlowPadWrapper.java b/src/com/android/incallui/GlowPadWrapper.java
index eff43a1c..369bfe20 100644
--- a/src/com/android/incallui/GlowPadWrapper.java
+++ b/src/com/android/incallui/GlowPadWrapper.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.telecom.VideoProfile;
+import android.telecom.TelecomManager;
import android.util.AttributeSet;
import android.view.View;
@@ -149,6 +150,16 @@ public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTrigger
mAnswerListener.onDeflect(getContext());
mTargetTriggered = true;
break;
+ case R.drawable.ic_lockscreen_answer_hold_current:
+ mAnswerListener.onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext(),
+ TelecomManager.CALL_WAITING_RESPONSE_NO_POPUP_HOLD_CALL);
+ mTargetTriggered = true;
+ break;
+ case R.drawable.ic_lockscreen_answer_end_current:
+ mAnswerListener.onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext(),
+ TelecomManager.CALL_WAITING_RESPONSE_NO_POPUP_END_CALL);
+ mTargetTriggered = true;
+ break;
default:
// Code should never reach here.
Log.e(this, "Trigger detected on unhandled resource. Skipping.");
@@ -180,6 +191,7 @@ public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTrigger
public interface AnswerListener {
void onAnswer(int videoState, Context context);
+ void onAnswer(int videoState, Context context, int callWaitingResponseType);
void onDecline(Context context);
void onDeclineUpgradeRequest(Context context);
void onText();
diff --git a/src/com/android/incallui/TelecomAdapter.java b/src/com/android/incallui/TelecomAdapter.java
index 5de28f5f..ce5f75b6 100644
--- a/src/com/android/incallui/TelecomAdapter.java
+++ b/src/com/android/incallui/TelecomAdapter.java
@@ -68,6 +68,15 @@ final class TelecomAdapter implements InCallServiceListener {
}
}
+ void answerCall(String callId, int videoState, int callWaitingResponseType) {
+ android.telecom.Call call = getTelecommCallById(callId);
+ if (call != null) {
+ call.answer(videoState, callWaitingResponseType);
+ } else {
+ Log.e(this, "error answerCall, call not in call list: " + callId);
+ }
+ }
+
void rejectCall(String callId, boolean rejectWithMessage, String message) {
android.telecom.Call call = getTelecommCallById(callId);
if (call != null) {
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);