Automated import from //branches/donutburger/...@142291,142291
diff --git a/core/java/android/view/WindowOrientationListener.java b/core/java/android/view/WindowOrientationListener.java
index f1f5f70..1b7cf8f 100755
--- a/core/java/android/view/WindowOrientationListener.java
+++ b/core/java/android/view/WindowOrientationListener.java
@@ -106,7 +106,7 @@
         private static final int _DATA_Z = 2;
         // Angle around x-axis thats considered almost perfect vertical to hold
         // the device
-        private static final int PIVOT = 30;
+        private static final int PIVOT = 20;
         // Angle around x-asis that's considered almost too vertical. Beyond
         // this angle will not result in any orientation changes. f phone faces uses,
         // the device is leaning backward.
@@ -114,22 +114,26 @@
         // Angle about x-axis that's considered negative vertical. Beyond this
         // angle will not result in any orientation changes. If phone faces uses,
         // the device is leaning forward.
-        private static final int PIVOT_LOWER = 0;
+        private static final int PIVOT_LOWER = -10;
         // Upper threshold limit for switching from portrait to landscape
-        private static final int PL_UPPER = 280;
+        private static final int PL_UPPER = 285;
         // Lower threshold limit for switching from landscape to portrait
         private static final int LP_LOWER = 320;
         // Lower threshold limt for switching from portrait to landscape
-        private static final int PL_LOWER = 240;
+        private static final int PL_LOWER = 265;
         // Upper threshold limit for switching from landscape to portrait
-        private static final int LP_UPPER = 360;
+        private static final int LP_UPPER = 355;
         
         // Internal value used for calculating linear variant
-        private static final float PL_LINEAR_FACTOR =
-            ((float)(PL_UPPER-PL_LOWER))/((float)(PIVOT_UPPER-PIVOT_LOWER));
+        private static final float PL_LF_UPPER =
+            ((float)(PL_UPPER-PL_LOWER))/((float)(PIVOT_UPPER-PIVOT));
+        private static final float PL_LF_LOWER =
+            ((float)(PL_UPPER-PL_LOWER))/((float)(PIVOT-PIVOT_LOWER));
         //  Internal value used for calculating linear variant
-        private static final float LP_LINEAR_FACTOR =
-            ((float)(LP_UPPER - LP_LOWER))/((float)(PIVOT_UPPER-PIVOT_LOWER));
+        private static final float LP_LF_UPPER =
+            ((float)(LP_UPPER - LP_LOWER))/((float)(PIVOT_UPPER-PIVOT));
+        private static final float LP_LF_LOWER =
+            ((float)(LP_UPPER - LP_LOWER))/((float)(PIVOT-PIVOT_LOWER)); 
         
         public void onSensorChanged(SensorEvent event) {
             float[] values = event.values;
@@ -138,7 +142,7 @@
             float Z = values[_DATA_Z];
             float OneEightyOverPi = 57.29577957855f;
             float gravity = (float) Math.sqrt(X*X+Y*Y+Z*Z);
-            float zyangle = Math.abs((float)Math.asin(Z/gravity)*OneEightyOverPi);
+            float zyangle = (float)Math.asin(Z/gravity)*OneEightyOverPi;
             int rotation = mSensorRotation;
             if ((zyangle <= PIVOT_UPPER) && (zyangle >= PIVOT_LOWER)) {
                 // Check orientation only if the phone is flat enough
@@ -152,20 +156,29 @@
                 while (orientation < 0) {
                     orientation += 360;
                 }
-               
-                float delta = (float)Math.abs(zyangle - PIVOT);
+                float delta = zyangle - PIVOT;
                 if (((orientation >= 0) && (orientation <= LP_UPPER)) ||
                         (orientation >= PL_LOWER)) {
                     float threshold;
                     if (mSensorRotation == Surface.ROTATION_90) {
-                        threshold = LP_LOWER + (LP_LINEAR_FACTOR * delta) ;
+                        if (delta < 0) {
+                            // delta is negative
+                            threshold = LP_LOWER - (LP_LF_LOWER * delta);
+                            //threshold = LP_LOWER + (LP_LF_LOWER * delta);
+                        } else {
+                            threshold = LP_LOWER + (LP_LF_UPPER * delta);
+                        }
                     } else {
-                        threshold = PL_UPPER - (PL_LINEAR_FACTOR * delta);
+                        if (delta < 0) {
+                            //delta is negative
+                            threshold = PL_UPPER+(PL_LF_LOWER * delta);
+                        } else {
+                            threshold = PL_UPPER-(PL_LF_UPPER * delta);
+                        }
                     }
                     rotation = (orientation >= PL_LOWER &&
                             orientation <= threshold) ? Surface.ROTATION_90 : Surface.ROTATION_0;
                 }
-                
             }
             if (rotation != mSensorRotation) {
                 mSensorRotation = rotation;