Merge change I8d2de438 into eclair
* changes:
fix [2143798] Need to figure out how to do video
diff --git a/Android.mk b/Android.mk
index 5d4c5c1..d92809a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -489,6 +489,8 @@
include $(BUILD_DROIDDOC)
+# explicitly specify that online-sdk depends on framework-res.
+$(full_target): framework-res-package-target
# ==== docs that have all of the stuff that's @hidden =======================
include $(CLEAR_VARS)
diff --git a/api/current.xml b/api/current.xml
index 8f83e39..47dc08a 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -99410,6 +99410,17 @@
visibility="public"
>
</field>
+<field name="ECLAIR_MR1"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="6"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
</class>
<class name="Bundle"
extends="java.lang.Object"
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 0f8bc08..d4aaba3 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -103,16 +103,19 @@
* October 2008: The original, first, version of Android. Yay!
*/
public static final int BASE = 1;
+
/**
* February 2009: First Android update, officially called 1.1.
*/
public static final int BASE_1_1 = 2;
+
/**
* May 2009: Android 1.5.
*/
public static final int CUPCAKE = 3;
+
/**
- * Current work on "Donut" development branch.
+ * September 2009: Android 1.6.
*
* <p>Applications targeting this or a later release will get these
* new changes in behavior:</p>
@@ -133,8 +136,9 @@
* </ul>
*/
public static final int DONUT = 4;
+
/**
- * Current work on "Eclair" development branch.
+ * November 2009: Android 2.0
*
* <p>Applications targeting this or a later release will get these
* new changes in behavior:</p>
@@ -152,6 +156,11 @@
* </ul>
*/
public static final int ECLAIR = 5;
+
+ /**
+ * Current work on Eclair MR1.
+ */
+ public static final int ECLAIR_MR1 = 6;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 86685fb..a5a4852 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1643,8 +1643,6 @@
final DrawFilter mZoomFilter =
new PaintFlagsDrawFilter(ZOOM_BITS, Paint.LINEAR_TEXT_FLAG);
- final DrawFilter mScrollFilter =
- new PaintFlagsDrawFilter(SCROLL_BITS, 0);
/* package */ void drawContentPicture(Canvas canvas, int color,
boolean animatingZoom,
@@ -1653,7 +1651,7 @@
if (animatingZoom) {
df = mZoomFilter;
} else if (animatingScroll) {
- df = mScrollFilter;
+ df = null;
}
canvas.setDrawFilter(df);
boolean tookTooLong = nativeDrawContent(canvas, color);
diff --git a/core/res/Android.mk b/core/res/Android.mk
index cb5524a..78cb86d 100644
--- a/core/res/Android.mk
+++ b/core/res/Android.mk
@@ -34,3 +34,7 @@
LOCAL_EXPORT_PACKAGE_RESOURCES := true
include $(BUILD_PACKAGE)
+
+# define a global intermediate target that other module may depend on.
+.PHONY: framework-res-package-target
+framework-res-package-target: $(LOCAL_BUILT_MODULE)
diff --git a/data/sounds/ringtones/FreeFlight.ogg b/data/sounds/ringtones/FreeFlight.ogg
new file mode 100644
index 0000000..76dfabe
--- /dev/null
+++ b/data/sounds/ringtones/FreeFlight.ogg
Binary files differ
diff --git a/data/sounds/ringtones/FreeFlight.wav b/data/sounds/ringtones/FreeFlight.wav
new file mode 100644
index 0000000..a4e14aa
--- /dev/null
+++ b/data/sounds/ringtones/FreeFlight.wav
Binary files differ
diff --git a/docs/html/sdk/download.jd b/docs/html/sdk/download.jd
index 76f1213..47505e6 100644
--- a/docs/html/sdk/download.jd
+++ b/docs/html/sdk/download.jd
@@ -58,7 +58,7 @@
<h2>Thank you for downloading the Android SDK!</h2>
<p>Your download should be underway. If not, <a id="click-download">click here to start the download</a>.</p>
<p>To set up your Android development environment, please read the guide to
- <a href="installing.html" class="addVersionPath">Installing the Android SDK</a>.
+ <a href="installing.html">Installing the Android SDK</a>.
Once you have completed the installation, see the
<a href="/guide/index.html">Dev Guide</a> for documentation about
developing Android applications.</p>
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index cc39dac..eb388af 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -30,8 +30,21 @@
pthread_key_t Context::gThreadTLSKey = 0;
uint32_t Context::gThreadTLSKeyCount = 0;
+uint32_t Context::gGLContextCount = 0;
pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
+static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
+ if (returnVal != EGL_TRUE) {
+ fprintf(stderr, "%s() returned %d\n", op, returnVal);
+ }
+
+ for (EGLint error = eglGetError(); error != EGL_SUCCESS; error
+ = eglGetError()) {
+ fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error),
+ error);
+ }
+}
+
void Context::initEGL()
{
mEGL.mNumConfigs = -1;
@@ -61,7 +74,10 @@
LOGV("initEGL start");
mEGL.mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ checkEglError("eglGetDisplay");
+
eglInitialize(mEGL.mDisplay, &mEGL.mMajorVersion, &mEGL.mMinorVersion);
+ checkEglError("eglInitialize");
status_t err = EGLUtils::selectConfigForNativeWindow(mEGL.mDisplay, configAttribs, mWndSurface, &mEGL.mConfig);
if (err) {
@@ -76,9 +92,24 @@
android_createDisplaySurface(),
NULL);
}
+ checkEglError("eglCreateWindowSurface");
+ if (mEGL.mSurface == EGL_NO_SURFACE) {
+ LOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
+ }
- mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, NULL, NULL);
- eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext);
+ mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, EGL_NO_CONTEXT, NULL);
+ checkEglError("eglCreateContext");
+ if (mEGL.mContext == EGL_NO_CONTEXT) {
+ LOGE("eglCreateContext returned EGL_NO_CONTEXT");
+ }
+ gGLContextCount++;
+
+ EGLBoolean ret = eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext);
+ checkEglError("eglCreateContext", ret);
+ if (mEGL.mContext == EGL_NO_CONTEXT) {
+ LOGE("eglCreateContext returned EGL_NO_CONTEXT");
+ }
+
eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth);
eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight);
@@ -101,6 +132,24 @@
}
}
+void Context::deinitEGL()
+{
+ EGLBoolean ret = eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ checkEglError("eglCreateContext", ret);
+ if (mEGL.mContext == EGL_NO_CONTEXT) {
+ LOGE("eglCreateContext returned EGL_NO_CONTEXT");
+ }
+
+ eglDestroyContext(mEGL.mDisplay, mEGL.mContext);
+ checkEglError("eglDestroyContext");
+
+ gGLContextCount--;
+ if (!gGLContextCount) {
+ eglTerminate(mEGL.mDisplay);
+ }
+}
+
+
bool Context::runScript(Script *s, uint32_t launchID)
{
ObjectBaseRef<ProgramFragment> frag(mFragment);
@@ -232,7 +281,9 @@
rsc->props.mLogScripts = getProp("debug.rs.script");
rsc->props.mLogObjects = getProp("debug.rs.objects");
+ pthread_mutex_lock(&gInitMutex);
rsc->initEGL();
+ pthread_mutex_unlock(&gInitMutex);
ScriptTLSStruct *tlsStruct = new ScriptTLSStruct;
if (!tlsStruct) {
@@ -294,7 +345,11 @@
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface);
- eglTerminate(rsc->mEGL.mDisplay);
+
+ pthread_mutex_lock(&gInitMutex);
+ rsc->deinitEGL();
+ pthread_mutex_unlock(&gInitMutex);
+
rsc->objDestroyOOBRun();
LOGV("RS Thread exited");
return NULL;
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 0dd90ed..c80fd5a 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -54,6 +54,7 @@
static pthread_key_t gThreadTLSKey;
static uint32_t gThreadTLSKeyCount;
+ static uint32_t gGLContextCount;
static pthread_mutex_t gInitMutex;
struct ScriptTLSStruct {
@@ -215,6 +216,7 @@
Context();
void initEGL();
+ void deinitEGL();
bool runRootScript();
diff --git a/media/java/android/media/AsyncPlayer.java b/media/java/android/media/AsyncPlayer.java
index 35f0409..e1e09b9 100644
--- a/media/java/android/media/AsyncPlayer.java
+++ b/media/java/android/media/AsyncPlayer.java
@@ -19,10 +19,12 @@
import android.content.Context;
import android.net.Uri;
import android.os.PowerManager;
+import android.os.SystemClock;
import android.util.Log;
import java.io.IOException;
import java.lang.IllegalStateException;
+import java.util.LinkedList;
/**
* Plays a series of audio URIs, but does all the hard work on another thread
@@ -31,14 +33,15 @@
public class AsyncPlayer {
private static final int PLAY = 1;
private static final int STOP = 2;
+ private static final boolean mDebug = false;
private static final class Command {
- Command next;
int code;
Context context;
Uri uri;
boolean looping;
int stream;
+ long requestTime;
public String toString() {
return "{ code=" + code + " looping=" + looping + " stream=" + stream
@@ -46,6 +49,36 @@
}
}
+ private LinkedList<Command> mCmdQueue = new LinkedList();
+
+ private void startSound(Command cmd) {
+ // Preparing can be slow, so if there is something else
+ // is playing, let it continue until we're done, so there
+ // is less of a glitch.
+ try {
+ if (mDebug) Log.d(mTag, "Starting playback");
+ MediaPlayer player = new MediaPlayer();
+ player.setAudioStreamType(cmd.stream);
+ player.setDataSource(cmd.context, cmd.uri);
+ player.setLooping(cmd.looping);
+ player.prepare();
+ player.start();
+ if (mPlayer != null) {
+ mPlayer.release();
+ }
+ mPlayer = player;
+ long delay = SystemClock.uptimeMillis() - cmd.requestTime;
+ if (delay > 1000) {
+ Log.w(mTag, "Notification sound delayed by " + delay + "msecs");
+ }
+ }
+ catch (IOException e) {
+ Log.w(mTag, "error loading sound for " + cmd.uri, e);
+ } catch (IllegalStateException e) {
+ Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);
+ }
+ }
+
private final class Thread extends java.lang.Thread {
Thread() {
super("AsyncPlayer-" + mTag);
@@ -55,41 +88,23 @@
while (true) {
Command cmd = null;
- synchronized (mLock) {
- if (mHead != null) {
- cmd = mHead;
- mHead = cmd.next;
- if (mTail == cmd) {
- mTail = null;
- }
- }
+ synchronized (mCmdQueue) {
+ if (mDebug) Log.d(mTag, "RemoveFirst");
+ cmd = mCmdQueue.removeFirst();
}
switch (cmd.code) {
case PLAY:
- try {
- // Preparing can be slow, so if there is something else
- // is playing, let it continue until we're done, so there
- // is less of a glitch.
- MediaPlayer player = new MediaPlayer();
- player.setAudioStreamType(cmd.stream);
- player.setDataSource(cmd.context, cmd.uri);
- player.setLooping(cmd.looping);
- player.prepare();
- player.start();
- if (mPlayer != null) {
- mPlayer.release();
- }
- mPlayer = player;
- }
- catch (IOException e) {
- Log.w(mTag, "error loading sound for " + cmd.uri, e);
- } catch (IllegalStateException e) {
- Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);
- }
+ if (mDebug) Log.d(mTag, "PLAY");
+ startSound(cmd);
break;
case STOP:
+ if (mDebug) Log.d(mTag, "STOP");
if (mPlayer != null) {
+ long delay = SystemClock.uptimeMillis() - cmd.requestTime;
+ if (delay > 1000) {
+ Log.w(mTag, "Notification stop delayed by " + delay + "msecs");
+ }
mPlayer.stop();
mPlayer.release();
mPlayer = null;
@@ -99,8 +114,8 @@
break;
}
- synchronized (mLock) {
- if (mHead == null) {
+ synchronized (mCmdQueue) {
+ if (mCmdQueue.size() == 0) {
// nothing left to do, quit
// doing this check after we're done prevents the case where they
// added it during the operation from spawning two threads and
@@ -115,11 +130,8 @@
}
private String mTag;
- private Command mHead;
- private Command mTail;
private Thread mThread;
private MediaPlayer mPlayer;
- private Object mLock = new Object();
private PowerManager.WakeLock mWakeLock;
// The current state according to the caller. Reality lags behind
@@ -154,12 +166,13 @@
*/
public void play(Context context, Uri uri, boolean looping, int stream) {
Command cmd = new Command();
+ cmd.requestTime = SystemClock.uptimeMillis();
cmd.code = PLAY;
cmd.context = context;
cmd.uri = uri;
cmd.looping = looping;
cmd.stream = stream;
- synchronized (mLock) {
+ synchronized (mCmdQueue) {
enqueueLocked(cmd);
mState = PLAY;
}
@@ -170,11 +183,12 @@
* at this point. Calling this multiple times has no ill effects.
*/
public void stop() {
- synchronized (mLock) {
+ synchronized (mCmdQueue) {
// This check allows stop to be called multiple times without starting
// a thread that ends up doing nothing.
if (mState != STOP) {
Command cmd = new Command();
+ cmd.requestTime = SystemClock.uptimeMillis();
cmd.code = STOP;
enqueueLocked(cmd);
mState = STOP;
@@ -183,12 +197,7 @@
}
private void enqueueLocked(Command cmd) {
- if (mTail == null) {
- mHead = cmd;
- } else {
- mTail.next = cmd;
- }
- mTail = cmd;
+ mCmdQueue.add(cmd);
if (mThread == null) {
acquireWakeLock();
mThread = new Thread();
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 5c4aa79..927c1b3 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -131,6 +131,8 @@
static final boolean ANIMATE_KEYBOARD_LIGHTS = false;
static final int ANIM_STEPS = 60/4;
+ // Slower animation for autobrightness changes
+ static final int AUTOBRIGHTNESS_ANIM_STEPS = 60;
// These magic numbers are the initial state of the LEDs at boot. Ideally
// we should read them from the driver, but our current hardware returns 0
@@ -224,7 +226,7 @@
// could be either static or controllable at runtime
private static final boolean mSpew = false;
- private static final boolean mDebugLightSensor = false;
+ private static final boolean mDebugLightSensor = (false || mSpew);
/*
static PrintStream mLog;
@@ -1925,27 +1927,45 @@
Log.d(TAG, "keyboardValue " + keyboardValue);
}
+ boolean startAnimation = false;
if (mScreenBrightnessOverride < 0) {
- mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT,
- lcdValue);
- }
- mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS,
- buttonValue);
- mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
- keyboardValue);
-
- // update our animation state
- if (ANIMATE_SCREEN_LIGHTS) {
- mScreenBrightness.curValue = lcdValue;
- mScreenBrightness.animating = false;
+ if (ANIMATE_SCREEN_LIGHTS) {
+ if (mScreenBrightness.setTargetLocked(lcdValue,
+ AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_SCREEN_BRIGHTNESS,
+ (int)mScreenBrightness.curValue)) {
+ startAnimation = true;
+ }
+ } else {
+ mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT,
+ lcdValue);
+ }
}
if (ANIMATE_BUTTON_LIGHTS) {
- mButtonBrightness.curValue = buttonValue;
- mButtonBrightness.animating = false;
+ if (mButtonBrightness.setTargetLocked(buttonValue,
+ AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_BUTTON_BRIGHTNESS,
+ (int)mButtonBrightness.curValue)) {
+ startAnimation = true;
+ }
+ } else {
+ mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS,
+ buttonValue);
}
if (ANIMATE_KEYBOARD_LIGHTS) {
- mKeyboardBrightness.curValue = keyboardValue;
- mKeyboardBrightness.animating = false;
+ if (mKeyboardBrightness.setTargetLocked(keyboardValue,
+ AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_BUTTON_BRIGHTNESS,
+ (int)mKeyboardBrightness.curValue)) {
+ startAnimation = true;
+ }
+ } else {
+ mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
+ keyboardValue);
+ }
+ if (startAnimation) {
+ if (mDebugLightSensor) {
+ Log.i(TAG, "lightSensorChangedLocked scheduling light animator");
+ }
+ mHandler.removeCallbacks(mLightAnimator);
+ mHandler.post(mLightAnimator);
}
}
}
@@ -2041,6 +2061,7 @@
if (mAutoBrightessEnabled != enabled) {
mAutoBrightessEnabled = enabled;
// reset computed brightness
+ mLightSensorValue = -1;
mLightSensorBrightness = -1;
if (mHasHardwareAutoBrightness) {
@@ -2263,14 +2284,17 @@
if (ANIMATE_SCREEN_LIGHTS) {
mScreenBrightness.curValue = brightness;
mScreenBrightness.animating = false;
+ mScreenBrightness.targetValue = -1;
}
if (ANIMATE_KEYBOARD_LIGHTS) {
mKeyboardBrightness.curValue = brightness;
mKeyboardBrightness.animating = false;
+ mKeyboardBrightness.targetValue = -1;
}
if (ANIMATE_BUTTON_LIGHTS) {
mButtonBrightness.curValue = brightness;
mButtonBrightness.animating = false;
+ mButtonBrightness.targetValue = -1;
}
}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTest.java
index 50b7c3f..9bc0962 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTest.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTest.java
@@ -74,6 +74,8 @@
Intent intent = new Intent(runner.getContext(), ReliabilityTestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ ReliabilityTestActivity activity = (ReliabilityTestActivity)runner.startActivitySync(
+ intent);
//read from BufferedReader instead of populating a list in advance,
//this will avoid excessive memory usage in case of a large list
while((url = listReader.readLine()) != null) {
@@ -83,8 +85,6 @@
start = System.currentTimeMillis();
Log.v(LOGTAG, "Testing URL: " + url);
FsUtils.updateTestStatus(TEST_STATUS_FILE, url);
- ReliabilityTestActivity activity = (ReliabilityTestActivity)runner.startActivitySync(
- intent);
activity.reset();
//use message to send new URL to avoid interacting with
//WebView in non-UI thread
@@ -110,11 +110,11 @@
if(runner.mLogtime) {
writeLoadTime(url, activity.getPageLoadTime());
}
- activity.finish();
System.runFinalization();
System.gc();
System.gc();
}
+ activity.finish();
FsUtils.updateTestStatus(TEST_STATUS_FILE, TEST_DONE);
// activity.finish();
listReader.close();