am fb24dbd6: am 51bf4916: am 86a3adca: Merge "Magic null-background filling for PhoneWindows" into lmp-dev
* commit 'fb24dbd64fe88856ac84d58e0e5c693254098780': Magic null-background filling for PhoneWindows
This commit is contained in:
@@ -22,6 +22,7 @@ import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Outline;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.ActionMode;
|
||||
@@ -384,7 +385,23 @@ public class ActionBarContainer extends FrameLayout {
|
||||
|
||||
@Override
|
||||
public int getOpacity() {
|
||||
return 0;
|
||||
if (mIsSplit) {
|
||||
if (mSplitBackground != null
|
||||
&& mSplitBackground.getOpacity() == PixelFormat.OPAQUE) {
|
||||
return PixelFormat.OPAQUE;
|
||||
}
|
||||
} else {
|
||||
if (mIsStacked && (mStackedBackground == null
|
||||
|| mStackedBackground.getOpacity() != PixelFormat.OPAQUE)) {
|
||||
return PixelFormat.UNKNOWN;
|
||||
}
|
||||
if (!isCollapsed(mActionBarView) && mBackground != null
|
||||
&& mBackground.getOpacity() == PixelFormat.OPAQUE) {
|
||||
return PixelFormat.OPAQUE;
|
||||
}
|
||||
}
|
||||
|
||||
return PixelFormat.UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
101
core/java/com/android/internal/widget/BackgroundFallback.java
Normal file
101
core/java/com/android/internal/widget/BackgroundFallback.java
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* 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 com.android.internal.widget;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
/**
|
||||
* Helper class for drawing a fallback background in framework decor layouts.
|
||||
* Useful for when an app has not set a window background but we're asked to draw
|
||||
* an uncovered area.
|
||||
*/
|
||||
public class BackgroundFallback {
|
||||
private Drawable mBackgroundFallback;
|
||||
|
||||
public void setDrawable(Drawable d) {
|
||||
mBackgroundFallback = d;
|
||||
}
|
||||
|
||||
public boolean hasFallback() {
|
||||
return mBackgroundFallback != null;
|
||||
}
|
||||
|
||||
public void draw(ViewGroup root, Canvas c, View content) {
|
||||
if (!hasFallback()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw the fallback in the padding.
|
||||
final int width = root.getWidth();
|
||||
final int height = root.getHeight();
|
||||
int left = width;
|
||||
int top = height;
|
||||
int right = 0;
|
||||
int bottom = 0;
|
||||
|
||||
final int childCount = root.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
final View child = root.getChildAt(i);
|
||||
final Drawable childBg = child.getBackground();
|
||||
if (child == content) {
|
||||
// We always count the content view container unless it has no background
|
||||
// and no children.
|
||||
if (childBg == null && child instanceof ViewGroup &&
|
||||
((ViewGroup) child).getChildCount() == 0) {
|
||||
continue;
|
||||
}
|
||||
} else if (child.getVisibility() != View.VISIBLE || childBg == null ||
|
||||
childBg.getOpacity() != PixelFormat.OPAQUE) {
|
||||
// Potentially translucent or invisible children don't count, and we assume
|
||||
// the content view will cover the whole area if we're in a background
|
||||
// fallback situation.
|
||||
continue;
|
||||
}
|
||||
left = Math.min(left, child.getLeft());
|
||||
top = Math.min(top, child.getTop());
|
||||
right = Math.max(right, child.getRight());
|
||||
bottom = Math.max(bottom, child.getBottom());
|
||||
}
|
||||
|
||||
if (left >= right || top >= bottom) {
|
||||
// No valid area to draw in.
|
||||
return;
|
||||
}
|
||||
|
||||
if (top > 0) {
|
||||
mBackgroundFallback.setBounds(0, 0, width, top);
|
||||
mBackgroundFallback.draw(c);
|
||||
}
|
||||
if (left > 0) {
|
||||
mBackgroundFallback.setBounds(0, top, left, height);
|
||||
mBackgroundFallback.draw(c);
|
||||
}
|
||||
if (right < width) {
|
||||
mBackgroundFallback.setBounds(right, top, width, height);
|
||||
mBackgroundFallback.draw(c);
|
||||
}
|
||||
if (bottom < height) {
|
||||
mBackgroundFallback.setBounds(left, bottom, right, height);
|
||||
mBackgroundFallback.draw(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,5 +49,4 @@ public interface DecorContentParent {
|
||||
void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);
|
||||
void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);
|
||||
void dismissPopups();
|
||||
|
||||
}
|
||||
|
||||
@@ -308,6 +308,10 @@
|
||||
null so it will not be drawn.
|
||||
</ul> -->
|
||||
<attr name="windowBackground" format="reference" />
|
||||
<!-- Drawable to draw selectively within the inset areas when the windowBackground
|
||||
has been set to null. This protects against seeing visual garbage in the
|
||||
surface when the app has not drawn any content into this area. -->
|
||||
<attr name="windowBackgroundFallback" format="reference" />
|
||||
<!-- Drawable to use as a frame around the window. -->
|
||||
<attr name="windowFrame" format="reference" />
|
||||
<!-- Flag indicating whether there should be no title on this window. -->
|
||||
@@ -1772,6 +1776,7 @@
|
||||
<!-- The set of attributes that describe a Windows's theme. -->
|
||||
<declare-styleable name="Window">
|
||||
<attr name="windowBackground" />
|
||||
<attr name="windowBackgroundFallback" />
|
||||
<attr name="windowContentOverlay" />
|
||||
<attr name="windowFrame" />
|
||||
<attr name="windowNoTitle" />
|
||||
|
||||
@@ -2060,4 +2060,5 @@
|
||||
<java-symbol type="layout" name="resolver_different_item_header" />
|
||||
<java-symbol type="array" name="config_default_vm_number" />
|
||||
<java-symbol type="integer" name="config_cdma_3waycall_flash_delay"/>
|
||||
<java-symbol type="attr" name="windowBackgroundFallback" />
|
||||
</resources>
|
||||
|
||||
@@ -169,6 +169,7 @@ please see themes_device_defaults.xml.
|
||||
|
||||
<!-- 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>
|
||||
|
||||
@@ -145,7 +145,7 @@ please see themes_device_defaults.xml.
|
||||
<item name="galleryItemBackground">@drawable/gallery_item_background</item>
|
||||
|
||||
<!-- Window attributes -->
|
||||
<item name="windowBackground">@color/background_material_dark</item>
|
||||
<item name="windowBackground">?attr/colorBackground</item>
|
||||
<item name="windowClipToOutline">true</item>
|
||||
<item name="windowFrame">@null</item>
|
||||
<item name="windowNoTitle">false</item>
|
||||
@@ -489,7 +489,7 @@ please see themes_device_defaults.xml.
|
||||
<item name="galleryItemBackground">@drawable/gallery_item_background</item>
|
||||
|
||||
<!-- Window attributes -->
|
||||
<item name="windowBackground">@color/background_material_light</item>
|
||||
<item name="windowBackground">?attr/colorBackground</item>
|
||||
<item name="windowClipToOutline">true</item>
|
||||
<item name="windowFrame">@null</item>
|
||||
<item name="windowNoTitle">false</item>
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.android.internal.view.menu.MenuDialogHelper;
|
||||
import com.android.internal.view.menu.MenuPresenter;
|
||||
import com.android.internal.view.menu.MenuView;
|
||||
import com.android.internal.widget.ActionBarContextView;
|
||||
import com.android.internal.widget.BackgroundFallback;
|
||||
import com.android.internal.widget.DecorContentParent;
|
||||
import com.android.internal.widget.SwipeDismissLayout;
|
||||
|
||||
@@ -211,6 +212,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
private ProgressBar mHorizontalProgressBar;
|
||||
|
||||
private int mBackgroundResource = 0;
|
||||
private int mBackgroundFallbackResource = 0;
|
||||
|
||||
private Drawable mBackgroundDrawable;
|
||||
|
||||
@@ -1326,6 +1328,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
if (mDecor != null) {
|
||||
mDecor.setWindowBackground(drawable);
|
||||
}
|
||||
if (mBackgroundFallbackResource != 0) {
|
||||
mDecor.setBackgroundFallback(drawable != null ? 0 : mBackgroundFallbackResource);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2153,6 +2158,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
|
||||
private View mStatusColorView;
|
||||
private View mNavigationColorView;
|
||||
private final BackgroundFallback mBackgroundFallback = new BackgroundFallback();
|
||||
|
||||
private int mLastTopInset = 0;
|
||||
private int mLastBottomInset = 0;
|
||||
@@ -2165,6 +2171,17 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
mFeatureId = featureId;
|
||||
}
|
||||
|
||||
public void setBackgroundFallback(int resId) {
|
||||
mBackgroundFallback.setDrawable(resId != 0 ? getContext().getDrawable(resId) : null);
|
||||
setWillNotDraw(getBackground() == null && !mBackgroundFallback.hasFallback());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas c) {
|
||||
super.onDraw(c);
|
||||
mBackgroundFallback.draw(mContentRoot, c, mContentParent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||
final int keyCode = event.getKeyCode();
|
||||
@@ -3342,6 +3359,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
if (mFrameResource == 0) {
|
||||
mFrameResource = a.getResourceId(R.styleable.Window_windowFrame, 0);
|
||||
}
|
||||
mBackgroundFallbackResource = a.getResourceId(
|
||||
R.styleable.Window_windowBackgroundFallback, 0);
|
||||
if (false) {
|
||||
System.out.println("Background: "
|
||||
+ Integer.toHexString(mBackgroundResource) + " Frame: "
|
||||
@@ -3557,6 +3576,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
}
|
||||
}
|
||||
|
||||
if (mDecor.getBackground() == null && mBackgroundFallbackResource != 0) {
|
||||
mDecor.setBackgroundFallback(mBackgroundFallbackResource);
|
||||
}
|
||||
|
||||
// Only inflate or create a new TransitionManager if the caller hasn't
|
||||
// already set a custom one.
|
||||
if (hasFeature(FEATURE_ACTIVITY_TRANSITIONS)) {
|
||||
|
||||
Reference in New Issue
Block a user