| Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
|
| index 7429eb3689974cf9af7e753a5706dc20d912218a..13d2b931dff1d3af690de31d8a9179ccc2bc3cbc 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
|
| @@ -15,6 +15,7 @@ import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.infobar.translate.TranslateMenu;
|
| import org.chromium.chrome.browser.infobar.translate.TranslateMenuHelper;
|
| import org.chromium.chrome.browser.infobar.translate.TranslateTabLayout;
|
| +import org.chromium.chrome.browser.widget.TintedImageButton;
|
| import org.chromium.ui.widget.Toast;
|
|
|
| /**
|
| @@ -33,7 +34,12 @@ class TranslateCompactInfoBar extends InfoBar
|
| private long mNativeTranslateInfoBarPtr;
|
| private TranslateTabLayout mTabLayout;
|
|
|
| - private TranslateMenuHelper mMenuHelper;
|
| + // Need 2 instances of TranslateMenuHelper to prevent a race condition bug which happens when
|
| + // showing language menu after dismissing overflow menu.
|
| + private TranslateMenuHelper mOverflowMenuHelper;
|
| + private TranslateMenuHelper mLanguageMenuHelper;
|
| +
|
| + private TintedImageButton mMenuButton;
|
|
|
| @CalledByNative
|
| private static InfoBar create(int initialStep, String sourceLanguageCode,
|
| @@ -74,21 +80,35 @@ class TranslateCompactInfoBar extends InfoBar
|
|
|
| mTabLayout.addOnTabSelectedListener(this);
|
|
|
| - content.findViewById(R.id.translate_infobar_menu_button)
|
| - .setOnClickListener(new OnClickListener() {
|
| - @Override
|
| - public void onClick(View v) {
|
| - initMenuHelper(v);
|
| - mMenuHelper.show(TranslateMenu.MENU_OVERFLOW);
|
| - }
|
| - });
|
| + mMenuButton = (TintedImageButton) content.findViewById(R.id.translate_infobar_menu_button);
|
| + mMenuButton.setOnClickListener(new OnClickListener() {
|
| + @Override
|
| + public void onClick(View v) {
|
| + initMenuHelper(TranslateMenu.MENU_OVERFLOW);
|
| + mOverflowMenuHelper.show(TranslateMenu.MENU_OVERFLOW);
|
| + }
|
| + });
|
|
|
| parent.addContent(content, 1.0f);
|
| }
|
|
|
| - private void initMenuHelper(View anchorView) {
|
| - if (mMenuHelper == null) {
|
| - mMenuHelper = new TranslateMenuHelper(getContext(), anchorView, mOptions, this);
|
| + private void initMenuHelper(int menuType) {
|
| + switch (menuType) {
|
| + case TranslateMenu.MENU_OVERFLOW:
|
| + if (mOverflowMenuHelper == null) {
|
| + mOverflowMenuHelper =
|
| + new TranslateMenuHelper(getContext(), mMenuButton, mOptions, this);
|
| + }
|
| + return;
|
| + case TranslateMenu.MENU_TARGET_LANGUAGE:
|
| + case TranslateMenu.MENU_SOURCE_LANGUAGE:
|
| + if (mLanguageMenuHelper == null) {
|
| + mLanguageMenuHelper =
|
| + new TranslateMenuHelper(getContext(), mMenuButton, mOptions, this);
|
| + }
|
| + return;
|
| + default:
|
| + assert false : "Unsupported Menu Item Id";
|
| }
|
| }
|
|
|
| @@ -153,7 +173,8 @@ class TranslateCompactInfoBar extends InfoBar
|
| public void onOverflowMenuItemClicked(int itemId) {
|
| switch (itemId) {
|
| case TranslateMenu.ID_OVERFLOW_MORE_LANGUAGE:
|
| - mMenuHelper.show(TranslateMenu.MENU_TARGET_LANGUAGE);
|
| + initMenuHelper(TranslateMenu.MENU_TARGET_LANGUAGE);
|
| + mLanguageMenuHelper.show(TranslateMenu.MENU_TARGET_LANGUAGE);
|
| return;
|
| case TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE:
|
| nativeApplyBoolTranslateOption(
|
| @@ -171,7 +192,8 @@ class TranslateCompactInfoBar extends InfoBar
|
| showSnackbar(TranslateSnackbarType.NEVER_TRANSLATE_SITE);
|
| return;
|
| case TranslateMenu.ID_OVERFLOW_NOT_THIS_LANGUAGE:
|
| - mMenuHelper.show(TranslateMenu.MENU_SOURCE_LANGUAGE);
|
| + initMenuHelper(TranslateMenu.MENU_SOURCE_LANGUAGE);
|
| + mLanguageMenuHelper.show(TranslateMenu.MENU_SOURCE_LANGUAGE);
|
| return;
|
| default:
|
| assert false : "Unexpected overflow menu code";
|
|
|