From 51d412304f41e0d553c7e401e288e9394dbca950 Mon Sep 17 00:00:00 2001 From: jsh Date: Wed, 14 Oct 2009 16:55:14 -0700 Subject: [PATCH 01/13] Make sure CF icon updates when using "all CF" MMI. Fixes b/2074739. --- .../java/com/android/internal/telephony/gsm/GsmMmiCode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java b/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java index 18e6375a13928..bcbd127497b21 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java @@ -595,7 +595,8 @@ public final class GsmMmiCode extends Handler implements MmiCode { } int isSettingUnconditionalVoice = - ((reason == CommandsInterface.CF_REASON_UNCONDITIONAL) && + (((reason == CommandsInterface.CF_REASON_UNCONDITIONAL) || + (reason == CommandsInterface.CF_REASON_ALL)) && (((serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0) || (serviceClass == CommandsInterface.SERVICE_CLASS_NONE))) ? 1 : 0; From 9e58e6427c8e5fefb65432ea4b56c6cb31e80bbd Mon Sep 17 00:00:00 2001 From: Guang Zhu Date: Thu, 15 Oct 2009 10:45:49 -0700 Subject: [PATCH 02/13] Enable some tests that requires local http server --- .../src/com/android/dumprendertree/FileFilter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java index 395e572083104..32219fad63975 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java @@ -79,8 +79,7 @@ public class FileFilter { "profiler", // profiler is not supported "svg", // svg is not supported "platform", // platform specific - "http", // requires local http(s) server - "fast/workers", + "http/wml", }; static final String [] ignoreTestList = { From a8a720d8cd208d7d265de28ab69f7e68eb10140a Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 15 Oct 2009 15:09:26 -0700 Subject: [PATCH 03/13] Fix possible NPE in the code that restores widgets' state. Bug #2189714 Reviewed by: ryanpc Change-Id: I0d74deb6dc8e90e3b0eafd6b3c16b0c557c72873 --- core/java/android/appwidget/AppWidgetHostView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index a4c141ebfdf6d..bb0cbe9f7d6cd 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -123,7 +123,8 @@ public class AppWidgetHostView extends FrameLayout { @Override protected void dispatchRestoreInstanceState(SparseArray container) { - final ParcelableSparseArray jail = (ParcelableSparseArray) container.get(generateId()); + ParcelableSparseArray jail = (ParcelableSparseArray) container.get(generateId()); + if (jail == null) jail = new ParcelableSparseArray(); super.dispatchRestoreInstanceState(jail); } From dd158c9a9059ae01de0f1f914617d6e21e7c54c3 Mon Sep 17 00:00:00 2001 From: Dave Sparks Date: Thu, 15 Oct 2009 10:02:22 -0700 Subject: [PATCH 04/13] Don't callback on NULL client. Bug 2180510. We weren't checking to see if there was a valid camera client when calling the notify callback function. Now we grab a strong pointer before the callback to guarantee that the client is not destroyed before we complete the callback. This change also fixes other places in the code where we weren't holding a local strong pointer. --- camera/libcameraservice/CameraService.cpp | 87 ++++++++++++++++------- camera/libcameraservice/CameraService.h | 6 +- 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index b63e97fdc4a97..688014430c13e 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -309,7 +309,7 @@ status_t CameraService::Client::connect(const sp& client) oldClient = mCameraClient; // did the client actually change? - if (client->asBinder() == mCameraClient->asBinder()) { + if ((mCameraClient != NULL) && (client->asBinder() == mCameraClient->asBinder())) { LOGD("Connect to the same client"); return NO_ERROR; } @@ -878,7 +878,10 @@ void CameraService::Client::handleShutter() mSurface->unregisterBuffers(); } - mCameraClient->notifyCallback(CAMERA_MSG_SHUTTER, 0, 0); + sp c = mCameraClient; + if (c != NULL) { + c->notifyCallback(CAMERA_MSG_SHUTTER, 0, 0); + } mHardware->disableMsgType(CAMERA_MSG_SHUTTER); // It takes some time before yuvPicture callback to be called. @@ -932,31 +935,38 @@ void CameraService::Client::handlePreviewData(const sp& mem) } } - // Is the callback enabled or not? - if (!(mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_ENABLE_MASK)) { + // local copy of the callback flags + int flags = mPreviewCallbackFlag; + + // is callback enabled? + if (!(flags & FRAME_CALLBACK_FLAG_ENABLE_MASK)) { // If the enable bit is off, the copy-out and one-shot bits are ignored LOGV("frame callback is diabled"); return; } - // Is the received frame copied out or not? - if (mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_COPY_OUT_MASK) { - LOGV("frame is copied out"); - copyFrameAndPostCopiedFrame(heap, offset, size); - } else { - LOGV("frame is directly sent out without copying"); - mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME, mem); - } + // hold a strong pointer to the client + sp c = mCameraClient; - // Is this is one-shot only? - if (mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { - LOGV("One-shot only, thus clear the bits and disable frame callback"); + // clear callback flags if no client or one-shot mode + if ((c == NULL) || (mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK)) { + LOGV("Disable preview callback"); mPreviewCallbackFlag &= ~(FRAME_CALLBACK_FLAG_ONE_SHOT_MASK | FRAME_CALLBACK_FLAG_COPY_OUT_MASK | FRAME_CALLBACK_FLAG_ENABLE_MASK); + // TODO: Shouldn't we use this API for non-overlay hardware as well? if (mUseOverlay) mHardware->disableMsgType(CAMERA_MSG_PREVIEW_FRAME); } + + // Is the received frame copied out or not? + if (flags & FRAME_CALLBACK_FLAG_COPY_OUT_MASK) { + LOGV("frame is copied"); + copyFrameAndPostCopiedFrame(c, heap, offset, size); + } else { + LOGV("frame is forwarded"); + c->dataCallback(CAMERA_MSG_PREVIEW_FRAME, mem); + } } // picture callback - postview image ready @@ -972,7 +982,10 @@ void CameraService::Client::handlePostview(const sp& mem) } #endif - mCameraClient->dataCallback(CAMERA_MSG_POSTVIEW_FRAME, mem); + sp c = mCameraClient; + if (c != NULL) { + c->dataCallback(CAMERA_MSG_POSTVIEW_FRAME, mem); + } mHardware->disableMsgType(CAMERA_MSG_POSTVIEW_FRAME); } @@ -997,7 +1010,10 @@ void CameraService::Client::handleRawPicture(const sp& mem) mSurface->postBuffer(offset); } - mCameraClient->dataCallback(CAMERA_MSG_RAW_IMAGE, mem); + sp c = mCameraClient; + if (c != NULL) { + c->dataCallback(CAMERA_MSG_RAW_IMAGE, mem); + } mHardware->disableMsgType(CAMERA_MSG_RAW_IMAGE); } @@ -1014,7 +1030,10 @@ void CameraService::Client::handleCompressedPicture(const sp& mem) } #endif - mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, mem); + sp c = mCameraClient; + if (c != NULL) { + c->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, mem); + } mHardware->disableMsgType(CAMERA_MSG_COMPRESSED_IMAGE); } @@ -1032,7 +1051,10 @@ void CameraService::Client::notifyCallback(int32_t msgType, int32_t ext1, int32_ client->handleShutter(); break; default: - client->mCameraClient->notifyCallback(msgType, ext1, ext2); + sp c = client->mCameraClient; + if (c != NULL) { + c->notifyCallback(msgType, ext1, ext2); + } break; } @@ -1053,10 +1075,13 @@ void CameraService::Client::dataCallback(int32_t msgType, const sp& dat return; } + sp c = client->mCameraClient; if (dataPtr == NULL) { LOGE("Null data returned in data callback"); - client->mCameraClient->notifyCallback(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); - client->mCameraClient->dataCallback(msgType, NULL); + if (c != NULL) { + c->notifyCallback(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); + c->dataCallback(msgType, NULL); + } return; } @@ -1074,7 +1099,9 @@ void CameraService::Client::dataCallback(int32_t msgType, const sp& dat client->handleCompressedPicture(dataPtr); break; default: - client->mCameraClient->dataCallback(msgType, dataPtr); + if (c != NULL) { + c->dataCallback(msgType, dataPtr); + } break; } @@ -1095,15 +1122,20 @@ void CameraService::Client::dataCallbackTimestamp(nsecs_t timestamp, int32_t msg if (client == 0) { return; } + sp c = client->mCameraClient; if (dataPtr == NULL) { LOGE("Null data returned in data with timestamp callback"); - client->mCameraClient->notifyCallback(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); - client->mCameraClient->dataCallbackTimestamp(0, msgType, NULL); + if (c != NULL) { + c->notifyCallback(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); + c->dataCallbackTimestamp(0, msgType, NULL); + } return; } - client->mCameraClient->dataCallbackTimestamp(timestamp, msgType, dataPtr); + if (c != NULL) { + c->dataCallbackTimestamp(timestamp, msgType, dataPtr); + } #if DEBUG_CLIENT_REFERENCES if (client->getStrongCount() == 1) { @@ -1161,7 +1193,8 @@ status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t a return mHardware->sendCommand(cmd, arg1, arg2); } -void CameraService::Client::copyFrameAndPostCopiedFrame(sp heap, size_t offset, size_t size) +void CameraService::Client::copyFrameAndPostCopiedFrame(const sp& client, + const sp& heap, size_t offset, size_t size) { LOGV("copyFrameAndPostCopiedFrame"); // It is necessary to copy out of pmem before sending this to @@ -1186,7 +1219,7 @@ void CameraService::Client::copyFrameAndPostCopiedFrame(sp heap, si LOGE("failed to allocate space for frame callback"); return; } - mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME, frame); + client->dataCallback(CAMERA_MSG_PREVIEW_FRAME, frame); } status_t CameraService::dump(int fd, const Vector& args) diff --git a/camera/libcameraservice/CameraService.h b/camera/libcameraservice/CameraService.h index 2e3597f113fee..2fcf839064b28 100644 --- a/camera/libcameraservice/CameraService.h +++ b/camera/libcameraservice/CameraService.h @@ -23,10 +23,9 @@ #include #include -class android::MemoryHeapBase; - namespace android { +class MemoryHeapBase; class MediaPlayer; // ---------------------------------------------------------------------------- @@ -151,7 +150,8 @@ private: void handleRawPicture(const sp&); void handleCompressedPicture(const sp&); - void copyFrameAndPostCopiedFrame(sp heap, size_t offset, size_t size); + void copyFrameAndPostCopiedFrame(const sp& client, + const sp& heap, size_t offset, size_t size); // camera operation mode enum camera_mode { From 6a17e163a0dca28c1b2f957561e909172b7259c8 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Thu, 8 Oct 2009 12:55:06 -0700 Subject: [PATCH 05/13] Add egl init start message to help debug driver init hangs. --- libs/rs/rsContext.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 195ea6f1d7d5c..33ed0ca0a3862 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -57,6 +57,7 @@ void Context::initEGL() configAttribsPtr[0] = EGL_NONE; rsAssert(configAttribsPtr < (configAttribs + (sizeof(configAttribs) / sizeof(EGLint)))); + LOGV("initEGL start"); mEGL.mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(mEGL.mDisplay, &mEGL.mMajorVersion, &mEGL.mMinorVersion); From c7412b3b08d62c298dc7c3e5f369f406a3c0eac2 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Wed, 14 Oct 2009 15:43:53 -0700 Subject: [PATCH 06/13] Minor bug fixes and add glError check. --- libs/rs/rsContext.cpp | 6 ++++++ libs/rs/rsProgramRaster.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 33ed0ca0a3862..51277172a0f92 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -145,6 +145,12 @@ bool Context::runRootScript() } mStateFragmentStore.mLast.clear(); bool ret = runScript(mRootScript.get(), 0); + + GLenum err = glGetError(); + if (err != GL_NO_ERROR) { + LOGE("Pending GL Error, 0x%x", err); + } + return ret; } diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp index fcf6824f691d1..51ae7cf61f167 100644 --- a/libs/rs/rsProgramRaster.cpp +++ b/libs/rs/rsProgramRaster.cpp @@ -74,7 +74,7 @@ void ProgramRaster::setupGL(const Context *rsc, ProgramRasterState *state) if (mLineSmooth) { glEnable(GL_LINE_SMOOTH); } else { - glEnable(GL_LINE_SMOOTH); + glDisable(GL_LINE_SMOOTH); } if (rsc->checkVersion1_1()) { From 41c19db90e250e2b7cb438904f0e96a0ef455d6d Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Thu, 15 Oct 2009 16:47:31 -0700 Subject: [PATCH 07/13] Remove hack in RS that called exit to WAR now fixed driver bugs. Make gloabal init safe by locking around the critical code. --- libs/rs/rsContext.cpp | 22 +++++++++++++++++----- libs/rs/rsContext.h | 3 +++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 51277172a0f92..2b3d0765bea88 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -29,6 +29,8 @@ using namespace android; using namespace android::renderscript; pthread_key_t Context::gThreadTLSKey = 0; +uint32_t Context::gThreadTLSKeyCount = 0; +pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER; void Context::initEGL() { @@ -300,6 +302,8 @@ void * Context::threadProc(void *vrsc) Context::Context(Device *dev, Surface *sur, bool useDepth) { + pthread_mutex_lock(&gInitMutex); + dev->addContext(this); mDev = dev; mRunning = false; @@ -311,16 +315,18 @@ Context::Context(Device *dev, Surface *sur, bool useDepth) int status; pthread_attr_t threadAttr; - if (!gThreadTLSKey) { + if (!gThreadTLSKeyCount) { status = pthread_key_create(&gThreadTLSKey, NULL); if (status) { LOGE("Failed to init thread tls key."); + pthread_mutex_unlock(&gInitMutex); return; } - } else { - // HACK: workaround gl hang on start - exit(-1); } + gThreadTLSKeyCount++; + pthread_mutex_unlock(&gInitMutex); + + // Global init done at this point. status = pthread_attr_init(&threadAttr); if (status) { @@ -362,10 +368,16 @@ Context::~Context() int status = pthread_join(mThreadId, &res); objDestroyOOBRun(); + // Global structure cleanup. + pthread_mutex_lock(&gInitMutex); if (mDev) { mDev->removeContext(this); - pthread_key_delete(gThreadTLSKey); + --gThreadTLSKeyCount; + if (!gThreadTLSKeyCount) { + pthread_key_delete(gThreadTLSKey); + } } + pthread_mutex_unlock(&gInitMutex); objDestroyOOBDestroy(); } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 3570e102d96e8..0dd90ed44baaf 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -53,6 +53,9 @@ public: ~Context(); static pthread_key_t gThreadTLSKey; + static uint32_t gThreadTLSKeyCount; + static pthread_mutex_t gInitMutex; + struct ScriptTLSStruct { Context * mContext; Script * mScript; From 37a13208c93bbe00cf233baf1ebcd6e081972a27 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 14 Oct 2009 11:55:50 -0700 Subject: [PATCH 08/13] Add separate configuration flag for hardware ALS support. A new flag config_hardware_automatic_brightness_available indicates that the device has hardware support for automatic screen brightness management, while config_automatic_brightness_available now indicates that automatic brightness mode is available in general. If config_automatic_brightness_available is true but config_hardware_automatic_brightness_available is false, then automatic brightness mode support in PowerManager support will be used. Bug b/2015734 (Ambient light sensor support in power manager) Change-Id: I6cd888252043dd63df3c25a1d14c21a04a91ad28 Signed-off-by: Mike Lockwood --- core/res/res/values/config.xml | 6 +++++- services/java/com/android/server/HardwareService.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index c87a11c6de539..45fcaa59e8405 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -67,7 +67,11 @@ the slider can be opened (for example, in a pocket or purse). --> true - + + false + + false diff --git a/services/java/com/android/server/HardwareService.java b/services/java/com/android/server/HardwareService.java index 29c13e04f7f83..7c56a30804e81 100755 --- a/services/java/com/android/server/HardwareService.java +++ b/services/java/com/android/server/HardwareService.java @@ -133,7 +133,7 @@ public class HardwareService extends IHardwareService.Stub { context.registerReceiver(mIntentReceiver, filter); mAutoBrightnessAvailable = context.getResources().getBoolean( - com.android.internal.R.bool.config_automatic_brightness_available); + com.android.internal.R.bool.config_hardware_automatic_brightness_available); } protected void finalize() throws Throwable { From 741a6100a0de3cbbbb44c4e6ecc8be770e684a1e Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Thu, 15 Oct 2009 18:45:45 -0700 Subject: [PATCH 09/13] Fix bug where dirty messages for allocations attached to programVertex objects could be lost. --- libs/rs/rsContext.cpp | 1 + libs/rs/rsProgram.h | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 2b3d0765bea88..cc39dacc72a70 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -438,6 +438,7 @@ void Context::setVertex(ProgramVertex *pv) } else { mVertex.set(pv); } + mVertex->forceDirty(); } void Context::assignName(ObjectBase *obj, const char *name, uint32_t len) diff --git a/libs/rs/rsProgram.h b/libs/rs/rsProgram.h index 26b78ddde257f..57c654f28c97d 100644 --- a/libs/rs/rsProgram.h +++ b/libs/rs/rsProgram.h @@ -44,6 +44,10 @@ protected: ObjectBaseRef mConstants; mutable bool mDirty; + + +public: + void forceDirty() {mDirty = true;} }; From 486fdb559658ea790e4d5cf310b5e13b244ae0a7 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Thu, 15 Oct 2009 20:26:08 -0700 Subject: [PATCH 10/13] Fix bug 2183179 - Hitting the back key repeatedly makes the notification shade jump up and down This thing needs to be rewritten. It's grown too complicated for what it's doing, and I don't like the physics anyway. Also, this leaves the bug where if you press back while it's animating down, the animation is ignored. However it no longer jumps down all the way, it just essentially ignores the back key. Also, this makes the collapse get executed on the back key up event, so it works with the swipe on the soft keys at the bottom of the screen. --- .../server/status/StatusBarService.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/services/java/com/android/server/status/StatusBarService.java b/services/java/com/android/server/status/StatusBarService.java index fe761eaa62d85..59e9832c18fe6 100644 --- a/services/java/com/android/server/status/StatusBarService.java +++ b/services/java/com/android/server/status/StatusBarService.java @@ -140,7 +140,7 @@ public class StatusBarService extends IStatusBar.Stub boolean down = event.getAction() == KeyEvent.ACTION_DOWN; switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: - if (down) { + if (!down) { StatusBarService.this.deactivate(); } return true; @@ -973,15 +973,24 @@ public class StatusBarService extends IStatusBar.Stub } void animateCollapse() { - if (SPEW) Log.d(TAG, "Animate collapse: expanded=" + mExpanded - + " expanded visible=" + mExpandedVisible); + if (SPEW) { + Log.d(TAG, "animateCollapse(): mExpanded=" + mExpanded + + " mExpandedVisible=" + mExpandedVisible + + " mAnimating=" + mAnimating + + " mAnimVel=" + mAnimVel); + } if (!mExpandedVisible) { return; } - prepareTracking(mDisplay.getHeight()-1); - performFling(mDisplay.getHeight()-1, -2000.0f, true); + if (mAnimating) { + return; + } + + int y = mDisplay.getHeight()-1; + prepareTracking(y); + performFling(y, -2000.0f, true); } void performExpand() { @@ -1096,7 +1105,7 @@ public class StatusBarService extends IStatusBar.Stub mTracking = true; mVelocityTracker = VelocityTracker.obtain(); boolean opening = !mExpanded; - if (!mExpanded) { + if (opening) { mAnimAccel = 2000.0f; mAnimVel = 200; mAnimY = mStatusBarView.getHeight(); @@ -1111,16 +1120,13 @@ public class StatusBarService extends IStatusBar.Stub mAnimating = true; mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), mCurAnimationTime); + makeExpandedVisible(); } else { // it's open, close it? if (mAnimating) { mAnimating = false; mHandler.removeMessages(MSG_ANIMATE); } - } - if (opening) { - makeExpandedVisible(); - } else { updateExpandedViewPos(y + mViewDelta); } } @@ -1547,7 +1553,7 @@ public class StatusBarService extends IStatusBar.Stub void updateExpandedViewPos(int expandedPosition) { if (SPEW) { - Log.d(TAG, "updateExpandedViewPos before pos=" + expandedPosition + Log.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition + " mTrackingParams.y=" + mTrackingParams.y + " mTrackingPosition=" + mTrackingPosition); } From 39e6773431e6010c5066c0e13facfd943c932c7e Mon Sep 17 00:00:00 2001 From: Cary Clark Date: Thu, 15 Oct 2009 13:32:08 -0400 Subject: [PATCH 11/13] do not merge: fix copy/paste using trackball on passion This fix is alrady in mr2. It does not affect sholes -- this is a trackball only bug. The selection caret and arrow now take the scale factor and the height of the title bar into account when preparing the canvas for drawing. Clicking the trackball at the end of selecting text no longer sends a click event. Requires a companion fix in external/webkit Fixes http://b/issue?id=2187591 --- core/java/android/webkit/WebView.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 4bc1a0e37b232..eb09c66149eef 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -2926,12 +2926,12 @@ public class WebView extends AbsoluteLayout animateScroll); if (mNativeClass == 0) return; - if (mShiftIsPressed) { + if (mShiftIsPressed && !animateZoom) { if (mTouchSelection) { nativeDrawSelectionRegion(canvas); } else { - nativeDrawSelection(canvas, mSelectX, mSelectY, - mExtendSelection); + nativeDrawSelection(canvas, mInvActualScale, getTitleHeight(), + mSelectX, mSelectY, mExtendSelection); } } else if (drawCursorRing) { if (mTouchMode == TOUCH_SHORTPRESS_START_MODE) { @@ -4065,6 +4065,9 @@ public class WebView extends AbsoluteLayout return true; } if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (mShiftIsPressed) { + return true; // discard press if copy in progress + } mTrackballDown = true; if (mNativeClass == 0) { return false; @@ -4093,6 +4096,7 @@ public class WebView extends AbsoluteLayout } else { mExtendSelection = true; } + return true; // discard press if copy in progress } if (DebugFlags.WEB_VIEW) { Log.v(LOGTAG, "onTrackballEvent up ev=" + ev @@ -5600,8 +5604,8 @@ public class WebView extends AbsoluteLayout private native void nativeDestroy(); private native void nativeDrawCursorRing(Canvas content); private native void nativeDrawMatches(Canvas canvas); - private native void nativeDrawSelection(Canvas content - , int x, int y, boolean extendSelection); + private native void nativeDrawSelection(Canvas content, float scale, + int offset, int x, int y, boolean extendSelection); private native void nativeDrawSelectionRegion(Canvas content); private native void nativeDumpDisplayTree(String urlOrNull); private native int nativeFindAll(String findLower, String findUpper); From dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 14 Oct 2009 21:17:09 -0700 Subject: [PATCH 12/13] Remove PowerManager.setAutoBrightness() We will use the System.SCREEN_BRIGHTNESS_MODE Settings value instead. Add SCREEN_BRIGHTNESS_MODE_MANUAL and SCREEN_BRIGHTNESS_MODE_AUTOMATIC constants. Change-Id: I01935be3fcb48cf76392d2c594205cb47babc5b2 Signed-off-by: Mike Lockwood --- core/java/android/os/IPowerManager.aidl | 3 -- core/java/android/provider/Settings.java | 12 +++++++ .../providers/settings/SettingsHelper.java | 26 -------------- .../android/server/PowerManagerService.java | 36 +++++++++++++------ 4 files changed, 37 insertions(+), 40 deletions(-) diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 189335ef1e869..5ac543d810585 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -34,7 +34,4 @@ interface IPowerManager // sets the brightness of the backlights (screen, keyboard, button) 0-255 void setBacklightBrightness(int brightness); - - // enables or disables automatic brightness mode - void setAutoBrightness(boolean on); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 8c9581d0e1cce..cb3dc166f7a4b 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1080,6 +1080,18 @@ public final class Settings { */ public static final String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode"; + /** + * SCREEN_BRIGHTNESS_MODE value for manual mode. + * @hide + */ + public static final int SCREEN_BRIGHTNESS_MODE_MANUAL = 0; + + /** + * SCREEN_BRIGHTNESS_MODE value for manual mode. + * @hide + */ + public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1; + /** * Control whether the process CPU usage meter should be shown. */ diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 3b91a383adb9c..153a5ea76b5e3 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -45,7 +45,6 @@ public class SettingsHelper { private boolean mSilent; private boolean mVibrate; - private boolean mHasAutoBrightness; public SettingsHelper(Context context) { mContext = context; @@ -54,9 +53,6 @@ public class SettingsHelper { mContentService = ContentResolver.getContentService(); mPowerManager = IPowerManager.Stub.asInterface( ServiceManager.getService("power")); - - mHasAutoBrightness = context.getResources().getBoolean( - com.android.internal.R.bool.config_automatic_brightness_available); } /** @@ -71,18 +67,6 @@ public class SettingsHelper { public boolean restoreValue(String name, String value) { if (Settings.System.SCREEN_BRIGHTNESS.equals(name)) { setBrightness(Integer.parseInt(value)); - } else if (Settings.System.SCREEN_BRIGHTNESS_MODE.equals(name)) { - if (mHasAutoBrightness) { - // When setting auto-brightness, must reset the brightness afterwards - try { - int curBrightness = Settings.System.getInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS); - setAutoBrightness(Integer.parseInt(value) != 0); - setBrightness(curBrightness); - } catch (Settings.SettingNotFoundException e) { - // no brightness setting at all? weird. skip this then. - } - } } else if (Settings.System.SOUND_EFFECTS_ENABLED.equals(name)) { setSoundEffects(Integer.parseInt(value) == 1); } else if (Settings.Secure.LOCATION_PROVIDERS_ALLOWED.equals(name)) { @@ -92,16 +76,6 @@ public class SettingsHelper { return true; } - private void setAutoBrightness(boolean value) { - if (mPowerManager != null) { - try { - mPowerManager.setAutoBrightness(value); - } catch (RemoteException e) { - // unable to reach the power manager; skip - } - } - } - private void setGpsLocation(String value) { final String GPS = LocationManager.GPS_PROVIDER; boolean enabled = diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index e1bea37ba8397..a1220b650dccf 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -53,6 +53,7 @@ import android.view.WindowManagerPolicy; import static android.provider.Settings.System.DIM_SCREEN; import static android.provider.Settings.System.SCREEN_BRIGHTNESS; import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE; +import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static android.provider.Settings.System.STAY_ON_WHILE_PLUGGED_IN; @@ -199,6 +200,8 @@ class PowerManagerService extends IPowerManager.Stub private long mScreenOnStartTime; private boolean mPreventScreenOn; private int mScreenBrightnessOverride = -1; + private boolean mHasHardwareAutoBrightness; + private boolean mAutoBrightessEnabled; // Used when logging number and duration of touch-down cycles private long mTotalTouchDownTime; @@ -344,6 +347,9 @@ class PowerManagerService extends IPowerManager.Stub // DIM_SCREEN //mDimScreen = getInt(DIM_SCREEN) != 0; + // SCREEN_BRIGHTNESS_MODE + setScreenBrightnessMode(getInt(SCREEN_BRIGHTNESS_MODE)); + // recalculate everything setScreenOffTimeoutsLocked(); } @@ -415,12 +421,17 @@ class PowerManagerService extends IPowerManager.Stub mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - ContentResolver resolver = mContext.getContentResolver(); + mHasHardwareAutoBrightness = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_hardware_automatic_brightness_available); + + ContentResolver resolver = mContext.getContentResolver(); Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null, "(" + Settings.System.NAME + "=?) or (" + + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?)", - new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN}, + new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN, + SCREEN_BRIGHTNESS_MODE}, null); mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler); SettingsObserver settingsObserver = new SettingsObserver(); @@ -444,10 +455,6 @@ class PowerManagerService extends IPowerManager.Stub // turn everything on setPowerState(ALL_BRIGHT); - // set auto brightness mode to user setting - boolean brightnessMode = Settings.System.getInt(resolver, SCREEN_BRIGHTNESS_MODE, 1) != 0; - mHardware.setAutoBrightness_UNCHECKED(brightnessMode); - synchronized (mHandlerThread) { mInitComplete = true; mHandlerThread.notifyAll(); @@ -1885,6 +1892,18 @@ class PowerManagerService extends IPowerManager.Stub } } + private void setScreenBrightnessMode(int mode) { + mAutoBrightessEnabled = (mode == SCREEN_BRIGHTNESS_MODE_AUTOMATIC); + + if (mHasHardwareAutoBrightness) { + // When setting auto-brightness, must reset the brightness afterwards + mHardware.setAutoBrightness_UNCHECKED(mAutoBrightessEnabled); + setBacklightBrightness((int)mScreenBrightness.curValue); + } else { + // not yet implemented + } + } + /** Sets the screen off timeouts: * mKeylightDelay * mDimDelay @@ -2098,11 +2117,6 @@ class PowerManagerService extends IPowerManager.Stub } } - public void setAutoBrightness(boolean on) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - mHardware.setAutoBrightness_UNCHECKED(on); - } - private SensorManager getSensorManager() { if (mSensorManager == null) { mSensorManager = new SensorManager(mHandlerThread.getLooper()); From 8738e0c040061a179ad88adb997143f076277b04 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Sun, 4 Oct 2009 08:44:47 -0400 Subject: [PATCH 13/13] Register for light sensor events if non-hardware based auto-brightnees is enabled Change-Id: I9521cf8b315306bdafa70c1500f2e4af83d94ec3 Signed-off-by: Mike Lockwood --- .../android/server/PowerManagerService.java | 138 ++++++++++++------ 1 file changed, 95 insertions(+), 43 deletions(-) diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index a1220b650dccf..99e008cef4392 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -65,7 +65,7 @@ import java.util.Observable; import java.util.Observer; class PowerManagerService extends IPowerManager.Stub - implements LocalPowerManager, Watchdog.Monitor, SensorEventListener { + implements LocalPowerManager, Watchdog.Monitor { private static final String TAG = "PowerManagerService"; static final String PARTIAL_NAME = "PowerManagerService"; @@ -190,6 +190,9 @@ class PowerManagerService extends IPowerManager.Stub private BatteryService mBatteryService; private SensorManager mSensorManager; private Sensor mProximitySensor; + private Sensor mLightSensor; + private boolean mLightSensorEnabled; + private float mLightSensorValue = -1; private boolean mDimScreen = true; private long mNextTimeout; private volatile int mPokey = 0; @@ -210,6 +213,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; /* static PrintStream mLog; @@ -1171,7 +1175,7 @@ class PowerManagerService extends IPowerManager.Stub // Finally, set the flag that prevents the screen from turning on. // (Below, in setPowerState(), we'll check mPreventScreenOn and - // we *won't* call Power.setScreenState(true) if it's set.) + // we *won't* call setScreenStateLocked(true) if it's set.) mPreventScreenOn = true; } else { // (Re)enable the screen. @@ -1189,9 +1193,9 @@ class PowerManagerService extends IPowerManager.Stub Log.d(TAG, "preventScreenOn: turning on after a prior preventScreenOn(true)!"); } - int err = Power.setScreenState(true); + int err = setScreenStateLocked(true); if (err != 0) { - Log.w(TAG, "preventScreenOn: error from Power.setScreenState(): " + err); + Log.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err); } } @@ -1246,6 +1250,14 @@ class PowerManagerService extends IPowerManager.Stub } }; + private int setScreenStateLocked(boolean on) { + int err = Power.setScreenState(on); + if (err == 0) { + enableLightSensor(on && mAutoBrightessEnabled); + } + return err; + } + private void setPowerState(int state) { setPowerState(state, false, false); @@ -1334,7 +1346,7 @@ class PowerManagerService extends IPowerManager.Stub reallyTurnScreenOn = false; } if (reallyTurnScreenOn) { - err = Power.setScreenState(true); + err = setScreenStateLocked(true); long identity = Binder.clearCallingIdentity(); try { mBatteryStats.noteScreenBrightness( @@ -1346,7 +1358,7 @@ class PowerManagerService extends IPowerManager.Stub Binder.restoreCallingIdentity(identity); } } else { - Power.setScreenState(false); + setScreenStateLocked(false); // But continue as if we really did turn the screen on... err = 0; } @@ -1391,7 +1403,7 @@ class PowerManagerService extends IPowerManager.Stub EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 0, becauseOfUser ? 1 : 0, mTotalTouchDownTime, mTouchCycles); mLastTouchDown = 0; - int err = Power.setScreenState(false); + int err = setScreenStateLocked(false); if (mScreenOnStartTime != 0) { mScreenOnTime += SystemClock.elapsedRealtime() - mScreenOnStartTime; mScreenOnStartTime = 0; @@ -1809,6 +1821,14 @@ class PowerManagerService extends IPowerManager.Stub } } + private void lightSensorChangedLocked(float value) { + if (mDebugLightSensor) { + Log.d(TAG, "lightSensorChangedLocked " + value); + } + mLightSensorValue = value; + // more to do here + } + /** * The user requested that we go to sleep (probably with the power button). * This overrides all wake locks that are held. @@ -1900,7 +1920,7 @@ class PowerManagerService extends IPowerManager.Stub mHardware.setAutoBrightness_UNCHECKED(mAutoBrightessEnabled); setBacklightBrightness((int)mScreenBrightness.curValue); } else { - // not yet implemented + enableLightSensor(screenIsOn() && mAutoBrightessEnabled); } } @@ -2050,6 +2070,14 @@ class PowerManagerService extends IPowerManager.Stub } void systemReady() { + mSensorManager = new SensorManager(mHandlerThread.getLooper()); + mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + // don't bother with the light sensor if auto brightness is handled in hardware + if (!mHasHardwareAutoBrightness) { + mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + enableLightSensor(mAutoBrightessEnabled); + } + synchronized (mLocks) { Log.d(TAG, "system ready!"); mDoneBooting = true; @@ -2077,8 +2105,6 @@ class PowerManagerService extends IPowerManager.Stub | PowerManager.FULL_WAKE_LOCK | PowerManager.SCREEN_DIM_WAKE_LOCK; - // call getSensorManager() to make sure mProximitySensor is initialized - getSensorManager(); if (mProximitySensor != null) { result |= PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK; } @@ -2117,26 +2143,19 @@ class PowerManagerService extends IPowerManager.Stub } } - private SensorManager getSensorManager() { - if (mSensorManager == null) { - mSensorManager = new SensorManager(mHandlerThread.getLooper()); - mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); - } - return mSensorManager; - } - private void enableProximityLockLocked() { if (mSpew) { Log.d(TAG, "enableProximityLockLocked"); } - mSensorManager.registerListener(this, mProximitySensor, SensorManager.SENSOR_DELAY_NORMAL); + mSensorManager.registerListener(mProximityListener, mProximitySensor, + SensorManager.SENSOR_DELAY_NORMAL); } private void disableProximityLockLocked() { if (mSpew) { Log.d(TAG, "disableProximityLockLocked"); } - mSensorManager.unregisterListener(this); + mSensorManager.unregisterListener(mProximityListener); synchronized (mLocks) { if (mProximitySensorActive) { mProximitySensorActive = false; @@ -2145,32 +2164,65 @@ class PowerManagerService extends IPowerManager.Stub } } - public void onSensorChanged(SensorEvent event) { - long milliseconds = event.timestamp / 1000000; - synchronized (mLocks) { - float distance = event.values[0]; - // compare against getMaximumRange to support sensors that only return 0 or 1 - if (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && - distance < mProximitySensor.getMaximumRange()) { - if (mSpew) { - Log.d(TAG, "onSensorChanged: proximity active, distance: " + distance); - } - goToSleepLocked(milliseconds); - mProximitySensorActive = true; + private void enableLightSensor(boolean enable) { + if (mDebugLightSensor) { + Log.d(TAG, "enableLightSensor " + enable); + } + if (mSensorManager != null && mLightSensorEnabled != enable) { + mLightSensorEnabled = enable; + if (enable) { + mSensorManager.registerListener(mLightListener, mLightSensor, + SensorManager.SENSOR_DELAY_NORMAL); } else { - // proximity sensor negative events trigger as user activity. - // temporarily set mUserActivityAllowed to true so this will work - // even when the keyguard is on. - if (mSpew) { - Log.d(TAG, "onSensorChanged: proximity inactive, distance: " + distance); - } - mProximitySensorActive = false; - forceUserActivityLocked(); + mSensorManager.unregisterListener(mLightListener); } } } - public void onAccuracyChanged(Sensor sensor, int accuracy) { - // ignore - } + SensorEventListener mProximityListener = new SensorEventListener() { + public void onSensorChanged(SensorEvent event) { + long milliseconds = event.timestamp / 1000000; + synchronized (mLocks) { + float distance = event.values[0]; + // compare against getMaximumRange to support sensors that only return 0 or 1 + if (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && + distance < mProximitySensor.getMaximumRange()) { + if (mSpew) { + Log.d(TAG, "onSensorChanged: proximity active, distance: " + distance); + } + goToSleepLocked(milliseconds); + mProximitySensorActive = true; + } else { + // proximity sensor negative events trigger as user activity. + // temporarily set mUserActivityAllowed to true so this will work + // even when the keyguard is on. + if (mSpew) { + Log.d(TAG, "onSensorChanged: proximity inactive, distance: " + distance); + } + mProximitySensorActive = false; + forceUserActivityLocked(); + } + } + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // ignore + } + }; + + SensorEventListener mLightListener = new SensorEventListener() { + public void onSensorChanged(SensorEvent event) { + synchronized (mLocks) { + int value = (int)event.values[0]; + if (mDebugLightSensor) { + Log.d(TAG, "onSensorChanged: light value: " + value); + } + lightSensorChangedLocked(value); + } + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // ignore + } + }; }