Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 474690ca authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #8325007: EyeEm app crashes on launch- NPE at...

...android.view.ViewGroup.measureChildWithMargins

The app is doing grungy stuff with trying to insert its own
views inside the window decor.  This new custom layout of the
action bar was assuming it would get fitSystemWindows() called
at which point it would retrieve all of its child views...  but
with the app doing this, it blocks the call down to
fitSystemWindows() and breaks us.  So we now make the layout
manager more robust and ensure it has retrieved its children
when measuring.

Also fix an issue where the xlarge layouts were not updated.

Change-Id: I6c69f26f26b59a6aa8fa1e5788288ffce0b490ca
parent 7cf71fbd
Loading
Loading
Loading
Loading
+21 −16
Original line number Diff line number Diff line
@@ -73,10 +73,6 @@ public class ActionBarOverlayLayout extends ViewGroup {
        ta.recycle();
    }

    public void setOverlayMode(boolean mode) {
        mOverlayMode = mode;
    }

    public void setActionBar(ActionBarImpl impl, boolean overlayMode) {
        mActionBar = impl;
        mOverlayMode = overlayMode;
@@ -177,7 +173,9 @@ public class ActionBarOverlayLayout extends ViewGroup {

        // The top and bottom action bars are always within the content area.
        boolean changed = applyInsets(mActionBarTop, insets, true, true, false, true);
        if (mActionBarBottom != null) {
            changed |= applyInsets(mActionBarBottom, insets, true, false, true, true);
        }

        mBaseInnerInsets.set(insets);
        computeFitSystemWindows(mBaseInnerInsets, mBaseContentInsets);
@@ -219,6 +217,8 @@ public class ActionBarOverlayLayout extends ViewGroup {

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        pullChildren();

        int maxHeight = 0;
        int maxWidth = 0;
        int childState = 0;
@@ -234,6 +234,8 @@ public class ActionBarOverlayLayout extends ViewGroup {
                mActionBarTop.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
        childState = combineMeasuredStates(childState, mActionBarTop.getMeasuredState());

        // xlarge screen layout doesn't have bottom action bar.
        if (mActionBarBottom != null) {
            measureChildWithMargins(mActionBarBottom, widthMeasureSpec, 0, heightMeasureSpec, 0);
            lp = (LayoutParams) mActionBarBottom.getLayoutParams();
            maxWidth = Math.max(maxWidth,
@@ -241,6 +243,7 @@ public class ActionBarOverlayLayout extends ViewGroup {
            maxHeight = Math.max(maxHeight,
                    mActionBarBottom.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
            childState = combineMeasuredStates(childState, mActionBarBottom.getMeasuredState());
        }

        final int vis = getWindowSystemUiVisibility();
        final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0;
@@ -264,12 +267,14 @@ public class ActionBarOverlayLayout extends ViewGroup {

        if (mActionView.isSplitActionBar()) {
            // If action bar is split, adjust bottom insets for it.
            if (mActionBarBottom != null) {
                if (stable) {
                    bottomInset = mActionBarHeight;
                } else {
                    bottomInset = mActionBarBottom.getMeasuredHeight();
                }
            }
        }

        // If the window has not requested system UI layout flags, we need to
        // make sure its content is not being covered by system UI...  though it
+34 −24
Original line number Diff line number Diff line
@@ -15,17 +15,28 @@
-->

<!--
This is an optimized layout for a screen with the Action Bar enabled.
This is an optimized layout for a screen with
the Action Bar enabled overlaying application content.
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
<com.android.internal.widget.ActionBarOverlayLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/action_bar_overlay_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:splitMotionEvents="false">
    <FrameLayout android:id="@android:id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <LinearLayout android:id="@+id/top_action_bar"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content">
        <com.android.internal.widget.ActionBarContainer android:id="@+id/action_bar_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        style="?android:attr/actionBarStyle">
            android:layout_alignParentTop="true"
            style="?android:attr/actionBarStyle"
            android:gravity="top">
            <com.android.internal.widget.ActionBarView
                android:id="@+id/action_bar"
                android:layout_width="match_parent"
@@ -38,10 +49,9 @@ This is an optimized layout for a screen with the Action Bar enabled.
                android:visibility="gone"
                style="?android:attr/actionModeStyle" />
        </com.android.internal.widget.ActionBarContainer>
    <FrameLayout android:id="@android:id/content"
        <ImageView android:src="?android:attr/windowContentOverlay"
                   android:scaleType="fitXY"
                   android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:foregroundGravity="fill_horizontal|top"
        android:foreground="?android:attr/windowContentOverlay" />
                   android:layout_height="wrap_content" />
    </LinearLayout>
</com.android.internal.widget.ActionBarOverlayLayout>
+0 −58
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 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.
-->

<!--
This is an optimized layout for a screen with
the Action Bar enabled overlaying application content.
-->

<com.android.internal.widget.ActionBarOverlayLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/action_bar_overlay_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:splitMotionEvents="false">
    <FrameLayout android:id="@android:id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <LinearLayout android:id="@+id/top_action_bar"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_gravity="top">
        <com.android.internal.widget.ActionBarContainer android:id="@+id/action_bar_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            style="?android:attr/actionBarStyle"
            android:gravity="top">
            <com.android.internal.widget.ActionBarView
                android:id="@+id/action_bar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="?android:attr/actionBarStyle" />
            <com.android.internal.widget.ActionBarContextView
                android:id="@+id/action_context_bar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="gone"
                style="?android:attr/actionModeStyle" />
        </com.android.internal.widget.ActionBarContainer>
        <ImageView android:src="?android:attr/windowContentOverlay"
                   android:scaleType="fitXY"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content" />
    </LinearLayout>
</com.android.internal.widget.ActionBarOverlayLayout>
+0 −1
Original line number Diff line number Diff line
@@ -1363,7 +1363,6 @@
  <java-symbol type="layout" name="keyguard_account_view" />
  <java-symbol type="layout" name="recent_apps_dialog" />
  <java-symbol type="layout" name="screen_action_bar" />
  <java-symbol type="layout" name="screen_action_bar_overlay" />
  <java-symbol type="layout" name="screen_custom_title" />
  <java-symbol type="layout" name="screen_progress" />
  <java-symbol type="layout" name="screen_simple" />