From d4c203f10033466f9ed09bd1b4927fff81ff7558 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 22 Nov 2013 12:32:19 -0500 Subject: [PATCH] Backed out changesets ea5939461476 and eb8ef0e80c9c (bug 938205) for robocop orange. --- mobile/android/base/moz.build | 2 - .../layout-large-v11/browser_toolbar.xml | 33 ++- .../base/resources/layout/browser_toolbar.xml | 34 ++- .../resources/layout/toolbar_edit_layout.xml | 36 ---- .../android/base/toolbar/BrowserToolbar.java | 186 +++++++++++++---- .../base/toolbar/ToolbarEditLayout.java | 193 ------------------ 6 files changed, 213 insertions(+), 271 deletions(-) delete mode 100644 mobile/android/base/resources/layout/toolbar_edit_layout.xml delete mode 100644 mobile/android/base/toolbar/ToolbarEditLayout.java diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index c339c363acec..727481277410 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -294,7 +294,6 @@ gbjar.sources += [ 'toolbar/PageActionLayout.java', 'toolbar/ShapedButton.java', 'toolbar/TabCounter.java', - 'toolbar/ToolbarEditLayout.java', 'toolbar/ToolbarEditText.java', 'TouchEventInterceptor.java', 'updater/UpdateService.java', @@ -900,7 +899,6 @@ ANDROID_RESFILES += [ 'resources/layout/tabs_panel_header.xml', 'resources/layout/tabs_panel_indicator.xml', 'resources/layout/text_selection_handles.xml', - 'resources/layout/toolbar_edit_layout.xml', 'resources/layout/top_sites_grid_item_view.xml', 'resources/layout/two_line_page_row.xml', 'resources/layout/validation_message.xml', diff --git a/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml b/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml index 6acb936556c7..c6ff90444d92 100644 --- a/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml +++ b/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml @@ -60,14 +60,43 @@ android:contentDescription="@string/back" android:background="@drawable/url_bar_nav_button"/> - + android:layout_toLeftOf="@id/menu_items"> + + + + + + - + android:visibility="gone" + android:orientation="horizontal"> + + + + + + - - - - - - - - - diff --git a/mobile/android/base/toolbar/BrowserToolbar.java b/mobile/android/base/toolbar/BrowserToolbar.java index 8671d46f4cc8..f8d48192f785 100644 --- a/mobile/android/base/toolbar/BrowserToolbar.java +++ b/mobile/android/base/toolbar/BrowserToolbar.java @@ -7,6 +7,7 @@ package org.mozilla.gecko.toolbar; import org.mozilla.gecko.AboutPages; import org.mozilla.gecko.BrowserApp; +import org.mozilla.gecko.InputMethods; import org.mozilla.gecko.GeckoApplication; import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.GeckoProfile; @@ -16,16 +17,21 @@ import org.mozilla.gecko.SiteIdentityPopup; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; import org.mozilla.gecko.animation.PropertyAnimator; -import org.mozilla.gecko.animation.PropertyAnimator.PropertyAnimationListener; import org.mozilla.gecko.animation.ViewHelper; +import org.mozilla.gecko.gfx.ImmutableViewportMetrics; +import org.mozilla.gecko.gfx.LayerView; import org.mozilla.gecko.menu.GeckoMenu; import org.mozilla.gecko.menu.MenuPopup; import org.mozilla.gecko.PrefsHelper; import org.mozilla.gecko.util.Clipboard; +import org.mozilla.gecko.util.StringUtils; import org.mozilla.gecko.util.HardwareUtils; import org.mozilla.gecko.util.ThreadUtils; +import org.mozilla.gecko.util.UiAsyncTask; import org.mozilla.gecko.util.GeckoEventListener; import org.mozilla.gecko.util.StringUtils; +import org.mozilla.gecko.toolbar.ToolbarEditText.OnTextTypeChangeListener; +import org.mozilla.gecko.toolbar.ToolbarEditText.TextType; import org.mozilla.gecko.widget.GeckoImageButton; import org.mozilla.gecko.widget.GeckoImageView; import org.mozilla.gecko.widget.GeckoRelativeLayout; @@ -36,6 +42,10 @@ import org.json.JSONObject; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Rect; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.StateListDrawable; import android.os.Build; @@ -55,6 +65,8 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; +import android.view.Window; +import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -63,10 +75,14 @@ import android.view.animation.Interpolator; import android.view.animation.TranslateAnimation; import android.view.inputmethod.InputMethodManager; import android.widget.Button; +import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.RelativeLayout.LayoutParams; +import android.widget.ViewSwitcher; import java.util.Arrays; import java.util.List; @@ -105,7 +121,8 @@ public class BrowserToolbar extends GeckoRelativeLayout } private View mUrlDisplayContainer; - private ToolbarEditLayout mUrlEditLayout; + private View mUrlEditContainer; + private ToolbarEditText mUrlEditText; private View mUrlBarEntry; private ImageView mUrlBarRightEdge; private GeckoTextView mTitle; @@ -118,6 +135,7 @@ public class BrowserToolbar extends GeckoRelativeLayout private ImageButton mFavicon; private ImageButton mStop; private ImageButton mSiteSecurity; + private ImageButton mGo; private PageActionLayout mPageActionLayout; private Animation mProgressSpinner; private TabCounter mTabsCounter; @@ -258,7 +276,9 @@ public class BrowserToolbar extends GeckoRelativeLayout mDefaultForwardMargin = res.getDimensionPixelSize(R.dimen.forward_default_offset); mUrlDisplayContainer = findViewById(R.id.url_display_container); mUrlBarEntry = findViewById(R.id.url_bar_entry); - mUrlEditLayout = (ToolbarEditLayout) findViewById(R.id.edit_layout); + + mUrlEditContainer = findViewById(R.id.url_edit_container); + mUrlEditText = (ToolbarEditText) findViewById(R.id.url_edit_text); // This will clip the right edge's image at 60% of its width mUrlBarRightEdge = (ImageView) findViewById(R.id.url_bar_right_edge); @@ -368,10 +388,32 @@ public class BrowserToolbar extends GeckoRelativeLayout } }); - mUrlEditLayout.setOnFocusChangeListener(new View.OnFocusChangeListener() { + mUrlEditText.setOnTextTypeChangeListener(new OnTextTypeChangeListener() { + @Override + public void onTextTypeChange(ToolbarEditText editText, TextType textType) { + updateGoButton(textType); + } + }); + + mUrlEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { + if (v == null) { + return; + } + setSelected(hasFocus); + if (hasFocus) { + return; + } + + InputMethodManager imm = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); + try { + imm.hideSoftInputFromWindow(v.getWindowToken(), 0); + } catch (NullPointerException e) { + Log.e(LOGTAG, "InputMethodManagerService, why are you throwing" + + " a NullPointerException? See bug 782096", e); + } } }); @@ -439,6 +481,16 @@ public class BrowserToolbar extends GeckoRelativeLayout } }); + mGo = (ImageButton) findViewById(R.id.go); + mGo.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View v) { + if (mCommitListener != null) { + mCommitListener.onCommit(); + } + } + }); + float slideWidth = getResources().getDimension(R.dimen.browser_toolbar_lock_width); LinearLayout.LayoutParams siteSecParams = (LinearLayout.LayoutParams) mSiteSecurity.getLayoutParams(); @@ -497,7 +549,24 @@ public class BrowserToolbar extends GeckoRelativeLayout keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { return false; } else if (isEditing()) { - return mUrlEditLayout.onKey(keyCode, event); + final int prevSelStart = mUrlEditText.getSelectionStart(); + final int prevSelEnd = mUrlEditText.getSelectionEnd(); + + // Manually dispatch the key event to the edit text. If selection changed as + // a result of the key event, then give focus back to mUrlEditText + mUrlEditText.dispatchKeyEvent(event); + + final int curSelStart = mUrlEditText.getSelectionStart(); + final int curSelEnd = mUrlEditText.getSelectionEnd(); + + if (prevSelStart != curSelStart || prevSelEnd != curSelEnd) { + mUrlEditText.requestFocusFromTouch(); + + // Restore the selection, which gets lost due to the focus switch + mUrlEditText.setSelection(curSelStart, curSelEnd); + } + + return true; } return false; @@ -848,7 +917,11 @@ public class BrowserToolbar extends GeckoRelativeLayout return; } - mUrlEditLayout.onEditSuggestion(suggestion); + mUrlEditText.setText(suggestion); + mUrlEditText.setSelection(mUrlEditText.getText().length()); + mUrlEditText.requestFocus(); + + showSoftInput(); } public void setTitle(CharSequence title) { @@ -867,7 +940,7 @@ public class BrowserToolbar extends GeckoRelativeLayout String url = tab.getURL(); if (!isEditing()) { - mUrlEditLayout.setText(url); + mUrlEditText.setText(url); } // Setting a null title will ensure we just see the "Enter Search or Address" placeholder text. @@ -983,17 +1056,17 @@ public class BrowserToolbar extends GeckoRelativeLayout public void setOnCommitListener(OnCommitListener listener) { mCommitListener = listener; - mUrlEditLayout.setOnCommitListener(listener); + mUrlEditText.setOnCommitListener(listener); } public void setOnDismissListener(OnDismissListener listener) { mDismissListener = listener; - mUrlEditLayout.setOnDismissListener(listener); + mUrlEditText.setOnDismissListener(listener); } public void setOnFilterListener(OnFilterListener listener) { mFilterListener = listener; - mUrlEditLayout.setOnFilterListener(listener); + mUrlEditText.setOnFilterListener(listener); } public void setOnStartEditingListener(OnStartEditingListener listener) { @@ -1004,33 +1077,41 @@ public class BrowserToolbar extends GeckoRelativeLayout mStopEditingListener = listener; } - private void showUrlEditLayout() { - setUrlEditLayoutVisibility(true, null); + private void showSoftInput() { + InputMethodManager imm = + (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(mUrlEditText, InputMethodManager.SHOW_IMPLICIT); } - private void showUrlEditLayout(PropertyAnimator animator) { - setUrlEditLayoutVisibility(true, animator); + private void showUrlEditContainer() { + setUrlEditContainerVisibility(true, null); } - private void hideUrlEditLayout() { - setUrlEditLayoutVisibility(false, null); + private void showUrlEditContainer(PropertyAnimator animator) { + setUrlEditContainerVisibility(true, animator); } - private void hideUrlEditLayout(PropertyAnimator animator) { - setUrlEditLayoutVisibility(false, animator); + private void hideUrlEditContainer() { + setUrlEditContainerVisibility(false, null); } - private void setUrlEditLayoutVisibility(final boolean showEditLayout, PropertyAnimator animator) { - final View viewToShow = (showEditLayout ? mUrlEditLayout : mUrlDisplayContainer); - final View viewToHide = (showEditLayout ? mUrlDisplayContainer : mUrlEditLayout); + private void hideUrlEditContainer(PropertyAnimator animator) { + setUrlEditContainerVisibility(false, animator); + } - if (showEditLayout) { - mUrlEditLayout.prepareShowAnimation(animator); - } + private void setUrlEditContainerVisibility(final boolean showEditContainer, PropertyAnimator animator) { + final View viewToShow = (showEditContainer ? mUrlEditContainer : mUrlDisplayContainer); + final View viewToHide = (showEditContainer ? mUrlDisplayContainer : mUrlEditContainer); if (animator == null) { viewToHide.setVisibility(View.GONE); viewToShow.setVisibility(View.VISIBLE); + + if (showEditContainer) { + mUrlEditText.requestFocus(); + showSoftInput(); + } + return; } @@ -1043,16 +1124,26 @@ public class BrowserToolbar extends GeckoRelativeLayout PropertyAnimator.Property.ALPHA, 0.0f); - animator.addPropertyAnimationListener(new PropertyAnimationListener() { + animator.addPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { @Override public void onPropertyAnimationStart() { viewToShow.setVisibility(View.VISIBLE); + + if (showEditContainer) { + ViewHelper.setAlpha(mGo, 0.0f); + mUrlEditText.requestFocus(); + } } @Override public void onPropertyAnimationEnd() { viewToHide.setVisibility(View.GONE); ViewHelper.setAlpha(viewToHide, 1.0f); + + if (showEditContainer) { + ViewHelper.setAlpha(mGo, 1.0f); + showSoftInput(); + } } }); } @@ -1094,7 +1185,7 @@ public class BrowserToolbar extends GeckoRelativeLayout public void setIsEditing(boolean isEditing) { mIsEditing = isEditing; - mUrlEditLayout.setEnabled(isEditing); + mUrlEditText.setEnabled(isEditing); } /** @@ -1110,9 +1201,9 @@ public class BrowserToolbar extends GeckoRelativeLayout return; } - mUrlEditLayout.setText(url != null ? url : ""); - + mUrlEditText.setText(url != null ? url : ""); setIsEditing(true); + updateChildrenForEditing(); if (mStartEditingListener != null) { @@ -1128,7 +1219,7 @@ public class BrowserToolbar extends GeckoRelativeLayout // This animation doesn't make much sense in a sidebar UI if (HardwareUtils.isTablet() || Build.VERSION.SDK_INT < 11) { - showUrlEditLayout(); + showUrlEditContainer(); if (!HardwareUtils.isTablet()) { if (mUrlBarRightEdge != null) { @@ -1186,7 +1277,7 @@ public class BrowserToolbar extends GeckoRelativeLayout curveTranslation); } - showUrlEditLayout(animator); + showUrlEditContainer(animator); animator.addPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { @Override @@ -1225,7 +1316,7 @@ public class BrowserToolbar extends GeckoRelativeLayout } private String stopEditing() { - final String url = mUrlEditLayout.getText(); + final String url = mUrlEditText.getText().toString(); if (!isEditing()) { return url; } @@ -1238,7 +1329,7 @@ public class BrowserToolbar extends GeckoRelativeLayout } if (HardwareUtils.isTablet() || Build.VERSION.SDK_INT < 11) { - hideUrlEditLayout(); + hideUrlEditContainer(); if (!HardwareUtils.isTablet()) { updateTabCountAndAnimate(Tabs.getInstance().getDisplayCount()); @@ -1291,7 +1382,7 @@ public class BrowserToolbar extends GeckoRelativeLayout 0); } - hideUrlEditLayout(contentAnimator); + hideUrlEditContainer(contentAnimator); contentAnimator.addPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { @Override @@ -1331,6 +1422,29 @@ public class BrowserToolbar extends GeckoRelativeLayout return url; } + private void updateGoButton(TextType textType) { + if (textType == TextType.EMPTY) { + mGo.setVisibility(View.GONE); + return; + } + + mGo.setVisibility(View.VISIBLE); + + final int imageResource; + final String contentDescription; + + if (textType == TextType.SEARCH_QUERY) { + imageResource = R.drawable.ic_url_bar_search; + contentDescription = mActivity.getString(R.string.search); + } else { + imageResource = R.drawable.ic_url_bar_go; + contentDescription = mActivity.getString(R.string.go); + } + + mGo.setImageResource(imageResource); + mGo.setContentDescription(contentDescription); + } + public void setButtonEnabled(ImageButton button, boolean enabled) { final Drawable drawable = button.getDrawable(); if (drawable != null) { @@ -1372,7 +1486,7 @@ public class BrowserToolbar extends GeckoRelativeLayout layoutParams.leftMargin = 0; // Do the same on the URL edit container - layoutParams = (ViewGroup.MarginLayoutParams) mUrlEditLayout.getLayoutParams(); + layoutParams = (ViewGroup.MarginLayoutParams)mUrlEditContainer.getLayoutParams(); layoutParams.leftMargin = 0; requestLayout(); @@ -1389,7 +1503,7 @@ public class BrowserToolbar extends GeckoRelativeLayout (ViewGroup.MarginLayoutParams)mUrlDisplayContainer.getLayoutParams(); layoutParams.leftMargin = mUrlBarViewOffset; - layoutParams = (ViewGroup.MarginLayoutParams) mUrlEditLayout.getLayoutParams(); + layoutParams = (ViewGroup.MarginLayoutParams)mUrlEditContainer.getLayoutParams(); layoutParams.leftMargin = mUrlBarViewOffset; ViewHelper.setTranslationX(mTitle, 0); @@ -1489,7 +1603,7 @@ public class BrowserToolbar extends GeckoRelativeLayout mTitle.setPrivateMode(isPrivate); mMenu.setPrivateMode(isPrivate); mMenuIcon.setPrivateMode(isPrivate); - mUrlEditLayout.setPrivateMode(isPrivate); + mUrlEditText.setPrivateMode(isPrivate); if (mBack instanceof BackButton) ((BackButton) mBack).setPrivateMode(isPrivate); diff --git a/mobile/android/base/toolbar/ToolbarEditLayout.java b/mobile/android/base/toolbar/ToolbarEditLayout.java deleted file mode 100644 index b006c69f0732..000000000000 --- a/mobile/android/base/toolbar/ToolbarEditLayout.java +++ /dev/null @@ -1,193 +0,0 @@ -/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.gecko.toolbar; - -import org.mozilla.gecko.R; -import org.mozilla.gecko.animation.PropertyAnimator; -import org.mozilla.gecko.animation.PropertyAnimator.PropertyAnimationListener; -import org.mozilla.gecko.animation.ViewHelper; -import org.mozilla.gecko.toolbar.BrowserToolbar.OnCommitListener; -import org.mozilla.gecko.toolbar.BrowserToolbar.OnDismissListener; -import org.mozilla.gecko.toolbar.BrowserToolbar.OnFilterListener; -import org.mozilla.gecko.toolbar.ToolbarEditText.OnTextTypeChangeListener; -import org.mozilla.gecko.toolbar.ToolbarEditText.TextType; -import org.mozilla.gecko.widget.GeckoLinearLayout; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnFocusChangeListener; -import android.view.inputmethod.InputMethodManager; -import android.widget.ImageButton; - -public class ToolbarEditLayout extends GeckoLinearLayout { - - private final ToolbarEditText mEditText; - private final ImageButton mGo; - - private OnCommitListener mCommitListener; - private OnFocusChangeListener mFocusChangeListener; - - public ToolbarEditLayout(Context context, AttributeSet attrs) { - super(context, attrs); - - setOrientation(HORIZONTAL); - - LayoutInflater.from(context).inflate(R.layout.toolbar_edit_layout, this); - mGo = (ImageButton) findViewById(R.id.go); - mEditText = (ToolbarEditText) findViewById(R.id.url_edit_text); - } - - @Override - public void onAttachedToWindow() { - mGo.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mCommitListener != null) { - mCommitListener.onCommit(); - } - } - }); - - mEditText.setOnTextTypeChangeListener(new OnTextTypeChangeListener() { - @Override - public void onTextTypeChange(ToolbarEditText editText, TextType textType) { - updateGoButton(textType); - } - }); - - mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (mFocusChangeListener != null) { - mFocusChangeListener.onFocusChange(ToolbarEditLayout.this, hasFocus); - } - } - }); - } - - @Override - public void setOnFocusChangeListener(OnFocusChangeListener listener) { - mFocusChangeListener = listener; - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - - mGo.setEnabled(enabled); - mEditText.setEnabled(enabled); - } - - @Override - public void setPrivateMode(boolean isPrivate) { - super.setPrivateMode(isPrivate); - mEditText.setPrivateMode(isPrivate); - } - - private void updateGoButton(TextType textType) { - if (textType == TextType.EMPTY) { - mGo.setVisibility(View.GONE); - return; - } - - mGo.setVisibility(View.VISIBLE); - - final int imageResource; - final String contentDescription; - - if (textType == TextType.SEARCH_QUERY) { - imageResource = R.drawable.ic_url_bar_search; - contentDescription = getContext().getString(R.string.search); - } else { - imageResource = R.drawable.ic_url_bar_go; - contentDescription = getContext().getString(R.string.go); - } - - mGo.setImageResource(imageResource); - mGo.setContentDescription(contentDescription); - } - - private void showSoftInput() { - InputMethodManager imm = - (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT); - } - - void prepareShowAnimation(PropertyAnimator animator) { - if (animator == null) { - mEditText.requestFocus(); - showSoftInput(); - return; - } - - animator.addPropertyAnimationListener(new PropertyAnimationListener() { - @Override - public void onPropertyAnimationStart() { - ViewHelper.setAlpha(mGo, 0.0f); - mEditText.requestFocus(); - } - - @Override - public void onPropertyAnimationEnd() { - ViewHelper.setAlpha(mGo, 1.0f); - showSoftInput(); - } - }); - } - - void setOnCommitListener(OnCommitListener listener) { - mCommitListener = listener; - mEditText.setOnCommitListener(listener); - } - - void setOnDismissListener(OnDismissListener listener) { - mEditText.setOnDismissListener(listener); - } - - void setOnFilterListener(OnFilterListener listener) { - mEditText.setOnFilterListener(listener); - } - - boolean onKey(int keyCode, KeyEvent event) { - final int prevSelStart = mEditText.getSelectionStart(); - final int prevSelEnd = mEditText.getSelectionEnd(); - - // Manually dispatch the key event to the edit text. If selection changed as - // a result of the key event, then give focus back to mEditText - mEditText.dispatchKeyEvent(event); - - final int curSelStart = mEditText.getSelectionStart(); - final int curSelEnd = mEditText.getSelectionEnd(); - - if (prevSelStart != curSelStart || prevSelEnd != curSelEnd) { - mEditText.requestFocusFromTouch(); - - // Restore the selection, which gets lost due to the focus switch - mEditText.setSelection(curSelStart, curSelEnd); - } - - return true; - } - - void onEditSuggestion(String suggestion) { - mEditText.setText(suggestion); - mEditText.setSelection(mEditText.getText().length()); - mEditText.requestFocus(); - - showSoftInput(); - } - - void setText(String text) { - mEditText.setText(text); - } - - String getText() { - return mEditText.getText().toString(); - } -} \ No newline at end of file