From 9b40728fdcbfa8a56af36618d165de4526637c85 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Mon, 1 Jul 2013 12:57:51 -0700 Subject: [PATCH] Change order of setting isOpen Because the WindowManager.addView() method can indirectly call PhoneWindow.closePanel() it is critical to set isOpen after the addView call returns in PhoneWindow.openPanel. Otherwise when closePanel sets isOpen to false PhoneWindow will be in to an inconsistent state. Fixes bug 9404689. Change-Id: If0129a0859546b35445df0f4be2f422c4807fba7 --- .../android/internal/policy/impl/PhoneWindow.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 71855b2fa9113..5a95f4c8dc5bd 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -646,9 +646,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } - Slog.d(TAG, "openPanel: b9404689 setting isOpen true, st=" + st + " decorView=" - + st.decorView); - st.isOpen = true; st.isHandled = false; WindowManager.LayoutParams lp = new WindowManager.LayoutParams( @@ -666,8 +663,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } lp.windowAnimations = st.windowAnimations; - + wm.addView(st.decorView, lp); + Slog.d(TAG, "openPanel: b9404689 setting isOpen true, st=" + st + " decorView=" + + st.decorView); + st.isOpen = true; // Log.v(TAG, "Adding main menu to window manager."); } @@ -696,7 +696,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { */ public final void closePanel(PanelFeatureState st, boolean doCallback) { // System.out.println("Close panel: isOpen=" + st.isOpen); - Slog.d(TAG, "closePanel: b9404689 entry, st=" + st + " decorView=" + st.decorView); + Slog.d(TAG, "closePanel: b9404689 entry, st=" + st + " isOpen=" + st.isOpen + + " decorView=" + st.decorView + " Callers=" + Debug.getCallers(4)); if (doCallback && st.featureId == FEATURE_OPTIONS_PANEL && mActionBar != null && mActionBar.isOverflowMenuShowing()) { checkCloseActionMenu(st.menu); @@ -717,6 +718,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (doCallback) { callOnPanelClosed(st.featureId, st, null); } + } else { + Slog.d(TAG, "closePanel: b9404689 not removing wm=" + wm); } st.isPrepared = false;