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

Unified Diff: android_webview/java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java

Issue 2515343004: Update selection handle bitmaps in AW if DIP scale changes (Closed)
Patch Set: Initialized mDeviceScale in constructor Created 4 years, 1 month 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java
diff --git a/android_webview/java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java b/android_webview/java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java
index 3ff98343cea2b2c478152fda964b7dad672b6edb..1e809d1701303e2faae5d694bfe214030b4bd61d 100644
--- a/android_webview/java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java
+++ b/android_webview/java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java
@@ -6,6 +6,7 @@ package org.chromium.android_webview;
import android.annotation.SuppressLint;
import android.content.Context;
+import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Build;
@@ -27,6 +28,8 @@ import org.chromium.content.browser.PositionObserver;
import org.chromium.content.browser.ViewPositionObserver;
import org.chromium.content.browser.input.HandleViewResources;
import org.chromium.content_public.browser.GestureStateListener;
+import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.display.DisplayAndroid.DisplayAndroidObserver;
import org.chromium.ui.touch_selection.TouchHandleOrientation;
import java.lang.reflect.InvocationTargetException;
@@ -40,7 +43,20 @@ import java.lang.reflect.Method;
*
*/
@JNINamespace("android_webview")
-public class PopupTouchHandleDrawable extends View {
+public class PopupTouchHandleDrawable extends View implements DisplayAndroidObserver {
+ @Override
+ public void onRotationChanged(int rotation) {}
+
+ @Override
+ public void onDIPScaleChanged(float dipScale) {
+ if (mDeviceScale != dipScale) {
+ mDeviceScale = dipScale;
+
+ // Postpone update till onConfigurationChanged()
+ mNeedsUpdateDrawable = true;
+ }
+ }
+
private final PopupWindow mContainer;
private final PositionObserver.Listener mParentPositionListener;
private ContentViewCore mContentViewCore;
@@ -68,6 +84,8 @@ public class PopupTouchHandleDrawable extends View {
private int mOrientation = TouchHandleOrientation.UNDEFINED;
+ private float mDeviceScale;
+
// Length of the delay before fading in after the last page movement.
private static final int MOVING_FADE_IN_DELAY_MS = 300;
private static final int FADE_IN_DURATION_MS = 200;
@@ -98,6 +116,8 @@ public class PopupTouchHandleDrawable extends View {
private Runnable mInvalidationRunnable;
private boolean mHasPendingInvalidate;
+ private boolean mNeedsUpdateDrawable;
+
// List of drawables used to inform them of the container view switching.
private final ObserverList<PopupTouchHandleDrawable> mDrawableObserverList;
@@ -108,8 +128,12 @@ public class PopupTouchHandleDrawable extends View {
mDrawableObserverList.addObserver(this);
mContentViewCore = contentViewCore;
- mContainer = new PopupWindow(mContentViewCore.getWindowAndroid().getContext().get(),
- null, android.R.attr.textSelectHandleWindowStyle);
+
+ WindowAndroid windowAndroid = mContentViewCore.getWindowAndroid();
boliu 2016/11/29 03:35:43 need null check for windowAndroid
Tima Vaisburd 2016/11/29 17:14:52 Without windowAndroid we apparently cannot create
boliu 2016/11/29 17:22:52 No, the better thing would be to not create the ob
+ mDeviceScale = windowAndroid.getDisplay().getDipScale();
+
+ mContainer = new PopupWindow(
+ windowAndroid.getContext().get(), null, android.R.attr.textSelectHandleWindowStyle);
mContainer.setSplitTouchEnabled(true);
mContainer.setClippingEnabled(false);
@@ -251,6 +275,19 @@ public class PopupTouchHandleDrawable extends View {
if (orientationChanged || mirroringChanged) scheduleInvalidate();
}
+ @SuppressLint("NewApi")
+ private void updateDrawableAndRequestLayout() {
+ mNeedsUpdateDrawable = false;
+
+ if (mDrawable == null) return;
+
+ mDrawable = getHandleDrawable(getContext(), mOrientation);
+
+ if (mDrawable != null) mDrawable.setAlpha((int) (255 * mAlpha));
+
+ if (!isInLayout()) requestLayout();
+ }
+
private void updateParentPosition(int parentPositionX, int parentPositionY) {
if (mParentPositionX == parentPositionX && mParentPositionY == parentPositionY) return;
mParentPositionX = parentPositionX;
@@ -259,13 +296,11 @@ public class PopupTouchHandleDrawable extends View {
}
private int getContainerPositionX() {
- final float deviceScale = mContentViewCore.getDeviceScaleFactor();
- return mParentPositionX + (int) (mOriginXDip * deviceScale);
+ return mParentPositionX + (int) (mOriginXDip * mDeviceScale);
}
private int getContainerPositionY() {
- final float deviceScale = mContentViewCore.getDeviceScaleFactor();
- return mParentPositionY + (int) (mOriginYDip * deviceScale);
+ return mParentPositionY + (int) (mOriginYDip * mDeviceScale);
}
private void updatePosition() {
@@ -274,11 +309,10 @@ public class PopupTouchHandleDrawable extends View {
}
private boolean isShowingAllowed() {
- final float deviceScale = mContentViewCore.getDeviceScaleFactor();
// mOriginX/YDip * deviceScale is the distance of the handler drawable from the top left of
// the containerView (the WebView).
return mAttachedToWindow && mVisible && mFocused && !mScrolling && !mTemporarilyHidden
- && isPositionVisible(mOriginXDip * deviceScale, mOriginYDip * deviceScale);
+ && isPositionVisible(mOriginXDip * mDeviceScale, mOriginYDip * mDeviceScale);
}
// Adapted from android.widget.Editor#isPositionVisible.
@@ -446,6 +480,16 @@ public class PopupTouchHandleDrawable extends View {
}
@Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+
+ // Update the drawable when the configuration with the new density comes.
+ if (mNeedsUpdateDrawable && mDeviceScale == getResources().getDisplayMetrics().density) {
+ updateDrawableAndRequestLayout();
+ }
+ }
+
+ @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mDrawable == null) {
setMeasuredDimension(0, 0);
@@ -475,11 +519,22 @@ public class PopupTouchHandleDrawable extends View {
super.onAttachedToWindow();
mAttachedToWindow = true;
onVisibilityInputChanged();
+
+ WindowAndroid windowAndroid = mContentViewCore.getWindowAndroid();
+ if (windowAndroid != null) {
+ windowAndroid.getDisplay().addObserver(this);
+ mDeviceScale = windowAndroid.getDisplay().getDipScale();
Tima Vaisburd 2016/11/29 02:55:58 Here I just assigned the value directly instead of
+ updateDrawableAndRequestLayout();
+ }
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
+
+ WindowAndroid windowAndroid = mContentViewCore.getWindowAndroid();
+ if (windowAndroid != null) windowAndroid.getDisplay().removeObserver(this);
+
mAttachedToWindow = false;
onVisibilityInputChanged();
}
@@ -555,15 +610,13 @@ public class PopupTouchHandleDrawable extends View {
@CalledByNative
private float getVisibleWidthDip() {
if (mDrawable == null) return 0;
- if (mContentViewCore == null) return 0;
- return mDrawable.getIntrinsicWidth() / mContentViewCore.getDeviceScaleFactor();
+ return mDrawable.getIntrinsicWidth() / mDeviceScale;
}
@CalledByNative
private float getVisibleHeightDip() {
if (mDrawable == null) return 0;
- if (mContentViewCore == null) return 0;
- return mDrawable.getIntrinsicHeight() / mContentViewCore.getDeviceScaleFactor();
+ return mDrawable.getIntrinsicHeight() / mDeviceScale;
}
public void onContainerViewChanged(ViewGroup newContainerView) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698