diff options
-rw-r--r-- | api/current.xml | 59 | ||||
-rw-r--r-- | core/java/android/content/Intent.java | 69 | ||||
-rw-r--r-- | graphics/java/android/graphics/Rect.java | 42 |
3 files changed, 169 insertions, 1 deletions
diff --git a/api/current.xml b/api/current.xml index 761d6c1..d530c34 100644 --- a/api/current.xml +++ b/api/current.xml @@ -34043,6 +34043,17 @@ <parameter name="defaultValue" type="short"> </parameter> </method> +<method name="getSourceBounds" + return="android.graphics.Rect" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getStringArrayExtra" return="java.lang.String[]" abstract="false" @@ -34854,6 +34865,19 @@ <parameter name="packageName" type="java.lang.String"> </parameter> </method> +<method name="setSourceBounds" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="r" type="android.graphics.Rect"> +</parameter> +</method> <method name="setType" return="android.content.Intent" abstract="false" @@ -36434,6 +36458,17 @@ visibility="public" > </field> +<field name="FILL_IN_SOURCE_BOUNDS" + type="int" + transient="false" + volatile="false" + value="32" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="FLAG_ACTIVITY_BROUGHT_TO_FRONT" type="int" transient="false" @@ -62120,6 +62155,17 @@ visibility="public" > </method> +<method name="flattenToString" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="height" return="int" abstract="false" @@ -62346,6 +62392,19 @@ visibility="public" > </method> +<method name="unflattenFromString" + return="android.graphics.Rect" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="str" type="java.lang.String"> +</parameter> +</method> <method name="union" return="void" abstract="false" diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 6ba79b4..8d69814 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -26,6 +26,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; @@ -2417,6 +2418,7 @@ public class Intent implements Parcelable { private int mFlags; private HashSet<String> mCategories; private Bundle mExtras; + private Rect mSourceBounds; // --------------------------------------------------------------------- @@ -2442,6 +2444,9 @@ public class Intent implements Parcelable { if (o.mExtras != null) { this.mExtras = new Bundle(o.mExtras); } + if (o.mSourceBounds != null) { + this.mSourceBounds = new Rect(o.mSourceBounds); + } } @Override @@ -2635,7 +2640,7 @@ public class Intent implements Parcelable { intent.mType = value; } - // launch flags + // launch flags else if (uri.startsWith("launchFlags=", i)) { intent.mFlags = Integer.decode(value).intValue(); } @@ -2655,6 +2660,11 @@ public class Intent implements Parcelable { scheme = value; } + // source bounds + else if (uri.startsWith("sourceBounds=", i)) { + intent.mSourceBounds = Rect.unflattenFromString(value); + } + // extra else { String key = Uri.decode(uri.substring(i + 2, eq)); @@ -3547,6 +3557,15 @@ public class Intent implements Parcelable { } /** + * Get the bounds of the sender of this intent, in screen coordinates. This can be + * used as a hint to the receiver for animations and the like. Null means that there + * is no source bounds. + */ + public Rect getSourceBounds() { + return mSourceBounds; + } + + /** * Return the Activity component that should be used to handle this intent. * The appropriate component is determined based on the information in the * intent, evaluated as follows: @@ -4648,6 +4667,19 @@ public class Intent implements Parcelable { } /** + * Set the bounds of the sender of this intent, in screen coordinates. This can be + * used as a hint to the receiver for animations and the like. Null means that there + * is no source bounds. + */ + public void setSourceBounds(Rect r) { + if (r != null) { + mSourceBounds = new Rect(r); + } else { + r = null; + } + } + + /** * Use with {@link #fillIn} to allow the current action value to be * overwritten, even if it is already set. */ @@ -4678,6 +4710,12 @@ public class Intent implements Parcelable { public static final int FILL_IN_PACKAGE = 1<<4; /** + * Use with {@link #fillIn} to allow the current package value to be + * overwritten, even if it is already set. + */ + public static final int FILL_IN_SOURCE_BOUNDS = 1<<5; + + /** * Copy the contents of <var>other</var> in to this object, but only * where fields are not defined by this object. For purposes of a field * being defined, the following pieces of data in the Intent are @@ -4691,6 +4729,7 @@ public class Intent implements Parcelable { * <li> package, as set by {@link #setPackage}. * <li> component, as set by {@link #setComponent(ComponentName)} or * related methods. + * <li> source bounds, as set by {@link #setSourceBounds} * <li> each top-level name in the associated extras. * </ul> * @@ -4752,6 +4791,11 @@ public class Intent implements Parcelable { changes |= FILL_IN_COMPONENT; } mFlags |= other.mFlags; + if (other.mSourceBounds != null + && (mSourceBounds == null || (flags&FILL_IN_SOURCE_BOUNDS) != 0)) { + mSourceBounds = new Rect(other.mSourceBounds); + changes |= FILL_IN_SOURCE_BOUNDS; + } if (mExtras == null) { if (other.mExtras != null) { mExtras = new Bundle(other.mExtras); @@ -5005,6 +5049,13 @@ public class Intent implements Parcelable { first = false; b.append("cmp=").append(mComponent.flattenToShortString()); } + if (mSourceBounds != null) { + if (!first) { + b.append(' '); + } + first = false; + b.append("bnds=").append(mSourceBounds.toShortString()); + } if (extras && mExtras != null) { if (!first) { b.append(' '); @@ -5096,6 +5147,11 @@ public class Intent implements Parcelable { uri.append("component=").append(Uri.encode( mComponent.flattenToShortString(), "/")).append(';'); } + if (mSourceBounds != null) { + uri.append("sourceBounds=") + .append(Uri.encode(mSourceBounds.flattenToString())) + .append(';'); + } if (mExtras != null) { for (String key : mExtras.keySet()) { final Object value = mExtras.get(key); @@ -5139,6 +5195,13 @@ public class Intent implements Parcelable { out.writeString(mPackage); ComponentName.writeToParcel(mComponent, out); + if (mSourceBounds != null) { + out.writeInt(1); + mSourceBounds.writeToParcel(out, flags); + } else { + out.writeInt(0); + } + if (mCategories != null) { out.writeInt(mCategories.size()); for (String category : mCategories) { @@ -5174,6 +5237,10 @@ public class Intent implements Parcelable { mPackage = in.readString(); mComponent = ComponentName.readFromParcel(in); + if (in.readInt() != 0) { + mSourceBounds = Rect.CREATOR.createFromParcel(in); + } + int N = in.readInt(); if (N > 0) { mCategories = new HashSet<String>(); diff --git a/graphics/java/android/graphics/Rect.java b/graphics/java/android/graphics/Rect.java index 42a14ce..98ffb8b 100644 --- a/graphics/java/android/graphics/Rect.java +++ b/graphics/java/android/graphics/Rect.java @@ -20,6 +20,8 @@ import android.os.Parcel; import android.os.Parcelable; import java.io.PrintWriter; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Rect holds four integer coordinates for a rectangle. The rectangle is @@ -34,6 +36,9 @@ public final class Rect implements Parcelable { public int right; public int bottom; + private static final Pattern FLATTENED_PATTERN = Pattern.compile( + "(-?\\d+) (-?\\d+) (-?\\d+) (-?\\d+)"); + /** * Create a new empty Rect. All coordinates are initialized to 0. */ @@ -105,6 +110,43 @@ public final class Rect implements Parcelable { sb.append(','); sb.append(bottom); sb.append(']'); return sb.toString(); } + + /** + * Return a string representation of the rectangle in a well-defined format. + * + * <p>You can later recover the Rect from this string through + * {@link #unflattenFromString(String)}. + * + * @return Returns a new String of the form "left top right bottom" + */ + public String flattenToString() { + StringBuilder sb = new StringBuilder(32); + // WARNING: Do not change the format of this string, it must be + // preserved because Rects are saved in this flattened format. + sb.append(left); + sb.append(' '); + sb.append(top); + sb.append(' '); + sb.append(right); + sb.append(' '); + sb.append(bottom); + return sb.toString(); + } + + /** + * Returns a Rect from a string of the form returned by {@link #flattenToString}, + * or null if the string is not of that form. + */ + public static Rect unflattenFromString(String str) { + Matcher matcher = FLATTENED_PATTERN.matcher(str); + if (!matcher.matches()) { + return null; + } + return new Rect(Integer.parseInt(matcher.group(1)), + Integer.parseInt(matcher.group(2)), + Integer.parseInt(matcher.group(3)), + Integer.parseInt(matcher.group(4))); + } /** * Print short representation to given writer. |