diff options
-rw-r--r-- | core/java/android/view/ContextThemeWrapper.java | 9 | ||||
-rw-r--r-- | core/java/com/android/internal/widget/SwipeDismissLayout.java | 28 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 11 | ||||
-rw-r--r-- | libs/hwui/ShadowTessellator.h | 2 | ||||
-rw-r--r-- | libs/hwui/SpotShadow.cpp | 5 | ||||
-rw-r--r-- | services/core/java/com/android/server/power/DisplayPowerController.java | 110 | ||||
-rw-r--r-- | services/core/java/com/android/server/power/DisplayPowerState.java | 9 | ||||
-rw-r--r-- | services/core/java/com/android/server/power/PowerManagerService.java | 3 |
8 files changed, 110 insertions, 67 deletions
diff --git a/core/java/android/view/ContextThemeWrapper.java b/core/java/android/view/ContextThemeWrapper.java index 1de9c35..0afbde9 100644 --- a/core/java/android/view/ContextThemeWrapper.java +++ b/core/java/android/view/ContextThemeWrapper.java @@ -26,7 +26,6 @@ import android.content.res.Resources; * wrapped context. */ public class ContextThemeWrapper extends ContextWrapper { - private Context mBase; private int mThemeResource; private Resources.Theme mTheme; private LayoutInflater mInflater; @@ -39,13 +38,11 @@ public class ContextThemeWrapper extends ContextWrapper { public ContextThemeWrapper(Context base, int themeres) { super(base); - mBase = base; mThemeResource = themeres; } @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(newBase); - mBase = newBase; } /** @@ -109,11 +106,11 @@ public class ContextThemeWrapper extends ContextWrapper { @Override public Object getSystemService(String name) { if (LAYOUT_INFLATER_SERVICE.equals(name)) { if (mInflater == null) { - mInflater = LayoutInflater.from(mBase).cloneInContext(this); + mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this); } return mInflater; } - return mBase.getSystemService(name); + return getBaseContext().getSystemService(name); } /** @@ -135,7 +132,7 @@ public class ContextThemeWrapper extends ContextWrapper { final boolean first = mTheme == null; if (first) { mTheme = getResources().newTheme(); - Resources.Theme theme = mBase.getTheme(); + Resources.Theme theme = getBaseContext().getTheme(); if (theme != null) { mTheme.setTo(theme); } diff --git a/core/java/com/android/internal/widget/SwipeDismissLayout.java b/core/java/com/android/internal/widget/SwipeDismissLayout.java index cc8ce2c..467d42e 100644 --- a/core/java/com/android/internal/widget/SwipeDismissLayout.java +++ b/core/java/com/android/internal/widget/SwipeDismissLayout.java @@ -126,6 +126,20 @@ public class SwipeDismissLayout extends FrameLayout { mVelocityTracker.addMovement(ev); break; + case MotionEvent.ACTION_POINTER_DOWN: + int actionIndex = ev.getActionIndex(); + mActiveTouchId = ev.getPointerId(actionIndex); + break; + case MotionEvent.ACTION_POINTER_UP: + actionIndex = ev.getActionIndex(); + int pointerId = ev.getPointerId(actionIndex); + if (pointerId == mActiveTouchId) { + // This was our active pointer going up. Choose a new active pointer. + int newActionIndex = actionIndex == 0 ? 1 : 0; + mActiveTouchId = ev.getPointerId(newActionIndex); + } + break; + case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: resetMembers(); @@ -137,6 +151,11 @@ public class SwipeDismissLayout extends FrameLayout { } int pointerIndex = ev.findPointerIndex(mActiveTouchId); + if (pointerIndex == -1) { + Log.e(TAG, "Invalid pointer index: ignoring."); + mDiscardIntercept = true; + break; + } float dx = ev.getRawX() - mDownX; float x = ev.getX(pointerIndex); float y = ev.getY(pointerIndex); @@ -228,11 +247,11 @@ public class SwipeDismissLayout extends FrameLayout { } private void updateDismiss(MotionEvent ev) { + float deltaX = ev.getRawX() - mDownX; if (!mDismissed) { mVelocityTracker.addMovement(ev); mVelocityTracker.computeCurrentVelocity(1000); - float deltaX = ev.getRawX() - mDownX; float velocityX = mVelocityTracker.getXVelocity(); float absVelocityX = Math.abs(velocityX); float absVelocityY = Math.abs(mVelocityTracker.getYVelocity()); @@ -247,6 +266,13 @@ public class SwipeDismissLayout extends FrameLayout { mDismissed = true; } } + // Check if the user tried to undo this. + if (mDismissed && mSwiping) { + // Check if the user's finger is actually back + if (deltaX < getWidth() / 2) { + mDismissed = false; + } + } } /** diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 8aac0fe..1475953 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -3222,10 +3222,12 @@ status_t OpenGLRenderer::drawShadow(const mat4& casterTransformXY, const mat4& c // map 2d caster poly into 3d const int casterVertexCount = casterVertices2d.size(); Vector3 casterPolygon[casterVertexCount]; + float minZ = FLT_MAX; for (int i = 0; i < casterVertexCount; i++) { const Vertex& point2d = casterVertices2d[i]; casterPolygon[i] = Vector3(point2d.x, point2d.y, 0); mapPointFakeZ(casterPolygon[i], casterTransformXY, casterTransformZ); + minZ = fmin(minZ, casterPolygon[i].z); } // map the centroid of the caster into 3d @@ -3235,6 +3237,15 @@ status_t OpenGLRenderer::drawShadow(const mat4& casterTransformXY, const mat4& c Vector3 centroid3d(centroid.x, centroid.y, 0); mapPointFakeZ(centroid3d, casterTransformXY, casterTransformZ); + // if the caster intersects the z=0 plane, lift it in Z so it doesn't + if (minZ < SHADOW_MIN_CASTER_Z) { + float casterLift = SHADOW_MIN_CASTER_Z - minZ; + for (int i = 0; i < casterVertexCount; i++) { + casterPolygon[i].z += casterLift; + } + centroid3d.z += casterLift; + } + // draw caster's shadows if (mCaches.propertyAmbientShadowStrength > 0) { paint.setARGB(casterAlpha * mCaches.propertyAmbientShadowStrength, 0, 0, 0); diff --git a/libs/hwui/ShadowTessellator.h b/libs/hwui/ShadowTessellator.h index 120774b..c558460 100644 --- a/libs/hwui/ShadowTessellator.h +++ b/libs/hwui/ShadowTessellator.h @@ -54,6 +54,8 @@ namespace uirenderer { // The total number of indices used for drawing the shadow geometry as triangle strips. #define SHADOW_INDEX_COUNT (2 * SHADOW_RAY_COUNT + 1 + 2 * (SHADOW_RAY_COUNT + 1)) +#define SHADOW_MIN_CASTER_Z 0.001f + class ShadowTessellator { public: static void tessellateAmbientShadow(const Vector3* casterPolygon, diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp index 4e52555..8538b29 100644 --- a/libs/hwui/SpotShadow.cpp +++ b/libs/hwui/SpotShadow.cpp @@ -548,11 +548,6 @@ void SpotShadow::computeSpotShadow(const Vector3* lightPoly, int lightPolyLength // Validate input, receiver is always at z = 0 plane. bool inputPolyPositionValid = true; for (int i = 0; i < polyLength; i++) { - if (poly[i].z <= 0.00001) { - inputPolyPositionValid = false; - ALOGW("polygon below the surface"); - break; - } if (poly[i].z >= lightPoly[0].z) { inputPolyPositionValid = false; ALOGW("polygon above the light"); diff --git a/services/core/java/com/android/server/power/DisplayPowerController.java b/services/core/java/com/android/server/power/DisplayPowerController.java index 12d51aa..6d3702a 100644 --- a/services/core/java/com/android/server/power/DisplayPowerController.java +++ b/services/core/java/com/android/server/power/DisplayPowerController.java @@ -479,7 +479,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && mProximity == PROXIMITY_POSITIVE) { mScreenOffBecauseOfProximity = true; sendOnProximityPositiveWithWakelock(); - setScreenOn(false); } } else if (mWaitingForNegativeProximity && mScreenOffBecauseOfProximity @@ -544,59 +543,62 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mUsingScreenAutoBrightness = false; } - // Animate the screen on or off. - if (!mScreenOffBecauseOfProximity) { - if (mPowerRequest.wantScreenOnAny()) { - // Want screen on. - // Wait for previous off animation to complete beforehand. - // It is relatively short but if we cancel it and switch to the - // on animation immediately then the results are pretty ugly. - if (!mElectronBeamOffAnimator.isStarted()) { - // Turn the screen on. The contents of the screen may not yet - // be visible if the electron beam has not been dismissed because - // its last frame of animation is solid black. - setScreenOn(true); - - if (mPowerRequest.blockScreenOn - && mPowerState.getElectronBeamLevel() == 0.0f) { - blockScreenOn(); - } else { - unblockScreenOn(); - if (USE_ELECTRON_BEAM_ON_ANIMATION) { - if (!mElectronBeamOnAnimator.isStarted()) { - if (mPowerState.getElectronBeamLevel() == 1.0f) { - mPowerState.dismissElectronBeam(); - } else if (mPowerState.prepareElectronBeam( - mElectronBeamFadesConfig ? - ElectronBeam.MODE_FADE : - ElectronBeam.MODE_WARM_UP)) { - mElectronBeamOnAnimator.start(); - } else { - mElectronBeamOnAnimator.end(); - } + // Animate the screen on or off unless blocked. + if (mScreenOffBecauseOfProximity) { + // Screen off due to proximity. + setScreenOn(false); + unblockScreenOn(); + } else if (mPowerRequest.wantScreenOnAny()) { + // Want screen on. + // Wait for previous off animation to complete beforehand. + // It is relatively short but if we cancel it and switch to the + // on animation immediately then the results are pretty ugly. + if (!mElectronBeamOffAnimator.isStarted()) { + // Turn the screen on. The contents of the screen may not yet + // be visible if the electron beam has not been dismissed because + // its last frame of animation is solid black. + setScreenOn(true); + + if (mPowerRequest.blockScreenOn + && mPowerState.getElectronBeamLevel() == 0.0f) { + blockScreenOn(); + } else { + unblockScreenOn(); + if (USE_ELECTRON_BEAM_ON_ANIMATION) { + if (!mElectronBeamOnAnimator.isStarted()) { + if (mPowerState.getElectronBeamLevel() == 1.0f) { + mPowerState.dismissElectronBeam(); + } else if (mPowerState.prepareElectronBeam( + mElectronBeamFadesConfig ? + ElectronBeam.MODE_FADE : + ElectronBeam.MODE_WARM_UP)) { + mElectronBeamOnAnimator.start(); + } else { + mElectronBeamOnAnimator.end(); } - } else { - mPowerState.setElectronBeamLevel(1.0f); - mPowerState.dismissElectronBeam(); } + } else { + mPowerState.setElectronBeamLevel(1.0f); + mPowerState.dismissElectronBeam(); } } - } else { - // Want screen off. - // Wait for previous on animation to complete beforehand. - if (!mElectronBeamOnAnimator.isStarted()) { - if (!mElectronBeamOffAnimator.isStarted()) { - if (mPowerState.getElectronBeamLevel() == 0.0f) { - setScreenOn(false); - } else if (mPowerState.prepareElectronBeam( - mElectronBeamFadesConfig ? - ElectronBeam.MODE_FADE : - ElectronBeam.MODE_COOL_DOWN) - && mPowerState.isScreenOn()) { - mElectronBeamOffAnimator.start(); - } else { - mElectronBeamOffAnimator.end(); - } + } + } else { + // Want screen off. + // Wait for previous on animation to complete beforehand. + unblockScreenOn(); + if (!mElectronBeamOnAnimator.isStarted()) { + if (!mElectronBeamOffAnimator.isStarted()) { + if (mPowerState.getElectronBeamLevel() == 0.0f) { + setScreenOn(false); + } else if (mPowerState.prepareElectronBeam( + mElectronBeamFadesConfig ? + ElectronBeam.MODE_FADE : + ElectronBeam.MODE_COOL_DOWN) + && mPowerState.isScreenOn()) { + mElectronBeamOffAnimator.start(); + } else { + mElectronBeamOffAnimator.end(); } } } @@ -641,15 +643,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private void unblockScreenOn() { if (mScreenOnWasBlocked) { mScreenOnWasBlocked = false; - if (DEBUG) { - Slog.d(TAG, "Unblocked screen on after " + - (SystemClock.elapsedRealtime() - mScreenOnBlockStartRealTime) + " ms"); + long delay = SystemClock.elapsedRealtime() - mScreenOnBlockStartRealTime; + if (delay > 1000 || DEBUG) { + Slog.d(TAG, "Unblocked screen on after " + delay + " ms"); } } } private void setScreenOn(boolean on) { - if (!mPowerState.isScreenOn() == on) { + if (mPowerState.isScreenOn() != on) { mPowerState.setScreenOn(on); if (on) { mNotifier.onScreenOn(); diff --git a/services/core/java/com/android/server/power/DisplayPowerState.java b/services/core/java/com/android/server/power/DisplayPowerState.java index 42af4b4..8e331ad 100644 --- a/services/core/java/com/android/server/power/DisplayPowerState.java +++ b/services/core/java/com/android/server/power/DisplayPowerState.java @@ -304,8 +304,15 @@ final class DisplayPowerState { int brightness = mScreenOn && mElectronBeamLevel > 0f ? mScreenBrightness : 0; if (mPhotonicModulator.setState(mScreenOn, brightness)) { + if (DEBUG) { + Slog.d(TAG, "Screen ready"); + } mScreenReady = true; invokeCleanListenerIfNeeded(); + } else { + if (DEBUG) { + Slog.d(TAG, "Screen not ready"); + } } } }; @@ -355,7 +362,7 @@ final class DisplayPowerState { AsyncTask.THREAD_POOL_EXECUTOR.execute(mTask); } } - return mChangeInProgress; + return !mChangeInProgress; } } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 40ebe8d..e0a46b9 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -1047,6 +1047,9 @@ public final class PowerManagerService extends com.android.server.SystemService if (!mSystemReady || mDirty == 0) { return; } + if (!Thread.holdsLock(mLock)) { + Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked"); + } // Phase 0: Basic state updates. updateIsPoweredLocked(mDirty); |