14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)package org.chromium.chrome.browser.infobar; 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.content.Context; 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.graphics.Color; 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.text.SpannableString; 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.text.TextUtils; 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.text.style.ForegroundColorSpan; 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.view.LayoutInflater; 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.view.View; 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.view.ViewGroup; 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.widget.AdapterView; 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.widget.ArrayAdapter; 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.widget.FrameLayout; 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.widget.Spinner; 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.widget.TextView; 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.chrome.R; 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import java.util.ArrayList; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import java.util.List; 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Language panel shown in the translate infobar. 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)public class TranslateLanguagePanel 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) implements TranslateSubPanel, AdapterView.OnItemSelectedListener { 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private static final int LANGUAGE_TYPE_SOURCE = 0; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private static final int LANGUAGE_TYPE_TARGET = 1; 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // UI elements. 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private Spinner mSourceSpinner; 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private Spinner mTargetSpinner; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Items that are not interacted with. 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Provided by the caller, the new languages will be set here if the user 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // clicks "done". 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final TranslateOptions mOptions; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This object will be used to keep the state for the time the 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // panel is opened it can be totally discarded in the end if the user 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // clicks "cancel". 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private final TranslateOptions mSessionOptions; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private LanguageArrayAdapter mSourceAdapter; 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private LanguageArrayAdapter mTargetAdapter; 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final SubPanelListener mListener; 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Display language drop downs so they can be picked as source or 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * target for a translation. 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param listener triggered when the panel is closed 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param options will be modified with the new languages selected. 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public TranslateLanguagePanel(SubPanelListener listener, TranslateOptions options) { 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mListener = listener; 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mOptions = options; 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSessionOptions = new TranslateOptions(mOptions); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void createContent(Context context, InfoBarLayout layout) { 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceSpinner = null; 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetSpinner = null; 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) String changeLanguage = context.getString(R.string.translate_infobar_change_languages); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout.setMessage(changeLanguage); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set up the spinners. 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) createSpinners(context); 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout.setCustomContent(mSourceSpinner, mTargetSpinner); 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set up the buttons. 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout.setButtons(context.getString(R.string.translate_button_done), 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context.getString(R.string.cancel)); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void onButtonClicked(boolean primary) { 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (primary) { 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mOptions.setSourceLanguage(mSessionOptions.sourceLanguageIndex()); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mOptions.setTargetLanguage(mSessionOptions.targetLanguageIndex()); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mListener.onPanelClosed(InfoBar.ACTION_TYPE_NONE); 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private void createSpinners(Context context) { 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceAdapter = new LanguageArrayAdapter(context, R.layout.translate_spinner, 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LANGUAGE_TYPE_SOURCE); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetAdapter = new LanguageArrayAdapter(context, R.layout.translate_spinner, 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LANGUAGE_TYPE_TARGET); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Determine how wide each spinner needs to be to avoid truncating its children. 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceAdapter.addAll(createSpinnerLanguages(-1)); 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetAdapter.addAll(createSpinnerLanguages(-1)); 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceAdapter.measureWidthRequiredForView(); 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetAdapter.measureWidthRequiredForView(); 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create the spinners. 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceSpinner = new Spinner(context); 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetSpinner = new Spinner(context); 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceSpinner.setOnItemSelectedListener(this); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetSpinner.setOnItemSelectedListener(this); 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceSpinner.setAdapter(mSourceAdapter); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetSpinner.setAdapter(mTargetAdapter); 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) reloadSpinners(); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private void reloadSpinners() { 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceAdapter.clear(); 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetAdapter.clear(); 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int sourceAvoidLanguage = mSessionOptions.targetLanguageIndex(); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int targetAvoidLanguage = mSessionOptions.sourceLanguageIndex(); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceAdapter.addAll(createSpinnerLanguages(sourceAvoidLanguage)); 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetAdapter.addAll(createSpinnerLanguages(targetAvoidLanguage)); 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int originalSourceSelection = mSourceSpinner.getSelectedItemPosition(); 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int newSourceSelection = getSelectionPosition(LANGUAGE_TYPE_SOURCE); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (originalSourceSelection != newSourceSelection) 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSourceSpinner.setSelection(newSourceSelection); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int originalTargetSelection = mTargetSpinner.getSelectedItemPosition(); 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int newTargetSelection = getSelectionPosition(LANGUAGE_TYPE_TARGET); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (originalTargetSelection != newTargetSelection) 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTargetSpinner.setSelection(newTargetSelection); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private int getSelectionPosition(int languageType) { 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int position = languageType == LANGUAGE_TYPE_SOURCE ? mSessionOptions.sourceLanguageIndex() 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : mSessionOptions.targetLanguageIndex(); 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Since the source and target languages cannot appear in both spinners, the index for the 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // source language can be off by one if comes after the target language alphabetically (and 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // vice versa). 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int opposite = languageType == LANGUAGE_TYPE_SOURCE ? mSessionOptions.targetLanguageIndex() 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : mSessionOptions.sourceLanguageIndex(); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (opposite < position) position -= 1; 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return position; 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Spinner spinner = (Spinner) adapter; 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int newId = ((SpinnerLanguageElement) spinner.getSelectedItem()).getLanguageId(); 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (spinner == mSourceSpinner) { 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSessionOptions.setSourceLanguage(newId); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSessionOptions.setTargetLanguage(newId); 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) reloadSpinners(); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void onNothingSelected(AdapterView<?> adapter) { 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Determines what languages will be shown in the Spinner. 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param avoidLanguage Index of the language to avoid. Use -1 to display all languages. 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private ArrayList<SpinnerLanguageElement> createSpinnerLanguages(int avoidLanguage) { 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ArrayList<SpinnerLanguageElement> result = new ArrayList<SpinnerLanguageElement>(); 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) List<String> languages = mSessionOptions.allLanguages(); 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (int i = 0; i < languages.size(); ++i) { 1734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (i != avoidLanguage) { 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.add(new SpinnerLanguageElement(languages.get(i), i)); 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * The drop down view displayed to show the currently selected value. 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private static class LanguageArrayAdapter extends ArrayAdapter<SpinnerLanguageElement> { 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final SpannableString mTextTemplate; 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private int mMinimumWidth; 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public LanguageArrayAdapter(Context context, int textViewResourceId, 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int languageType) { 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) super(context, textViewResourceId); 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Get the string that we will display inside the Spinner, indicating whether the 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // spinner is used for the source or target language. 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) String textTemplate = languageType == LANGUAGE_TYPE_SOURCE 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ? context.getString(R.string.translate_options_source_hint) 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : context.getString(R.string.translate_options_target_hint); 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTextTemplate = new SpannableString(textTemplate); 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTextTemplate.setSpan( 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new ForegroundColorSpan(Color.GRAY), 0, textTemplate.length(), 0); 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** Measures how large the view needs to be to avoid truncating its children. */ 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void measureWidthRequiredForView() { 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mMinimumWidth = 0; 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameLayout layout = new FrameLayout(getContext()); 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TextView estimator = (TextView) LayoutInflater.from(getContext()).inflate( 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) R.layout.infobar_text, null); 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layout.addView(estimator); 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (int i = 0; i < getCount(); ++i) { 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) estimator.setText(getStringForLanguage(i)); 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) estimator.measure(spec, spec); 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mMinimumWidth = Math.max(mMinimumWidth, estimator.getMeasuredWidth()); 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public View getDropDownView(int position, View convertView, ViewGroup parent) { 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TextView result; 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!(convertView instanceof TextView)) { 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result = (TextView) LayoutInflater.from(getContext()).inflate( 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) R.layout.infobar_spinner_item, null); 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result = (TextView) convertView; 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) String language = getItem(position).toString(); 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.setText(language); 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public View getView(int position, View convertView, ViewGroup parent) { 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TextView result; 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!(convertView instanceof TextView)) { 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result = (TextView) LayoutInflater.from(getContext()).inflate( 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) R.layout.infobar_text, null); 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result = (TextView) convertView; 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.setEllipsize(TextUtils.TruncateAt.END); 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.setMaxLines(1); 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.setText(getStringForLanguage(position)); 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.setMinWidth(mMinimumWidth); 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private CharSequence getStringForLanguage(int position) { 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The spinners prepend a string to show if they're for the source or target language. 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) String language = getItem(position).toString(); 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SpannableString lang = new SpannableString(language); 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lang.setSpan(new ForegroundColorSpan(Color.BLACK), 0, lang.length(), 0); 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return TextUtils.expandTemplate(mTextTemplate, lang); 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * The element that goes inside the spinner. 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private static class SpinnerLanguageElement { 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final String mLanguageName; 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final int mLanguageId; 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public SpinnerLanguageElement(String languageName, int languageId) { 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mLanguageName = languageName; 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mLanguageId = languageId; 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public int getLanguageId() { 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return mLanguageId; 2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * This is the text displayed in the spinner element so make sure no debug information 2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * is added. 2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public String toString() { 2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return mLanguageName; 2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 284