diff options
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | api/current.xml | 11 | ||||
-rw-r--r-- | core/java/android/os/Build.java | 13 | ||||
-rw-r--r-- | core/java/android/webkit/WebViewCore.java | 4 | ||||
-rw-r--r-- | core/res/Android.mk | 4 | ||||
-rw-r--r-- | data/sounds/ringtones/FreeFlight.ogg | bin | 0 -> 113055 bytes | |||
-rw-r--r-- | data/sounds/ringtones/FreeFlight.wav | bin | 0 -> 2229120 bytes | |||
-rw-r--r-- | docs/html/sdk/download.jd | 2 | ||||
-rw-r--r-- | libs/rs/rsContext.cpp | 61 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 2 | ||||
-rw-r--r-- | media/java/android/media/AsyncPlayer.java | 93 | ||||
-rw-r--r-- | services/java/com/android/server/PowerManagerService.java | 58 | ||||
-rw-r--r-- | tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTest.java | 6 |
13 files changed, 185 insertions, 71 deletions
@@ -489,6 +489,8 @@ LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:=assets-sdk 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 @@ public class Build { * 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 @@ public class Build { * </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 @@ public class Build { * </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 class WebViewCore { 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 @@ final class WebViewCore { 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_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES) 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 Binary files differnew file mode 100644 index 0000000..76dfabe --- /dev/null +++ b/data/sounds/ringtones/FreeFlight.ogg diff --git a/data/sounds/ringtones/FreeFlight.wav b/data/sounds/ringtones/FreeFlight.wav Binary files differnew file mode 100644 index 0000000..a4e14aa --- /dev/null +++ b/data/sounds/ringtones/FreeFlight.wav 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 @@ The License Agreement constitutes a contract between you and Google with respect <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 @@ using namespace android::renderscript; 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 @@ void Context::initEGL() 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 @@ void Context::initEGL() android_createDisplaySurface(), NULL); } + checkEglError("eglCreateWindowSurface"); + if (mEGL.mSurface == EGL_NO_SURFACE) { + LOGE("eglCreateWindowSurface returned EGL_NO_SURFACE"); + } + + 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"); + } - mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, NULL, NULL); - eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext); eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth); eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight); @@ -101,6 +132,24 @@ void Context::initEGL() } } +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 @@ void * Context::threadProc(void *vrsc) 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 @@ void * Context::threadProc(void *vrsc) 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 @@ public: static pthread_key_t gThreadTLSKey; static uint32_t gThreadTLSKeyCount; + static uint32_t gGLContextCount; static pthread_mutex_t gInitMutex; struct ScriptTLSStruct { @@ -215,6 +216,7 @@ private: 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 @@ package android.media; 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 @@ import java.lang.IllegalStateException; 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 @@ public class AsyncPlayer { } } + 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 @@ public class AsyncPlayer { 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 @@ public class AsyncPlayer { 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 @@ public class AsyncPlayer { } 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 class AsyncPlayer { */ 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 @@ public class AsyncPlayer { * 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 @@ public class AsyncPlayer { } 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 @@ class PowerManagerService extends IPowerManager.Stub 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 @@ class PowerManagerService extends IPowerManager.Stub // 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 @@ class PowerManagerService extends IPowerManager.Stub 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 @@ class PowerManagerService extends IPowerManager.Stub if (mAutoBrightessEnabled != enabled) { mAutoBrightessEnabled = enabled; // reset computed brightness + mLightSensorValue = -1; mLightSensorBrightness = -1; if (mHasHardwareAutoBrightness) { @@ -2263,14 +2284,17 @@ class PowerManagerService extends IPowerManager.Stub 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 @@ public class ReliabilityTest extends ActivityInstrumentationTestCase2<Reliabilit 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 @@ public class ReliabilityTest extends ActivityInstrumentationTestCase2<Reliabilit 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 @@ public class ReliabilityTest extends ActivityInstrumentationTestCase2<Reliabilit 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(); |