SuggestionStripView.java revision 923bf41f853a544fd0d71fbf7dc90359ec35981
1923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/* 2923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Copyright (C) 2008-2009 Google Inc. 3923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * 4923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 6923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * the License at 7923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * 8923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * 10923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * License for the specific language governing permissions and limitations under 14923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * the License. 15923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */ 16923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 17923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpackage com.android.inputmethod.latin; 18923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 19923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport java.util.ArrayList; 20923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport java.util.Arrays; 21923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport java.util.List; 22923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 23923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.content.Context; 24923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.content.Intent; 25923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.graphics.Canvas; 26923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.graphics.Paint; 27923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.graphics.Rect; 28923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.graphics.Typeface; 29923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.graphics.drawable.Drawable; 30923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.os.Handler; 31923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.os.Message; 32923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.util.AttributeSet; 33923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.view.GestureDetector; 34923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.view.Gravity; 35923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.view.LayoutInflater; 36923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.view.MotionEvent; 37923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.view.View; 38923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.view.ViewGroup.LayoutParams; 39923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.widget.PopupWindow; 40923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.widget.TextView; 41923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 42923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpublic class CandidateView extends View { 43923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 44923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final int OUT_OF_BOUNDS = -1; 45923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final List<CharSequence> EMPTY_LIST = new ArrayList<CharSequence>(); 46923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 47923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private LatinIME mService; 48923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private List<CharSequence> mSuggestions = EMPTY_LIST; 49923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private boolean mShowingCompletions; 50923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private CharSequence mSelectedString; 51923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mSelectedIndex; 52923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mTouchX = OUT_OF_BOUNDS; 53923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private Drawable mSelectionHighlight; 54923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private boolean mTypedWordValid; 55923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 56923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private boolean mHaveMinimalSuggestion; 57923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 58923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private Rect mBgPadding; 59923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 60923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private TextView mPreviewText; 61923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private PopupWindow mPreviewPopup; 62923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mCurrentWordIndex; 63923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private Drawable mDivider; 64923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 65923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final int MAX_SUGGESTIONS = 32; 66923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final int SCROLL_PIXELS = 20; 67923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 68923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final int MSG_REMOVE_PREVIEW = 1; 69923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final int MSG_REMOVE_THROUGH_PREVIEW = 2; 70923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 71923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int[] mWordWidth = new int[MAX_SUGGESTIONS]; 72923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int[] mWordX = new int[MAX_SUGGESTIONS]; 73923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mPopupPreviewX; 74923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mPopupPreviewY; 75923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 76923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private static final int X_GAP = 10; 77923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 78923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mColorNormal; 79923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mColorRecommended; 80923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mColorOther; 81923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private Paint mPaint; 82923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mDescent; 83923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private boolean mScrolled; 84923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mTargetScrollX; 85923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 86923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private int mTotalWidth; 87923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 88923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private GestureDetector mGestureDetector; 89923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 90923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project Handler mHandler = new Handler() { 91923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project @Override 92923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void handleMessage(Message msg) { 93923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project switch (msg.what) { 94923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project case MSG_REMOVE_PREVIEW: 95923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewText.setVisibility(GONE); 96923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 97923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project case MSG_REMOVE_THROUGH_PREVIEW: 98923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewText.setVisibility(GONE); 99923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mTouchX != OUT_OF_BOUNDS) { 100923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project removeHighlight(); 101923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 102923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 103923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 104923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 105923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 106923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project }; 107923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 108923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project /** 109923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Construct a CandidateView for showing suggested words for completion. 110923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * @param context 111923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * @param attrs 112923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */ 113923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public CandidateView(Context context, AttributeSet attrs) { 114923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project super(context, attrs); 115923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectionHighlight = context.getResources().getDrawable( 116923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project com.android.internal.R.drawable.list_selector_background_pressed); 117923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 118923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project LayoutInflater inflate = 119923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project (LayoutInflater) context 120923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 121923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup = new PopupWindow(context); 122923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewText = (TextView) inflate.inflate(R.layout.candidate_preview, null); 123923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 124923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.setContentView(mPreviewText); 125923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.setBackgroundDrawable(null); 126923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mColorNormal = context.getResources().getColor(R.color.candidate_normal); 127923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mColorRecommended = context.getResources().getColor(R.color.candidate_recommended); 128923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mColorOther = context.getResources().getColor(R.color.candidate_other); 129923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mDivider = context.getResources().getDrawable(R.drawable.keyboard_suggest_strip_divider); 130923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 131923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPaint = new Paint(); 132923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPaint.setColor(mColorNormal); 133923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPaint.setAntiAlias(true); 134923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPaint.setTextSize(mPreviewText.getTextSize()); 135923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPaint.setStrokeWidth(0); 136923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mDescent = (int) mPaint.descent(); 137923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 138923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 139923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project @Override 140923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void onLongPress(MotionEvent me) { 141923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mSuggestions.size() > 0) { 142923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (me.getX() + mScrollX < mWordWidth[0] && mScrollX < 10) { 143923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project longPressFirstWord(); 144923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 145923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 146923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 147923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 148923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project @Override 149923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public boolean onScroll(MotionEvent e1, MotionEvent e2, 150923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project float distanceX, float distanceY) { 151923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrolled = true; 152923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX += distanceX; 153923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mScrollX < 0) { 154923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX = 0; 155923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 156923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mScrollX + getWidth() > mTotalWidth) { 157923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX -= distanceX; 158923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 159923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTargetScrollX = mScrollX; 160923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project showPreview(OUT_OF_BOUNDS, null); 161923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 162923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project return true; 163923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 164923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project }); 165923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project setHorizontalFadingEdgeEnabled(true); 166923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project setWillNotDraw(false); 167923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project setHorizontalScrollBarEnabled(false); 168923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project setVerticalScrollBarEnabled(false); 169923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX = 0; 170923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 171923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 172923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project /** 173923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * A connection back to the service to communicate with the text field 174923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * @param listener 175923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */ 176923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void setService(LatinIME listener) { 177923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mService = listener; 178923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 179923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 180923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project @Override 181923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public int computeHorizontalScrollRange() { 182923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project return mTotalWidth; 183923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 184923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 185923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project /** 186923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * If the canvas is null, then only touch calculations are performed to pick the target 187923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * candidate. 188923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */ 189923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project @Override 190923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project protected void onDraw(Canvas canvas) { 191923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (canvas != null) { 192923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project super.onDraw(canvas); 193923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 194923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTotalWidth = 0; 195923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mSuggestions == null) return; 196923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 197923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int height = getHeight(); 198923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mBgPadding == null) { 199923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mBgPadding = new Rect(0, 0, 0, 0); 200923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (getBackground() != null) { 201923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project getBackground().getPadding(mBgPadding); 202923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 203923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mDivider.setBounds(0, mBgPadding.top, mDivider.getIntrinsicWidth(), 204923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mDivider.getIntrinsicHeight()); 205923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 206923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int x = 0; 207923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int count = mSuggestions.size(); 208923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int width = getWidth(); 209923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final Rect bgPadding = mBgPadding; 210923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final Paint paint = mPaint; 211923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int touchX = mTouchX; 212923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int scrollX = mScrollX; 213923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final boolean scrolled = mScrolled; 214923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final boolean typedWordValid = mTypedWordValid; 215923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int y = (int) (height + mPaint.getTextSize() - mDescent) / 2; 216923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 217923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project for (int i = 0; i < count; i++) { 218923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project CharSequence suggestion = mSuggestions.get(i); 219923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (suggestion == null) continue; 220923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project paint.setColor(mColorNormal); 221923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mHaveMinimalSuggestion 222923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) { 223923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project paint.setTypeface(Typeface.DEFAULT_BOLD); 224923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project paint.setColor(mColorRecommended); 225923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } else if (i != 0) { 226923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project paint.setColor(mColorOther); 227923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 228923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int wordWidth; 229923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mWordWidth[i] != 0) { 230923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project wordWidth = mWordWidth[i]; 231923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } else { 232923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project float textWidth = paint.measureText(suggestion, 0, suggestion.length()); 233923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project wordWidth = (int) textWidth + X_GAP * 2; 234923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mWordWidth[i] = wordWidth; 235923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 236923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 237923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mWordX[i] = x; 238923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 239923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (touchX + scrollX >= x && touchX + scrollX < x + wordWidth && !scrolled) { 240923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (canvas != null) { 241923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project canvas.translate(x, 0); 242923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height); 243923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectionHighlight.draw(canvas); 244923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project canvas.translate(-x, 0); 245923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project showPreview(i, null); 246923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 247923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedString = suggestion; 248923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedIndex = i; 249923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 250923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 251923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (canvas != null) { 252923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project canvas.drawText(suggestion, 0, suggestion.length(), x + X_GAP, y, paint); 253923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project paint.setColor(mColorOther); 254923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project canvas.translate(x + wordWidth, 0); 255923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mDivider.draw(canvas); 256923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project canvas.translate(-x - wordWidth, 0); 257923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 258923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project paint.setTypeface(Typeface.DEFAULT); 259923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project x += wordWidth; 260923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 261923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTotalWidth = x; 262923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mTargetScrollX != mScrollX) { 263923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project scrollToTarget(); 264923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 265923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 266923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 267923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private void scrollToTarget() { 268923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mTargetScrollX > mScrollX) { 269923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX += SCROLL_PIXELS; 270923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mScrollX >= mTargetScrollX) { 271923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX = mTargetScrollX; 272923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project requestLayout(); 273923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 274923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } else { 275923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX -= SCROLL_PIXELS; 276923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mScrollX <= mTargetScrollX) { 277923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX = mTargetScrollX; 278923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project requestLayout(); 279923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 280923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 281923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 282923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 283923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 284923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void setSuggestions(List<CharSequence> suggestions, boolean completions, 285923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project boolean typedWordValid, boolean haveMinimalSuggestion) { 286923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project clear(); 287923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (suggestions != null) { 288923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSuggestions = new ArrayList<CharSequence>(suggestions); 289923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 290923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mShowingCompletions = completions; 291923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTypedWordValid = typedWordValid; 292923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrollX = 0; 293923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTargetScrollX = 0; 294923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mHaveMinimalSuggestion = haveMinimalSuggestion; 295923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project // Compute the total width 296923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project onDraw(null); 297923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 298923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project requestLayout(); 299923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 300923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 301923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void scrollPrev() { 302923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int i = 0; 303923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int count = mSuggestions.size(); 304923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int firstItem = 0; // Actually just before the first item, if at the boundary 305923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project while (i < count) { 306923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mWordX[i] < mScrollX 307923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project && mWordX[i] + mWordWidth[i] >= mScrollX - 1) { 308923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project firstItem = i; 309923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 310923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 311923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project i++; 312923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 313923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int leftEdge = mWordX[firstItem] + mWordWidth[firstItem] - getWidth(); 314923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (leftEdge < 0) leftEdge = 0; 315923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project updateScrollPosition(leftEdge); 316923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 317923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 318923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void scrollNext() { 319923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int i = 0; 320923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int targetX = mScrollX; 321923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int count = mSuggestions.size(); 322923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int rightEdge = mScrollX + getWidth(); 323923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project while (i < count) { 324923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mWordX[i] <= rightEdge && 325923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mWordX[i] + mWordWidth[i] >= rightEdge) { 326923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project targetX = Math.min(mWordX[i], mTotalWidth - getWidth()); 327923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 328923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 329923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project i++; 330923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 331923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project updateScrollPosition(targetX); 332923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 333923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 334923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private void updateScrollPosition(int targetX) { 335923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (targetX != mScrollX) { 336923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project // TODO: Animate 337923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTargetScrollX = targetX; 338923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project requestLayout(); 339923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 340923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrolled = true; 341923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 342923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 343923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 344923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void clear() { 345923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSuggestions = EMPTY_LIST; 346923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTouchX = OUT_OF_BOUNDS; 347923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedString = null; 348923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedIndex = -1; 349923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 350923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project Arrays.fill(mWordWidth, 0); 351923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project Arrays.fill(mWordX, 0); 352923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mPreviewPopup.isShowing()) { 353923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.dismiss(); 354923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 355923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 356923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 357923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project @Override 358923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public boolean onTouchEvent(MotionEvent me) { 359923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 360923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mGestureDetector.onTouchEvent(me)) { 361923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project return true; 362923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 363923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 364923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int action = me.getAction(); 365923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int x = (int) me.getX(); 366923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int y = (int) me.getY(); 367923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTouchX = x; 368923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 369923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project switch (action) { 370923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project case MotionEvent.ACTION_DOWN: 371923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mScrolled = false; 372923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 373923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 374923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project case MotionEvent.ACTION_MOVE: 375923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (y <= 0) { 376923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project // Fling up!? 377923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mSelectedString != null) { 378923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (!mShowingCompletions) { 379923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project TextEntryState.acceptedSuggestion(mSuggestions.get(0), 380923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedString); 381923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 382923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mService.pickSuggestionManually(mSelectedIndex, mSelectedString); 383923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedString = null; 384923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedIndex = -1; 385923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 386923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 387923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 388923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 389923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project case MotionEvent.ACTION_UP: 390923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (!mScrolled) { 391923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mSelectedString != null) { 392923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (!mShowingCompletions) { 393923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project TextEntryState.acceptedSuggestion(mSuggestions.get(0), 394923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedString); 395923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 396923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mService.pickSuggestionManually(mSelectedIndex, mSelectedString); 397923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 398923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 399923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedString = null; 400923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mSelectedIndex = -1; 401923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project removeHighlight(); 402923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project showPreview(OUT_OF_BOUNDS, null); 403923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project requestLayout(); 404923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project break; 405923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 406923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project return true; 407923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 408923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 409923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project /** 410923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * For flick through from keyboard, call this method with the x coordinate of the flick 411923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * gesture. 412923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * @param x 413923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */ 414923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public void takeSuggestionAt(float x) { 415923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTouchX = (int) x; 416923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project // To detect candidate 417923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project onDraw(null); 418923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mSelectedString != null) { 419923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (!mShowingCompletions) { 420923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project TextEntryState.acceptedSuggestion(mSuggestions.get(0), mSelectedString); 421923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 422923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mService.pickSuggestionManually(mSelectedIndex, mSelectedString); 423923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 424923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 425923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_REMOVE_THROUGH_PREVIEW), 200); 426923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 427923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 428923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private void showPreview(int wordIndex, String altText) { 429923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int oldWordIndex = mCurrentWordIndex; 430923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mCurrentWordIndex = wordIndex; 431923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project // If index changed or changing text 432923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (oldWordIndex != mCurrentWordIndex || altText != null) { 433923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (wordIndex == OUT_OF_BOUNDS) { 434923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mPreviewPopup.isShowing()) { 435923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mHandler.sendMessageDelayed(mHandler 436923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project .obtainMessage(MSG_REMOVE_PREVIEW), 60); 437923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 438923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } else { 439923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project CharSequence word = altText != null? altText : mSuggestions.get(wordIndex); 440923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewText.setText(word); 441923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 442923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 443923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int wordWidth = (int) (mPaint.measureText(word, 0, word.length()) + X_GAP * 2); 444923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int popupWidth = wordWidth 445923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight(); 446923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project final int popupHeight = mPreviewText.getMeasuredHeight(); 447923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project //mPreviewText.setVisibility(INVISIBLE); 448923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPopupPreviewX = mWordX[wordIndex] - mPreviewText.getPaddingLeft() - mScrollX; 449923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPopupPreviewY = - popupHeight; 450923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mHandler.removeMessages(MSG_REMOVE_PREVIEW); 451923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project int [] offsetInWindow = new int[2]; 452923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project getLocationInWindow(offsetInWindow); 453923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mPreviewPopup.isShowing()) { 454923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.update(mPopupPreviewX, mPopupPreviewY + offsetInWindow[1], 455923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project popupWidth, popupHeight); 456923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } else { 457923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.setWidth(popupWidth); 458923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.setHeight(popupHeight); 459923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewPopup.showAtLocation(this, Gravity.NO_GRAVITY, mPopupPreviewX, 460923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPopupPreviewY + offsetInWindow[1]); 461923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 462923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mPreviewText.setVisibility(VISIBLE); 463923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 464923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 465923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 466923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 467923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private void removeHighlight() { 468923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project mTouchX = OUT_OF_BOUNDS; 469923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project invalidate(); 470923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 471923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 472923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project private void longPressFirstWord() { 473923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project CharSequence word = mSuggestions.get(0); 474923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project if (mService.addWordToDictionary(word.toString())) { 475923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project showPreview(0, getContext().getResources().getString(R.string.added_word, word)); 476923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 477923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 478923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project} 479