diff options
42 files changed, 865 insertions, 210 deletions
diff --git a/api/current.xml b/api/current.xml index 51315ab..c43ebac 100644 --- a/api/current.xml +++ b/api/current.xml @@ -46584,6 +46584,21 @@ <parameter name="cursor" type="android.database.Cursor"> </parameter> </method> +<method name="registerContentObserver" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="cursor" type="android.database.Cursor"> +</parameter> +<parameter name="observer" type="android.database.ContentObserver"> +</parameter> +</method> <method name="setProjection" return="void" abstract="false" @@ -157268,6 +157283,17 @@ visibility="public" > </field> +<field name="AUTO_TIME_ZONE" + type="java.lang.String" + transient="false" + volatile="false" + value=""auto_time_zone"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="BLUETOOTH_DISCOVERABILITY" type="java.lang.String" transient="false" diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java index 42599ed..7776874 100644 --- a/core/java/android/content/CursorLoader.java +++ b/core/java/android/content/CursorLoader.java @@ -16,6 +16,7 @@ package android.content; +import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; @@ -37,14 +38,22 @@ public class CursorLoader extends AsyncTaskLoader<Cursor> { public Cursor loadInBackground() { Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection, mSelectionArgs, mSortOrder); - // Ensure the cursor window is filled if (cursor != null) { + // Ensure the cursor window is filled cursor.getCount(); - cursor.registerContentObserver(mObserver); + registerContentObserver(cursor, mObserver); } return cursor; } + /** + * Registers an observer to get notifications from the content provider + * when the cursor needs to be refreshed. + */ + public void registerContentObserver(Cursor cursor, ContentObserver observer) { + cursor.registerContentObserver(mObserver); + } + /* Runs on the UI thread */ @Override public void deliverResult(Cursor cursor) { diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index f571c42..3ddaad9 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -30,8 +30,59 @@ import java.util.ArrayList; import java.util.HashMap; /** - * <p>StrictMode lets you impose stricter rules under which your - * application runs.</p> + * <p>StrictMode is a developer tool which lets you impose stricter + * rules under which your application runs. + * + * <p>StrictMode is most commonly used to catch accidental disk or + * network access on the application's main thread, where UI + * operations are received and animations take place. Keeping disk + * and network operations off the main thread makes for much smoother, + * more responsive applications. + * + * <p class="note">Note that even though an Android device's disk is + * often on flash memory, many devices run a filesystem on top of that + * memory with very limited concurrency. It's often the case that + * almost all disk accesses are fast, but may in individual cases be + * dramatically slower when certain I/O is happening in the background + * from other processes. If possible, it's best to assume that such + * things are not fast.</p> + * + * <p>Example code to enable from early in your + * {@link android.app.Application}, {@link android.app.Activity}, or + * other application component's + * {@link android.app.Application#onCreate} method: + * + * <pre> + * public void onCreate() { + * if (DEVELOPER_MODE) { + * StrictMode.setThreadPolicy(StrictMode.DISALLOW_DISK_WRITE | + * StrictMode.DISALLOW_DISK_READ | + * StrictMode.DISALLOW_NETWORK | + * StrictMode.PENALTY_LOG); + * } + * super.onCreate(); + * } + * </pre> + * + * <p>Then you can watch the output of <code>adb logcat</code> while you + * use your application. + * + * <p>If you find violations that you feel are problematic, there are + * a variety of tools to help solve them: threads, {@link android.os.Handler}, + * {@link android.os.AsyncTask}, {@link android.app.IntentService}, etc. + * But don't feel compelled to fix everything that StrictMode finds. In particular, + * a lot of disk accesses are often necessary during the normal activity lifecycle. Use + * StrictMode to find things you did on accident. Network requests on the UI thread + * are almost always a problem, though. + * + * <p class="note">StrictMode is not a security mechanism and is not + * guaranteed to find all disk or network accesses. While it does + * propagate its state across process boundaries when doing + * {@link android.os.Binder} calls, it's still ultimately a best + * effort mechanism. Notably, disk or network access from JNI calls + * won't necessarily trigger it. Future versions of Android may catch + * more (or fewer) operations, so you should never leave StrictMode + * enabled in shipping applications on the Android Market. */ public final class StrictMode { private static final String TAG = "StrictMode"; @@ -45,8 +96,22 @@ public final class StrictMode { private StrictMode() {} + /** + * Flag for {@link #setThreadPolicy} to signal that you don't intend for this + * thread to write to disk. + */ public static final int DISALLOW_DISK_WRITE = 0x01; + + /** + * Flag for {@link #setThreadPolicy} to signal that you don't intend for this + * thread to read from disk. + */ public static final int DISALLOW_DISK_READ = 0x02; + + /** + * Flag for {@link #setThreadPolicy} to signal that you don't intend for this + * thread to access the network. + */ public static final int DISALLOW_NETWORK = 0x04; /** @hide */ @@ -54,23 +119,30 @@ public final class StrictMode { DISALLOW_DISK_WRITE | DISALLOW_DISK_READ | DISALLOW_NETWORK; /** - * Flag to log to the system log. + * Penalty flag for {@link #setThreadPolicy} to log violations to + * the system log, visible with <code>adb logcat</code>. */ public static final int PENALTY_LOG = 0x10; // normal android.util.Log /** - * Show an annoying dialog to the user. Will be rate-limited to be only - * a little annoying. + * Penalty flag for {@link #setThreadPolicy} to show an annoying + * dialog to the developer, rate-limited to be only a little + * annoying. */ public static final int PENALTY_DIALOG = 0x20; /** - * Crash hard if policy is violated. + * Penalty flag for {@link #setThreadPolicy} to crash hard if + * policy is violated. */ public static final int PENALTY_DEATH = 0x40; /** - * Log a stacktrace to the DropBox on policy violation. + * Penalty flag for {@link #setThreadPolicy} to log a stacktrace + * and timing data to the + * {@link android.os.DropBoxManager DropBox} on policy violation. + * Intended mostly for platform integrators doing beta user field + * data collection. */ public static final int PENALTY_DROPBOX = 0x80; @@ -109,10 +181,17 @@ public final class StrictMode { }; /** - * Sets the policy for what actions the current thread is denied, - * as well as the penalty for violating the policy. + * Sets the policy for what actions the current thread isn't + * expected to do, as well as the penalty if it does. + * + * <p>Internally this sets a thread-local integer which is + * propagated across cross-process IPC calls, meaning you can + * catch violations when a system service or another process + * accesses the disk or network on your behalf. * - * @param policyMask a bitmask of DISALLOW_* and PENALTY_* values. + * @param policyMask a bitmask of DISALLOW_* and PENALTY_* values, + * e.g. {@link #DISALLOW_DISK_READ}, {@link #DISALLOW_DISK_WRITE}, + * {@link #DISALLOW_NETWORK}, {@link #PENALTY_LOG}. */ public static void setThreadPolicy(final int policyMask) { // In addition to the Java-level thread-local in Dalvik's @@ -160,7 +239,7 @@ public final class StrictMode { } /** - * Returns the bitmask of the current thread's blocking policy. + * Returns the bitmask of the current thread's policy. * * @return the bitmask of all the DISALLOW_* and PENALTY_* bits currently enabled */ @@ -169,8 +248,10 @@ public final class StrictMode { } /** - * Updates the current thread's policy mask to allow reading & - * writing to disk. + * A convenience wrapper around {@link #getThreadPolicy} and + * {@link #setThreadPolicy}. Updates the current thread's policy + * mask to allow both reading & writing to disk, returning the + * old policy so you can restore it at the end of a block. * * @return the old policy mask, to be passed to setThreadPolicy to * restore the policy. @@ -185,8 +266,10 @@ public final class StrictMode { } /** - * Updates the current thread's policy mask to allow reading from - * disk. + * A convenience wrapper around {@link #getThreadPolicy} and + * {@link #setThreadPolicy}. Updates the current thread's policy + * mask to allow reading from disk, returning the old + * policy so you can restore it at the end of a block. * * @return the old policy mask, to be passed to setThreadPolicy to * restore the policy. diff --git a/core/java/android/provider/Mtp.java b/core/java/android/provider/Mtp.java index bba54e1..de161e7 100644 --- a/core/java/android/provider/Mtp.java +++ b/core/java/android/provider/Mtp.java @@ -75,7 +75,7 @@ public final class Mtp return Uri.parse(CONTENT_AUTHORITY_DEVICE_SLASH + deviceID + "/storage"); } - public static Uri getContentUri(int deviceID, int storageID) { + public static Uri getContentUri(int deviceID, long storageID) { return Uri.parse(CONTENT_AUTHORITY_DEVICE_SLASH + deviceID + "/storage/" + storageID); } @@ -97,17 +97,17 @@ public final class Mtp */ public static final class Object implements BaseColumns { - public static Uri getContentUri(int deviceID, int objectID) { + public static Uri getContentUri(int deviceID, long objectID) { return Uri.parse(CONTENT_AUTHORITY_DEVICE_SLASH + deviceID + "/object/" + objectID); } - public static Uri getContentUriForObjectChildren(int deviceID, int objectID) { + public static Uri getContentUriForObjectChildren(int deviceID, long objectID) { return Uri.parse(CONTENT_AUTHORITY_DEVICE_SLASH + deviceID + "/object/" + objectID + "/child"); } - public static Uri getContentUriForStorageChildren(int deviceID, int storageID) { + public static Uri getContentUriForStorageChildren(int deviceID, long storageID) { return Uri.parse(CONTENT_AUTHORITY_DEVICE_SLASH + deviceID + "/storage/" + storageID + "/child"); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 4d87b79..51dc6ae 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1494,6 +1494,12 @@ public final class Settings { public static final String AUTO_TIME = "auto_time"; /** + * Value to specify if the user prefers the time zone + * to be automatically fetched from the network (NITZ). 1=yes, 0=no + */ + public static final String AUTO_TIME_ZONE = "auto_time_zone"; + + /** * Display times as 12 or 24 hours * 12 * 24 @@ -1775,6 +1781,7 @@ public final class Settings { TEXT_AUTO_PUNCTUATE, TEXT_SHOW_PASSWORD, AUTO_TIME, + AUTO_TIME_ZONE, TIME_12_24, DATE_FORMAT, ACCELEROMETER_ROTATION, diff --git a/core/java/android/util/Base64InputStream.java b/core/java/android/util/Base64InputStream.java index da3911d..e9dac24 100644 --- a/core/java/android/util/Base64InputStream.java +++ b/core/java/android/util/Base64InputStream.java @@ -112,7 +112,7 @@ public class Base64InputStream extends FilterInputStream { if (outputStart >= outputEnd) { return -1; } else { - return coder.output[outputStart++]; + return coder.output[outputStart++] & 0xff; } } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index af7d95e..bb43690 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -1829,9 +1829,11 @@ final class WebViewCore { draw.mViewState = mInitialViewState; if (mViewportWidth == -1 && mSettings.getUseFixedViewport() && mSettings.getUseWideViewPort()) { + final int fixedViewportMargin = mContext.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.fixed_viewport_margin); // Use website's initial preferred width as the fixed viewport width. mViewportWidth = Math.min(mSettings.getMaxFixedViewportWidth(), - Math.max(draw.mWidthHeight.x, draw.mMinPrefWidth)); + draw.mMinPrefWidth + 2 * fixedViewportMargin); draw.mViewState.mViewportWidth = mViewportWidth; } mInitialViewState = null; diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 539a986..171bb45 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -45,6 +45,8 @@ <dimen name="fastscroll_thumb_height">52dp</dimen> <!-- Min width for a tablet device --> <dimen name="min_xlarge_screen_width">800dp</dimen> + <!-- Fixed viewport margin for website content width change --> + <dimen name="fixed_viewport_margin">7dp</dimen> <!-- Default height of a key in the password keyboard for alpha --> <dimen name="password_keyboard_key_height_alpha">56dip</dimen> <!-- Default height of a key in the password keyboard for numeric --> diff --git a/core/tests/coretests/src/android/util/Base64Test.java b/core/tests/coretests/src/android/util/Base64Test.java index 0f5b090..53368d4 100644 --- a/core/tests/coretests/src/android/util/Base64Test.java +++ b/core/tests/coretests/src/android/util/Base64Test.java @@ -16,6 +16,9 @@ package android.util; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; import junit.framework.TestCase; import java.io.ByteArrayInputStream; @@ -404,6 +407,14 @@ public class Base64Test extends TestCase { } } + /** http://b/3026478 */ + public void testSingleByteReads() throws IOException { + InputStream in = new Base64InputStream( + new ByteArrayInputStream("/v8=".getBytes()), Base64.DEFAULT); + assertEquals(254, in.read()); + assertEquals(255, in.read()); + } + /** * Tests that Base64OutputStream produces exactly the same results * as calling Base64.encode/.decode on an in-memory array. diff --git a/graphics/java/android/renderscript/Mesh.java b/graphics/java/android/renderscript/Mesh.java index b74c1f8..d36b2f1 100644 --- a/graphics/java/android/renderscript/Mesh.java +++ b/graphics/java/android/renderscript/Mesh.java @@ -69,7 +69,7 @@ public class Mesh extends BaseObj { int[] primitives = new int[idxCount]; mRS.nMeshGetVertices(mID, vtxIDs, vtxCount); - mRS.nMeshGetIndices(mID, idxIDs, primitives, vtxCount); + mRS.nMeshGetIndices(mID, idxIDs, primitives, idxCount); mVertexBuffers = new Allocation[vtxCount]; mIndexBuffers = new Allocation[idxCount]; diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 31d70c7..21cbc50 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -354,10 +354,6 @@ ScriptSetVarV { } -ScriptCSetScript { - param void * codePtr - } - ScriptCSetText { param const char * text param uint32_t length diff --git a/libs/rs/rsMesh.cpp b/libs/rs/rsMesh.cpp index 810e4ff..8e43f24 100644 --- a/libs/rs/rsMesh.cpp +++ b/libs/rs/rsMesh.cpp @@ -124,8 +124,6 @@ void Mesh::uploadAll(Context *rsc) mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); } } - - rsc->checkError("Mesh::uploadAll"); } void Mesh::updateGLPrimitives() diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp index 9817fca..8f5c653 100644 --- a/libs/rs/rsProgramFragment.cpp +++ b/libs/rs/rsProgramFragment.cpp @@ -78,8 +78,6 @@ ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, mConstantColor[2] = 1.f; mConstantColor[3] = 1.f; - LOGE("Custom FP"); - mTextureEnableMask = (1 << mTextureCount) -1; init(rsc); diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index cbc5df9..4b484b1 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -67,12 +67,15 @@ void ScriptC::setupScript(Context *rsc) ptr = mSlots[ct]->getPtr(); } void **dest = ((void ***)mEnviroment.mFieldAddress)[ct]; - //LOGE("setupScript %i %p = %p %p %i", ct, dest, ptr, mSlots[ct]->getType(), mSlots[ct]->getType()->getDimX()); - //const uint32_t *p32 = (const uint32_t *)ptr; - //for (uint32_t ct2=0; ct2 < mSlots[ct]->getType()->getDimX(); ct2++) { - //LOGE(" %i = 0x%08x ", ct2, p32[ct2]); - //} + if (rsc->props.mLogScripts) { + LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=%p", rsc, ct, dest, ptr, mSlots[ct]->getType()); + + //const uint32_t *p32 = (const uint32_t *)ptr; + //for (uint32_t ct2=0; ct2 < mSlots[ct]->getType()->getDimX(); ct2++) { + //LOGE(" %i = 0x%08x ", ct2, p32[ct2]); + //} + } if (dest) { *dest = ptr; @@ -136,10 +139,18 @@ uint32_t ScriptC::run(Context *rsc) uint32_t ret = 0; Script * oldTLS = setTLS(this); - //LOGE("ScriptC::run %p", mProgram.mRoot); + + if (rsc->props.mLogScripts) { + LOGV("%p ScriptC::run invoking root, ptr %p", rsc, mProgram.mRoot); + } + ret = mProgram.mRoot(); + + if (rsc->props.mLogScripts) { + LOGV("%p ScriptC::run invoking complete, ret=%i", rsc, ret); + } + setTLS(oldTLS); - //LOGE("ScriptC::run ret %i", ret); return ret; } @@ -325,8 +336,14 @@ void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len setupScript(rsc); Script * oldTLS = setTLS(this); + if (rsc->props.mLogScripts) { + LOGV("%p ScriptC::Invoke invoking slot %i, ptr %p", rsc, slot, mEnviroment.mInvokeFunctions[slot]); + } ((void (*)(const void *, uint32_t)) mEnviroment.mInvokeFunctions[slot])(data, len); + if (rsc->props.mLogScripts) { + LOGV("%p ScriptC::Invoke complete", rsc); + } setTLS(oldTLS); } @@ -377,7 +394,7 @@ static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) void ScriptCState::runCompiler(Context *rsc, ScriptC *s) { - LOGV("ScriptCState::runCompiler "); + LOGV("%p ScriptCState::runCompiler ", rsc); s->mBccScript = bccCreateScript(); s->mEnviroment.mIsThreadable = true; @@ -386,7 +403,7 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s) bccCompileScript(s->mBccScript); bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot); bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit); - LOGV("root %p, init %p", s->mProgram.mRoot, s->mProgram.mInit); + LOGV("%p ScriptCState::runCompiler root %p, init %p", rsc, s->mProgram.mRoot, s->mProgram.mInit); if (s->mProgram.mInit) { s->mProgram.mInit(); @@ -407,9 +424,6 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s) s->mEnviroment.mFieldAddress = (void **) calloc(s->mEnviroment.mFieldCount, sizeof(void *)); bccGetExportVars(s->mBccScript, NULL, s->mEnviroment.mFieldCount, (BCCvoid **) s->mEnviroment.mFieldAddress); } - //for (int ct2=0; ct2 < s->mEnviroment.mFieldCount; ct2++ ) { - //LOGE("Script field %i = %p", ct2, s->mEnviroment.mFieldAddress[ct2]); - //} s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); @@ -491,13 +505,6 @@ void rsi_ScriptCBegin(Context * rsc) ss->clear(); } -void rsi_ScriptCSetScript(Context * rsc, void *vp) -{ - rsAssert(0); - //ScriptCState *ss = &rsc->mScriptC; - //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp); -} - void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { ScriptCState *ss = &rsc->mScriptC; diff --git a/media/java/android/media/MtpClient.java b/media/java/android/media/MtpClient.java index f7c0ce2..98da1f6 100644 --- a/media/java/android/media/MtpClient.java +++ b/media/java/android/media/MtpClient.java @@ -57,20 +57,20 @@ public class MtpClient { native_stop(); } - public boolean deleteObject(int deviceID, int objectID) { + public boolean deleteObject(int deviceID, long objectID) { return native_delete_object(deviceID, objectID); } - public int getParent(int deviceID, int objectID) { + public long getParent(int deviceID, long objectID) { return native_get_parent(deviceID, objectID); } - public int getStorageID(int deviceID, int objectID) { + public long getStorageID(int deviceID, long objectID) { return native_get_storage_id(deviceID, objectID); } // create a file descriptor for reading the contents of an object over MTP - public ParcelFileDescriptor openFile(int deviceID, int objectID) { + public ParcelFileDescriptor openFile(int deviceID, long objectID) { return native_open_file(deviceID, objectID); } @@ -101,8 +101,8 @@ public class MtpClient { private native final void native_finalize(); private native boolean native_start(); private native void native_stop(); - private native boolean native_delete_object(int deviceID, int objectID); - private native int native_get_parent(int deviceID, int objectID); - private native int native_get_storage_id(int deviceID, int objectID); - private native ParcelFileDescriptor native_open_file(int deviceID, int objectID); + private native boolean native_delete_object(int deviceID, long objectID); + private native long native_get_parent(int deviceID, long objectID); + private native long native_get_storage_id(int deviceID, long objectID); + private native ParcelFileDescriptor native_open_file(int deviceID, long objectID); } diff --git a/media/java/android/media/MtpCursor.java b/media/java/android/media/MtpCursor.java index d4142d8..b9dd03e 100644 --- a/media/java/android/media/MtpCursor.java +++ b/media/java/android/media/MtpCursor.java @@ -43,8 +43,8 @@ public final class MtpCursor extends AbstractWindowedCursor { private int mQueryType; private int mDeviceID; - private int mStorageID; - private int mQbjectID; + private long mStorageID; + private long mQbjectID; /** The names of the columns in the projection */ private String[] mColumns; @@ -54,7 +54,7 @@ public final class MtpCursor extends AbstractWindowedCursor { private final MtpClient mClient; - public MtpCursor(MtpClient client, int queryType, int deviceID, int storageID, int objectID, + public MtpCursor(MtpClient client, int queryType, int deviceID, long storageID, long objectID, String[] projection) { mClient = client; @@ -220,7 +220,7 @@ public final class MtpCursor extends AbstractWindowedCursor { private int mNativeContext; private native final void native_setup(MtpClient client, int queryType, - int deviceID, int storageID, int objectID, int[] columns); + int deviceID, long storageID, long objectID, int[] columns); private native final void native_finalize(); private native void native_wait_for_event(); private native int native_fill_window(CursorWindow window, int startPos); diff --git a/media/jni/android_media_MtpClient.cpp b/media/jni/android_media_MtpClient.cpp index 67740bc..d23185b 100644 --- a/media/jni/android_media_MtpClient.cpp +++ b/media/jni/android_media_MtpClient.cpp @@ -161,7 +161,7 @@ android_media_MtpClient_stop(JNIEnv *env, jobject thiz) static jboolean android_media_MtpClient_delete_object(JNIEnv *env, jobject thiz, - jint device_id, jint object_id) + jint device_id, jlong object_id) { #ifdef HAVE_ANDROID_OS MyClient *client = (MyClient *)env->GetIntField(thiz, field_context); @@ -173,9 +173,9 @@ android_media_MtpClient_delete_object(JNIEnv *env, jobject thiz, return NULL; } -static jint +static jlong android_media_MtpClient_get_parent(JNIEnv *env, jobject thiz, - jint device_id, jint object_id) + jint device_id, jlong object_id) { #ifdef HAVE_ANDROID_OS MyClient *client = (MyClient *)env->GetIntField(thiz, field_context); @@ -187,9 +187,9 @@ android_media_MtpClient_get_parent(JNIEnv *env, jobject thiz, return -1; } -static jint +static jlong android_media_MtpClient_get_storage_id(JNIEnv *env, jobject thiz, - jint device_id, jint object_id) + jint device_id, jlong object_id) { #ifdef HAVE_ANDROID_OS MyClient *client = (MyClient *)env->GetIntField(thiz, field_context); @@ -203,7 +203,7 @@ android_media_MtpClient_get_storage_id(JNIEnv *env, jobject thiz, static jobject android_media_MtpClient_open_file(JNIEnv *env, jobject thiz, - jint device_id, jint object_id) + jint device_id, jlong object_id) { #ifdef HAVE_ANDROID_OS MyClient *client = (MyClient *)env->GetIntField(thiz, field_context); @@ -240,10 +240,10 @@ static JNINativeMethod gMethods[] = { {"native_finalize", "()V", (void *)android_media_MtpClient_finalize}, {"native_start", "()Z", (void *)android_media_MtpClient_start}, {"native_stop", "()V", (void *)android_media_MtpClient_stop}, - {"native_delete_object", "(II)Z", (void *)android_media_MtpClient_delete_object}, - {"native_get_parent", "(II)I", (void *)android_media_MtpClient_get_parent}, - {"native_get_storage_id", "(II)I", (void *)android_media_MtpClient_get_storage_id}, - {"native_open_file", "(II)Landroid/os/ParcelFileDescriptor;", + {"native_delete_object", "(IJ)Z", (void *)android_media_MtpClient_delete_object}, + {"native_get_parent", "(IJ)J", (void *)android_media_MtpClient_get_parent}, + {"native_get_storage_id", "(IJ)J", (void *)android_media_MtpClient_get_storage_id}, + {"native_open_file", "(IJ)Landroid/os/ParcelFileDescriptor;", (void *)android_media_MtpClient_open_file}, }; diff --git a/media/jni/android_media_MtpCursor.cpp b/media/jni/android_media_MtpCursor.cpp index 6228b5d..6a65ffd 100644 --- a/media/jni/android_media_MtpCursor.cpp +++ b/media/jni/android_media_MtpCursor.cpp @@ -49,7 +49,7 @@ static bool ExceptionCheck(void* env) static void android_media_MtpCursor_setup(JNIEnv *env, jobject thiz, jobject javaClient, - jint queryType, jint deviceID, jint storageID, jint objectID, jintArray javaColumns) + jint queryType, jint deviceID, jlong storageID, jlong objectID, jintArray javaColumns) { #ifdef HAVE_ANDROID_OS LOGD("android_media_MtpCursor_setup queryType: %d deviceID: %d storageID: %d objectID: %d\n", @@ -104,7 +104,7 @@ android_media_MtpCursor_fill_window(JNIEnv *env, jobject thiz, jobject javaWindo // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { - {"native_setup", "(Landroid/media/MtpClient;IIII[I)V", + {"native_setup", "(Landroid/media/MtpClient;IIJJ[I)V", (void *)android_media_MtpCursor_setup}, {"native_finalize", "()V", (void *)android_media_MtpCursor_finalize}, {"native_fill_window", "(Landroid/database/CursorWindow;I)I", diff --git a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp index 7483d60..3c0b736 100644 --- a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp +++ b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp @@ -232,6 +232,53 @@ static void findNALFragment( } } +MediaBuffer *AVCDecoder::drainOutputBuffer() { + int32_t index; + int32_t Release; + AVCFrameIO Output; + Output.YCbCr[0] = Output.YCbCr[1] = Output.YCbCr[2] = NULL; + AVCDec_Status status = PVAVCDecGetOutput(mHandle, &index, &Release, &Output); + + if (status != AVCDEC_SUCCESS) { + LOGV("PVAVCDecGetOutput returned error %d", status); + return NULL; + } + + CHECK(index >= 0); + CHECK(index < (int32_t)mFrames.size()); + + MediaBuffer *mbuf = mFrames.editItemAt(index); + + bool skipFrame = false; + + if (mTargetTimeUs >= 0) { + int64_t timeUs; + CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs)); + CHECK(timeUs <= mTargetTimeUs); + + if (timeUs < mTargetTimeUs) { + // We're still waiting for the frame with the matching + // timestamp and we won't return the current one. + skipFrame = true; + + LOGV("skipping frame at %lld us", timeUs); + } else { + LOGV("found target frame at %lld us", timeUs); + + mTargetTimeUs = -1; + } + } + + if (!skipFrame) { + mbuf->set_range(0, mbuf->size()); + mbuf->add_ref(); + + return mbuf; + } + + return new MediaBuffer(0); +} + status_t AVCDecoder::read( MediaBuffer **out, const ReadOptions *options) { *out = NULL; @@ -279,7 +326,8 @@ status_t AVCDecoder::read( seekOptions.clearSeekTo(); if (err != OK) { - return err; + *out = drainOutputBuffer(); + return (*out == NULL) ? err : (status_t)OK; } if (mInputBuffer->range_length() > 0) { @@ -415,51 +463,12 @@ status_t AVCDecoder::read( fragSize); if (res == AVCDEC_PICTURE_OUTPUT_READY) { - int32_t index; - int32_t Release; - AVCFrameIO Output; - Output.YCbCr[0] = Output.YCbCr[1] = Output.YCbCr[2] = NULL; - - AVCDec_Status status = - PVAVCDecGetOutput(mHandle, &index, &Release, &Output); - - if (status != AVCDEC_SUCCESS) { - LOGV("PVAVCDecGetOutput returned error %d", status); + MediaBuffer *mbuf = drainOutputBuffer(); + if (mbuf == NULL) { break; } - CHECK(index >= 0); - CHECK(index < (int32_t)mFrames.size()); - - MediaBuffer *mbuf = mFrames.editItemAt(index); - - bool skipFrame = false; - - if (mTargetTimeUs >= 0) { - int64_t timeUs; - CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs)); - CHECK(timeUs <= mTargetTimeUs); - - if (timeUs < mTargetTimeUs) { - // We're still waiting for the frame with the matching - // timestamp and we won't return the current one. - skipFrame = true; - - LOGV("skipping frame at %lld us", timeUs); - } else { - LOGV("found target frame at %lld us", timeUs); - - mTargetTimeUs = -1; - } - } - - if (!skipFrame) { - *out = mbuf; - (*out)->set_range(0, (*out)->size()); - (*out)->add_ref(); - } else { - *out = new MediaBuffer(0); - } + *out = mbuf; // Do _not_ release input buffer yet. @@ -496,6 +505,7 @@ status_t AVCDecoder::read( case AVC_NALTYPE_AUD: case AVC_NALTYPE_FILL: + case AVC_NALTYPE_EOSEQ: { *out = new MediaBuffer(0); diff --git a/media/libstagefright/include/AVCDecoder.h b/media/libstagefright/include/AVCDecoder.h index 898c90a..eb3b142 100644 --- a/media/libstagefright/include/AVCDecoder.h +++ b/media/libstagefright/include/AVCDecoder.h @@ -82,6 +82,8 @@ private: void releaseFrames(); + MediaBuffer *drainOutputBuffer(); + AVCDecoder(const AVCDecoder &); AVCDecoder &operator=(const AVCDecoder &); }; diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp index fcf506d..4f28855 100644 --- a/media/libstagefright/omx/tests/OMXHarness.cpp +++ b/media/libstagefright/omx/tests/OMXHarness.cpp @@ -286,7 +286,7 @@ status_t Harness::testStateTransitions( return OK; } - sp<MemoryDealer> dealer = new MemoryDealer(8 * 1024 * 1024, "OMXHarness"); + sp<MemoryDealer> dealer = new MemoryDealer(16 * 1024 * 1024, "OMXHarness"); IOMX::node_id node; status_t err = diff --git a/media/tests/CameraBrowser/Android.mk b/media/tests/CameraBrowser/Android.mk index 33d2976..1d81129 100644 --- a/media/tests/CameraBrowser/Android.mk +++ b/media/tests/CameraBrowser/Android.mk @@ -1,6 +1,8 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) +LOCAL_MODULE_TAGS := tests + LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := CameraBrowser diff --git a/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectBrowser.java b/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectBrowser.java index 329aa40..6d34fd4 100644 --- a/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectBrowser.java +++ b/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectBrowser.java @@ -44,8 +44,8 @@ public class ObjectBrowser extends ListActivity { private Cursor mCursor; private ObjectCursorAdapter mAdapter; private int mDeviceID; - private int mStorageID; - private int mObjectID; + private long mStorageID; + private long mObjectID; private static final String[] OBJECT_COLUMNS = new String[] { Mtp.Object._ID, Mtp.Object.NAME, Mtp.Object.FORMAT, Mtp.Object.THUMB }; @@ -65,8 +65,8 @@ public class ObjectBrowser extends ListActivity { super.onResume(); mDeviceID = getIntent().getIntExtra("device", 0); - mStorageID = getIntent().getIntExtra("storage", 0); - mObjectID = getIntent().getIntExtra("object", 0); + mStorageID = getIntent().getLongExtra("storage", 0); + mObjectID = getIntent().getLongExtra("object", 0); if (mDeviceID != 0 && mStorageID != 0) { Cursor c; Uri uri; @@ -88,7 +88,7 @@ public class ObjectBrowser extends ListActivity { @Override protected void onListItemClick(ListView l, View v, int position, long id) { - int rowID = (int)mAdapter.getItemId(position); + long rowID = mAdapter.getItemId(position); Cursor c = getContentResolver().query( Mtp.Object.getContentUri(mDeviceID, rowID), OBJECT_COLUMNS, null, null, null); @@ -111,7 +111,7 @@ public class ObjectBrowser extends ListActivity { Intent intent = new Intent(this, ObjectViewer.class); intent.putExtra("device", mDeviceID); intent.putExtra("storage", mStorageID); - intent.putExtra("object",rowID); + intent.putExtra("object", rowID); startActivity(intent); } } diff --git a/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectViewer.java b/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectViewer.java index 408f15e..5899bc1 100644 --- a/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectViewer.java +++ b/media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectViewer.java @@ -51,8 +51,8 @@ public class ObjectViewer extends Activity { private static final String TAG = "ObjectViewer"; private int mDeviceID; - private int mStorageID; - private int mObjectID; + private long mStorageID; + private long mObjectID; private static final String[] OBJECT_COLUMNS = new String[] { Mtp.Object._ID, @@ -84,8 +84,8 @@ public class ObjectViewer extends Activity { super.onResume(); mDeviceID = getIntent().getIntExtra("device", 0); - mStorageID = getIntent().getIntExtra("storage", 0); - mObjectID = getIntent().getIntExtra("object", 0); + mStorageID = getIntent().getLongExtra("storage", 0); + mObjectID = getIntent().getLongExtra("object", 0); if (mDeviceID != 0 && mObjectID != 0) { Cursor c = getContentResolver().query( diff --git a/media/tests/CameraBrowser/src/com/android/camerabrowser/StorageBrowser.java b/media/tests/CameraBrowser/src/com/android/camerabrowser/StorageBrowser.java index 6ddf4e7..63e036e 100644 --- a/media/tests/CameraBrowser/src/com/android/camerabrowser/StorageBrowser.java +++ b/media/tests/CameraBrowser/src/com/android/camerabrowser/StorageBrowser.java @@ -70,7 +70,7 @@ public class StorageBrowser extends ListActivity { protected void onListItemClick(ListView l, View v, int position, long id) { Intent intent = new Intent(this, ObjectBrowser.class); intent.putExtra("device", mDeviceID); - intent.putExtra("storage", (int)mAdapter.getItemId(position)); + intent.putExtra("storage", mAdapter.getItemId(position)); startActivity(intent); } } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java index db0db70..d5538f1 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java @@ -414,13 +414,13 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr EnergyProbe probe = null; AudioEffect vc = null; MediaPlayer mp = null; + AudioEffect rvb = null; AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); try { - probe = new EnergyProbe(0); // creating a volume controller on output mix ensures that ro.audio.silent mutes // audio after the effects and not before vc = new AudioEffect( @@ -433,11 +433,24 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr mp = new MediaPlayer(); mp.setDataSource(MediaNames.SINE_200_1000); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); - getReverb(mp.getAudioSessionId()); - mReverb.setRoomLevel((short)0); - mReverb.setReverbLevel((short)0); - mReverb.setDecayTime(2000); - mReverb.setEnabled(true); + + // create reverb with UUID instead of EnvironmentalReverb constructor otherwise an + // auxiliary reverb will be chosen by the effect framework as we are on session 0 + rvb = new AudioEffect( + AudioEffect.EFFECT_TYPE_NULL, + UUID.fromString("c7a511a0-a3bb-11df-860e-0002a5d5c51b"), + 0, + 0); + + rvb.setParameter(EnvironmentalReverb.PARAM_ROOM_LEVEL, (short)0); + rvb.setParameter(EnvironmentalReverb.PARAM_REVERB_LEVEL, (short)0); + rvb.setParameter(EnvironmentalReverb.PARAM_DECAY_TIME, 2000); + rvb.setEnabled(true); + + // create probe after reverb so that it is chained behind the reverb in the + // effect chain + probe = new EnergyProbe(0); + mp.prepare(); mp.start(); Thread.sleep(1000); @@ -460,13 +473,15 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr loge(msg, "sleep() interrupted"); } finally { - releaseReverb(); if (mp != null) { mp.release(); } if (vc != null) { vc.release(); } + if (rvb != null) { + rvb.release(); + } if (probe != null) { probe.release(); } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java index c14319a..fbd8a78 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java @@ -257,13 +257,13 @@ public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<Medi EnergyProbe probe = null; AudioEffect vc = null; MediaPlayer mp = null; + AudioEffect rvb = null; AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); try { - probe = new EnergyProbe(0); // creating a volume controller on output mix ensures that ro.audio.silent mutes // audio after the effects and not before vc = new AudioEffect( @@ -279,6 +279,22 @@ public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<Medi getReverb(mp.getAudioSessionId()); mReverb.setPreset((short)PresetReverb.PRESET_PLATE); mReverb.setEnabled(true); + + // create reverb with UUID instead of PresetReverb constructor otherwise an auxiliary + // reverb will be chosen by the effect framework as we are on session 0 + rvb = new AudioEffect( + AudioEffect.EFFECT_TYPE_NULL, + UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b"), + 0, + 0); + + rvb.setParameter(PresetReverb.PARAM_PRESET, PresetReverb.PRESET_PLATE); + rvb.setEnabled(true); + + // create probe after reverb so that it is chained behind the reverb in the + // effect chain + probe = new EnergyProbe(0); + mp.prepare(); mp.start(); Thread.sleep(1000); @@ -308,6 +324,9 @@ public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<Medi if (vc != null) { vc.release(); } + if (rvb != null) { + rvb.release(); + } if (probe != null) { probe.release(); } diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index 66f9e2d..a8200be 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -1365,16 +1365,18 @@ EGLBoolean eglWaitNative(EGLint engine) EGLint eglGetError(void) { EGLint result = EGL_SUCCESS; + EGLint err; for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) { - EGLint err = EGL_SUCCESS; + err = EGL_SUCCESS; egl_connection_t* const cnx = &gEGLImpl[i]; if (cnx->dso) err = cnx->egl.eglGetError(); if (err!=EGL_SUCCESS && result==EGL_SUCCESS) result = err; } + err = getError(); if (result == EGL_SUCCESS) - result = getError(); + result = err; return result; } @@ -1816,16 +1818,16 @@ EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_l { EGLContext ctx = eglGetCurrentContext(); ContextRef _c(ctx); - if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); + if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_NO_SYNC_KHR); if (!validate_display_context(dpy, ctx)) - return EGL_NO_IMAGE_KHR; + return EGL_NO_SYNC_KHR; egl_display_t const * const dp = get_display(dpy); egl_context_t * const c = get_context(ctx); - EGLSyncKHR result = EGL_NO_IMAGE_KHR; + EGLSyncKHR result = EGL_NO_SYNC_KHR; if (c->cnx->egl.eglCreateSyncKHR) { EGLSyncKHR sync = c->cnx->egl.eglCreateSyncKHR( dp->disp[c->impl].dpy, type, attrib_list); - if (sync == EGL_NO_IMAGE_KHR) + if (sync == EGL_NO_SYNC_KHR) return sync; result = (egl_sync_t*)new egl_sync_t(dpy, ctx, sync); } diff --git a/opengl/tests/testLatency/Android.mk b/opengl/tests/testLatency/Android.mk new file mode 100644 index 0000000..96417c7 --- /dev/null +++ b/opengl/tests/testLatency/Android.mk @@ -0,0 +1,20 @@ +######################################################################### +# Test end-to-end latency. +######################################################################### + +TOP_LOCAL_PATH:= $(call my-dir) + +# Build activity + + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SDK_VERSION := 8 +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_PACKAGE_NAME := TestLatency + +include $(BUILD_PACKAGE) diff --git a/opengl/tests/testLatency/AndroidManifest.xml b/opengl/tests/testLatency/AndroidManifest.xml new file mode 100644 index 0000000..741266e --- /dev/null +++ b/opengl/tests/testLatency/AndroidManifest.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2009, 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. +*/ +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.testlatency"> + <uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8" /> + + <application + android:label="@string/testLatency_activity"> + <activity android:name="TestLatencyActivity" + android:theme="@android:style/Theme.NoTitleBar.Fullscreen" + android:launchMode="singleTask" + android:configChanges="orientation|keyboardHidden"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/opengl/tests/testLatency/res/values/strings.xml b/opengl/tests/testLatency/res/values/strings.xml new file mode 100644 index 0000000..0309991 --- /dev/null +++ b/opengl/tests/testLatency/res/values/strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2006, 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. +*/ +--> + +<!-- This file contains resource definitions for displayed strings, allowing + them to be changed based on the locale and options. --> + +<resources> + <!-- Simple strings. --> + <string name="testLatency_activity">TestLatency</string> + +</resources> + diff --git a/opengl/tests/testLatency/src/com/android/testlatency/TestLatencyActivity.java b/opengl/tests/testLatency/src/com/android/testlatency/TestLatencyActivity.java new file mode 100644 index 0000000..ed993cb --- /dev/null +++ b/opengl/tests/testLatency/src/com/android/testlatency/TestLatencyActivity.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2007 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.testlatency; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; +import android.view.WindowManager; + +import java.io.File; + + +public class TestLatencyActivity extends Activity { + + TestLatencyView mView; + + @Override protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + mView = new TestLatencyView(getApplication()); + setContentView(mView); + mView.setFocusableInTouchMode(true); + } + + @Override protected void onPause() { + super.onPause(); + mView.onPause(); + } + + @Override protected void onResume() { + super.onResume(); + mView.onResume(); + } +} diff --git a/opengl/tests/testLatency/src/com/android/testlatency/TestLatencyView.java b/opengl/tests/testLatency/src/com/android/testlatency/TestLatencyView.java new file mode 100644 index 0000000..d62bf17 --- /dev/null +++ b/opengl/tests/testLatency/src/com/android/testlatency/TestLatencyView.java @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2009 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.testlatency; + +import android.content.Context; +import android.opengl.GLSurfaceView; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +/** + * An implementation of SurfaceView that uses the dedicated surface for + * displaying an OpenGL animation. This allows the animation to run in a + * separate thread, without requiring that it be driven by the update mechanism + * of the view hierarchy. + * + * The application-specific rendering code is delegated to a GLView.Renderer + * instance. + */ +class TestLatencyView extends GLSurfaceView { + private static String TAG = "TestLatencyiew"; + private float mX; + private float mY; + private float mDX; + private float mDY; + private long mT; + private long mDT; + + public TestLatencyView(Context context) { + super(context); + setEGLContextClientVersion(2); + setRenderer(new Renderer()); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_MOVE: + float x = event.getX(); + float y = event.getY(); + long t = event.getEventTime(); + synchronized(this) { + mDT = t - mT; + mT = t; + mDX = x - mX; + mX = x; + mDY = y - mY; + mY = y; + } + break; + default: + break; + } + return true; + } + + private class Renderer implements GLSurfaceView.Renderer { + private float mScaleX, mScaleY, mOffsetX, mOffsetY; + private final float MS_PER_FRAME = 1000 / 60; + public Renderer() { + mTriangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + } + + + public void onDrawFrame(GL10 gl) { + GLES20.glClearColor(0.4f, 0.4f, 0.4f, 1.0f); + GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); + GLES20.glUseProgram(mProgram); + checkGlError("glUseProgram"); + + float x, y, dx, dy; + long t, dt; + synchronized(TestLatencyView.this) { + x = mX; + y = mY; + dx = mDX; + dy = mDY; + dt = mDT; + } + + if (dt > 0) { + dx = dx * MS_PER_FRAME / dt; + dy = dy * MS_PER_FRAME / dt; + } + + GLES20.glEnableVertexAttribArray(mvPositionHandle); + checkGlError("glEnableVertexAttribArray"); + GLES20.glEnableVertexAttribArray(mvColorHandle); + checkGlError("glEnableVertexAttribArray"); + for(int step = 0; step < 8; step++) { + float sx = (x + dx * step) * mScaleX + mOffsetX; + float sy = (y + dy * step) * mScaleY + mOffsetY; + int cbase = step * 4; + + for (int i = 0; i < mTriangleVerticesData.length; i += 6) { + mTriangleVerticesData2[i] = sx + mTriangleVerticesData[i]; + mTriangleVerticesData2[i+1] = -sy + mTriangleVerticesData[i+1]; + mTriangleVerticesData2[i+2] = mColors[cbase]; + mTriangleVerticesData2[i+3] = mColors[cbase+1]; + mTriangleVerticesData2[i+4] = mColors[cbase+2]; + mTriangleVerticesData2[i+5] = mColors[cbase+3]; + } + mTriangleVertices.position(0); + mTriangleVertices.put(mTriangleVerticesData2).position(0); + + GLES20.glVertexAttribPointer(mvPositionHandle, 2, GLES20.GL_FLOAT, false, 6*4, mTriangleVertices); + checkGlError("glVertexAttribPointer mvPosition"); + mTriangleVertices.put(mTriangleVerticesData2).position(2); + GLES20.glVertexAttribPointer(mvColorHandle, 4, GLES20.GL_FLOAT, false, 6*4, mTriangleVertices); + checkGlError("glVertexAttribPointer mvColor"); + GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3); + checkGlError("glDrawArrays"); + } + } + + public void onSurfaceChanged(GL10 gl, int width, int height) { + GLES20.glViewport(0, 0, width, height); + mScaleX = 2.0f / width; + mScaleY = 2.0f / height; + mOffsetX = -1f; + mOffsetY = -1f; + } + + public void onSurfaceCreated(GL10 gl, EGLConfig config) { + mProgram = createProgram(mVertexShader, mFragmentShader); + if (mProgram == 0) { + return; + } + mvPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); + checkGlError("glGetAttribLocation"); + if (mvPositionHandle == -1) { + throw new RuntimeException("Could not get attrib location for vPosition"); + } + mvColorHandle = GLES20.glGetAttribLocation(mProgram, "aColor"); + checkGlError("glGetAttribLocation"); + if (mvColorHandle == -1) { + throw new RuntimeException("Could not get attrib location for vColor"); + } + } + + private int loadShader(int shaderType, String source) { + int shader = GLES20.glCreateShader(shaderType); + if (shader != 0) { + GLES20.glShaderSource(shader, source); + GLES20.glCompileShader(shader); + int[] compiled = new int[1]; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); + if (compiled[0] == 0) { + Log.e(TAG, "Could not compile shader " + shaderType + ":"); + Log.e(TAG, GLES20.glGetShaderInfoLog(shader)); + GLES20.glDeleteShader(shader); + shader = 0; + } + } + return shader; + } + + private int createProgram(String vertexSource, String fragmentSource) { + int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource); + if (vertexShader == 0) { + return 0; + } + + int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); + if (pixelShader == 0) { + return 0; + } + + int program = GLES20.glCreateProgram(); + if (program != 0) { + GLES20.glAttachShader(program, vertexShader); + checkGlError("glAttachShader vertexShader"); + GLES20.glAttachShader(program, pixelShader); + checkGlError("glAttachShader pixelShader"); + GLES20.glLinkProgram(program); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] != GLES20.GL_TRUE) { + Log.e(TAG, "Could not link program: "); + Log.e(TAG, GLES20.glGetProgramInfoLog(program)); + GLES20.glDeleteProgram(program); + program = 0; + } + } + return program; + } + + private void checkGlError(String op) { + int error; + while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { + Log.e(TAG, op + ": glError " + error); + throw new RuntimeException(op + ": glError " + error); + } + } + + // X, Y, R G B A + private final float[] mTriangleVerticesData = { + -0.025f, 0.3f, 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f , 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, + 0.025f, 0.3f, 1.0f, 1.0f, 255.0f, 1.0f + }; + + // Color cascade: + private final float[] mColors = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.5f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.5f, 0.0f, 1.0f, + 0.5f, 0.5f, 0.0f, 1.0f, + + 0.0f, 0.0f, 0.5f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f + }; + + private float[] mTriangleVerticesData2 = new float[mTriangleVerticesData.length]; + private FloatBuffer mTriangleVertices; + + private final String mVertexShader = "attribute vec4 aPosition;\n" + + "attribute vec4 aColor;\n" + + "varying vec4 vColor;\n" + + "void main() {\n" + + " gl_Position = aPosition;\n" + + " vColor = aColor;\n" + + "}\n"; + + private final String mFragmentShader = "precision mediump float;\n" + + "varying vec4 vColor;\n" + + "void main() {\n" + + " gl_FragColor = vColor;\n" + + "}\n"; + + private int mProgram; + private int mvPositionHandle; + private int mvColorHandle; + + } +} + diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 43bb26a..3980189 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -3,16 +3,16 @@ /** * Copyright (c) 2009, 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 + * 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 + * 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 + * 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. */ --> @@ -24,6 +24,7 @@ <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi</string> <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi</string> <bool name="def_auto_time">true</bool> + <bool name="def_auto_time_zone">true</bool> <bool name="def_accelerometer_rotation">true</bool> <!-- Default screen brightness, from 0 to 255. 102 is 40%. --> <integer name="def_screen_brightness">102</integer> @@ -31,12 +32,12 @@ <fraction name="def_window_animation_scale">100%</fraction> <fraction name="def_window_transition_scale">100%</fraction> <bool name="def_haptic_feedback">true</bool> - + <bool name="def_bluetooth_on">false</bool> <bool name="def_install_non_market_apps">false</bool> - <!-- Comma-separated list of location providers. + <!-- Comma-separated list of location providers. Network location is off by default because it requires - user opt-in via Setup Wizard or Settings. + user opt-in via Setup Wizard or Settings. --> <string name="def_location_providers_allowed" translatable="false">gps</string> <bool name="assisted_gps_enabled">true</bool> @@ -45,11 +46,11 @@ <bool name="def_usb_mass_storage_enabled">true</bool> <bool name="def_wifi_on">false</bool> <bool name="def_networks_available_notification_on">true</bool> - + <bool name="def_backup_enabled">false</bool> <string name="def_backup_transport" translatable="false">android/com.android.internal.backup.LocalTransport</string> - <!-- Default value for whether or not to pulse the notification LED when there is a + <!-- Default value for whether or not to pulse the notification LED when there is a pending notification --> <bool name="def_notification_pulse">true</bool> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 8eb3fe6..9ac832b 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -16,6 +16,15 @@ package com.android.providers.settings; +import com.android.internal.content.PackageHelper; +import com.android.internal.telephony.RILConstants; +import com.android.internal.util.XmlUtils; +import com.android.internal.widget.LockPatternUtils; +import com.android.internal.widget.LockPatternView; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + import android.content.ComponentName; import android.content.ContentValues; import android.content.Context; @@ -36,14 +45,6 @@ import android.provider.Settings.Secure; import android.text.TextUtils; import android.util.Log; -import com.android.internal.content.PackageHelper; -import com.android.internal.telephony.RILConstants; -import com.android.internal.util.XmlUtils; -import com.android.internal.widget.LockPatternUtils; -import com.android.internal.widget.LockPatternView; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; import java.util.HashSet; import java.util.List; @@ -60,7 +61,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' // is properly propagated through your change. Not doing so will result in a loss of user // settings. - private static final int DATABASE_VERSION = 58; + private static final int DATABASE_VERSION = 59; private Context mContext; @@ -757,6 +758,23 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 58; } + if (upgradeVersion == 58) { + /* Add default for new Auto Time Zone */ + db.beginTransaction(); + SQLiteStatement stmt = null; + try { + stmt = db.compileStatement("INSERT INTO secure(name,value)" + + " VALUES(?,?);"); + loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE, + R.bool.def_auto_time_zone); // Sync timezone to NITZ + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + if (stmt != null) stmt.close(); + } + upgradeVersion = 59; + } + // *** Remember to update DATABASE_VERSION above! if (upgradeVersion != currentVersion) { @@ -1067,7 +1085,10 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadBooleanSetting(stmt, Settings.System.AUTO_TIME, R.bool.def_auto_time); // Sync time to NITZ - + + loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE, + R.bool.def_auto_time_zone); // Sync timezone to NITZ + loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS, R.integer.def_screen_brightness); diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java index 3bf6ee4..39ce0b6 100755 --- a/services/java/com/android/server/location/GpsLocationProvider.java +++ b/services/java/com/android/server/location/GpsLocationProvider.java @@ -1171,7 +1171,10 @@ public class GpsLocationProvider implements LocationProviderInterface { private void reportAGpsStatus(int type, int status) { switch (status) { case GPS_REQUEST_AGPS_DATA_CONN: - int result = mConnMgr.startUsingNetworkFeature( + // Set mAGpsDataConnectionState before calling startUsingNetworkFeature + // to avoid a race condition with handleUpdateNetworkState() + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPENING; + int result = mConnMgr.startUsingNetworkFeature( ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL); if (result == Phone.APN_ALREADY_ACTIVE) { if (mAGpsApn != null) { @@ -1179,11 +1182,13 @@ public class GpsLocationProvider implements LocationProviderInterface { mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN; } else { Log.e(TAG, "mAGpsApn not set when receiving Phone.APN_ALREADY_ACTIVE"); + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; native_agps_data_conn_failed(); } } else if (result == Phone.APN_REQUEST_STARTED) { - mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPENING; + // Nothing to do here } else { + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; native_agps_data_conn_failed(); } break; diff --git a/services/java/com/android/server/sip/SipService.java b/services/java/com/android/server/sip/SipService.java index a2ebc69..f1dcd5a 100644 --- a/services/java/com/android/server/sip/SipService.java +++ b/services/java/com/android/server/sip/SipService.java @@ -172,7 +172,7 @@ public final class SipService extends ISipService.Stub { SipSessionGroupExt group = mSipGroups.remove(localProfileUri); if (group != null) { notifyProfileRemoved(group.getLocalProfile()); - group.closeToNotReceiveCalls(); + group.close(); if (isWifiOn() && !anyOpened()) releaseWifiLock(); } } @@ -449,9 +449,9 @@ public final class SipService extends ISipService.Stub { } } - public void closeToNotReceiveCalls() { + public void close() { mOpened = false; - mSipGroup.closeToNotReceiveCalls(); + mSipGroup.close(); mAutoRegistration.stop(); if (DEBUG) Log.d(TAG, " close: " + getUri() + ": " + mIncomingCallBroadcastAction); diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java index 5d4dc58..b71cf13 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java @@ -16,6 +16,16 @@ package com.android.internal.telephony.cdma; +import com.android.internal.telephony.CommandException; +import com.android.internal.telephony.CommandsInterface; +import com.android.internal.telephony.DataConnectionTracker; +import com.android.internal.telephony.EventLogTags; +import com.android.internal.telephony.IccCard; +import com.android.internal.telephony.MccTable; +import com.android.internal.telephony.ServiceStateTracker; +import com.android.internal.telephony.TelephonyIntents; +import com.android.internal.telephony.TelephonyProperties; + import android.app.AlarmManager; import android.content.ContentResolver; import android.content.Context; @@ -38,19 +48,8 @@ import android.telephony.cdma.CdmaCellLocation; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; -import android.util.Config; import android.util.TimeUtils; -import com.android.internal.telephony.CommandException; -import com.android.internal.telephony.CommandsInterface; -import com.android.internal.telephony.DataConnectionTracker; -import com.android.internal.telephony.EventLogTags; -import com.android.internal.telephony.IccCard; -import com.android.internal.telephony.MccTable; -import com.android.internal.telephony.ServiceStateTracker; -import com.android.internal.telephony.TelephonyIntents; -import com.android.internal.telephony.TelephonyProperties; - import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -987,7 +986,7 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { mNeedFixZone = false; if (zone != null) { - if (getAutoTime()) { + if (getAutoTimeZone()) { setAndBroadcastNetworkSetTimeZone(zone.getID()); } saveNitzTimeZone(zone.getID()); @@ -1439,7 +1438,7 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { } if (zone != null) { - if (getAutoTime()) { + if (getAutoTimeZone()) { setAndBroadcastNetworkSetTimeZone(zone.getID()); } saveNitzTimeZone(zone.getID()); @@ -1529,6 +1528,14 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { } } + private boolean getAutoTimeZone() { + try { + return Settings.System.getInt(cr, Settings.System.AUTO_TIME_ZONE) > 0; + } catch (SettingNotFoundException snfe) { + return true; + } + } + private void saveNitzTimeZone(String zoneId) { mSavedTimeZone = zoneId; } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java index b639eea..83ad552 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java @@ -16,6 +16,17 @@ package com.android.internal.telephony.gsm; +import com.android.internal.telephony.CommandException; +import com.android.internal.telephony.CommandsInterface; +import com.android.internal.telephony.DataConnectionTracker; +import com.android.internal.telephony.EventLogTags; +import com.android.internal.telephony.IccCard; +import com.android.internal.telephony.MccTable; +import com.android.internal.telephony.RILConstants; +import com.android.internal.telephony.ServiceStateTracker; +import com.android.internal.telephony.TelephonyIntents; +import com.android.internal.telephony.TelephonyProperties; + import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; @@ -47,17 +58,6 @@ import android.util.EventLog; import android.util.Log; import android.util.TimeUtils; -import com.android.internal.telephony.CommandException; -import com.android.internal.telephony.CommandsInterface; -import com.android.internal.telephony.DataConnectionTracker; -import com.android.internal.telephony.EventLogTags; -import com.android.internal.telephony.IccCard; -import com.android.internal.telephony.MccTable; -import com.android.internal.telephony.RILConstants; -import com.android.internal.telephony.ServiceStateTracker; -import com.android.internal.telephony.TelephonyIntents; -import com.android.internal.telephony.TelephonyProperties; - import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -995,7 +995,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { mNeedFixZone = false; if (zone != null) { - if (getAutoTime()) { + if (getAutoTimeZone()) { setAndBroadcastNetworkSetTimeZone(zone.getID()); } saveNitzTimeZone(zone.getID()); @@ -1476,7 +1476,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { } if (zone != null) { - if (getAutoTime()) { + if (getAutoTimeZone()) { setAndBroadcastNetworkSetTimeZone(zone.getID()); } saveNitzTimeZone(zone.getID()); @@ -1546,6 +1546,15 @@ final class GsmServiceStateTracker extends ServiceStateTracker { } } + private boolean getAutoTimeZone() { + try { + return Settings.System.getInt(phone.getContext().getContentResolver(), + Settings.System.AUTO_TIME_ZONE) > 0; + } catch (SettingNotFoundException snfe) { + return true; + } + } + private void saveNitzTimeZone(String zoneId) { mSavedTimeZone = zoneId; } diff --git a/tests/DumpRenderTree2/assets/run_apache2.py b/tests/DumpRenderTree2/assets/run_apache2.py index c799b5c..5edead1 100755 --- a/tests/DumpRenderTree2/assets/run_apache2.py +++ b/tests/DumpRenderTree2/assets/run_apache2.py @@ -109,18 +109,17 @@ def main(options, args): # Try to execute the commands logging.info("Will " + run_cmd + " apache2 server.") - cmd_template = export_envvars_cmd + " && " + apache2_restart_template + directives + conf_file_cmd # It is worth noting here that if the configuration file with which we restart the server points - # to a different PidFile it will not work and result in second apache2 instance. + # to a different PidFile it will not work and will result in a second apache2 instance. if (run_cmd == 'restart'): logging.info("First will stop...") - execute_cmd(cmd_template % ('stop')) + execute_cmd(export_envvars_cmd + " && " + (apache2_restart_template % ('stop')) + directives + conf_file_cmd) logging.info("Stopped. Will start now...") # We need to sleep breifly to avoid errors with apache being stopped and started too quickly time.sleep(0.5) - execute_cmd(cmd_template % (run_cmd)) + execute_cmd(export_envvars_cmd + " && " + (apache2_restart_template % (run_cmd)) + directives + conf_file_cmd) def execute_cmd(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java index 96c1e5e..614b03c 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java @@ -32,7 +32,7 @@ import java.io.Serializable; * A class that represent a result of the test. It is responsible for returning the result's * raw data and generating its own diff in HTML format. */ -public abstract class AbstractResult implements Comparable<AbstractResult> { +public abstract class AbstractResult implements Comparable<AbstractResult>, Serializable { private static final String LOG_TAG = "AbstractResult"; diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java index b9fc274..c0ba9e5 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; +import android.net.http.SslError; import android.os.Bundle; import android.os.Environment; import android.os.Handler; @@ -30,19 +31,20 @@ import android.os.Message; import android.os.Messenger; import android.os.PowerManager; import android.os.Process; -import android.os.RemoteException; import android.os.PowerManager.WakeLock; +import android.os.RemoteException; import android.util.Log; import android.view.Window; import android.webkit.ConsoleMessage; +import android.webkit.GeolocationPermissions; import android.webkit.HttpAuthHandler; import android.webkit.JsPromptResult; import android.webkit.JsResult; +import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; -import android.webkit.GeolocationPermissions; import android.webkit.WebStorage.QuotaUpdater; import java.io.File; @@ -74,7 +76,7 @@ public class LayoutTestsExecutor extends Activity { } } - private static final String LOG_TAG = "LayoutTestExecutor"; + private static final String LOG_TAG = "LayoutTestsExecutor"; public static final String EXTRA_TESTS_LIST = "TestsList"; public static final String EXTRA_TEST_INDEX = "TestIndex"; @@ -180,6 +182,13 @@ public class LayoutTestsExecutor extends Activity { } handler.cancel(); } + + @Override + public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { + // We ignore SSL errors. In particular, the certificate used by the LayoutTests server + // produces an error as it lacks a CN field. + handler.proceed(); + } }; private WebChromeClient mWebChromeClient = new WebChromeClient() { @@ -236,7 +245,7 @@ public class LayoutTestsExecutor extends Activity { * We never display the new window, just create the view and allow it's content to * execute and be recorded by the executor. */ - newWindowWebView = new WebView(LayoutTestsExecutor.this); + newWindowWebView = createWebViewWithJavascriptInterfaces(); setupWebView(newWindowWebView); } @@ -317,7 +326,7 @@ public class LayoutTestsExecutor extends Activity { mCurrentResult = null; mCurrentAdditionalTextOutput = null; - mCurrentWebView = new WebView(this); + mCurrentWebView = createWebViewWithJavascriptInterfaces(); setupWebView(mCurrentWebView); mEventSender.reset(mCurrentWebView); @@ -329,11 +338,26 @@ public class LayoutTestsExecutor extends Activity { } } + private static class WebViewWithJavascriptInterfaces extends WebView { + public WebViewWithJavascriptInterfaces( + Context context, Map<String, Object> javascriptInterfaces) { + super(context, + null, // attribute set + 0, // default style resource ID + javascriptInterfaces, + false); // is private browsing + } + } + private WebView createWebViewWithJavascriptInterfaces() { + Map<String, Object> javascriptInterfaces = new HashMap<String, Object>(); + javascriptInterfaces.put("layoutTestController", mLayoutTestController); + javascriptInterfaces.put("eventSender", mEventSender); + return new WebViewWithJavascriptInterfaces(this, javascriptInterfaces); + } + private void setupWebView(WebView webView) { webView.setWebViewClient(mWebViewClient); webView.setWebChromeClient(mWebChromeClient); - webView.addJavascriptInterface(mLayoutTestController, "layoutTestController"); - webView.addJavascriptInterface(mEventSender, "eventSender"); /** * Setting a touch interval of -1 effectively disables the optimisation in WebView |
