Skip to content
Snippets Groups Projects
Commit 1e273fa6 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Separate debug information display from candidate view

This change is one of the preparations for suggestion strip redesign.

Bug: 4175031
Change-Id: I82675936773ed6cf132a52486909ff21af828256
parent f20eb55d
No related branches found
No related tags found
No related merge requests found
...@@ -18,31 +18,14 @@ ...@@ -18,31 +18,14 @@
*/ */
--> -->
<LinearLayout <Button
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="horizontal" android:minWidth="@dimen/candidate_min_width"
> android:textSize="@dimen/candidate_text_size"
<Button android:textColor="@color/candidate_typed_word"
android:id="@+id/candidate_word" android:focusable="true"
android:layout_width="wrap_content" android:clickable="true"
android:layout_height="match_parent" android:gravity="center_vertical|center_horizontal"
android:minWidth="@dimen/candidate_min_width" style="?attr/suggestionBackgroundStyle" />
android:textSize="@dimen/candidate_text_size"
android:textColor="@color/candidate_normal"
android:focusable="true"
android:clickable="true"
android:gravity="center_vertical|center_horizontal"
style="?attr/suggestionBackgroundStyle" />
<TextView
android:id="@+id/candidate_debug_info"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:visibility="gone"
android:textSize="10dip"
android:textColor="#ff808080"
android:focusable="false"
android:clickable="false"
android:gravity="bottom" />
</LinearLayout>
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
<ImageView <ImageView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/candidate_divider"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:src="@drawable/keyboard_suggest_strip_divider" android:src="@drawable/keyboard_suggest_strip_divider"
......
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
*/ */
--> -->
<resources> <resources>
<color name="candidate_normal">#FFFFFFFF</color> <color name="candidate_typed_word">#FFFFFFFF</color>
<color name="candidate_recommended">#FFFCAE00</color> <color name="candidate_auto_correct">#FFFCAE00</color>
<color name="candidate_other">#FFFCAE00</color> <color name="candidate_suggested">#FFFCAE00</color>
<color name="latinkeyboard_bar_language_shadow_white">#80000000</color> <color name="latinkeyboard_bar_language_shadow_white">#80000000</color>
<color name="latinkeyboard_bar_language_shadow_black">#80FFFFFF</color> <color name="latinkeyboard_bar_language_shadow_black">#80FFFFFF</color>
<color name="latinkeyboard_bar_language_text">#FFC0C0C0</color> <color name="latinkeyboard_bar_language_text">#FFC0C0C0</color>
......
...@@ -55,14 +55,15 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo ...@@ -55,14 +55,15 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private static final boolean DBG = LatinImeLogger.sDBG; private static final boolean DBG = LatinImeLogger.sDBG;
private final ArrayList<View> mWords = new ArrayList<View>(); private final ArrayList<TextView> mWords = new ArrayList<TextView>();
private final ArrayList<View> mDividers = new ArrayList<View>(); private final ArrayList<View> mDividers = new ArrayList<View>();
private final int mCandidatePadding;
private final boolean mConfigCandidateHighlightFontColorEnabled; private final boolean mConfigCandidateHighlightFontColorEnabled;
private final CharacterStyle mInvertedForegroundColorSpan; private final CharacterStyle mInvertedForegroundColorSpan;
private final CharacterStyle mInvertedBackgroundColorSpan; private final CharacterStyle mInvertedBackgroundColorSpan;
private final int mColorNormal; private final int mColorTypedWord;
private final int mColorRecommended; private final int mColorAutoCorrect;
private final int mColorOther; private final int mColorSuggestedCandidate;
private final PopupWindow mPreviewPopup; private final PopupWindow mPreviewPopup;
private final TextView mPreviewText; private final TextView mPreviewText;
...@@ -135,20 +136,20 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo ...@@ -135,20 +136,20 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
mPreviewPopup.setBackgroundDrawable(null); mPreviewPopup.setBackgroundDrawable(null);
mConfigCandidateHighlightFontColorEnabled = mConfigCandidateHighlightFontColorEnabled =
res.getBoolean(R.bool.config_candidate_highlight_font_color_enabled); res.getBoolean(R.bool.config_candidate_highlight_font_color_enabled);
mColorNormal = res.getColor(R.color.candidate_normal); mColorTypedWord = res.getColor(R.color.candidate_typed_word);
mColorRecommended = res.getColor(R.color.candidate_recommended); mColorAutoCorrect = res.getColor(R.color.candidate_auto_correct);
mColorOther = res.getColor(R.color.candidate_other); mColorSuggestedCandidate = res.getColor(R.color.candidate_suggested);
mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorNormal ^ 0x00ffffff); mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorTypedWord ^ 0x00ffffff);
mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorNormal); mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorTypedWord);
mCandidatePadding = res.getDimensionPixelOffset(R.dimen.candidate_padding);
for (int i = 0; i < MAX_SUGGESTIONS; i++) { for (int i = 0; i < MAX_SUGGESTIONS; i++) {
View v = inflater.inflate(R.layout.candidate, null); final TextView tv = (TextView)inflater.inflate(R.layout.candidate, null);
TextView tv = (TextView)v.findViewById(R.id.candidate_word);
tv.setTag(i); tv.setTag(i);
tv.setOnClickListener(this); tv.setOnClickListener(this);
if (i == 0) if (i == 0)
tv.setOnLongClickListener(this); tv.setOnLongClickListener(this);
mWords.add(v); mWords.add(tv);
if (i > 0) { if (i > 0) {
View divider = inflater.inflate(R.layout.candidate_divider, null); View divider = inflater.inflate(R.layout.candidate_divider, null);
mDividers.add(divider); mDividers.add(divider);
...@@ -177,70 +178,79 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo ...@@ -177,70 +178,79 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
} }
} }
private CharSequence getStyledCandidateWord(CharSequence word, boolean isAutoCorrect) {
if (!isAutoCorrect)
return word;
final CharacterStyle style = mConfigCandidateHighlightFontColorEnabled ? BOLD_SPAN
: UNDERLINE_SPAN;
final Spannable spannedWord = new SpannableString(word);
spannedWord.setSpan(style, 0, word.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
return spannedWord;
}
private int getCandidateTextColor(boolean isAutoCorrect, boolean isSuggestedCandidate,
SuggestedWordInfo info) {
final int color;
if (isAutoCorrect && mConfigCandidateHighlightFontColorEnabled) {
color = mColorAutoCorrect;
} else if (isSuggestedCandidate) {
color = mColorSuggestedCandidate;
} else {
color = mColorTypedWord;
}
if (info != null && info.isPreviousSuggestedWord()) {
final int newAlpha = (int)(Color.alpha(color) * 0.5f);
return Color.argb(newAlpha, Color.red(color), Color.green(color), Color.blue(color));
} else {
return color;
}
}
private void updateSuggestions() { private void updateSuggestions() {
final SuggestedWords suggestions = mSuggestions; final SuggestedWords suggestions = mSuggestions;
final List<SuggestedWordInfo> suggestedWordInfoList = suggestions.mSuggestedWordInfoList;
clear(); clear();
final int count = Math.min(mWords.size(), suggestions.size()); final int count = Math.min(mWords.size(), suggestions.size());
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
CharSequence word = suggestions.getWord(i); final CharSequence word = suggestions.getWord(i);
if (word == null) continue; if (word == null) continue;
final int wordLength = word.length();
final List<SuggestedWordInfo> suggestedWordInfoList = final SuggestedWordInfo info = (suggestedWordInfoList != null)
suggestions.mSuggestedWordInfoList; ? suggestedWordInfoList.get(i) : null;
final boolean isAutoCorrect = suggestions.mHasMinimalSuggestion
final View v = mWords.get(i);
final TextView tv = (TextView)v.findViewById(R.id.candidate_word);
final TextView dv = (TextView)v.findViewById(R.id.candidate_debug_info);
tv.setTextColor(mColorNormal);
// TODO: Needs safety net?
if (suggestions.mHasMinimalSuggestion
&& ((i == 1 && !suggestions.mTypedWordValid) && ((i == 1 && !suggestions.mTypedWordValid)
|| (i == 0 && suggestions.mTypedWordValid))) { || (i == 0 && suggestions.mTypedWordValid));
final CharacterStyle style; // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1
if (mConfigCandidateHighlightFontColorEnabled) { // and there are multiple suggestions, such as the default punctuation list.
style = BOLD_SPAN; // TODO: Need to revisit this logic with bigram suggestions
tv.setTextColor(mColorRecommended); final boolean isSuggestedCandidate = (i != 0);
} else { final boolean isPunctuationSuggestions = (word.length() == 1 && count > 1);
style = UNDERLINE_SPAN;
} final TextView tv = mWords.get(i);
final Spannable spannedWord = new SpannableString(word); tv.setTextColor(getCandidateTextColor(isAutoCorrect,
spannedWord.setSpan(style, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); isSuggestedCandidate || isPunctuationSuggestions, info));
word = spannedWord; tv.setText(getStyledCandidateWord(word, isAutoCorrect));
} else if (i != 0 || (wordLength == 1 && count > 1)) { if (i == 0) {
// HACK: even if i == 0, we use mColorOther when this tv.setPadding(mCandidatePadding, 0, 0, 0);
// suggestion's length is 1 } else if (i == count - 1) {
// and there are multiple suggestions, such as the default tv.setPadding(0, 0, mCandidatePadding, 0);
// punctuation list.
if (mConfigCandidateHighlightFontColorEnabled)
tv.setTextColor(mColorOther);
}
tv.setText(word);
tv.setClickable(true);
if (suggestedWordInfoList != null && suggestedWordInfoList.get(i) != null) {
final SuggestedWordInfo info = suggestedWordInfoList.get(i);
if (info.isPreviousSuggestedWord()) {
int color = tv.getCurrentTextColor();
tv.setTextColor(Color.argb((int)(Color.alpha(color) * 0.5f), Color.red(color),
Color.green(color), Color.blue(color)));
}
final String debugString = info.getDebugString();
if (DBG) {
if (TextUtils.isEmpty(debugString)) {
dv.setVisibility(GONE);
} else {
dv.setText(debugString);
dv.setVisibility(VISIBLE);
}
} else {
dv.setVisibility(GONE);
}
} else { } else {
dv.setVisibility(GONE); tv.setPadding(0, 0, 0, 0);
} }
if (i > 0) if (i > 0)
addView(mDividers.get(i - 1)); addView(mDividers.get(i - 1));
addView(v); addView(tv);
if (DBG && info != null) {
final TextView dv = new TextView(getContext(), null);
dv.setTextSize(10.0f);
dv.setTextColor(0xff808080);
dv.setText(info.getDebugString());
addView(dv);
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)dv.getLayoutParams();
lp.gravity = Gravity.BOTTOM;
}
} }
scrollTo(0, getScrollY()); scrollTo(0, getScrollY());
...@@ -252,7 +262,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo ...@@ -252,7 +262,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
// with color is disabled. // with color is disabled.
if (mConfigCandidateHighlightFontColorEnabled) if (mConfigCandidateHighlightFontColorEnabled)
return; return;
final TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word); final TextView tv = mWords.get(1);
final Spannable word = new SpannableString(autoCorrectedWord); final Spannable word = new SpannableString(autoCorrectedWord);
final int wordLength = word.length(); final int wordLength = word.length();
word.setSpan(mInvertedBackgroundColorSpan, 0, wordLength, word.setSpan(mInvertedBackgroundColorSpan, 0, wordLength,
...@@ -278,7 +288,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo ...@@ -278,7 +288,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
setSuggestions(builder.build()); setSuggestions(builder.build());
mShowingAddToDictionary = true; mShowingAddToDictionary = true;
// Disable R.string.hint_add_to_dictionary button // Disable R.string.hint_add_to_dictionary button
TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word); TextView tv = mWords.get(1);
tv.setClickable(false); tv.setClickable(false);
} }
...@@ -307,7 +317,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo ...@@ -307,7 +317,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
return; return;
final TextView previewText = mPreviewText; final TextView previewText = mPreviewText;
previewText.setTextColor(mColorNormal); previewText.setTextColor(mColorTypedWord);
previewText.setText(word); previewText.setText(word);
previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment