Merge "Add preference-v17 to gradle build"
diff --git a/v17/leanback/Android.mk b/v17/leanback/Android.mk
index baf8719..2fcad14 100644
--- a/v17/leanback/Android.mk
+++ b/v17/leanback/Android.mk
@@ -107,13 +107,10 @@
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 LOCAL_MODULE_TAGS := optional
 
-res.COMMON := $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),android-support-v17-leanback-res,,COMMON)
-leanback.docs.src_files := $(leanback.docs.src_files) $(call all-java-files-under, ../../../../$(res.COMMON))
-
-intermediates.COMMON := $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),android-support-v17-leanback,,COMMON)
+gen_res_src_dirs := $(call intermediates-dir-for,JAVA_LIBRARIES,android-support-v17-leanback-res,,COMMON)/src
 
 LOCAL_SRC_FILES := $(leanback.docs.src_files)
-LOCAL_ADDITONAL_JAVA_DIR := $(intermediates.COMMON)/src
+LOCAL_ADDITIONAL_JAVA_DIR := $(gen_res_src_dirs)
 
 LOCAL_SDK_VERSION := 19
 LOCAL_IS_HOST_MODULE := false
@@ -164,8 +161,7 @@
 # ===========================================================
 leanback.docs.src_files :=
 leanback.docs.java_libraries :=
-intermediates.COMMON :=
-res.COMMON :=
+gen_res_src_dirs :=
 leanback_internal_api_file :=
 leanback_stubs_stamp :=
 leanback.docs.stubpackages :=
diff --git a/v17/leanback/kitkat/android/support/v17/leanback/widget/BackgroundHelperKitkat.java b/v17/leanback/kitkat/android/support/v17/leanback/widget/BackgroundHelperKitkat.java
new file mode 100644
index 0000000..2b095fa
--- /dev/null
+++ b/v17/leanback/kitkat/android/support/v17/leanback/widget/BackgroundHelperKitkat.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.widget;
+
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+class BackgroundHelperKitkat {
+
+    public static void setBackgroundPreservingAlpha(View view, Drawable drawable) {
+        if (view.getBackground() != null) {
+            drawable.setAlpha(view.getBackground().getAlpha());
+        }
+        view.setBackground(drawable);
+    }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java b/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java
index fbc1dcb..59b0f19 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java
@@ -34,6 +34,7 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
 import android.os.Handler;
+import android.support.v17.leanback.widget.BackgroundHelper;
 import android.support.v4.view.animation.FastOutLinearInInterpolator;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -250,6 +251,11 @@
             }
         }
 
+        // Queried by system transitions
+        public int getAlpha() {
+            return mPaint.getAlpha();
+        }
+
         @Override
         public Drawable mutate() {
             Drawable drawable = super.mutate();
@@ -316,11 +322,6 @@
     }
 
     private TranslucentLayerDrawable mLayerDrawable;
-    private DrawableWrapper mImageInWrapper;
-    private DrawableWrapper mImageOutWrapper;
-    private DrawableWrapper mColorWrapper;
-    private DrawableWrapper mDimWrapper;
-
     private Drawable mDimDrawable;
     private ChangeBackgroundRunnable mChangeRunnable;
 
@@ -333,10 +334,10 @@
         }
         @Override
         public void onAnimationEnd(Animator animation) {
-            // mImageInWrapper should be full alpha, but mImageOutWrapper may not be 0 alpha
-            if (mImageOutWrapper != null) {
-                mImageOutWrapper.setAlpha(0);
-                mImageOutWrapper = null;
+            // imageInWrapper should be full alpha, but imageOutWrapper may not be 0 alpha
+            DrawableWrapper imageOutWrapper = getImageOutWrapper();
+            if (imageOutWrapper != null) {
+                imageOutWrapper.setAlpha(0);
             }
             if (mChangeRunnable != null) {
                 long delayMs = getRunnableDelay();
@@ -354,10 +355,14 @@
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
             int fadeInAlpha = (Integer) animation.getAnimatedValue();
-            if (mImageInWrapper != null) {
-                mImageInWrapper.setAlpha(fadeInAlpha);
-            } else if (mImageOutWrapper != null) {
-                mImageOutWrapper.setAlpha(255 - fadeInAlpha);
+            DrawableWrapper imageInWrapper = getImageInWrapper();
+            if (imageInWrapper != null) {
+                imageInWrapper.setAlpha(fadeInAlpha);
+            } else {
+                DrawableWrapper imageOutWrapper = getImageOutWrapper();
+                if (imageOutWrapper != null) {
+                    imageOutWrapper.setAlpha(255 - fadeInAlpha);
+                }
             }
         }
     };
@@ -366,8 +371,9 @@
             new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
-            if (mDimWrapper != null) {
-                mDimWrapper.setAlpha((Integer) animation.getAnimatedValue());
+            DrawableWrapper dimWrapper = getDimWrapper();
+            if (dimWrapper != null) {
+                dimWrapper.setAlpha((Integer) animation.getAnimatedValue());
             }
         }
     };
@@ -555,6 +561,26 @@
         fragment.setBackgroundManager(this);
     }
 
+    private DrawableWrapper getImageInWrapper() {
+        return mLayerDrawable == null ? null :
+                mLayerDrawable.findWrapperById(R.id.background_imagein);
+    }
+
+    private DrawableWrapper getImageOutWrapper() {
+        return mLayerDrawable == null ? null :
+                mLayerDrawable.findWrapperById(R.id.background_imageout);
+    }
+
+    private DrawableWrapper getDimWrapper() {
+        return mLayerDrawable == null ? null :
+                mLayerDrawable.findWrapperById(R.id.background_dim);
+    }
+
+    private DrawableWrapper getColorWrapper() {
+        return mLayerDrawable == null ? null :
+                mLayerDrawable.findWrapperById(R.id.background_color);
+    }
+
     /**
      * Synchronizes state when the owning Activity is resumed.
      */
@@ -596,13 +622,11 @@
         LayerDrawable layerDrawable = (LayerDrawable)
                 ContextCompat.getDrawable(mContext, R.drawable.lb_background).mutate();
         mLayerDrawable = TranslucentLayerDrawable.create(layerDrawable);
-        mBgView.setBackground(mLayerDrawable);
+        BackgroundHelper.setBackgroundPreservingAlpha(mBgView, mLayerDrawable);
 
         mLayerDrawable.clearDrawable(R.id.background_imageout, mContext);
         mLayerDrawable.updateDrawable(R.id.background_theme, getThemeDrawable());
 
-        mColorWrapper = mLayerDrawable.findWrapperById(R.id.background_color);
-
         updateDimWrapper();
     }
 
@@ -612,8 +636,9 @@
         }
         Drawable dimDrawable = mDimDrawable.getConstantState().newDrawable(
                 mContext.getResources()).mutate();
-        mDimWrapper = mLayerDrawable == null ? null : mLayerDrawable.updateDrawable(
-                R.id.background_dim, dimDrawable);
+        if (mLayerDrawable != null) {
+            mLayerDrawable.updateDrawable(R.id.background_dim, dimDrawable);
+        }
     }
 
     /**
@@ -704,10 +729,6 @@
             mLayerDrawable.clearDrawable(R.id.background_theme, mContext);
             mLayerDrawable = null;
         }
-        mImageInWrapper = null;
-        mImageOutWrapper = null;
-        mColorWrapper = null;
-        mDimWrapper = null;
         if (mChangeRunnable != null) {
             mHandler.removeCallbacks(mChangeRunnable);
             mChangeRunnable = null;
@@ -744,9 +765,13 @@
     private void updateImmediate() {
         lazyInit();
 
-        mColorWrapper.setColor(mBackgroundColor);
-        if (mDimWrapper != null) {
-            mDimWrapper.setAlpha(mBackgroundColor == Color.TRANSPARENT ? 0 : DIM_ALPHA_ON_SOLID);
+        DrawableWrapper colorWrapper = getColorWrapper();
+        if (colorWrapper != null) {
+            colorWrapper.setColor(mBackgroundColor);
+        }
+        DrawableWrapper dimWrapper = getDimWrapper();
+        if (dimWrapper != null) {
+            dimWrapper.setAlpha(mBackgroundColor == Color.TRANSPARENT ? 0 : DIM_ALPHA_ON_SOLID);
         }
         showWallpaper(mBackgroundColor == Color.TRANSPARENT);
 
@@ -754,10 +779,10 @@
             mLayerDrawable.clearDrawable(R.id.background_imagein, mContext);
         } else {
             if (DEBUG) Log.v(TAG, "Background drawable is available");
-            mImageInWrapper = mLayerDrawable.updateDrawable(
+            mLayerDrawable.updateDrawable(
                     R.id.background_imagein, mBackgroundDrawable);
-            if (mDimWrapper != null) {
-                mDimWrapper.setAlpha(FULL_ALPHA);
+            if (dimWrapper != null) {
+                dimWrapper.setAlpha(FULL_ALPHA);
             }
         }
     }
@@ -772,8 +797,9 @@
         mBackgroundColor = color;
         mService.setColor(mBackgroundColor);
 
-        if (mColorWrapper != null) {
-            mColorWrapper.setColor(mBackgroundColor);
+        DrawableWrapper colorWrapper = getColorWrapper();
+        if (colorWrapper != null) {
+            colorWrapper.setColor(mBackgroundColor);
         }
     }
 
@@ -886,26 +912,28 @@
 
         int dimAlpha = -1;
 
-        if (mImageOutWrapper != null) {
+        if (getImageOutWrapper() != null) {
             dimAlpha = mBackgroundColor == Color.TRANSPARENT ? 0 : DIM_ALPHA_ON_SOLID;
         }
 
-        if (mImageInWrapper == null && mBackgroundDrawable != null) {
+        DrawableWrapper imageInWrapper = getImageInWrapper();
+        if (imageInWrapper == null && mBackgroundDrawable != null) {
             if (DEBUG) Log.v(TAG, "creating new imagein drawable");
-            mImageInWrapper = mLayerDrawable.updateDrawable(
+            imageInWrapper = mLayerDrawable.updateDrawable(
                     R.id.background_imagein, mBackgroundDrawable);
-            if (DEBUG) Log.v(TAG, "mImageInWrapper animation starting");
-            mImageInWrapper.setAlpha(0);
+            if (DEBUG) Log.v(TAG, "imageInWrapper animation starting");
+            imageInWrapper.setAlpha(0);
             dimAlpha = FULL_ALPHA;
         }
 
         mAnimator.setDuration(FADE_DURATION);
         mAnimator.start();
 
-        if (mDimWrapper != null && dimAlpha >= 0) {
+        DrawableWrapper dimWrapper = getDimWrapper();
+        if (dimWrapper != null && dimAlpha >= 0) {
             if (DEBUG) Log.v(TAG, "dimwrapper animation starting to " + dimAlpha);
             mDimAnimator.cancel();
-            mDimAnimator.setIntValues(mDimWrapper.getAlpha(), dimAlpha);
+            mDimAnimator.setIntValues(dimWrapper.getAlpha(), dimAlpha);
             mDimAnimator.setDuration(FADE_DURATION);
             mDimAnimator.setInterpolator(
                     dimAlpha == FULL_ALPHA ? mDecelerateInterpolator : mAccelerateInterpolator);
@@ -972,14 +1000,14 @@
 
             releaseBackgroundBitmap();
 
-            if (mImageInWrapper != null) {
+            DrawableWrapper imageInWrapper = getImageInWrapper();
+            if (imageInWrapper != null) {
                 if (DEBUG) Log.v(TAG, "moving image in to image out");
                 // Order is important! Setting a drawable "removes" the
                 // previous one from the view
                 mLayerDrawable.clearDrawable(R.id.background_imagein, mContext);
-                mImageOutWrapper = mLayerDrawable.updateDrawable(R.id.background_imageout,
-                        mImageInWrapper.getDrawable());
-                mImageInWrapper = null;
+                mLayerDrawable.updateDrawable(R.id.background_imageout,
+                        imageInWrapper.getDrawable());
             }
 
             mBackgroundDrawable = mDrawable;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/BackgroundHelper.java b/v17/leanback/src/android/support/v17/leanback/widget/BackgroundHelper.java
new file mode 100644
index 0000000..2df10a8
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/BackgroundHelper.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.widget;
+
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.v17.leanback.widget.BackgroundHelperKitkat;
+import android.view.View;
+
+
+/**
+ * Helper for view backgrounds.
+ * @hide
+ */
+public final class BackgroundHelper {
+
+    final static BackgroundHelperVersionImpl sImpl;
+
+    static interface BackgroundHelperVersionImpl {
+        public void setBackgroundPreservingAlpha(View view, Drawable drawable);
+    }
+
+    private static final class BackgroundHelperStubImpl implements BackgroundHelperVersionImpl {
+        @Override
+        public void setBackgroundPreservingAlpha(View view, Drawable drawable) {
+            // Cannot query drawable alpha
+            view.setBackground(drawable);
+        }
+    }
+
+    private static final class BackgroundHelperKitkatImpl implements BackgroundHelperVersionImpl {
+        @Override
+        public void setBackgroundPreservingAlpha(View view, Drawable drawable) {
+            BackgroundHelperKitkat.setBackgroundPreservingAlpha(view, drawable);
+        }
+    }
+
+    private BackgroundHelper() {
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 19) {
+            sImpl = new BackgroundHelperKitkatImpl();
+        } else {
+            sImpl = new BackgroundHelperStubImpl();
+        }
+    }
+
+    public static void setBackgroundPreservingAlpha(View view, Drawable drawable) {
+        sImpl.setBackgroundPreservingAlpha(view, drawable);
+    }
+}