Merge "Enforce background fallback to be non-translucent" into nyc-dev
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index f596636..a065219 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -45,6 +45,7 @@
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.graphics.Shader;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.RemoteException;
 import android.util.DisplayMetrics;
@@ -907,10 +908,12 @@
         if (getBackground() != drawable) {
             setBackgroundDrawable(drawable);
             if (drawable != null) {
-                mResizingBackgroundDrawable = drawable;
+                mResizingBackgroundDrawable = enforceNonTranslucentBackground(drawable,
+                        mWindow.isTranslucent() || mWindow.isShowingWallpaper());
             } else {
                 mResizingBackgroundDrawable = getResizingBackgroundDrawable(
-                        getContext(), 0, mWindow.mBackgroundFallbackResource);
+                        getContext(), 0, mWindow.mBackgroundFallbackResource,
+                        mWindow.isTranslucent() || mWindow.isShowingWallpaper());
             }
             if (mResizingBackgroundDrawable != null) {
                 mResizingBackgroundDrawable.getPadding(mBackgroundPadding);
@@ -1785,7 +1788,8 @@
     private void loadBackgroundDrawablesIfNeeded() {
         if (mResizingBackgroundDrawable == null) {
             mResizingBackgroundDrawable = getResizingBackgroundDrawable(getContext(),
-                    mWindow.mBackgroundResource, mWindow.mBackgroundFallbackResource);
+                    mWindow.mBackgroundResource, mWindow.mBackgroundFallbackResource,
+                    mWindow.isTranslucent() || mWindow.isShowingWallpaper());
             if (mResizingBackgroundDrawable == null) {
                 // We shouldn't really get here as the background fallback should be always
                 // available since it is defaulted by the system.
@@ -1893,21 +1897,41 @@
      * user is resizing the window of an activity in multi-window mode.
      */
     public static Drawable getResizingBackgroundDrawable(Context context, int backgroundRes,
-            int backgroundFallbackRes) {
+            int backgroundFallbackRes, boolean windowTranslucent) {
         if (backgroundRes != 0) {
             final Drawable drawable = context.getDrawable(backgroundRes);
             if (drawable != null) {
-                return drawable;
+                return enforceNonTranslucentBackground(drawable, windowTranslucent);
             }
         }
 
         if (backgroundFallbackRes != 0) {
             final Drawable fallbackDrawable = context.getDrawable(backgroundFallbackRes);
             if (fallbackDrawable != null) {
-                return fallbackDrawable;
+                return enforceNonTranslucentBackground(fallbackDrawable, windowTranslucent);
             }
         }
-        return null;
+        return new ColorDrawable(Color.BLACK);
+    }
+
+    /**
+     * Enforces a drawable to be non-translucent to act as a background if needed, i.e. if the
+     * window is not translucent.
+     */
+    private static Drawable enforceNonTranslucentBackground(Drawable drawable,
+            boolean windowTranslucent) {
+        if (!windowTranslucent && drawable instanceof ColorDrawable) {
+            ColorDrawable colorDrawable = (ColorDrawable) drawable;
+            int color = colorDrawable.getColor();
+            if (Color.alpha(color) != 255) {
+                ColorDrawable copy = (ColorDrawable) colorDrawable.getConstantState().newDrawable()
+                        .mutate();
+                copy.setColor(
+                        Color.argb(255, Color.red(color), Color.green(color), Color.blue(color)));
+                return copy;
+            }
+        }
+        return drawable;
     }
 
     /**
@@ -2037,7 +2061,7 @@
     private void drawResizingShadowIfNeeded(DisplayListCanvas canvas) {
         if (mResizeMode != RESIZE_MODE_DOCKED_DIVIDER || mWindow.mIsFloating
                 || mWindow.isTranslucent()
-                || (mWindow.getAttributes().flags & FLAG_SHOW_WALLPAPER) != 0) {
+                || mWindow.isShowingWallpaper()) {
             return;
         }
         canvas.save();
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 4f15ece..9ad750d 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -509,6 +509,13 @@
     }
 
     /**
+     * @return Whether the window is currently showing the wallpaper.
+     */
+    boolean isShowingWallpaper() {
+        return (getAttributes().flags & FLAG_SHOW_WALLPAPER) != 0;
+    }
+
+    /**
      * Return a LayoutInflater instance that can be used to inflate XML view layout
      * resources for use in this Window.
      *
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 998eea5..aecda44 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -174,7 +174,6 @@
 
         <!-- Window attributes -->
         <item name="windowBackground">@drawable/screen_background_selector_dark</item>
-        <item name="windowBackgroundFallback">?attr/colorBackground</item>
         <item name="windowClipToOutline">false</item>
         <item name="windowFrame">@null</item>
         <item name="windowNoTitle">false</item>