diff --git a/api/current.txt b/api/current.txt index 3637f148e350f..eb6ad09eedbec 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1420,6 +1420,7 @@ package android { field public static final int windowNoTitle = 16842838; // 0x1010056 field public static final int windowOverscan = 16843727; // 0x10103cf field public static final int windowReenterTransition = 16843951; // 0x10104af + field public static final int windowResizingBackground = 16844035; // 0x1010503 field public static final int windowReturnTransition = 16843950; // 0x10104ae field public static final int windowSharedElementEnterTransition = 16843833; // 0x1010439 field public static final int windowSharedElementExitTransition = 16843834; // 0x101043a diff --git a/api/system-current.txt b/api/system-current.txt index 076815eaa9c87..64ea3b82a279d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1516,6 +1516,7 @@ package android { field public static final int windowNoTitle = 16842838; // 0x1010056 field public static final int windowOverscan = 16843727; // 0x10103cf field public static final int windowReenterTransition = 16843951; // 0x10104af + field public static final int windowResizingBackground = 16844035; // 0x1010503 field public static final int windowReturnTransition = 16843950; // 0x10104ae field public static final int windowSharedElementEnterTransition = 16843833; // 0x1010439 field public static final int windowSharedElementExitTransition = 16843834; // 0x101043a diff --git a/core/java/com/android/internal/policy/DecorContext.java b/core/java/com/android/internal/policy/DecorContext.java index 4f17c39ddf813..aa603c123f8bd 100644 --- a/core/java/com/android/internal/policy/DecorContext.java +++ b/core/java/com/android/internal/policy/DecorContext.java @@ -17,6 +17,7 @@ package com.android.internal.policy; import android.content.Context; +import android.content.res.TypedArray; import android.view.ContextThemeWrapper; import android.view.WindowManager; import android.view.WindowManagerImpl; @@ -30,6 +31,7 @@ import android.view.WindowManagerImpl; class DecorContext extends ContextThemeWrapper { private PhoneWindow mPhoneWindow; private WindowManager mWindowManager; + private TypedArray mWindowStyle; public DecorContext(Context context) { super(context, null); @@ -52,4 +54,13 @@ class DecorContext extends ContextThemeWrapper { } return super.getSystemService(name); } + + public TypedArray getWindowStyle() { + synchronized (this) { + if (mWindowStyle == null) { + mWindowStyle = obtainStyledAttributes(com.android.internal.R.styleable.Window); + } + return mWindowStyle; + } + } } diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 75ad916ab9b39..3faa46fb238e0 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -19,7 +19,6 @@ package com.android.internal.policy; import static android.app.ActivityManager.FIRST_DYNAMIC_STACK_ID; import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.FULLSCREEN_WORKSPACE_STACK_ID; -import static android.app.ActivityManager.HOME_STACK_ID; import static android.app.ActivityManager.INVALID_STACK_ID; import static android.view.View.MeasureSpec.AT_MOST; import static android.view.View.MeasureSpec.EXACTLY; @@ -32,8 +31,7 @@ import android.animation.Animator; import android.animation.ObjectAnimator; import android.app.ActivityManagerNative; import android.app.SearchManager; -import android.content.ContextWrapper; -import android.content.res.Resources; +import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.UserHandle; @@ -4228,7 +4226,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } nonClientDecorView.setPhoneWindow(this, hasNonClientDecor(mWorkspaceId), - nonClientDecorHasShadow(mWorkspaceId)); + nonClientDecorHasShadow(mWorkspaceId), getResizingBackgroundDrawable(), + mDecor.getContext().getDrawable(R.drawable.non_client_decor_title_focused)); } // Tell the decor if it has a visible non client decor. mDecor.enableNonClientDecor(nonClientDecorView != null && hasNonClientDecor(mWorkspaceId)); @@ -5409,7 +5408,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { * @param workspaceId The Id of the workspace which contains this window. * @Return Returns true if the window should show a non client decor. **/ - private boolean hasNonClientDecor(int workspaceId) { + private static boolean hasNonClientDecor(int workspaceId) { return workspaceId == FREEFORM_WORKSPACE_STACK_ID; } @@ -5432,4 +5431,44 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } } + + /** + * Returns the color used to fill areas the app has not rendered content to yet when the user + * is resizing the window of an activity in multi-window mode. + * */ + private Drawable getResizingBackgroundDrawable() { + final Context context = mDecor.getContext(); + final TypedArray windowStyle; + if (context instanceof DecorContext) { + windowStyle = ((DecorContext) context).getWindowStyle(); + } else { + windowStyle = getWindowStyle(); + } + final int resourceId = + windowStyle.getResourceId(R.styleable.Window_windowResizingBackground, 0); + if (resourceId != 0) { + return context.getDrawable(resourceId); + } + + // The app didn't set a resizing background color. In this case we try to use the app's + // background drawable for the resizing background. + if (mBackgroundResource != 0) { + final Drawable drawable = context.getDrawable(mBackgroundResource); + if (drawable != null) { + return drawable; + } + } + + // The app background drawable isn't currently set. This might be because the app cleared + // it. In this case we try to use the app's background fallback drawable. + if (mBackgroundFallbackResource != 0) { + final Drawable fallbackDrawable = context.getDrawable(mBackgroundFallbackResource); + if (fallbackDrawable != null) { + return fallbackDrawable; + } + } + + return new ColorDrawable(context.getResources().getInteger( + com.android.internal.R.integer.config_windowResizingBackgroundColorARGB)); + } } diff --git a/core/java/com/android/internal/widget/NonClientDecorView.java b/core/java/com/android/internal/widget/NonClientDecorView.java index ed7492aae47be..5d502c9dcca02 100644 --- a/core/java/com/android/internal/widget/NonClientDecorView.java +++ b/core/java/com/android/internal/widget/NonClientDecorView.java @@ -19,6 +19,7 @@ package com.android.internal.widget; import android.content.Context; import android.graphics.Color; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.os.Looper; import android.os.RemoteException; import android.util.AttributeSet; @@ -52,7 +53,7 @@ import com.android.internal.policy.PhoneWindow; *