Merge "Bug 3292797. Talkback accessibility doesn't work at times."
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 34d7935..b74806486 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -136,6 +136,11 @@
         outMetrics.ydpi         = mDpiY;
     }
 
+    /**
+     * @hide Helper for our fake display size hack.
+     */
+    native public static int unmapDisplaySize(int newSize);
+    
     /*
      * We use a class initializer to allow the native code to cache some
      * field offsets.
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index ec2bb74..ed06ded 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -16,6 +16,8 @@
 
 package android.widget;
 
+import java.lang.ref.WeakReference;
+
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.content.Context;
@@ -54,6 +56,7 @@
     private static final int DEFAULT_ANIMATION_DURATION = 400;
     private static final int FADE_IN_ANIMATION_DURATION = 800;
     private static final int MINIMUM_ANIMATION_DURATION = 50;
+    private static final int STACK_RELAYOUT_DURATION = 100;
 
     /**
      * Parameters effecting the perspective visuals
@@ -192,11 +195,15 @@
      * Animate the views between different relative indexes within the {@link AdapterViewAnimator}
      */
     void animateViewForTransition(int fromIndex, int toIndex, View view) {
-        if (fromIndex == -1 && toIndex > 0) {
+        if (fromIndex == -1 && toIndex == NUM_ACTIVE_VIEWS -1) {
             // Fade item in
             if (view.getAlpha() == 1) {
                 view.setAlpha(0);
             }
+            view.setScaleX(1 - PERSPECTIVE_SCALE_FACTOR);
+            view.setScaleY(1 - PERSPECTIVE_SCALE_FACTOR);
+            view.setTranslationX(mPerspectiveShiftX);
+            view.setTranslationY(0);
             view.setVisibility(VISIBLE);
 
             ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 1.0f);
@@ -234,10 +241,13 @@
             view.setVisibility(INVISIBLE);
             LayoutParams lp = (LayoutParams) view.getLayoutParams();
             lp.setVerticalOffset(-mSlideAmount);
+        } else if (fromIndex == -1) {
+            view.setAlpha(1.0f);
+            view.setVisibility(VISIBLE);
         } else if (toIndex == -1) {
             // Fade item out
             ObjectAnimator fadeOut = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 0.0f);
-            fadeOut.setDuration(DEFAULT_ANIMATION_DURATION);
+            fadeOut.setDuration(STACK_RELAYOUT_DURATION);
             fadeOut.start();
         }
 
@@ -277,13 +287,17 @@
 
             ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(view, scalePropX, scalePropY,
                     translationY, translationX);
-            oa.setDuration(100);
-            view.setTagInternal(com.android.internal.R.id.viewAnimation, oa);
+            oa.setDuration(STACK_RELAYOUT_DURATION);
+            view.setTagInternal(com.android.internal.R.id.viewAnimation, 
+                    new WeakReference<ObjectAnimator>(oa));
             oa.start();
         } else {
             Object tag = view.getTag(com.android.internal.R.id.viewAnimation);
-            if (tag instanceof ObjectAnimator) {
-                ((ObjectAnimator) tag).cancel();
+            if (tag instanceof WeakReference<?>) {
+                Object obj = ((WeakReference<?>) tag).get();
+                if (obj instanceof ObjectAnimator) {
+                    ((ObjectAnimator) obj).cancel();
+                }
             }
 
             view.setTranslationX(transX);
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index e520e69..e63a68f 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.util.AttributeSet;
+import android.view.MotionEvent;
 import android.widget.FrameLayout;
 
 /**
@@ -39,4 +40,10 @@
         setBackgroundDrawable(a.getDrawable(com.android.internal.R.styleable.ActionBar_background));
         a.recycle();
     }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        super.onTouchEvent(ev);
+        return true;
+    }
 }
diff --git a/core/jni/android_view_Display.cpp b/core/jni/android_view_Display.cpp
index 2e160ae..ac8835a 100644
--- a/core/jni/android_view_Display.cpp
+++ b/core/jni/android_view_Display.cpp
@@ -17,6 +17,8 @@
 #include <stdio.h>
 #include <assert.h>
 
+#include <cutils/properties.h>
+
 #include <surfaceflinger/SurfaceComposerClient.h>
 #include <ui/PixelFormat.h>
 #include <ui/DisplayInfo.h>
@@ -24,6 +26,7 @@
 #include "jni.h"
 #include <android_runtime/AndroidRuntime.h>
 #include <utils/misc.h>
+#include <utils/Log.h>
 
 // ----------------------------------------------------------------------------
 
@@ -41,6 +44,9 @@
 };
 static offsets_t offsets;
 
+static int gOldSize = -1;
+static int gNewSize = -1;
+
 static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL)
 {
     jclass npeClazz = env->FindClass(exc);
@@ -69,14 +75,16 @@
         JNIEnv* env, jobject clazz)
 {
     DisplayID dpy = env->GetIntField(clazz, offsets.display);
-    return SurfaceComposerClient::getDisplayWidth(dpy);
+    jint w = SurfaceComposerClient::getDisplayWidth(dpy);
+    return w == gOldSize ? gNewSize : w;
 }
 
 static jint android_view_Display_getHeight(
         JNIEnv* env, jobject clazz)
 {
     DisplayID dpy = env->GetIntField(clazz, offsets.display);
-    return SurfaceComposerClient::getDisplayHeight(dpy);
+    int h = SurfaceComposerClient::getDisplayHeight(dpy);
+    return h == gOldSize ? gNewSize : h;
 }
 
 static jint android_view_Display_getOrientation(
@@ -92,6 +100,13 @@
     return SurfaceComposerClient::getNumberOfDisplays();
 }
 
+static jint android_view_Display_unmapDisplaySize(
+        JNIEnv* env, jclass clazz, jint newSize)
+{
+    if (newSize == gNewSize) return gOldSize;
+    return newSize;
+}
+
 // ----------------------------------------------------------------------------
 
 const char* const kClassPathName = "android/view/Display";
@@ -110,7 +125,9 @@
     {   "getHeight", "()I",
             (void*)android_view_Display_getHeight },
     {   "getOrientation", "()I",
-            (void*)android_view_Display_getOrientation }
+            (void*)android_view_Display_getOrientation },
+    {   "unmapDisplaySize", "(I)I",
+            (void*)android_view_Display_unmapDisplaySize }
 };
 
 void nativeClassInit(JNIEnv* env, jclass clazz)
@@ -125,6 +142,16 @@
 
 int register_android_view_Display(JNIEnv* env)
 {
+    char buf[PROPERTY_VALUE_MAX];
+    int len = property_get("persist.demo.screensizehack", buf, "");
+    if (len > 0) {
+        int temp1, temp2;
+        if (sscanf(buf, "%d=%d", &temp1, &temp2) == 2) {
+            gOldSize = temp1;
+            gNewSize = temp2;
+        }
+    }
+
     return AndroidRuntime::registerNativeMethods(env,
             kClassPathName, gMethods, NELEM(gMethods));
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
index e0f37ca..edcf096 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
@@ -319,10 +319,8 @@
             anim.setDuration((last-first) * STAGGER_ANIMATION_DELAY);
             anim.setInterpolator(interp);
             anims.add(anim);
-        }
 
-        if (animate) {
-            ObjectAnimator anim = ObjectAnimator.ofFloat(mBackgroundProtector, "alpha",
+            anim = ObjectAnimator.ofFloat(mBackgroundProtector, "alpha",
                     initialAlpha, 1.0f);
             anim.setDuration(last * STAGGER_ANIMATION_DELAY);
             anim.setInterpolator(interp);
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 26dd692..748f2e9 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -6239,7 +6239,8 @@
             mDisplay = wm.getDefaultDisplay();
             mInitialDisplayWidth = mDisplay.getWidth();
             mInitialDisplayHeight = mDisplay.getHeight();
-            mInputManager.setDisplaySize(0, mInitialDisplayWidth, mInitialDisplayHeight);
+            mInputManager.setDisplaySize(0, Display.unmapDisplaySize(mInitialDisplayWidth),
+                    Display.unmapDisplaySize(mInitialDisplayHeight));
         }
 
         try {