Merge change I96c4d4b3 into eclair

* changes:
  Fix for random audio output failures, properly dup() the file descriptor in IMediaPlayer::setDataSource to assume ownership as the caller will otherwise close it.
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index daf4090..b116bf8 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -485,7 +485,8 @@
             return mResources;
         }
 
-        public Application makeApplication(boolean forceDefaultAppClass) {
+        public Application makeApplication(boolean forceDefaultAppClass,
+                Instrumentation instrumentation) {
             if (mApplication != null) {
                 return mApplication;
             }
@@ -512,7 +513,21 @@
                 }
             }
             mActivityThread.mAllApplications.add(app);
-            return mApplication = app;
+            mApplication = app;
+            
+            if (instrumentation != null) {
+                try {
+                    instrumentation.callApplicationOnCreate(app);
+                } catch (Exception e) {
+                    if (!instrumentation.onException(app, e)) {
+                        throw new RuntimeException(
+                            "Unable to create application " + app.getClass().getName()
+                            + ": " + e.toString(), e);
+                    }
+                }
+            }
+            
+            return app;
         }
 
         public void removeContextRegistrations(Context context,
@@ -2378,7 +2393,7 @@
         }
 
         try {
-            Application app = r.packageInfo.makeApplication(false);
+            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
 
             if (localLOGV) Log.v(TAG, "Performing launch of " + r);
             if (localLOGV) Log.v(
@@ -2576,7 +2591,7 @@
         }
 
         try {
-            Application app = packageInfo.makeApplication(false);
+            Application app = packageInfo.makeApplication(false, mInstrumentation);
 
             if (localLOGV) Log.v(
                 TAG, "Performing receive of " + data.intent
@@ -2730,7 +2745,7 @@
             ApplicationContext context = new ApplicationContext();
             context.init(packageInfo, null, this);
 
-            Application app = packageInfo.makeApplication(false);
+            Application app = packageInfo.makeApplication(false, mInstrumentation);
             context.setOuterContext(service);
             service.attach(context, this, data.info.name, data.token, app,
                     ActivityManagerNative.getDefault());
@@ -3940,7 +3955,7 @@
 
         // If the app is being launched for full backup or restore, bring it up in
         // a restricted environment with the base application class.
-        Application app = data.info.makeApplication(data.restrictedBackupMode);
+        Application app = data.info.makeApplication(data.restrictedBackupMode, null);
         mInitialApplication = app;
 
         List<ProviderInfo> providers = data.providers;
diff --git a/services/java/com/android/server/HardwareService.java b/services/java/com/android/server/HardwareService.java
index 3e3cf06..88074c2 100755
--- a/services/java/com/android/server/HardwareService.java
+++ b/services/java/com/android/server/HardwareService.java
@@ -54,6 +54,16 @@
     static final int LIGHT_FLASH_TIMED = 1;
     static final int LIGHT_FLASH_HARDWARE = 2;
 
+    /**
+     * Light brightness is managed by a user setting.
+     */
+    static final int BRIGHTNESS_MODE_USER = 0;
+
+    /**
+     * Light brightness is managed by a light sensor.
+     */
+    static final int BRIGHTNESS_MODE_SENSOR = 1;
+
     private final LinkedList<Vibration> mVibrations;
     private Vibration mCurrentVibration;
 
@@ -266,21 +276,21 @@
     }
 
     void setLightOff_UNCHECKED(int light) {
-        setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0);
+        setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0, 0);
     }
 
-    void setLightBrightness_UNCHECKED(int light, int brightness) {
+    void setLightBrightness_UNCHECKED(int light, int brightness, int brightnessMode) {
         int b = brightness & 0x000000ff;
         b = 0xff000000 | (b << 16) | (b << 8) | b;
-        setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0);
+        setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
     }
 
     void setLightColor_UNCHECKED(int light, int color) {
-        setLight_native(mNativePointer, light, color, LIGHT_FLASH_NONE, 0, 0);
+        setLight_native(mNativePointer, light, color, LIGHT_FLASH_NONE, 0, 0, 0);
     }
 
     void setLightFlashing_UNCHECKED(int light, int color, int mode, int onMS, int offMS) {
-        setLight_native(mNativePointer, light, color, mode, onMS, offMS);
+        setLight_native(mNativePointer, light, color, mode, onMS, offMS, 0);
     }
 
     public void setAttentionLight(boolean on, int color) {
@@ -289,7 +299,7 @@
             mAttentionLightOn = on;
             mPulsing = false;
             setLight_native(mNativePointer, LIGHT_ID_ATTENTION, color,
-                    LIGHT_FLASH_HARDWARE, on ? 3 : 0, 0);
+                    LIGHT_FLASH_HARDWARE, on ? 3 : 0, 0, 0);
         }
     }
 
@@ -304,7 +314,7 @@
             if (!mAttentionLightOn && !mPulsing) {
                 mPulsing = true;
                 setLight_native(mNativePointer, LIGHT_ID_ATTENTION, 0x00ffffff,
-                        LIGHT_FLASH_HARDWARE, 7, 0);
+                        LIGHT_FLASH_HARDWARE, 7, 0, 0);
                 mH.sendMessageDelayed(Message.obtain(mH, 1), 3000);
             }
         }
@@ -321,7 +331,7 @@
                     mPulsing = false;
                     setLight_native(mNativePointer, LIGHT_ID_ATTENTION,
                             mAttentionLightOn ? 0xffffffff : 0,
-                            LIGHT_FLASH_NONE, 0, 0);
+                            LIGHT_FLASH_NONE, 0, 0, 0);
                 }
             }
         }
@@ -484,7 +494,7 @@
     private static native void finalize_native(int ptr);
 
     private static native void setLight_native(int ptr, int light, int color, int mode,
-            int onMS, int offMS);
+            int onMS, int offMS, int brightnessMode);
 
     private final Context mContext;
     private final PowerManager.WakeLock mWakeLock;
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 3000e9d..e1425d4 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -1324,8 +1324,13 @@
                 enableLightSensor(on);
                 if (!on) {
                     // make sure button and key backlights are off too
-                    mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, 0);
-                    mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, 0);
+                    int brightnessMode = (mUseSoftwareAutoBrightness
+                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
+                            : HardwareService.BRIGHTNESS_MODE_USER);
+                    mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, 0,
+                        brightnessMode);
+                    mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, 0,
+                        brightnessMode);
                     // clear current value so we will update based on the new conditions
                     // when the sensor is reenabled.
                     mLightSensorValue = -1;
@@ -1680,14 +1685,23 @@
     }
 
     private void setLightBrightness(int mask, int value) {
+        int brightnessMode = (mAutoBrightessEnabled
+                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
+                            : HardwareService.BRIGHTNESS_MODE_USER);
         if ((mask & SCREEN_BRIGHT_BIT) != 0) {
-            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, value);
+            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, value,
+                brightnessMode);
         }
+        brightnessMode = (mUseSoftwareAutoBrightness
+                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
+                            : HardwareService.BRIGHTNESS_MODE_USER);
         if ((mask & BUTTON_BRIGHT_BIT) != 0) {
-            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, value);
+            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, value,
+                brightnessMode);
         }
         if ((mask & KEYBOARD_BRIGHT_BIT) != 0) {
-            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, value);
+            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, value,
+                brightnessMode);
         }
     }
 
@@ -1986,8 +2000,11 @@
                             startAnimation = true;
                         }
                     } else {
+                        int brightnessMode = (mAutoBrightessEnabled
+                                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
+                                            : HardwareService.BRIGHTNESS_MODE_USER);
                         mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT,
-                                lcdValue);
+                                lcdValue, brightnessMode);
                     }
                 }
                 if (ANIMATE_BUTTON_LIGHTS) {
@@ -1997,8 +2014,11 @@
                         startAnimation = true;
                     }
                 } else {
+                    int brightnessMode = (mUseSoftwareAutoBrightness
+                                        ? HardwareService.BRIGHTNESS_MODE_SENSOR
+                                        : HardwareService.BRIGHTNESS_MODE_USER);
                     mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS,
-                            buttonValue);
+                            buttonValue, brightnessMode);
                 }
                 if (ANIMATE_KEYBOARD_LIGHTS) {
                     if (mKeyboardBrightness.setTargetLocked(keyboardValue,
@@ -2007,8 +2027,11 @@
                         startAnimation = true;
                     }
                 } else {
+                    int brightnessMode = (mUseSoftwareAutoBrightness
+                                        ? HardwareService.BRIGHTNESS_MODE_SENSOR
+                                        : HardwareService.BRIGHTNESS_MODE_USER);
                     mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
-                            keyboardValue);
+                            keyboardValue, brightnessMode);
                 }
                 if (startAnimation) {
                     if (mDebugLightSensor) {
@@ -2329,10 +2352,12 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
         // Don't let applications turn the screen all the way off
         brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);
-        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness);
+        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness,
+                HardwareService.BRIGHTNESS_MODE_USER);
         mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
-            (mKeyboardVisible ? brightness : 0));
-        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness);
+            (mKeyboardVisible ? brightness : 0), HardwareService.BRIGHTNESS_MODE_USER);
+        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness,
+            HardwareService.BRIGHTNESS_MODE_USER);
         long identity = Binder.clearCallingIdentity();
         try {
             mBatteryStats.noteScreenBrightness(brightness);
diff --git a/services/jni/com_android_server_HardwareService.cpp b/services/jni/com_android_server_HardwareService.cpp
index 22d4bd8..253e655 100644
--- a/services/jni/com_android_server_HardwareService.cpp
+++ b/services/jni/com_android_server_HardwareService.cpp
@@ -101,7 +101,7 @@
 }
 
 static void setLight_native(JNIEnv *env, jobject clazz, int ptr,
-        int light, int colorARGB, int flashMode, int onMS, int offMS)
+        int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)
 {
     Devices* devices = (Devices*)ptr;
     light_state_t state;
@@ -115,6 +115,7 @@
     state.flashMode = flashMode;
     state.flashOnMS = onMS;
     state.flashOffMS = offMS;
+    state.brightnessMode = brightnessMode;
 
     devices->lights[light]->set_light(devices->lights[light], &state);
 }
@@ -134,7 +135,7 @@
 static JNINativeMethod method_table[] = {
     { "init_native", "()I", (void*)init_native },
     { "finalize_native", "(I)V", (void*)finalize_native },
-    { "setLight_native", "(IIIIII)V", (void*)setLight_native },
+    { "setLight_native", "(IIIIIII)V", (void*)setLight_native },
     { "vibratorOn", "(J)V", (void*)vibratorOn },
     { "vibratorOff", "()V", (void*)vibratorOff }
 };