Don't use invalidateOptionsMenu before API level 11.

Change-Id: If46d46e44797b2bd4f66235eca0954a55d0008cf
diff --git a/gallerycommon/src/com/android/gallery3d/common/ApiHelper.java b/gallerycommon/src/com/android/gallery3d/common/ApiHelper.java
index 4545b92..305fb2c 100644
--- a/gallerycommon/src/com/android/gallery3d/common/ApiHelper.java
+++ b/gallerycommon/src/com/android/gallery3d/common/ApiHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.gallery3d.common;
 
+import android.app.Activity;
 import android.os.Build;
 import android.provider.MediaStore.MediaColumns;
 import android.view.View;
@@ -60,6 +61,9 @@
     public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK =
             Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
 
+    public static final boolean HAS_ACTIVITY_INVALIDATE_OPTIONS_MENU =
+            hasMethod(Activity.class, "invalidateOptionsMenu");
+
     private static boolean hasField(Class<?> klass, String fieldName) {
         try {
             klass.getDeclaredField(fieldName);
@@ -72,11 +76,21 @@
     private static boolean hasMethod(String className, String methodName,
             Class<?>... parameterTypes) {
         try {
-            Class klass = Class.forName(className);
+            Class<?> klass = Class.forName(className);
             klass.getDeclaredMethod(methodName, parameterTypes);
             return true;
         } catch (Throwable th) {
             return false;
         }
     }
+
+    private static boolean hasMethod(
+            Class<?> klass, String methodName, Class<?> ... paramTypes) {
+        try {
+            klass.getDeclaredMethod(methodName, paramTypes);
+            return true;
+        } catch (NoSuchMethodException e) {
+            return false;
+        }
+    }
 }
diff --git a/src/com/android/gallery3d/app/AbstractGalleryActivity.java b/src/com/android/gallery3d/app/AbstractGalleryActivity.java
index 9b2a85e..24d5dbc 100644
--- a/src/com/android/gallery3d/app/AbstractGalleryActivity.java
+++ b/src/com/android/gallery3d/app/AbstractGalleryActivity.java
@@ -16,6 +16,7 @@
 
 package com.android.gallery3d.app;
 
+import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
@@ -27,11 +28,13 @@
 import android.content.IntentFilter;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.view.Menu;
 import android.view.MenuItem;
 import android.view.Window;
 import android.view.WindowManager;
 
 import com.android.gallery3d.R;
+import com.android.gallery3d.common.ApiHelper;
 import com.android.gallery3d.data.BitmapPool;
 import com.android.gallery3d.data.DataManager;
 import com.android.gallery3d.data.MediaItem;
@@ -85,18 +88,42 @@
         toggleStatusBarByOrientation();
     }
 
+    private Menu mOptionsMenu;
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        mOptionsMenu = menu;
+        super.onCreateOptionsMenu(menu);
+        return getStateManager().createOptionsMenu(menu);
+    }
+
+    @Override
+    @TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB)
+    public void invalidateOptionsMenu() {
+        if (ApiHelper.HAS_ACTIVITY_INVALIDATE_OPTIONS_MENU) {
+            super.invalidateOptionsMenu();
+        } else if (mOptionsMenu != null) {
+            mOptionsMenu.clear();
+            getStateManager().createOptionsMenu(mOptionsMenu);
+        }
+    }
+
+    @Override
     public Context getAndroidContext() {
         return this;
     }
 
+    @Override
     public DataManager getDataManager() {
         return ((GalleryApp) getApplication()).getDataManager();
     }
 
+    @Override
     public ThreadPool getThreadPool() {
         return ((GalleryApp) getApplication()).getThreadPool();
     }
 
+    @Override
     public synchronized StateManager getStateManager() {
         if (mStateManager == null) {
             mStateManager = new StateManager(this);
@@ -104,10 +131,12 @@
         return mStateManager;
     }
 
+    @Override
     public GLRoot getGLRoot() {
         return mGLRootView;
     }
 
+    @Override
     public OrientationManager getOrientationManager() {
         return mOrientationManager;
     }
diff --git a/src/com/android/gallery3d/app/ActivityState.java b/src/com/android/gallery3d/app/ActivityState.java
index 867cda3..c870855 100644
--- a/src/com/android/gallery3d/app/ActivityState.java
+++ b/src/com/android/gallery3d/app/ActivityState.java
@@ -27,7 +27,6 @@
 import android.os.Bundle;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
 
@@ -135,7 +134,7 @@
 
     // should only be called by StateManager
     void resume() {
-        Activity activity = (Activity) mActivity;
+        AbstractGalleryActivity activity = (AbstractGalleryActivity) mActivity;
         ActionBar actionBar = activity.getActionBar();
         if (actionBar != null) {
             if ((mFlags & FLAG_HIDE_ACTION_BAR) != 0) {
diff --git a/src/com/android/gallery3d/app/Gallery.java b/src/com/android/gallery3d/app/Gallery.java
index 468d202..0d5770c 100644
--- a/src/com/android/gallery3d/app/Gallery.java
+++ b/src/com/android/gallery3d/app/Gallery.java
@@ -26,7 +26,6 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.OpenableColumns;
-import android.view.Menu;
 import android.view.Window;
 import android.widget.Toast;
 
@@ -37,7 +36,6 @@
 import com.android.gallery3d.data.MediaSet;
 import com.android.gallery3d.data.Path;
 import com.android.gallery3d.picasasource.PicasaSource;
-import com.android.gallery3d.ui.GLRoot;
 import com.android.gallery3d.util.GalleryUtils;
 
 public final class Gallery extends AbstractGalleryActivity implements OnCancelListener {
@@ -232,12 +230,6 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-        return getStateManager().createOptionsMenu(menu);
-    }
-
-    @Override
     protected void onResume() {
         Utils.assertTrue(getStateManager().getStateCount() > 0);
         super.onResume();