From 70d8be7616a450e9b7ef09c8bda5a8b25936a29a Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 23 Jun 2015 19:33:02 +0000 Subject: [PATCH] Fix issue #22013372: Assist should take translationX and friends... ...into account when calculating the position information Actually what we need here is the full transformation matrix, if it is available. And that means actually computing the location of views on the screen requires doing this all through transformations, so the AssistVisualizer has been changed to do this (while still also keeping the old mechanism for comparison to verify that things are working correctly). Also added new properties for elevation and alpha. And optimized the parcelling of AssistStructure to not write things that aren't needed; this reduces the parcelled size by about half. Change-Id: I50b0dd2e6599c74701a5d188617a3eff64b07d03 --- api/current.txt | 6 + api/system-current.txt | 6 + .../android/app/assist/AssistStructure.java | 292 +++++++++++++----- core/java/android/view/View.java | 21 +- core/java/android/view/ViewStructure.java | 23 ++ .../res/layout/voice_interaction_session.xml | 41 ++- tests/VoiceInteraction/res/values/strings.xml | 2 + .../voiceinteraction/AssistVisualizer.java | 103 +++++- .../MainInteractionSession.java | 29 +- 9 files changed, 407 insertions(+), 116 deletions(-) diff --git a/api/current.txt b/api/current.txt index cd5c0a8fe558f..3f425a252380b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5846,10 +5846,12 @@ package android.app.assist { } public static class AssistStructure.ViewNode { + method public float getAlpha(); method public android.app.assist.AssistStructure.ViewNode getChildAt(int); method public int getChildCount(); method public java.lang.String getClassName(); method public java.lang.CharSequence getContentDescription(); + method public float getElevation(); method public android.os.Bundle getExtras(); method public int getHeight(); method public java.lang.String getHint(); @@ -5868,6 +5870,7 @@ package android.app.assist { method public float getTextSize(); method public int getTextStyle(); method public int getTop(); + method public android.graphics.Matrix getTransformation(); method public int getVisibility(); method public int getWidth(); method public boolean isAccessibilityFocused(); @@ -36962,6 +36965,7 @@ package android.view { method public abstract android.view.ViewStructure newChild(int); method public abstract void setAccessibilityFocused(boolean); method public abstract void setActivated(boolean); + method public abstract void setAlpha(float); method public abstract void setCheckable(boolean); method public abstract void setChecked(boolean); method public abstract void setChildCount(int); @@ -36970,6 +36974,7 @@ package android.view { method public abstract void setContentDescription(java.lang.CharSequence); method public abstract void setContextClickable(boolean); method public abstract void setDimens(int, int, int, int, int, int); + method public abstract void setElevation(float); method public abstract void setEnabled(boolean); method public abstract void setFocusable(boolean); method public abstract void setFocused(boolean); @@ -36980,6 +36985,7 @@ package android.view { method public abstract void setText(java.lang.CharSequence); method public abstract void setText(java.lang.CharSequence, int, int); method public abstract void setTextStyle(float, int, int, int); + method public abstract void setTransformation(android.graphics.Matrix); method public abstract void setVisibility(int); } diff --git a/api/system-current.txt b/api/system-current.txt index 574f0c825759d..33c7a1b1213ad 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5964,10 +5964,12 @@ package android.app.assist { } public static class AssistStructure.ViewNode { + method public float getAlpha(); method public android.app.assist.AssistStructure.ViewNode getChildAt(int); method public int getChildCount(); method public java.lang.String getClassName(); method public java.lang.CharSequence getContentDescription(); + method public float getElevation(); method public android.os.Bundle getExtras(); method public int getHeight(); method public java.lang.String getHint(); @@ -5986,6 +5988,7 @@ package android.app.assist { method public float getTextSize(); method public int getTextStyle(); method public int getTop(); + method public android.graphics.Matrix getTransformation(); method public int getVisibility(); method public int getWidth(); method public boolean isAccessibilityFocused(); @@ -39243,6 +39246,7 @@ package android.view { method public abstract android.view.ViewStructure newChild(int); method public abstract void setAccessibilityFocused(boolean); method public abstract void setActivated(boolean); + method public abstract void setAlpha(float); method public abstract void setCheckable(boolean); method public abstract void setChecked(boolean); method public abstract void setChildCount(int); @@ -39251,6 +39255,7 @@ package android.view { method public abstract void setContentDescription(java.lang.CharSequence); method public abstract void setContextClickable(boolean); method public abstract void setDimens(int, int, int, int, int, int); + method public abstract void setElevation(float); method public abstract void setEnabled(boolean); method public abstract void setFocusable(boolean); method public abstract void setFocused(boolean); @@ -39261,6 +39266,7 @@ package android.view { method public abstract void setText(java.lang.CharSequence); method public abstract void setText(java.lang.CharSequence, int, int); method public abstract void setTextStyle(float, int, int, int); + method public abstract void setTransformation(android.graphics.Matrix); method public abstract void setVisibility(int); } diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index 284dfd62173ac..3429b6e2ddf21 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -2,6 +2,7 @@ package android.app.assist; import android.app.Activity; import android.content.ComponentName; +import android.graphics.Matrix; import android.graphics.Rect; import android.os.Binder; import android.os.Bundle; @@ -128,24 +129,24 @@ public class AssistStructure implements Parcelable { view.dispatchProvideStructure(builder); } - WindowNode(Parcel in, PooledStringReader preader) { + WindowNode(Parcel in, PooledStringReader preader, float[] tmpMatrix) { mX = in.readInt(); mY = in.readInt(); mWidth = in.readInt(); mHeight = in.readInt(); mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); mDisplayId = in.readInt(); - mRoot = new ViewNode(in, preader); + mRoot = new ViewNode(in, preader, tmpMatrix); } - void writeToParcel(Parcel out, PooledStringWriter pwriter) { + int writeToParcel(Parcel out, PooledStringWriter pwriter, float[] tmpMatrix) { out.writeInt(mX); out.writeInt(mY); out.writeInt(mWidth); out.writeInt(mHeight); TextUtils.writeToParcel(mTitle, out, 0); out.writeInt(mDisplayId); - mRoot.writeToParcel(out, pwriter); + return mRoot.writeToParcel(out, pwriter, tmpMatrix); } /** @@ -216,7 +217,7 @@ public class AssistStructure implements Parcelable { public static final int TEXT_STYLE_UNDERLINE = 1<<2; public static final int TEXT_STYLE_STRIKE_THRU = 1<<3; - int mId; + int mId = View.NO_ID; String mIdPackage; String mIdType; String mIdEntry; @@ -226,20 +227,35 @@ public class AssistStructure implements Parcelable { int mScrollY; int mWidth; int mHeight; + Matrix mMatrix; + float mElevation; + float mAlpha = 1.0f; static final int FLAGS_DISABLED = 0x00000001; static final int FLAGS_VISIBILITY_MASK = View.VISIBLE|View.INVISIBLE|View.GONE; static final int FLAGS_FOCUSABLE = 0x00000010; static final int FLAGS_FOCUSED = 0x00000020; - static final int FLAGS_ACCESSIBILITY_FOCUSED = 0x04000000; static final int FLAGS_SELECTED = 0x00000040; static final int FLAGS_ASSIST_BLOCKED = 0x00000080; - static final int FLAGS_ACTIVATED = 0x40000000; static final int FLAGS_CHECKABLE = 0x00000100; static final int FLAGS_CHECKED = 0x00000200; - static final int FLAGS_CLICKABLE = 0x00004000; - static final int FLAGS_LONG_CLICKABLE = 0x00200000; - static final int FLAGS_CONTEXT_CLICKABLE = 0x00400000; + static final int FLAGS_CLICKABLE = 0x00000400; + static final int FLAGS_LONG_CLICKABLE = 0x00000800; + static final int FLAGS_ACCESSIBILITY_FOCUSED = 0x00001000; + static final int FLAGS_ACTIVATED = 0x00002000; + static final int FLAGS_CONTEXT_CLICKABLE = 0x00004000; + + static final int FLAGS_HAS_MATRIX = 0x40000000; + static final int FLAGS_HAS_ALPHA = 0x20000000; + static final int FLAGS_HAS_ELEVATION = 0x10000000; + static final int FLAGS_HAS_SCROLL = 0x08000000; + static final int FLAGS_HAS_LARGE_COORDS = 0x04000000; + static final int FLAGS_HAS_CONTENT_DESCRIPTION = 0x02000000; + static final int FLAGS_HAS_TEXT = 0x01000000; + static final int FLAGS_HAS_EXTRAS = 0x00800000; + static final int FLAGS_HAS_ID = 0x00400000; + static final int FLAGS_HAS_CHILDREN = 0x00200000; + static final int FLAGS_ALL_CONTROL = 0xfff00000; int mFlags; @@ -254,79 +270,153 @@ public class AssistStructure implements Parcelable { ViewNode() { } - ViewNode(Parcel in, PooledStringReader preader) { - mId = in.readInt(); - if (mId != 0) { - mIdEntry = preader.readString(); - if (mIdEntry != null) { - mIdType = preader.readString(); - mIdPackage = preader.readString(); - } else { - mIdPackage = mIdType = null; - } - } else { - mIdPackage = mIdType = mIdEntry = null; - } - mX = in.readInt(); - mY = in.readInt(); - mScrollX = in.readInt(); - mScrollY = in.readInt(); - mWidth = in.readInt(); - mHeight = in.readInt(); - mFlags = in.readInt(); + ViewNode(Parcel in, PooledStringReader preader, float[] tmpMatrix) { mClassName = preader.readString(); - mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - if (in.readInt() != 0) { - mText = new ViewNodeText(in); - } else { - mText = null; + mFlags = in.readInt(); + final int flags = mFlags; + if ((flags&FLAGS_HAS_ID) != 0) { + mId = in.readInt(); + if (mId != 0) { + mIdEntry = preader.readString(); + if (mIdEntry != null) { + mIdType = preader.readString(); + mIdPackage = preader.readString(); + } + } } - mExtras = in.readBundle(); - final int NCHILDREN = in.readInt(); - if (NCHILDREN > 0) { + if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) { + mX = in.readInt(); + mY = in.readInt(); + mWidth = in.readInt(); + mHeight = in.readInt(); + } else { + int val = in.readInt(); + mX = val&0x7fff; + mY = (val>>16)&0x7fff; + val = in.readInt(); + mWidth = val&0x7fff; + mHeight = (val>>16)&0x7fff; + } + if ((flags&FLAGS_HAS_SCROLL) != 0) { + mScrollX = in.readInt(); + mScrollY = in.readInt(); + } + if ((flags&FLAGS_HAS_MATRIX) != 0) { + mMatrix = new Matrix(); + in.readFloatArray(tmpMatrix); + mMatrix.setValues(tmpMatrix); + } + if ((flags&FLAGS_HAS_ELEVATION) != 0) { + mElevation = in.readFloat(); + } + if ((flags&FLAGS_HAS_ALPHA) != 0) { + mAlpha = in.readFloat(); + } + if ((flags&FLAGS_HAS_CONTENT_DESCRIPTION) != 0) { + mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); + } + if ((flags&FLAGS_HAS_TEXT) != 0) { + mText = new ViewNodeText(in); + } + if ((flags&FLAGS_HAS_EXTRAS) != 0) { + mExtras = in.readBundle(); + } + if ((flags&FLAGS_HAS_CHILDREN) != 0) { + final int NCHILDREN = in.readInt(); mChildren = new ViewNode[NCHILDREN]; for (int i=0; i 0) { // We waited too long, assume none of the assist structure is valid. + Log.w(TAG, "Skipping assist structure, waiting too long for async children (have " + + mPendingAsyncChildren.size() + " remaining"); skipStructure = true; } } int start = out.dataPosition(); PooledStringWriter pwriter = new PooledStringWriter(out); + float[] tmpMatrix = new float[9]; ComponentName.writeToParcel(mActivityComponent, out); final int N = skipStructure ? 0 : mWindowNodes.size(); out.writeInt(N); + int NV = 0; for (int i=0; i + + @@ -30,19 +35,29 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" - android:orientation="vertical" + android:orientation="horizontal" android:background="#ffffffff" android:elevation="8dp" > + + +