Merge "Fix bug 2605504 Don't leak a metric ton of NotificationPlayer threads The Looper on the thread created in order to be notified of the playback completion of notification sounds, was never stopped, causing the threads to stay around in wait state. The fix consists in quitting the Looper used for the previous sound when a new sound is started." into froyo
diff --git a/api/8.xml b/api/8.xml
index 8cffff1b..ff4afc7 100644
--- a/api/8.xml
+++ b/api/8.xml
@@ -27144,7 +27144,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="fd" type="android.os.ParcelFileDescriptor">
+<parameter name="newState" type="android.os.ParcelFileDescriptor">
</parameter>
</method>
</interface>
@@ -37923,6 +37923,28 @@
visibility="public"
>
</field>
+<field name="ACTION_EXTERNAL_APPLICATIONS_AVAILABLE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="ACTION_FACTORY_TEST"
type="java.lang.String"
transient="false"
@@ -38890,6 +38912,28 @@
visibility="public"
>
</field>
+<field name="EXTRA_CHANGED_PACKAGE_LIST"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.changed_package_list""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_CHANGED_UID_LIST"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.changed_uid_list""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="EXTRA_DATA_REMOVED"
type="java.lang.String"
transient="false"
@@ -42658,6 +42702,17 @@
visibility="public"
>
</field>
+<field name="FLAG_EXTERNAL_STORAGE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="524288"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="FLAG_FACTORY_TEST"
type="int"
transient="false"
diff --git a/api/current.xml b/api/current.xml
index db28cba..ff4afc7 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -42702,6 +42702,17 @@
visibility="public"
>
</field>
+<field name="FLAG_EXTERNAL_STORAGE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="524288"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="FLAG_FACTORY_TEST"
type="int"
transient="false"
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 0a04e5b..29b9d4c 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -252,20 +252,22 @@
public static final int FLAG_RESTORE_ANY_VERSION = 1<<17;
/**
+ * Value for {@link #flags}: Set to true if the application is
+ * currently installed on external/removable/unprotected storage. Such
+ * applications may not be available if their storage is not currently
+ * mounted. When the storage it is on is not available, it will look like
+ * the application has been uninstalled (its .apk is no longer available)
+ * but its persistent data is not removed.
+ */
+ public static final int FLAG_EXTERNAL_STORAGE = 1<<19;
+
+ /**
* Value for {@link #flags}: Set to true if the application has been
* installed using the forward lock option.
*
* {@hide}
*/
- public static final int FLAG_FORWARD_LOCK = 1<<19;
-
- /**
- * Value for {@link #flags}: Set to true if the application is
- * currently installed on the sdcard.
- *
- * {@hide}
- */
- public static final int FLAG_EXTERNAL_STORAGE = 1<<20;
+ public static final int FLAG_FORWARD_LOCK = 1<<20;
/**
* Value for {@link #flags}: Set to true if the application is
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 6a9218a..83ef8ba 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -147,6 +147,7 @@
private int mSaveCount;
@SuppressWarnings("unused")
private Canvas mCanvas;
+ private String mName;
// The display metrics used to provide the pseudo canvas size for applications
// running in compatibility mode. This is set to null for non compatibility mode.
@@ -204,6 +205,7 @@
}
mCanvas = new CompatibleCanvas();
init(s,pid,name,display,w,h,format,flags);
+ mName = name;
}
/**
@@ -386,7 +388,7 @@
@Override
public String toString() {
- return "Surface(native-token=" + mSurface + ")";
+ return "Surface(name=" + mName + ", identity=" + getIdentity() + ")";
}
private Surface(Parcel source) throws OutOfResourcesException {
@@ -437,4 +439,6 @@
throws OutOfResourcesException;
private native void init(Parcel source);
+
+ private native int getIdentity();
}
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index ed26cbe..788374b 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -229,6 +229,15 @@
setSurface(env, clazz, rhs);
}
+static jint Surface_getIdentity(JNIEnv* env, jobject clazz)
+{
+ const sp<SurfaceControl>& control(getSurfaceControl(env, clazz));
+ if (control != 0) return (jint) control->getIdentity();
+ const sp<Surface>& surface(getSurface(env, clazz));
+ if (surface != 0) return (jint) surface->getIdentity();
+ return -1;
+}
+
static void Surface_destroy(JNIEnv* env, jobject clazz, uintptr_t *ostack)
{
const sp<SurfaceControl>& surface(getSurfaceControl(env, clazz));
@@ -261,14 +270,14 @@
we can map to SkBitmap::kARGB_8888_Config, and optionally call
bitmap.setIsOpaque(true) on the resulting SkBitmap (as an accelerator)
*/
- switch (format) {
- case PIXEL_FORMAT_RGBX_8888: return SkBitmap::kARGB_8888_Config;
+ switch (format) {
+ case PIXEL_FORMAT_RGBX_8888: return SkBitmap::kARGB_8888_Config;
case PIXEL_FORMAT_RGBA_8888: return SkBitmap::kARGB_8888_Config;
case PIXEL_FORMAT_RGBA_4444: return SkBitmap::kARGB_4444_Config;
- case PIXEL_FORMAT_RGB_565: return SkBitmap::kRGB_565_Config;
- case PIXEL_FORMAT_A_8: return SkBitmap::kA8_Config;
- default: return SkBitmap::kNo_Config;
- }
+ case PIXEL_FORMAT_RGB_565: return SkBitmap::kRGB_565_Config;
+ case PIXEL_FORMAT_A_8: return SkBitmap::kA8_Config;
+ default: return SkBitmap::kNo_Config;
+ }
}
static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect)
@@ -347,7 +356,7 @@
env->SetIntField(dirtyRect, ro.b, bounds.bottom);
}
- return canvas;
+ return canvas;
}
static void Surface_unlockCanvasAndPost(
@@ -631,8 +640,8 @@
static void nativeClassInit(JNIEnv* env, jclass clazz);
static JNINativeMethod gSurfaceSessionMethods[] = {
- {"init", "()V", (void*)SurfaceSession_init },
- {"destroy", "()V", (void*)SurfaceSession_destroy },
+ {"init", "()V", (void*)SurfaceSession_init },
+ {"destroy", "()V", (void*)SurfaceSession_destroy },
{"kill", "()V", (void*)SurfaceSession_kill },
};
@@ -640,43 +649,44 @@
{"nativeClassInit", "()V", (void*)nativeClassInit },
{"init", "(Landroid/view/SurfaceSession;ILjava/lang/String;IIIII)V", (void*)Surface_init },
{"init", "(Landroid/os/Parcel;)V", (void*)Surface_initParcel },
+ {"getIdentity", "()I", (void*)Surface_getIdentity },
{"destroy", "()V", (void*)Surface_destroy },
{"release", "()V", (void*)Surface_release },
- {"copyFrom", "(Landroid/view/Surface;)V", (void*)Surface_copyFrom },
- {"isValid", "()Z", (void*)Surface_isValid },
- {"lockCanvasNative", "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;", (void*)Surface_lockCanvas },
- {"unlockCanvasAndPost", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvasAndPost },
- {"unlockCanvas", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvas },
- {"openTransaction", "()V", (void*)Surface_openTransaction },
+ {"copyFrom", "(Landroid/view/Surface;)V", (void*)Surface_copyFrom },
+ {"isValid", "()Z", (void*)Surface_isValid },
+ {"lockCanvasNative", "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;", (void*)Surface_lockCanvas },
+ {"unlockCanvasAndPost", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvasAndPost },
+ {"unlockCanvas", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvas },
+ {"openTransaction", "()V", (void*)Surface_openTransaction },
{"closeTransaction", "()V", (void*)Surface_closeTransaction },
{"setOrientation", "(III)V", (void*)Surface_setOrientation },
{"freezeDisplay", "(I)V", (void*)Surface_freezeDisplay },
{"unfreezeDisplay", "(I)V", (void*)Surface_unfreezeDisplay },
{"setLayer", "(I)V", (void*)Surface_setLayer },
- {"setPosition", "(II)V",(void*)Surface_setPosition },
- {"setSize", "(II)V",(void*)Surface_setSize },
- {"hide", "()V", (void*)Surface_hide },
- {"show", "()V", (void*)Surface_show },
- {"freeze", "()V", (void*)Surface_freeze },
- {"unfreeze", "()V", (void*)Surface_unfreeze },
- {"setFlags", "(II)V",(void*)Surface_setFlags },
- {"setTransparentRegionHint","(Landroid/graphics/Region;)V", (void*)Surface_setTransparentRegion },
- {"setAlpha", "(F)V", (void*)Surface_setAlpha },
- {"setMatrix", "(FFFF)V", (void*)Surface_setMatrix },
- {"setFreezeTint", "(I)V", (void*)Surface_setFreezeTint },
- {"readFromParcel", "(Landroid/os/Parcel;)V", (void*)Surface_readFromParcel },
- {"writeToParcel", "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel },
+ {"setPosition", "(II)V",(void*)Surface_setPosition },
+ {"setSize", "(II)V",(void*)Surface_setSize },
+ {"hide", "()V", (void*)Surface_hide },
+ {"show", "()V", (void*)Surface_show },
+ {"freeze", "()V", (void*)Surface_freeze },
+ {"unfreeze", "()V", (void*)Surface_unfreeze },
+ {"setFlags", "(II)V",(void*)Surface_setFlags },
+ {"setTransparentRegionHint","(Landroid/graphics/Region;)V", (void*)Surface_setTransparentRegion },
+ {"setAlpha", "(F)V", (void*)Surface_setAlpha },
+ {"setMatrix", "(FFFF)V", (void*)Surface_setMatrix },
+ {"setFreezeTint", "(I)V", (void*)Surface_setFreezeTint },
+ {"readFromParcel", "(Landroid/os/Parcel;)V", (void*)Surface_readFromParcel },
+ {"writeToParcel", "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel },
};
void nativeClassInit(JNIEnv* env, jclass clazz)
{
so.surface = env->GetFieldID(clazz, "mSurface", "I");
so.surfaceControl = env->GetFieldID(clazz, "mSurfaceControl", "I");
- so.saveCount = env->GetFieldID(clazz, "mSaveCount", "I");
- so.canvas = env->GetFieldID(clazz, "mCanvas", "Landroid/graphics/Canvas;");
+ so.saveCount = env->GetFieldID(clazz, "mSaveCount", "I");
+ so.canvas = env->GetFieldID(clazz, "mCanvas", "Landroid/graphics/Canvas;");
jclass surfaceSession = env->FindClass("android/view/SurfaceSession");
- sso.client = env->GetFieldID(surfaceSession, "mClient", "I");
+ sso.client = env->GetFieldID(surfaceSession, "mClient", "I");
jclass canvas = env->FindClass("android/graphics/Canvas");
no.native_canvas = env->GetFieldID(canvas, "mNativeCanvas", "I");
diff --git a/services/java/com/android/server/ThrottleService.java b/services/java/com/android/server/ThrottleService.java
index a1aa555..6a5bbd2 100644
--- a/services/java/com/android/server/ThrottleService.java
+++ b/services/java/com/android/server/ThrottleService.java
@@ -732,23 +732,25 @@
checkForSubscriberId();
boolean startNewPeriod = true;
- // if we rolled back in time, toss out
- // if we rolled foward, advance to the next
- if (end.before(mPeriodStart)) {
+ if (start.equals(mPeriodStart) && end.equals(mPeriodEnd)) {
+ // same endpoints - keep collecting
if (DBG) {
- Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
- end.getTimeInMillis() + ") - old start was " +
- mPeriodStart.getTimeInMillis() + ", wiping");
+ Slog.d(TAG, "same period (" + start.getTimeInMillis() + "," +
+ end.getTimeInMillis() +") - ammending data");
}
- synchronized (mParent) {
- mPeriodRxData[mCurrentPeriod] = 0;
- mPeriodTxData[mCurrentPeriod] = 0;
- }
- } else if(start.after(mPeriodEnd)) {
+ startNewPeriod = false;
+ } else {
if (DBG) {
- Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
- end.getTimeInMillis() + ") - old end was " +
- mPeriodEnd.getTimeInMillis() + ", following");
+ if(start.equals(mPeriodEnd) || start.after(mPeriodEnd)) {
+ Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
+ end.getTimeInMillis() + ") - old end was " +
+ mPeriodEnd.getTimeInMillis() + ", following");
+ } else {
+ Slog.d(TAG, "new period (" + start.getTimeInMillis() + "," +
+ end.getTimeInMillis() + ") replacing old (" +
+ mPeriodStart.getTimeInMillis() + "," +
+ mPeriodEnd.getTimeInMillis() + ")");
+ }
}
synchronized (mParent) {
++mCurrentPeriod;
@@ -756,12 +758,6 @@
mPeriodRxData[mCurrentPeriod] = 0;
mPeriodTxData[mCurrentPeriod] = 0;
}
- } else {
- startNewPeriod = false;
- if (DBG) {
- Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
- end.getTimeInMillis() + ") - we fit - ammending to last period");
- }
}
setPeriodStart(start);
setPeriodEnd(end);