Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2757)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java

Issue 1560573002: Reduce infobar lag on KitKat from 1000ms to 100ms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: appease the FindBugs gods Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java
index e01b811678d9aeb17955785cce1fe9353155c1db..98db250384421b089233ef42e009298f2cf19fa9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java
@@ -6,16 +6,15 @@ package org.chromium.chrome.browser.infobar;
import android.content.Context;
import android.graphics.Color;
+import android.graphics.Paint;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.TypedValue;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
-import android.widget.FrameLayout;
import android.widget.Spinner;
import android.widget.TextView;
@@ -103,18 +102,13 @@ public class TranslateLanguagePanel
mTargetAdapter = new LanguageArrayAdapter(context, R.layout.translate_spinner,
LANGUAGE_TYPE_TARGET);
- // Determine how wide each spinner needs to be to avoid truncating its children.
- mSourceAdapter.addAll(createSpinnerLanguages(""));
- mTargetAdapter.addAll(createSpinnerLanguages(""));
- mSourceAdapter.measureWidthRequiredForView();
- mTargetAdapter.measureWidthRequiredForView();
-
// Set up the spinners.
mSourceSpinner.setOnItemSelectedListener(this);
mTargetSpinner.setOnItemSelectedListener(this);
mSourceSpinner.setAdapter(mSourceAdapter);
mTargetSpinner.setAdapter(mTargetAdapter);
reloadSpinners();
+ measureSpinnerMinWidths();
}
private void reloadSpinners() {
@@ -170,12 +164,14 @@ public class TranslateLanguagePanel
public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) {
Spinner spinner = (Spinner) adapter;
String newCode = ((SpinnerLanguageElement) spinner.getSelectedItem()).getLanguageCode();
- if (spinner == mSourceSpinner) {
+ if (spinner == mSourceSpinner && !newCode.equals(mSessionOptions.sourceLanguageCode())) {
mSessionOptions.setSourceLanguage(newCode);
- } else {
+ reloadSpinners();
+ }
+ if (spinner == mTargetSpinner && !newCode.equals(mSessionOptions.targetLanguageCode())) {
mSessionOptions.setTargetLanguage(newCode);
+ reloadSpinners();
}
- reloadSpinners();
}
@Override
@@ -198,12 +194,33 @@ public class TranslateLanguagePanel
return result;
}
+ /** Measures how wide the spinners need to be to avoid truncating text. */
+ private void measureSpinnerMinWidths() {
+ Context context = mSourceAdapter.getContext();
+ TextView textView = (TextView) mSourceAdapter.getView(0, null, null);
+ Paint textPaint = textView.getPaint();
+
+ float longestLanguageWidth = 0;
+ for (TranslateOptions.TranslateLanguagePair language : mSessionOptions.allLanguages()) {
+ float width = textPaint.measureText(language.mLanguageRepresentation);
+ longestLanguageWidth = Math.max(longestLanguageWidth, width);
+ }
+
+ float sourceTemplateWidth = textPaint.measureText(TextUtils.expandTemplate(
+ context.getString(R.string.translate_options_source_hint), "").toString());
+ float targetTemplateWidth = textPaint.measureText(TextUtils.expandTemplate(
+ context.getString(R.string.translate_options_target_hint), "").toString());
+
+ mSourceAdapter.mMinWidth = (int) Math.ceil(sourceTemplateWidth + longestLanguageWidth);
+ mTargetAdapter.mMinWidth = (int) Math.ceil(targetTemplateWidth + longestLanguageWidth);
+ }
+
/**
* The drop down view displayed to show the currently selected value.
*/
private static class LanguageArrayAdapter extends ArrayAdapter<SpinnerLanguageElement> {
private final SpannableString mTextTemplate;
- private int mMinimumWidth;
+ private int mMinWidth;
public LanguageArrayAdapter(Context context, int textViewResourceId,
int languageType) {
@@ -219,46 +236,27 @@ public class TranslateLanguagePanel
new ForegroundColorSpan(Color.GRAY), 0, textTemplate.length(), 0);
}
- /** Measures how large the view needs to be to avoid truncating its children. */
- public void measureWidthRequiredForView() {
- mMinimumWidth = 0;
-
- final int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
-
- FrameLayout layout = new FrameLayout(getContext());
- TextView estimator = (TextView) LayoutInflater.from(getContext()).inflate(
- R.layout.infobar_text, null);
- layout.addView(estimator);
- for (int i = 0; i < getCount(); ++i) {
- estimator.setText(getStringForLanguage(i));
- estimator.measure(spec, spec);
- mMinimumWidth = Math.max(mMinimumWidth, estimator.getMeasuredWidth());
- }
- }
-
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
- View result = super.getDropDownView(position, convertView, parent);
- if (result instanceof TextView) {
- ((TextView) result).setText(getItem(position).toString());
- }
- return result;
+ TextView view = (TextView) super.getDropDownView(position, convertView, parent);
+ view.setText(getItem(position).toString());
+ return view;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView result;
- if (!(convertView instanceof TextView)) {
+ if (convertView instanceof TextView) {
+ result = (TextView) convertView;
+ } else {
result = new TextView(getContext());
result.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getContext().getResources().getDimension(R.dimen.infobar_text_size));
- } else {
- result = (TextView) convertView;
+ result.setEllipsize(TextUtils.TruncateAt.END);
+ result.setMaxLines(1);
+ result.setMinWidth(mMinWidth);
}
- result.setEllipsize(TextUtils.TruncateAt.END);
- result.setMaxLines(1);
result.setText(getStringForLanguage(position));
- result.setMinWidth(mMinimumWidth);
return result;
}
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698