diff options
32 files changed, 946 insertions, 217 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk index 1acb620bee2d..337b30f0843a 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -89,6 +89,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/target/common/obj/APPS/Music2_in $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/nfc/INdefTag.java) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libstagefright_aacdec_intermediates) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libstagefright_mp3dec_intermediates) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST diff --git a/api/11.xml b/api/11.xml index 4f4cc5e0ab47..31cfc85db89a 100644 --- a/api/11.xml +++ b/api/11.xml @@ -160213,17 +160213,6 @@ visibility="public" > </field> -<field name="ACTION_MTP_SESSION_END" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.provider.action.MTP_SESSION_END"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="ACTION_VIDEO_CAPTURE" type="java.lang.String" transient="false" @@ -166493,6 +166482,74 @@ <parameter name="d" type="float[]"> </parameter> </method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="int[]"> +</parameter> +</method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="short[]"> +</parameter> +</method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="byte[]"> +</parameter> +</method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="float[]"> +</parameter> +</method> <method name="copy2DRangeFrom" return="void" abstract="false" @@ -166672,6 +166729,58 @@ <parameter name="b" type="android.graphics.Bitmap"> </parameter> </method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="int[]"> +</parameter> +</method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="short[]"> +</parameter> +</method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="byte[]"> +</parameter> +</method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="float[]"> +</parameter> +</method> <method name="copyTo" return="void" abstract="false" @@ -175641,6 +175750,17 @@ visibility="public" > </field> +<field name="KEY_PARAM_PAN" + type="java.lang.String" + transient="false" + volatile="false" + value=""pan"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="KEY_PARAM_STREAM" type="java.lang.String" transient="false" @@ -175663,6 +175783,17 @@ visibility="public" > </field> +<field name="KEY_PARAM_VOLUME" + type="java.lang.String" + transient="false" + volatile="false" + value=""volume"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> </class> <interface name="TextToSpeech.OnInitListener" abstract="true" diff --git a/api/current.xml b/api/current.xml index 69276d6e50cd..83bfedb7281d 100644 --- a/api/current.xml +++ b/api/current.xml @@ -160224,17 +160224,6 @@ visibility="public" > </field> -<field name="ACTION_MTP_SESSION_END" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.provider.action.MTP_SESSION_END"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="ACTION_VIDEO_CAPTURE" type="java.lang.String" transient="false" @@ -166504,6 +166493,74 @@ <parameter name="d" type="float[]"> </parameter> </method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="int[]"> +</parameter> +</method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="short[]"> +</parameter> +</method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="byte[]"> +</parameter> +</method> +<method name="copy1DRangeFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="off" type="int"> +</parameter> +<parameter name="count" type="int"> +</parameter> +<parameter name="d" type="float[]"> +</parameter> +</method> <method name="copy2DRangeFrom" return="void" abstract="false" @@ -166683,6 +166740,58 @@ <parameter name="b" type="android.graphics.Bitmap"> </parameter> </method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="int[]"> +</parameter> +</method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="short[]"> +</parameter> +</method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="byte[]"> +</parameter> +</method> +<method name="copyFromUnchecked" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="d" type="float[]"> +</parameter> +</method> <method name="copyTo" return="void" abstract="false" @@ -260228,7 +260337,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="t" type="T"> +<parameter name="arg0" type="T"> </parameter> </method> </interface> diff --git a/build/phone-hdpi-512-dalvik-heap.mk b/build/phone-hdpi-512-dalvik-heap.mk index a7f9d326e5a0..630cf035a741 100644 --- a/build/phone-hdpi-512-dalvik-heap.mk +++ b/build/phone-hdpi-512-dalvik-heap.mk @@ -19,4 +19,5 @@ PRODUCT_PROPERTY_OVERRIDES += \ dalvik.vm.heapstartsize=5m \ - dalvik.vm.heapsize=32m + dalvik.vm.growthlimit=32m \ + dalvik.vm.heapsize=128m diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index d5aa9619962c..133a7d04003f 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -64,8 +64,11 @@ public class ActivityManager { static public int staticGetMemoryClass() { // Really brain dead right now -- just take this from the configured // vm heap size, and assume it is in megabytes and thus ends with "m". - String vmHeapSize = SystemProperties.get("dalvik.vm.smallheapsize", "16m"); - return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1)); + String vmHeapSize = SystemProperties.get("dalvik.vm.growthlimit", ""); + if (vmHeapSize != null && !"".equals(vmHeapSize)) { + return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1)); + } + return staticGetLargeMemoryClass(); } /** diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index db046ef73597..7cf60f99efbd 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3463,7 +3463,7 @@ public final class ActivityThread { } if ((data.appInfo.flags&ApplicationInfo.FLAG_LARGE_HEAP) != 0) { - // XXX bump up Dalvik's heap. + dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); } // If the app is being launched for full backup or restore, bring it up in diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 0243b02524e4..de84c566e5f7 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -34,6 +34,9 @@ import java.text.NumberFormat; * A class that represents how a persistent notification is to be presented to * the user using the {@link android.app.NotificationManager}. * + * <p>The {@link Notification.Builder Notification.Builder} has been added to make it + * easier to construct Notifications.</p> + * * <p>For a guide to creating notifications, see the * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Creating Status * Bar Notifications</a> document in the Dev Guide.</p> @@ -119,15 +122,8 @@ public class Notification implements Parcelable /** * An intent to launch instead of posting the notification to the status bar. - * Only for use with extremely high-priority notifications demanding the user's - * <strong>immediate</strong> attention, such as an incoming phone call or - * alarm clock that the user has explicitly set to a particular time. - * If this facility is used for something else, please give the user an option - * to turn it off and use a normal notification, as this can be extremely - * disruptive. - * - * <p>Use with {@link #FLAG_HIGH_PRIORITY} to ensure that this notification - * will reach the user even when other notifications are suppressed. + * + * @see Notification.Builder#setFullScreenIntent */ public PendingIntent fullScreenIntent; @@ -278,7 +274,7 @@ public class Notification implements Parcelable /** * Bit to be bitwise-ored into the {@link #flags} field that should be * set if the notification should be canceled when it is clicked by the - * user. + * user. On tablets, the */ public static final int FLAG_AUTO_CANCEL = 0x00000010; @@ -618,6 +614,10 @@ public class Notification implements Parcelable return sb.toString(); } + /** + * Builder class for {@link Notification} objects. Allows easier control over + * all the flags, as well as help constructing the typical notification layouts. + */ public static class Builder { private Context mContext; @@ -644,6 +644,16 @@ public class Notification implements Parcelable private int mDefaults; private int mFlags; + /** + * Constructor. + * + * Automatically sets the when field to {@link System#currentTimeMillis() + * System.currentTimeMllis()} and the audio stream to the {@link #STREAM_DEFAULT}. + * + * @param context A {@link Context} that will be used to construct the + * RemoteViews. The Context will not be held past the lifetime of this + * Builder object. + */ public Builder(Context context) { mContext = context; @@ -652,96 +662,192 @@ public class Notification implements Parcelable mAudioStreamType = STREAM_DEFAULT; } + /** + * Set the time that the event occurred. Notifications in the panel are + * sorted by this time. + */ public Builder setWhen(long when) { mWhen = when; return this; } + /** + * Set the small icon to use in the notification layouts. Different classes of devices + * may return different sizes. See the UX guidelines for more information on how to + * design these icons. + * + * @param icon A resource ID in the application's package of the drawble to use. + */ public Builder setSmallIcon(int icon) { mSmallIcon = icon; return this; } + /** + * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional + * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable + * LevelListDrawable}. + * + * @param icon A resource ID in the application's package of the drawble to use. + * @param level The level to use for the icon. + * + * @see android.graphics.drawable.LevelListDrawable + */ public Builder setSmallIcon(int icon, int level) { mSmallIcon = icon; mSmallIconLevel = level; return this; } + /** + * Set the title (first row) of the notification, in a standard notification. + */ public Builder setContentTitle(CharSequence title) { mContentTitle = title; return this; } + /** + * Set the text (second row) of the notification, in a standard notification. + */ public Builder setContentText(CharSequence text) { mContentText = text; return this; } + /** + * Set the large number at the right-hand side of the notification. This is + * equivalent to setContentInfo, although it might show the number in a different + * font size for readability. + */ public Builder setNumber(int number) { mNumber = number; return this; } + /** + * Set the large text at the right-hand side of the notification. + */ public Builder setContentInfo(CharSequence info) { mContentInfo = info; return this; } + /** + * Supply a custom RemoteViews to use instead of the standard one. + */ public Builder setContent(RemoteViews views) { mContentView = views; return this; } + /** + * Supply a {@link PendingIntent} to send when the notification is clicked. + * If you do not supply an intent, you can now add PendingIntents to individual + * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent + * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}. + */ public Builder setContentIntent(PendingIntent intent) { mContentIntent = intent; return this; } + /** + * Supply a {@link PendingIntent} to send when the notification is cleared by the user + * directly from the notification panel. For example, this intent is sent when the user + * clicks the "Clear all" button, or the individual "X" buttons on notifications. This + * intent is not sent when the application calls {@link NotificationManager#cancel + * NotificationManager.cancel(int)}. + */ public Builder setDeleteIntent(PendingIntent intent) { mDeleteIntent = intent; return this; } + /** + * An intent to launch instead of posting the notification to the status bar. + * Only for use with extremely high-priority notifications demanding the user's + * <strong>immediate</strong> attention, such as an incoming phone call or + * alarm clock that the user has explicitly set to a particular time. + * If this facility is used for something else, please give the user an option + * to turn it off and use a normal notification, as this can be extremely + * disruptive. + * + * @param intent The pending intent to launch. + * @param highPriority Passing true will cause this notification to be sent + * even if other notifications are suppressed. + */ public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) { mFullScreenIntent = intent; setFlag(FLAG_HIGH_PRIORITY, highPriority); return this; } + /** + * Set the text that is displayed in the status bar when the notification first + * arrives. + */ public Builder setTicker(CharSequence tickerText) { mTickerText = tickerText; return this; } + /** + * Set the text that is displayed in the status bar when the notification first + * arrives, and also a RemoteViews object that may be displayed instead on some + * devices. + */ public Builder setTicker(CharSequence tickerText, RemoteViews views) { mTickerText = tickerText; mTickerView = views; return this; } + /** + * Set the large icon that is shown in the ticker and notification. + */ public Builder setLargeIcon(Bitmap icon) { mLargeIcon = icon; return this; } + /** + * Set the sound to play. It will play on the default stream. + */ public Builder setSound(Uri sound) { mSound = sound; mAudioStreamType = STREAM_DEFAULT; return this; } + /** + * Set the sound to play. It will play on the stream you supply. + * + * @see #STREAM_DEFAULT + * @see AudioManager for the <code>STREAM_</code> constants. + */ public Builder setSound(Uri sound, int streamType) { mSound = sound; mAudioStreamType = streamType; return this; } + /** + * Set the vibration pattern to use. + * + * @see android.os.Vibrator for a discussion of the <code>pattern</code> + * parameter. + */ public Builder setVibrate(long[] pattern) { mVibrate = pattern; return this; } + /** + * Set the argb value that you would like the LED on the device to blnk, as well as the + * rate. The rate is specified in terms of the number of milliseconds to be on + * and then the number of milliseconds to be off. + */ public Builder setLights(int argb, int onMs, int offMs) { mLedArgb = argb; mLedOnMs = onMs; @@ -749,21 +855,51 @@ public class Notification implements Parcelable return this; } + /** + * Set whether this is an ongoing notification. + * + * <p>Ongoing notifications differ from regular notifications in the following ways: + * <ul> + * <li>Ongoing notifications are sorted above the regular notifications in the + * notification panel.</li> + * <li>Ongoing notifications do not have an 'X' close button, and are not affected + * by the "Clear all" button. + * </ul> + */ public Builder setOngoing(boolean ongoing) { setFlag(FLAG_ONGOING_EVENT, ongoing); return this; } + /** + * Set this flag if you would only like the sound, vibrate + * and ticker to be played if the notification is not already showing. + */ public Builder setOnlyAlertOnce(boolean onlyAlertOnce) { setFlag(FLAG_ONLY_ALERT_ONCE, onlyAlertOnce); return this; } + /** + * Setting this flag will make it so the notification is automatically + * canceled when the user clicks it in the panel. The PendingIntent + * set with {@link #setDeleteIntent} will be broadcast when the notification + * is canceled. + */ public Builder setAutoCancel(boolean autoCancel) { setFlag(FLAG_AUTO_CANCEL, autoCancel); return this; } + /** + * Set the default notification options that will be used. + * <p> + * The value should be one or more of the following fields combined with + * bitwise-or: + * {@link #DEFAULT_SOUND}, {@link #DEFAULT_VIBRATE}, {@link #DEFAULT_LIGHTS}. + * <p> + * For all default values, use {@link #DEFAULT_ALL}. + */ public Builder setDefaults(int defaults) { mDefaults = defaults; return this; @@ -834,6 +970,10 @@ public class Notification implements Parcelable } } + /** + * Combine all of the options that have been set and return a new {@link Notification} + * object. + */ public Notification getNotification() { Notification n = new Notification(); n.when = mWhen; diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 9f0ea325b3c0..82fe7dede98d 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -57,6 +57,8 @@ public final class MediaStore { * Broadcast Action: A broadcast to indicate the end of an MTP session with the host. * This broadcast is only sent if MTP activity has modified the media database during the * most recent MTP session. + * + * @hide */ public static final String ACTION_MTP_SESSION_END = "android.provider.action.MTP_SESSION_END"; diff --git a/core/java/android/view/DragEvent.java b/core/java/android/view/DragEvent.java index 6634f008ecc0..25b680e65b94 100644 --- a/core/java/android/view/DragEvent.java +++ b/core/java/android/view/DragEvent.java @@ -274,7 +274,7 @@ public static final int ACTION_DRAG_EXITED = 6; public String toString() { return "DragEvent{" + Integer.toHexString(System.identityHashCode(this)) + " action=" + mAction + " @ (" + mX + ", " + mY + ") desc=" + mClipDescription - + " data=" + mClipData + " result=" + mDragResult + + " data=" + mClipData + " local=" + mLocalState + " result=" + mDragResult + "}"; } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index c54a3cf15310..8eb42690229c 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -817,7 +817,7 @@ public interface WindowManager extends ViewManager { public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100; /** - * Desired operating mode for any soft input area. May any combination + * Desired operating mode for any soft input area. May be any combination * of: * * <ul> diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java index b4ece241ec03..593cb59c9fbb 100644 --- a/core/java/android/widget/ArrayAdapter.java +++ b/core/java/android/widget/ArrayAdapter.java @@ -25,9 +25,9 @@ import android.view.ViewGroup; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; -import java.util.Comparator; import java.util.Collections; +import java.util.Comparator; +import java.util.List; /** * A concrete BaseAdapter that is backed by an array of arbitrary @@ -86,6 +86,8 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { private Context mContext; + // A copy of the original mObjects array, initialized from and then used instead as soon as + // the mFilter ArrayFilter is used. mObjects will then only contain the filtered values. private ArrayList<T> mOriginalValues; private ArrayFilter mFilter; @@ -170,15 +172,14 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * @param object The object to add at the end of the array. */ public void add(T object) { - if (mOriginalValues != null) { - synchronized (mLock) { + synchronized (mLock) { + if (mOriginalValues != null) { mOriginalValues.add(object); - if (mNotifyOnChange) notifyDataSetChanged(); + } else { + mObjects.add(object); } - } else { - mObjects.add(object); - if (mNotifyOnChange) notifyDataSetChanged(); } + if (mNotifyOnChange) notifyDataSetChanged(); } /** @@ -187,15 +188,14 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * @param collection The Collection to add at the end of the array. */ public void addAll(Collection<? extends T> collection) { - if (mOriginalValues != null) { - synchronized (mLock) { + synchronized (mLock) { + if (mOriginalValues != null) { mOriginalValues.addAll(collection); - if (mNotifyOnChange) notifyDataSetChanged(); + } else { + mObjects.addAll(collection); } - } else { - mObjects.addAll(collection); - if (mNotifyOnChange) notifyDataSetChanged(); } + if (mNotifyOnChange) notifyDataSetChanged(); } /** @@ -204,19 +204,18 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * @param items The items to add at the end of the array. */ public void addAll(T ... items) { - if (mOriginalValues != null) { - synchronized (mLock) { + synchronized (mLock) { + if (mOriginalValues != null) { for (T item : items) { mOriginalValues.add(item); } - if (mNotifyOnChange) notifyDataSetChanged(); - } - } else { - for (T item : items) { - mObjects.add(item); + } else { + for (T item : items) { + mObjects.add(item); + } } - if (mNotifyOnChange) notifyDataSetChanged(); } + if (mNotifyOnChange) notifyDataSetChanged(); } /** @@ -226,15 +225,14 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * @param index The index at which the object must be inserted. */ public void insert(T object, int index) { - if (mOriginalValues != null) { - synchronized (mLock) { + synchronized (mLock) { + if (mOriginalValues != null) { mOriginalValues.add(index, object); - if (mNotifyOnChange) notifyDataSetChanged(); + } else { + mObjects.add(index, object); } - } else { - mObjects.add(index, object); - if (mNotifyOnChange) notifyDataSetChanged(); } + if (mNotifyOnChange) notifyDataSetChanged(); } /** @@ -243,12 +241,12 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * @param object The object to remove. */ public void remove(T object) { - if (mOriginalValues != null) { - synchronized (mLock) { + synchronized (mLock) { + if (mOriginalValues != null) { mOriginalValues.remove(object); + } else { + mObjects.remove(object); } - } else { - mObjects.remove(object); } if (mNotifyOnChange) notifyDataSetChanged(); } @@ -257,12 +255,12 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * Remove all elements from the list. */ public void clear() { - if (mOriginalValues != null) { - synchronized (mLock) { + synchronized (mLock) { + if (mOriginalValues != null) { mOriginalValues.clear(); + } else { + mObjects.clear(); } - } else { - mObjects.clear(); } if (mNotifyOnChange) notifyDataSetChanged(); } @@ -274,7 +272,13 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { * in this adapter. */ public void sort(Comparator<? super T> comparator) { - Collections.sort(mObjects, comparator); + synchronized (mLock) { + if (mOriginalValues != null) { + Collections.sort(mOriginalValues, comparator); + } else { + Collections.sort(mObjects, comparator); + } + } if (mNotifyOnChange) notifyDataSetChanged(); } @@ -482,6 +486,7 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable { final String[] words = valueText.split(" "); final int wordCount = words.length; + // Start at index 0, in case valueText starts with space(s) for (int k = 0; k < wordCount; k++) { if (words[k].startsWith(prefixString)) { newValues.add(value); diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index 4d8d21f4a3e0..707b92d5c164 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.content.Context; import android.content.res.TypedArray; import android.database.DataSetObserver; @@ -36,8 +38,6 @@ import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; -import com.android.internal.R; - /** * <p>An editable text view that shows completion suggestions automatically @@ -113,6 +113,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe private Validator mValidator = null; + // Set to true when text is set directly and no filtering shall be performed private boolean mBlockCompletion; private PassThroughClickListener mPassThroughClickListener; @@ -721,6 +722,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe return; } + updateList(); + } + + private void updateList() { // the drop down is shown only when a minimum number of characters // was typed in the text view if (enoughToFilter()) { @@ -840,7 +845,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe mBlockCompletion = true; replaceText(convertSelectionToString(selectedItem)); - mBlockCompletion = false; + mBlockCompletion = false; if (mItemClickListener != null) { final ListPopupWindow list = mPopup; @@ -903,10 +908,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe /** {@inheritDoc} */ public void onFilterComplete(int count) { - updateDropDownForFilter(count); + updateDropDownForFilter(count, true); } - private void updateDropDownForFilter(int count) { + private void updateDropDownForFilter(int count, boolean forceShow) { // Not attached to window, don't update drop-down if (getWindowVisibility() == View.GONE) return; @@ -919,7 +924,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible(); if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter()) { - if (hasFocus() && hasWindowFocus()) { + if (hasFocus() && hasWindowFocus() && (forceShow || isPopupShowing())) { showDropDown(); } } else if (!dropDownAlwaysVisible) { @@ -1182,12 +1187,14 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe // If the popup is not showing already, showing it will cause // the list of data set observers attached to the adapter to // change. We can't do it from here, because we are in the middle - // of iterating throught he list of observers. + // of iterating through the list of observers. post(new Runnable() { public void run() { final ListAdapter adapter = mAdapter; if (adapter != null) { - updateDropDownForFilter(adapter.getCount()); + // This will re-layout, thus resetting mDataChanged, so that the + // listView click listener stays responsive + updateDropDownForFilter(adapter.getCount(), false); } } }); diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index f6b1dbc99b40..db22a0cb1e31 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -511,8 +511,10 @@ public class HorizontalScrollView extends FrameLayout { switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { - final float x = ev.getX(); - mIsBeingDragged = true; + mIsBeingDragged = getChildCount() != 0; + if (!mIsBeingDragged) { + return false; + } /* * If being flinged and user touches, stop the fling. isFinished @@ -523,7 +525,7 @@ public class HorizontalScrollView extends FrameLayout { } // Remember where the motion event started - mLastMotionX = x; + mLastMotionX = ev.getX(); mActivePointerId = ev.getPointerId(0); break; } diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 8558c70e40de..ce6da72a2c98 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -521,8 +521,10 @@ public class ScrollView extends FrameLayout { switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { - final float y = ev.getY(); - mIsBeingDragged = true; + mIsBeingDragged = getChildCount() != 0; + if (!mIsBeingDragged) { + return false; + } /* * If being flinged and user touches, stop the fling. isFinished @@ -537,7 +539,7 @@ public class ScrollView extends FrameLayout { } // Remember where the motion event started - mLastMotionY = y; + mLastMotionY = ev.getY(); mActivePointerId = ev.getPointerId(0); break; } diff --git a/core/java/android/widget/SuggestionsAdapter.java b/core/java/android/widget/SuggestionsAdapter.java index 1ebe62294f79..2cfc0169a46e 100644 --- a/core/java/android/widget/SuggestionsAdapter.java +++ b/core/java/android/widget/SuggestionsAdapter.java @@ -78,15 +78,15 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene // URL color private ColorStateList mUrlColor; - // Cached column indexes, updated when the cursor changes. - private int mText1Col; - private int mText2Col; - private int mText2UrlCol; - private int mIconName1Col; - private int mIconName2Col; - private int mFlagsCol; + static final int INVALID_INDEX = -1; - static final int NONE = -1; + // Cached column indexes, updated when the cursor changes. + private int mText1Col = INVALID_INDEX; + private int mText2Col = INVALID_INDEX; + private int mText2UrlCol = INVALID_INDEX; + private int mIconName1Col = INVALID_INDEX; + private int mIconName2Col = INVALID_INDEX; + private int mFlagsCol = INVALID_INDEX; private final Runnable mStartSpinnerRunnable; private final Runnable mStopSpinnerRunnable; @@ -308,7 +308,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene ChildViewCache views = (ChildViewCache) view.getTag(); int flags = 0; - if (mFlagsCol != -1) { + if (mFlagsCol != INVALID_INDEX) { flags = cursor.getInt(mFlagsCol); } if (views.mText1 != null) { @@ -391,7 +391,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene } private Drawable getIcon1(Cursor cursor) { - if (mIconName1Col < 0) { + if (mIconName1Col == INVALID_INDEX) { return null; } String value = cursor.getString(mIconName1Col); @@ -403,7 +403,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene } private Drawable getIcon2(Cursor cursor) { - if (mIconName2Col < 0) { + if (mIconName2Col == INVALID_INDEX) { return null; } String value = cursor.getString(mIconName2Col); @@ -687,7 +687,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene } private static String getStringOrNull(Cursor cursor, int col) { - if (col == NONE) { + if (col == INVALID_INDEX) { return null; } try { diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index a8f9f62222c2..6a7db1f0b83c 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -33,8 +33,6 @@ import android.view.WindowManagerImpl; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; -import java.lang.ref.WeakReference; - /** * A toast is a view containing a quick little message for the user. The toast class * helps you create and show those. @@ -72,11 +70,6 @@ public class Toast { final Context mContext; final TN mTN; int mDuration; - int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - int mX, mY; - float mHorizontalMargin; - float mVerticalMargin; - View mView; View mNextView; /** @@ -88,8 +81,8 @@ public class Toast { */ public Toast(Context context) { mContext = context; - mTN = new TN(this); - mY = context.getResources().getDimensionPixelSize( + mTN = new TN(); + mTN.mY = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.toast_y_offset); } @@ -103,9 +96,11 @@ public class Toast { INotificationManager service = getService(); String pkg = mContext.getPackageName(); + TN tn = mTN; + tn.mNextView = mNextView; try { - service.enqueueToast(pkg, mTN, mDuration); + service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } @@ -165,22 +160,22 @@ public class Toast { * notification */ public void setMargin(float horizontalMargin, float verticalMargin) { - mHorizontalMargin = horizontalMargin; - mVerticalMargin = verticalMargin; + mTN.mHorizontalMargin = horizontalMargin; + mTN.mVerticalMargin = verticalMargin; } /** * Return the horizontal margin. */ public float getHorizontalMargin() { - return mHorizontalMargin; + return mTN.mHorizontalMargin; } /** * Return the vertical margin. */ public float getVerticalMargin() { - return mVerticalMargin; + return mTN.mVerticalMargin; } /** @@ -189,9 +184,9 @@ public class Toast { * @see #getGravity */ public void setGravity(int gravity, int xOffset, int yOffset) { - mGravity = gravity; - mX = xOffset; - mY = yOffset; + mTN.mGravity = gravity; + mTN.mX = xOffset; + mTN.mY = yOffset; } /** @@ -200,21 +195,21 @@ public class Toast { * @see #getGravity */ public int getGravity() { - return mGravity; + return mTN.mGravity; } /** * Return the X offset in pixels to apply to the gravity's location. */ public int getXOffset() { - return mX; + return mTN.mX; } /** * Return the Y offset in pixels to apply to the gravity's location. */ public int getYOffset() { - return mY; + return mTN.mY; } /** @@ -281,21 +276,6 @@ public class Toast { tv.setText(s); } - private void trySendAccessibilityEvent() { - AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(mContext); - if (!accessibilityManager.isEnabled()) { - return; - } - // treat toasts as notifications since they are used to - // announce a transient piece of information to the user - AccessibilityEvent event = AccessibilityEvent.obtain( - AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); - event.setClassName(getClass().getName()); - event.setPackageName(mContext.getPackageName()); - mView.dispatchPopulateAccessibilityEvent(event); - accessibilityManager.sendAccessibilityEvent(event); - } - // ======================================================================================= // All the gunk below is the interaction with the Notification Service, which handles // the proper ordering of these system-wide. @@ -312,8 +292,6 @@ public class Toast { } private static class TN extends ITransientNotification.Stub { - final Handler mHandler = new Handler(); - final Runnable mShow = new Runnable() { public void run() { handleShow(); @@ -327,12 +305,20 @@ public class Toast { }; private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); - private final WeakReference<Toast> mToast; + final Handler mHandler = new Handler(); + + int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; + int mX, mY; + float mHorizontalMargin; + float mVerticalMargin; + + + View mView; + View mNextView; WindowManagerImpl mWM; - TN(Toast toast) { - mToast = new WeakReference<Toast>(toast); + TN() { // XXX This should be changed to use a Dialog, with a Theme.Toast // defined that sets up the layout params appropriately. final WindowManager.LayoutParams params = mParams; @@ -364,53 +350,64 @@ public class Toast { } public void handleShow() { - final Toast toast = mToast.get(); - if (toast != null) { - if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + toast.mView - + " mNextView=" + toast.mNextView); - if (toast.mView != toast.mNextView) { - // remove the old view if necessary - handleHide(); - toast.mView = toast.mNextView; - mWM = WindowManagerImpl.getDefault(); - final int gravity = toast.mGravity; - mParams.gravity = gravity; - if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { - mParams.horizontalWeight = 1.0f; - } - if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) { - mParams.verticalWeight = 1.0f; - } - mParams.x = toast.mX; - mParams.y = toast.mY; - mParams.verticalMargin = toast.mVerticalMargin; - mParams.horizontalMargin = toast.mHorizontalMargin; - if (toast.mView.getParent() != null) { - if (localLOGV) Log.v(TAG, "REMOVE! " + toast.mView + " in " + this); - mWM.removeView(toast.mView); - } - if (localLOGV) Log.v(TAG, "ADD! " + toast.mView + " in " + this); - mWM.addView(toast.mView, mParams); - toast.trySendAccessibilityEvent(); + if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView + + " mNextView=" + mNextView); + if (mView != mNextView) { + // remove the old view if necessary + handleHide(); + mView = mNextView; + mWM = WindowManagerImpl.getDefault(); + final int gravity = mGravity; + mParams.gravity = gravity; + if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { + mParams.horizontalWeight = 1.0f; + } + if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) { + mParams.verticalWeight = 1.0f; + } + mParams.x = mX; + mParams.y = mY; + mParams.verticalMargin = mVerticalMargin; + mParams.horizontalMargin = mHorizontalMargin; + if (mView.getParent() != null) { + if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); + mWM.removeView(mView); } + if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this); + mWM.addView(mView, mParams); + trySendAccessibilityEvent(); } } + private void trySendAccessibilityEvent() { + AccessibilityManager accessibilityManager = + AccessibilityManager.getInstance(mView.getContext()); + if (!accessibilityManager.isEnabled()) { + return; + } + // treat toasts as notifications since they are used to + // announce a transient piece of information to the user + AccessibilityEvent event = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); + event.setClassName(getClass().getName()); + event.setPackageName(mView.getContext().getPackageName()); + mView.dispatchPopulateAccessibilityEvent(event); + accessibilityManager.sendAccessibilityEvent(event); + } + public void handleHide() { - final Toast toast = mToast.get(); - if (toast != null) { - if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + toast.mView); - if (toast.mView != null) { - // note: checking parent() just to make sure the view has - // been added... i have seen cases where we get here when - // the view isn't yet added, so let's try not to crash. - if (toast.mView.getParent() != null) { - if (localLOGV) Log.v(TAG, "REMOVE! " + toast.mView + " in " + this); - mWM.removeView(toast.mView); - } - - toast.mView = null; + if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView); + if (mView != null) { + // note: checking parent() just to make sure the view has + // been added... i have seen cases where we get here when + // the view isn't yet added, so let's try not to crash. + if (mView.getParent() != null) { + if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); + mWM.removeView(mView); } + + mView = null; + mNextView = null; } } } diff --git a/core/jni/android/graphics/Region.cpp b/core/jni/android/graphics/Region.cpp index c43b5ce14eb1..24452292ab62 100644 --- a/core/jni/android/graphics/Region.cpp +++ b/core/jni/android/graphics/Region.cpp @@ -154,6 +154,16 @@ static void Region_scale(JNIEnv* env, jobject region, jfloat scale, jobject dst) scale_rgn(rgn, *rgn, scale); } +static jstring Region_toString(JNIEnv* env, jobject clazz, SkRegion* region) { + char* str = region->toString(); + if (str == NULL) { + return NULL; + } + jstring result = env->NewStringUTF(str); + free(str); + return result; +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////// static SkRegion* Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel) @@ -262,6 +272,7 @@ static JNINativeMethod gRegionMethods[] = { { "quickReject", "(Landroid/graphics/Region;)Z", (void*)Region_quickRejectRgn }, { "scale", "(FLandroid/graphics/Region;)V", (void*)Region_scale }, { "translate", "(IILandroid/graphics/Region;)V", (void*)Region_translate }, + { "nativeToString", "(I)Ljava/lang/String;", (void*)Region_toString }, // parceling methods { "nativeCreateFromParcel", "(Landroid/os/Parcel;)I", (void*)Region_createFromParcel }, { "nativeWriteToParcel", "(ILandroid/os/Parcel;)Z", (void*)Region_writeToParcel }, diff --git a/drm/common/IDrmManagerService.cpp b/drm/common/IDrmManagerService.cpp index 75edac6b6f59..ddbd220795e1 100644 --- a/drm/common/IDrmManagerService.cpp +++ b/drm/common/IDrmManagerService.cpp @@ -382,7 +382,7 @@ status_t BpDrmManagerService::setPlaybackStatus( } data.writeInt32(playbackStatus); - data.writeInt32(position); + data.writeInt64(position); remote()->transact(SET_PLAYBACK_STATUS, data, &reply); return reply.readInt32(); @@ -1111,7 +1111,7 @@ status_t BnDrmManagerService::onTransact( } const status_t status - = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt32()); + = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64()); reply->writeInt32(status); delete handle.decryptInfo; handle.decryptInfo = NULL; diff --git a/graphics/java/android/graphics/Region.java b/graphics/java/android/graphics/Region.java index e5408068e64f..27ea0f03d97a 100644 --- a/graphics/java/android/graphics/Region.java +++ b/graphics/java/android/graphics/Region.java @@ -287,6 +287,10 @@ public class Region implements Parcelable { region2.mNativeRegion, op.nativeInt); } + public String toString() { + return nativeToString(mNativeRegion); + } + ////////////////////////////////////////////////////////////////////////// public static final Parcelable.Creator<Region> CREATOR @@ -357,6 +361,8 @@ public class Region implements Parcelable { return mNativeRegion; } + private static native boolean nativeEquals(int native_r1, int native_r2); + private static native int nativeConstructor(); private static native void nativeDestructor(int native_region); @@ -381,5 +387,5 @@ public class Region implements Parcelable { private static native boolean nativeWriteToParcel(int native_region, Parcel p); - private static native boolean nativeEquals(int native_r1, int native_r2); + private static native String nativeToString(int native_region); } diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java index 1789891d73e5..74cdf80a9294 100644 --- a/graphics/java/android/renderscript/Allocation.java +++ b/graphics/java/android/renderscript/Allocation.java @@ -268,22 +268,105 @@ public class Allocation extends BaseObj { } } + /** + * Copy an allocation from an array. This variant is not type + * checked which allows an application to fill in structured + * data from an array. + * + * @param d the source data array + */ + public void copyFromUnchecked(int[] d) { + mRS.validate(); + copy1DRangeFromUnchecked(0, mType.getCount(), d); + } + /** + * Copy an allocation from an array. This variant is not type + * checked which allows an application to fill in structured + * data from an array. + * + * @param d the source data array + */ + public void copyFromUnchecked(short[] d) { + mRS.validate(); + copy1DRangeFromUnchecked(0, mType.getCount(), d); + } + /** + * Copy an allocation from an array. This variant is not type + * checked which allows an application to fill in structured + * data from an array. + * + * @param d the source data array + */ + public void copyFromUnchecked(byte[] d) { + mRS.validate(); + copy1DRangeFromUnchecked(0, mType.getCount(), d); + } + /** + * Copy an allocation from an array. This variant is not type + * checked which allows an application to fill in structured + * data from an array. + * + * @param d the source data array + */ + public void copyFromUnchecked(float[] d) { + mRS.validate(); + copy1DRangeFromUnchecked(0, mType.getCount(), d); + } + + /** + * Copy an allocation from an array. This variant is type + * checked and will generate exceptions if the Allocation type + * is not a 32 bit integer type. + * + * @param d the source data array + */ public void copyFrom(int[] d) { mRS.validate(); copy1DRangeFrom(0, mType.getCount(), d); } + + /** + * Copy an allocation from an array. This variant is type + * checked and will generate exceptions if the Allocation type + * is not a 16 bit integer type. + * + * @param d the source data array + */ public void copyFrom(short[] d) { mRS.validate(); copy1DRangeFrom(0, mType.getCount(), d); } + + /** + * Copy an allocation from an array. This variant is type + * checked and will generate exceptions if the Allocation type + * is not a 8 bit integer type. + * + * @param d the source data array + */ public void copyFrom(byte[] d) { mRS.validate(); copy1DRangeFrom(0, mType.getCount(), d); } + + /** + * Copy an allocation from an array. This variant is type + * checked and will generate exceptions if the Allocation type + * is not a 32 bit float type. + * + * @param d the source data array + */ public void copyFrom(float[] d) { mRS.validate(); copy1DRangeFrom(0, mType.getCount(), d); } + + /** + * Copy an allocation from a bitmap. The height, width, and + * format of the bitmap must match the existing allocation. + * + * @param b the source bitmap + */ public void copyFrom(Bitmap b) { mRS.validate(); validateBitmapSize(b); @@ -369,39 +452,114 @@ public class Allocation extends BaseObj { mRS.nAllocationGenerateMipmaps(getID()); } - void copy1DRangeFromUnchecked(int off, int count, int[] d) { + /** + * Copy part of an allocation from an array. This variant is + * not type checked which allows an application to fill in + * structured data from an array. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ + public void copy1DRangeFromUnchecked(int off, int count, int[] d) { int dataSize = mType.mElement.getSizeBytes() * count; data1DChecks(off, count, d.length * 4, dataSize); mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); } - void copy1DRangeFromUnchecked(int off, int count, short[] d) { + /** + * Copy part of an allocation from an array. This variant is + * not type checked which allows an application to fill in + * structured data from an array. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ + public void copy1DRangeFromUnchecked(int off, int count, short[] d) { int dataSize = mType.mElement.getSizeBytes() * count; data1DChecks(off, count, d.length * 2, dataSize); mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); } - void copy1DRangeFromUnchecked(int off, int count, byte[] d) { + /** + * Copy part of an allocation from an array. This variant is + * not type checked which allows an application to fill in + * structured data from an array. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ + public void copy1DRangeFromUnchecked(int off, int count, byte[] d) { int dataSize = mType.mElement.getSizeBytes() * count; data1DChecks(off, count, d.length, dataSize); mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); } - void copy1DRangeFromUnchecked(int off, int count, float[] d) { + /** + * Copy part of an allocation from an array. This variant is + * not type checked which allows an application to fill in + * structured data from an array. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ + public void copy1DRangeFromUnchecked(int off, int count, float[] d) { int dataSize = mType.mElement.getSizeBytes() * count; data1DChecks(off, count, d.length * 4, dataSize); mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); } + /** + * Copy part of an allocation from an array. This variant is + * type checked and will generate exceptions if the Allocation + * type is not a 32 bit integer type. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ public void copy1DRangeFrom(int off, int count, int[] d) { validateIsInt32(); copy1DRangeFromUnchecked(off, count, d); } + + /** + * Copy part of an allocation from an array. This variant is + * type checked and will generate exceptions if the Allocation + * type is not a 16 bit integer type. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ public void copy1DRangeFrom(int off, int count, short[] d) { validateIsInt16(); copy1DRangeFromUnchecked(off, count, d); } + + /** + * Copy part of an allocation from an array. This variant is + * type checked and will generate exceptions if the Allocation + * type is not a 8 bit integer type. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ public void copy1DRangeFrom(int off, int count, byte[] d) { validateIsInt8(); copy1DRangeFromUnchecked(off, count, d); } + + /** + * Copy part of an allocation from an array. This variant is + * type checked and will generate exceptions if the Allocation + * type is not a 32 bit float type. + * + * @param off The offset of the first element to be copied. + * @param count The number of elements to be copied. + * @param d the source data array + */ public void copy1DRangeFrom(int off, int count, float[] d) { validateIsFloat32(); copy1DRangeFromUnchecked(off, count, d); diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java index ff8f09323503..94452834623f 100644 --- a/graphics/java/android/renderscript/ScriptC.java +++ b/graphics/java/android/renderscript/ScriptC.java @@ -56,6 +56,9 @@ public class ScriptC extends Script { protected ScriptC(RenderScript rs, Resources resources, int resourceID) { super(0, rs); int id = internalCreate(rs, resources, resourceID); + if (id == 0) { + throw new RSRuntimeException("Loading of ScriptC script failed."); + } setID(id); } diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 2e0c491c34ef..98f30ae4ead7 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -253,7 +253,11 @@ void Context::deinitEGL() { LOGV("%p, deinitEGL", this); if (mEGL.mContext != EGL_NO_CONTEXT) { - eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, mEGL.mContext); + eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroySurface(mEGL.mDisplay, mEGL.mSurfaceDefault); + if (mEGL.mSurface != EGL_NO_SURFACE) { + eglDestroySurface(mEGL.mDisplay, mEGL.mSurface); + } eglDestroyContext(mEGL.mDisplay, mEGL.mContext); checkEglError("eglDestroyContext"); } diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 9f730bffe8d3..1fceb663527f 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -467,7 +467,7 @@ extern const char rs_runtime_lib_bc[]; extern unsigned rs_runtime_lib_bc_size; #endif -void ScriptCState::runCompiler(Context *rsc, +bool ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir) { @@ -482,7 +482,7 @@ void ScriptCState::runCompiler(Context *rsc, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength, 0) != 0) { LOGE("bcc: FAILS to read bitcode"); - // Handle Fatal Error + return false; } #if 1 @@ -493,14 +493,14 @@ void ScriptCState::runCompiler(Context *rsc, /*"1" means skip buffer here, and let libbcc decide*/, 0) != 0) { LOGE("bcc: FAILS to link bitcode"); - // Handle Fatal Error + return false; } #endif char *cachePath = genCacheFileName(cacheDir, resName, ".oBCC"); if (bccPrepareExecutable(s->mBccScript, cachePath, 0) != 0) { LOGE("bcc: FAILS to prepare executable"); - // Handle Fatal Error + return false; } free(cachePath); @@ -547,7 +547,7 @@ void ScriptCState::runCompiler(Context *rsc, continue; } LOGE("Invalid version pragma value: %s\n", values[i]); - // Handle Fatal Error + return false; } if (!strcmp(keys[i], "stateVertex")) { @@ -559,7 +559,7 @@ void ScriptCState::runCompiler(Context *rsc, continue; } LOGE("Unrecognized value %s passed to stateVertex", values[i]); - // Handle Fatal Error + return false; } if (!strcmp(keys[i], "stateRaster")) { @@ -571,7 +571,7 @@ void ScriptCState::runCompiler(Context *rsc, continue; } LOGE("Unrecognized value %s passed to stateRaster", values[i]); - // Handle Fatal Error + return false; } if (!strcmp(keys[i], "stateFragment")) { @@ -583,7 +583,7 @@ void ScriptCState::runCompiler(Context *rsc, continue; } LOGE("Unrecognized value %s passed to stateFragment", values[i]); - // Handle Fatal Error + return false; } if (!strcmp(keys[i], "stateStore")) { @@ -595,9 +595,10 @@ void ScriptCState::runCompiler(Context *rsc, continue; } LOGE("Unrecognized value %s passed to stateStore", values[i]); - // Handle Fatal Error + return false; } } + return true; } namespace android { @@ -630,7 +631,11 @@ RsScript rsi_ScriptCCreate(Context *rsc, ss->mScript.clear(); s->incUserRef(); - ss->runCompiler(rsc, s.get(), resName, cacheDir); + if (!ss->runCompiler(rsc, s.get(), resName, cacheDir)) { + // Error during compile, destroy s and return null. + s->zeroUserRef(); + return NULL; + } ss->clear(rsc); return s.get(); } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 483481e81b02..612e38a3b5aa 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -81,7 +81,7 @@ public: void init(Context *rsc); void clear(Context *rsc); - void runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir); + bool runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir); struct SymbolTable_t { const char * mName; diff --git a/libs/ui/GraphicBufferAllocator.cpp b/libs/ui/GraphicBufferAllocator.cpp index ce84683375ba..33ef1fc8945c 100644 --- a/libs/ui/GraphicBufferAllocator.cpp +++ b/libs/ui/GraphicBufferAllocator.cpp @@ -61,7 +61,7 @@ void GraphicBufferAllocator::dump(String8& result) const const size_t c = list.size(); for (size_t i=0 ; i<c ; i++) { const alloc_rec_t& rec(list.valueAt(i)); - snprintf(buffer, SIZE, "%10p: %7.2f KiB | %4u (%4u) x %4u | %2d | 0x%08x\n", + snprintf(buffer, SIZE, "%10p: %7.2f KiB | %4u (%4u) x %4u | %8X | 0x%08x\n", list.keyAt(i), rec.size/1024.0f, rec.w, rec.s, rec.h, rec.format, rec.usage); result.append(buffer); diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index 0533b6f5e66c..852b72974f37 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -78,15 +78,14 @@ </LinearLayout> <!-- fake space bar zone --> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/fake_space_bar" + <com.android.systemui.statusbar.policy.EventHole android:id="@+id/fake_space_bar" android:layout_height="match_parent" - android:layout_width="match_parent" + android:layout_width="0dp" android:paddingLeft="8dip" android:paddingRight="8dip" android:layout_toRightOf="@+id/navigationArea" android:layout_toLeftOf="@+id/notificationArea" android:visibility="gone" - systemui:keyCode="62" /> </RelativeLayout> </FrameLayout> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EventHole.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EventHole.java new file mode 100644 index 000000000000..47e758c58fe6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EventHole.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Region; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.Drawable; +import android.os.RemoteException; +import android.os.SystemClock; +import android.os.ServiceManager; +import android.util.AttributeSet; +import android.util.Slog; +import android.view.HapticFeedbackConstants; +import android.view.IWindowManager; +import android.view.InputDevice; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewTreeObserver; +import android.widget.RemoteViews.RemoteView; + +import com.android.systemui.R; + +public class EventHole extends View implements ViewTreeObserver.OnComputeInternalInsetsListener { + private static final String TAG = "StatusBar.EventHole"; + + private boolean mWindowVis; + private int[] mLoc = new int[2]; + + public EventHole(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public EventHole(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + } + + @Override + protected void onWindowVisibilityChanged(int visibility) { + super.onWindowVisibilityChanged(visibility); + mWindowVis = visibility == View.VISIBLE; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + getViewTreeObserver().addOnComputeInternalInsetsListener(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + getViewTreeObserver().removeOnComputeInternalInsetsListener(this); + } + + public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { + final boolean visible = isShown() && mWindowVis && getWidth() > 0 && getHeight() > 0; + final int[] loc = mLoc; + getLocationInWindow(loc); + final int l = loc[0]; + final int r = l + getWidth(); + final int t = loc[1]; + final int b = t + getHeight(); + + View top = this; + while (top.getParent() instanceof View) { + top = (View)top.getParent(); + } + + if (visible) { + info.setTouchableInsets( + ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); + info.touchableRegion.set(0, 0, top.getWidth(), top.getHeight()); + info.touchableRegion.op(l, t, r, b, Region.Op.DIFFERENCE); + } else { + info.setTouchableInsets( + ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); + } + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java index 45a22b61904d..800f4b4a11b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -52,7 +52,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, View mNotificationScroller; View mNotificationGlow; ViewGroup mContentFrame; - Rect mContentArea; + Rect mContentArea = new Rect(); View mSettingsView; View mScrim, mGlow; ViewGroup mContentParent; @@ -136,7 +136,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - mContentArea = null; } public void onClick(View v) { @@ -165,13 +164,11 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, } public boolean isInContentArea(int x, int y) { - if (mContentArea == null) { - mContentArea = new Rect(mContentFrame.getLeft(), - mTitleArea.getTop(), - mContentFrame.getRight(), - mContentFrame.getBottom()); - offsetDescendantRectToMyCoords(mContentParent, mContentArea); - } + mContentArea.left = mContentFrame.getLeft(); + mContentArea.top = mTitleArea.getTop(); + mContentArea.right = mContentFrame.getRight(); + mContentArea.bottom = mContentFrame.getBottom(); + offsetDescendantRectToMyCoords(mContentParent, mContentArea); return mContentArea.contains(x, y); } diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index bbb2228b9ee1..b7ff64dbc63c 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -708,16 +708,20 @@ public class WindowManagerService extends IWindowManager.Stub // Move the surface to the given touch if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION notifyMoveLw"); - mSurface.openTransaction(); + Surface.openTransaction(); try { mSurface.setPosition((int)(x - mThumbOffsetX), (int)(y - mThumbOffsetY)); } finally { - mSurface.closeTransaction(); + Surface.closeTransaction(); if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION notifyMoveLw"); } // Tell the affected window WindowState touchedWin = getTouchedWinAtPointLw(x, y); + if (touchedWin == null) { + if (DEBUG_DRAG) Slog.d(TAG, "No touched win at x=" + x + " y=" + y); + return; + } if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0) { final IBinder touchedBinder = touchedWin.mClient.asBinder(); if (touchedBinder != mLocalWin) { diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 0c1fcf912493..9ddb05f3b001 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -534,6 +534,12 @@ void LayerBase::dump(String8& result, char* buffer, size_t SIZE) const result.append(buffer); } +void LayerBase::shortDump(String8& result, char* scratch, size_t size) const +{ + LayerBase::dump(result, scratch, size); +} + + // --------------------------------------------------------------------------- int32_t LayerBaseClient::sIdentity = 1; @@ -585,6 +591,12 @@ void LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const result.append(buffer); } + +void LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const +{ + LayerBaseClient::dump(result, scratch, size); +} + // --------------------------------------------------------------------------- LayerBaseClient::Surface::Surface( diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index f6c49fc24339..13af223475c4 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -211,6 +211,7 @@ public: /** always call base class first */ virtual void dump(String8& result, char* scratch, size_t size) const; + virtual void shortDump(String8& result, char* scratch, size_t size) const; enum { // flags for doTransaction() @@ -324,6 +325,7 @@ public: protected: virtual void dump(String8& result, char* scratch, size_t size) const; + virtual void shortDump(String8& result, char* scratch, size_t size) const; private: mutable Mutex mLock; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 65ad9568b3d3..434e473d74b1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1491,8 +1491,13 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) result.append(buffer); } + /* + * Dump the visible layer list + */ const LayerVector& currentLayers = mCurrentState.layersSortedByZ; const size_t count = currentLayers.size(); + snprintf(buffer, SIZE, "Visible layers (count = %d)\n", count); + result.append(buffer); for (size_t i=0 ; i<count ; i++) { const sp<LayerBase>& layer(currentLayers[i]); layer->dump(result, buffer, SIZE); @@ -1502,6 +1507,24 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) layer->visibleRegionScreen.dump(result, "visibleRegionScreen"); } + /* + * Dump the layers in the purgatory + */ + + const size_t purgatorySize = mLayerPurgatory.size(); + snprintf(buffer, SIZE, "Purgatory state (%d entries)\n", purgatorySize); + result.append(buffer); + for (size_t i=0 ; i<purgatorySize ; i++) { + const sp<LayerBase>& layer(mLayerPurgatory.itemAt(i)); + layer->shortDump(result, buffer, SIZE); + } + + /* + * Dump SurfaceFlinger global state + */ + + snprintf(buffer, SIZE, "SurfaceFlinger global state\n"); + result.append(buffer); mWormholeRegion.dump(result, "WormholeRegion"); const DisplayHardware& hw(graphicPlane(0).displayHardware()); snprintf(buffer, SIZE, @@ -1527,6 +1550,9 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) result.append(buffer); } + /* + * Dump HWComposer state + */ HWComposer& hwc(hw.getHwComposer()); snprintf(buffer, SIZE, " h/w composer %s and %s\n", hwc.initCheck()==NO_ERROR ? "present" : "not present", @@ -1534,6 +1560,9 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) result.append(buffer); hwc.dump(result, buffer, SIZE); + /* + * Dump gralloc state + */ const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get()); alloc.dump(result); hw.dump(result); |