Fix 5239335 ICS Gallery: convert tabs at Gallery home to drop down

Change-Id: I7503f724dbf16034513a6d8d6b0cb0425166a365
diff --git a/src/com/android/gallery3d/app/GalleryActionBar.java b/src/com/android/gallery3d/app/GalleryActionBar.java
index 3df5e91..7d792dd 100644
--- a/src/com/android/gallery3d/app/GalleryActionBar.java
+++ b/src/com/android/gallery3d/app/GalleryActionBar.java
@@ -19,19 +19,28 @@
 import com.android.gallery3d.R;
 
 import android.app.ActionBar;
-import android.app.ActionBar.Tab;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.FragmentTransaction;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.text.TextUtils.TruncateAt;
+import android.view.Gravity;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.BaseAdapter;
 import android.widget.ShareActionProvider;
+import android.widget.SpinnerAdapter;
+import android.widget.TextView;
+import android.widget.LinearLayout.LayoutParams;
 
 import java.util.ArrayList;
 
-public class GalleryActionBar implements ActionBar.TabListener {
+public class GalleryActionBar implements ActionBar.OnNavigationListener {
     private static final String TAG = "GalleryActionBar";
 
     public interface ClusterRunner {
@@ -42,7 +51,7 @@
         public int action;
         public boolean enabled;
         public boolean visible;
-        public int tabTitle;
+        public int spinnerTitle;
         public int dialogTitle;
         public int clusterBy;
 
@@ -51,11 +60,11 @@
             this(action, applied, enabled, title, title, clusterBy);
         }
 
-        public ActionItem(int action, boolean applied, boolean enabled, int tabTitle,
+        public ActionItem(int action, boolean applied, boolean enabled, int spinnerTitle,
                 int dialogTitle, int clusterBy) {
             this.action = action;
             this.enabled = enabled;
-            this.tabTitle = tabTitle;
+            this.spinnerTitle = spinnerTitle;
             this.dialogTitle = dialogTitle;
             this.clusterBy = clusterBy;
             this.visible = true;
@@ -75,23 +84,45 @@
                 R.string.group_by_tags)
     };
 
+    private class ClusterAdapter extends BaseAdapter {
+
+        public int getCount() {
+            return sClusterItems.length;
+        }
+
+        public Object getItem(int position) {
+            return sClusterItems[position];
+        }
+
+        public long getItemId(int position) {
+            return sClusterItems[position].action;
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            if (convertView == null) {
+                convertView = (TextView) mInflater.inflate(R.layout.action_bar_text,
+                        parent, false);
+            }
+            TextView view = (TextView) convertView;
+            view.setText(sClusterItems[position].spinnerTitle);
+            return convertView;
+        }
+    }
+
     private ClusterRunner mClusterRunner;
     private CharSequence[] mTitles;
     private ArrayList<Integer> mActions;
     private Context mContext;
+    private LayoutInflater mInflater;
     private ActionBar mActionBar;
-    // We need this because ActionBar.getSelectedTab() doesn't work when
-    // ActionBar is hidden.
-    private Tab mCurrentTab;
+    private int mCurrentIndex;
+    private ClusterAdapter mAdapter = new ClusterAdapter();
 
     public GalleryActionBar(Activity activity) {
         mActionBar = activity.getActionBar();
         mContext = activity;
-
-        for (ActionItem item : sClusterItems) {
-            mActionBar.addTab(mActionBar.newTab().setText(item.tabTitle).
-                    setTag(item).setTabListener(this));
-        }
+        mInflater = activity.getLayoutInflater();
+        mCurrentIndex = 0;
     }
 
     public static int getHeight(Activity activity) {
@@ -131,12 +162,7 @@
     }
 
     public int getClusterTypeAction() {
-        if (mCurrentTab != null) {
-            ActionItem item = (ActionItem) mCurrentTab.getTag();
-            return item.action;
-        }
-        // By default, it's group-by-album
-        return FilterUtils.CLUSTER_BY_ALBUM;
+        return sClusterItems[mCurrentIndex].action;
     }
 
     public static String getClusterByTypeString(Context context, int type) {
@@ -157,19 +183,19 @@
         return shareActionProvider;
     }
 
-    public void showClusterTabs(ClusterRunner runner) {
-        Log.v(TAG, "showClusterTabs: runner=" + runner);
-        // setNavigationMode will trigger onTabSelected, so we should avoid
-        // triggering any callback here
+    public void showClusterMenu(int action, ClusterRunner runner) {
+        Log.v(TAG, "showClusterMenu: runner=" + runner);
+        // Don't set cluster runner until action bar is ready.
         mClusterRunner = null;
-        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        mActionBar.setListNavigationCallbacks(mAdapter, this);
+        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
+        setSelectedAction(action);
         mClusterRunner = runner;
     }
 
-    public void hideClusterTabs() {
+    public void hideClusterMenu() {
         mClusterRunner = null;
         mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
-        Log.v(TAG, "hideClusterTabs: runner=" + mClusterRunner);
     }
 
     public void showClusterDialog(final ClusterRunner clusterRunner) {
@@ -203,31 +229,23 @@
         return mActionBar == null ? 0 : mActionBar.getHeight();
     }
 
-    @Override
-    public void onTabSelected(Tab tab, FragmentTransaction ft) {
-        if (mCurrentTab == tab) return;
-        mCurrentTab = tab;
-        ActionItem item = (ActionItem) tab.getTag();
-        Log.v(TAG, "onTabSelected: clusterrRunner=" + mClusterRunner);
-        if (mClusterRunner != null) mClusterRunner.doCluster(item.action);
-    }
-
-    @Override
-    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
-    }
-
-    @Override
-    public void onTabReselected(Tab tab, FragmentTransaction ft) {
-    }
-
-    public boolean setSelectedTab(int type) {
-        for (int i = 0, n = sClusterItems.length; i < n; ++i) {
+    public boolean setSelectedAction(int type) {
+        for (int i = 0, n = sClusterItems.length; i < n; i++) {
             ActionItem item = sClusterItems[i];
             if (item.visible && item.action == type) {
-                mActionBar.selectTab(mActionBar.getTabAt(i));
+                mActionBar.setSelectedNavigationItem(i);
+                mCurrentIndex = i;
                 return true;
             }
         }
         return false;
     }
+
+    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
+        if (itemPosition != mCurrentIndex && mClusterRunner != null) {
+            mClusterRunner.doCluster(sClusterItems[itemPosition].action);
+        }
+
+        return false;
+    }
 }