Merge "Fix bug 5090996 - Crash on tapping Menu on dial pad"
diff --git a/api/current.txt b/api/current.txt
index 7cb3bfb..7d0503d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -3072,6 +3072,7 @@
     method public abstract android.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
     method public abstract int getBackStackEntryCount();
     method public abstract android.app.Fragment getFragment(android.os.Bundle, java.lang.String);
+    method public void invalidateOptionsMenu();
     method public abstract void popBackStack();
     method public abstract void popBackStack(java.lang.String, int);
     method public abstract void popBackStack(int, int);
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 371e7ad..a8621f8 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -30,14 +30,14 @@
 import android.util.DebugUtils;
 import android.util.SparseArray;
 import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.View.OnCreateContextMenuListener;
+import android.view.ViewGroup;
 import android.widget.AdapterView;
 
 import java.io.FileDescriptor;
@@ -883,8 +883,8 @@
     public void setHasOptionsMenu(boolean hasMenu) {
         if (mHasMenu != hasMenu) {
             mHasMenu = hasMenu;
-            if (isAdded() && !isHidden() && isResumed()) {
-                mActivity.invalidateOptionsMenu();
+            if (isAdded() && !isHidden()) {
+                mFragmentManager.invalidateOptionsMenu();
             }
         }
     }
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index c33ab2c..712b55f 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -315,6 +315,12 @@
     public static void enableDebugLogging(boolean enabled) {
         FragmentManagerImpl.DEBUG = enabled;
     }
+
+    /**
+     * Invalidate the attached activity's options menu as necessary.
+     * This may end up being deferred until we move to the resumed state.
+     */
+    public void invalidateOptionsMenu() { }
 }
 
 final class FragmentManagerState implements Parcelable {
@@ -1816,7 +1822,16 @@
             }
         }
     }
-    
+
+    @Override
+    public void invalidateOptionsMenu() {
+        if (mActivity != null && mCurState == Fragment.RESUMED) {
+            mActivity.invalidateOptionsMenu();
+        } else {
+            mNeedMenuInvalidate = true;
+        }
+    }
+
     public static int reverseTransit(int transit) {
         int rev = 0;
         switch (transit) {