| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b9629106f8b497ce0ff09d2e19b8ed8f0c7fbc7e
|
| --- /dev/null
|
| +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
|
| @@ -0,0 +1,223 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.omnibox;
|
| +
|
| +import android.animation.Animator;
|
| +import android.animation.AnimatorListenerAdapter;
|
| +import android.animation.ObjectAnimator;
|
| +import android.content.Context;
|
| +import android.graphics.Rect;
|
| +import android.text.Selection;
|
| +import android.util.AttributeSet;
|
| +import android.util.Property;
|
| +import android.view.MotionEvent;
|
| +import android.view.View;
|
| +import android.view.WindowManager;
|
| +
|
| +import com.google.android.apps.chrome.R;
|
| +
|
| +import org.chromium.base.ApiCompatibilityUtils;
|
| +import org.chromium.chrome.browser.ntp.NewTabPage;
|
| +import org.chromium.ui.UiUtils;
|
| +
|
| +/**
|
| + * Location bar for tablet form factors.
|
| + */
|
| +public class LocationBarTablet extends LocationBarLayout {
|
| +
|
| + private static final int KEYBOARD_MODE_CHANGE_DELAY_MS = 300;
|
| + private static final long MAX_NTP_KEYBOARD_FOCUS_DURATION_MS = 200;
|
| +
|
| + private final Property<LocationBarTablet, Float> mUrlFocusChangePercentProperty =
|
| + new Property<LocationBarTablet, Float>(Float.class, "") {
|
| + @Override
|
| + public Float get(LocationBarTablet object) {
|
| + return object.mUrlFocusChangePercent;
|
| + }
|
| +
|
| + @Override
|
| + public void set(LocationBarTablet object, Float value) {
|
| + setUrlFocusChangePercent(value);
|
| + }
|
| + };
|
| +
|
| + private final Runnable mKeyboardResizeModeTask = new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + getWindowDelegate().setWindowSoftInputMode(
|
| + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
| + }
|
| + };
|
| +
|
| + private View mBookmarkButton;
|
| + private float mUrlFocusChangePercent;
|
| + private Animator mUrlFocusChangeAnimator;
|
| + private View[] mTargets;
|
| + private final Rect mCachedTargetBounds = new Rect();
|
| +
|
| + /**
|
| + * Constructor used to inflate from XML.
|
| + */
|
| + public LocationBarTablet(Context context, AttributeSet attrs) {
|
| + super(context, attrs);
|
| + }
|
| +
|
| + @Override
|
| + protected void onFinishInflate() {
|
| + super.onFinishInflate();
|
| +
|
| + mBookmarkButton = findViewById(R.id.bookmark_button);
|
| + mTargets = new View[] { mUrlBar, mDeleteButton };
|
| + }
|
| +
|
| + @Override
|
| + public boolean onTouchEvent(MotionEvent event) {
|
| + if (mTargets == null) return true;
|
| +
|
| + View selectedTarget = null;
|
| + float selectedDistance = 0;
|
| + // newX and newY are in the coordinates of the selectedTarget.
|
| + float newX = 0;
|
| + float newY = 0;
|
| + for (View target : mTargets) {
|
| + if (!target.isShown()) continue;
|
| +
|
| + mCachedTargetBounds.set(0, 0, target.getWidth(), target.getHeight());
|
| + offsetDescendantRectToMyCoords(target, mCachedTargetBounds);
|
| + float x = event.getX();
|
| + float y = event.getY();
|
| + float dx = distanceToRange(
|
| + mCachedTargetBounds.left, mCachedTargetBounds.right, x);
|
| + float dy = distanceToRange(
|
| + mCachedTargetBounds.top, mCachedTargetBounds.bottom, y);
|
| + float distance = Math.abs(dx) + Math.abs(dy);
|
| + if (selectedTarget == null || distance < selectedDistance) {
|
| + selectedTarget = target;
|
| + selectedDistance = distance;
|
| + newX = x + dx;
|
| + newY = y + dy;
|
| + }
|
| + }
|
| +
|
| + if (selectedTarget == null) return false;
|
| +
|
| + event.setLocation(newX, newY);
|
| + return selectedTarget.onTouchEvent(event);
|
| + }
|
| +
|
| + // Returns amount by which to adjust to move value inside the given range.
|
| + private static float distanceToRange(float min, float max, float value) {
|
| + return value < min ? (min - value) : value > max ? (max - value) : 0;
|
| + }
|
| +
|
| + @Override
|
| + public void onUrlFocusChange(final boolean hasFocus) {
|
| + super.onUrlFocusChange(hasFocus);
|
| +
|
| + removeCallbacks(mKeyboardResizeModeTask);
|
| +
|
| + if (mUrlFocusChangeAnimator != null && mUrlFocusChangeAnimator.isRunning()) {
|
| + mUrlFocusChangeAnimator.cancel();
|
| + mUrlFocusChangeAnimator = null;
|
| + }
|
| +
|
| + if (getToolbarDataProvider().getNewTabPageForCurrentTab() == null) {
|
| + finishUrlFocusChange(hasFocus);
|
| + return;
|
| + }
|
| +
|
| + Rect rootViewBounds = new Rect();
|
| + getRootView().getLocalVisibleRect(rootViewBounds);
|
| + float screenSizeRatio = (rootViewBounds.height()
|
| + / (float) (Math.max(rootViewBounds.height(), rootViewBounds.width())));
|
| + mUrlFocusChangeAnimator =
|
| + ObjectAnimator.ofFloat(this, mUrlFocusChangePercentProperty, hasFocus ? 1f : 0f);
|
| + mUrlFocusChangeAnimator.setDuration(
|
| + (long) (MAX_NTP_KEYBOARD_FOCUS_DURATION_MS * screenSizeRatio));
|
| + mUrlFocusChangeAnimator.addListener(new AnimatorListenerAdapter() {
|
| + private boolean mIsCancelled;
|
| +
|
| + @Override
|
| + public void onAnimationCancel(Animator animation) {
|
| + mIsCancelled = true;
|
| + }
|
| +
|
| + @Override
|
| + public void onAnimationEnd(Animator animation) {
|
| + if (mIsCancelled) return;
|
| + finishUrlFocusChange(hasFocus);
|
| + }
|
| + });
|
| + mUrlFocusChangeAnimator.start();
|
| + }
|
| +
|
| + private void finishUrlFocusChange(boolean hasFocus) {
|
| + if (hasFocus) {
|
| + if (mSecurityButton.getVisibility() == VISIBLE) mSecurityButton.setVisibility(GONE);
|
| + if (getWindowDelegate().getWindowSoftInputMode()
|
| + != WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) {
|
| + getWindowDelegate().setWindowSoftInputMode(
|
| + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
|
| + }
|
| + UiUtils.showKeyboard(mUrlBar);
|
| + } else {
|
| + if (mSecurityButton.getVisibility() == GONE
|
| + && mSecurityButton.getDrawable() != null
|
| + && mSecurityButton.getDrawable().getIntrinsicWidth() > 0
|
| + && mSecurityButton.getDrawable().getIntrinsicHeight() > 0) {
|
| + mSecurityButton.setVisibility(VISIBLE);
|
| + }
|
| + UiUtils.hideKeyboard(mUrlBar);
|
| + Selection.setSelection(mUrlBar.getText(), 0);
|
| + // Convert the keyboard back to resize mode (delay the change for an arbitrary
|
| + // amount of time in hopes the keyboard will be completely hidden before making
|
| + // this change).
|
| + if (getWindowDelegate().getWindowSoftInputMode()
|
| + != WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) {
|
| + postDelayed(mKeyboardResizeModeTask, KEYBOARD_MODE_CHANGE_DELAY_MS);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Updates percentage of current the URL focus change animation.
|
| + * @param percent 1.0 is 100% focused, 0 is completely unfocused.
|
| + */
|
| + private void setUrlFocusChangePercent(float percent) {
|
| + mUrlFocusChangePercent = percent;
|
| +
|
| + NewTabPage ntp = getToolbarDataProvider().getNewTabPageForCurrentTab();
|
| + if (ntp != null) ntp.setUrlFocusChangeAnimationPercent(percent);
|
| + }
|
| +
|
| + @Override
|
| + protected void updateDeleteButtonVisibility() {
|
| + boolean enabled = shouldShowDeleteButton();
|
| + mDeleteButton.setVisibility(enabled ? VISIBLE : GONE);
|
| + mBookmarkButton.setVisibility(enabled ? View.GONE : View.VISIBLE);
|
| + }
|
| +
|
| + @Override
|
| + protected void updateLayoutParams() {
|
| + // Calculate the bookmark/delete button margins.
|
| + final MarginLayoutParams micLayoutParams =
|
| + (MarginLayoutParams) mMicButton.getLayoutParams();
|
| + int micSpace = ApiCompatibilityUtils.getMarginEnd(micLayoutParams);
|
| + if (mMicButton.getVisibility() != View.GONE) micSpace += mMicButton.getWidth();
|
| +
|
| + final MarginLayoutParams deleteLayoutParams =
|
| + (MarginLayoutParams) mDeleteButton.getLayoutParams();
|
| + final MarginLayoutParams bookmarkLayoutParams =
|
| + (MarginLayoutParams) mBookmarkButton.getLayoutParams();
|
| +
|
| + ApiCompatibilityUtils.setMarginEnd(deleteLayoutParams, micSpace);
|
| + ApiCompatibilityUtils.setMarginEnd(bookmarkLayoutParams, micSpace);
|
| +
|
| + mDeleteButton.setLayoutParams(deleteLayoutParams);
|
| + mBookmarkButton.setLayoutParams(bookmarkLayoutParams);
|
| +
|
| + super.updateLayoutParams();
|
| + }
|
| +}
|
|
|