GalleryActionBar.java revision cc8e7ab7ae0912186beff20e7f042fd6c1e78b35
1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2011 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Linimport android.annotation.TargetApi; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.ActionBar; 21cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Linimport android.app.ActionBar.OnMenuVisibilityListener; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.Activity; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.AlertDialog; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface; 26b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.view.LayoutInflater; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.Menu; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.MenuItem; 29b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.view.View; 30b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.view.ViewGroup; 31b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.widget.BaseAdapter; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.widget.ShareActionProvider; 33b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.widget.TextView; 346cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 352b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.R; 36cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Linimport com.android.gallery3d.common.ApiHelper; 372b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin 386cf807453fb58ccd4cc513ff187b306c7090e67cOwen Linimport java.util.ArrayList; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenpublic class GalleryActionBar implements ActionBar.OnNavigationListener { 417817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @SuppressWarnings("unused") 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "GalleryActionBar"; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 448cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ClusterRunner mClusterRunner; 458cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private CharSequence[] mTitles; 468cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ArrayList<Integer> mActions; 478cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private Context mContext; 488cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private LayoutInflater mInflater; 498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActivity mActivity; 508cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ActionBar mActionBar; 518cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private int mCurrentIndex; 528cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ClusterAdapter mAdapter = new ClusterAdapter(); 538cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public interface ClusterRunner { 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void doCluster(int id); 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static class ActionItem { 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int action; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean enabled; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean visible; 62b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public int spinnerTitle; 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int dialogTitle; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int clusterBy; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ActionItem(int action, boolean applied, boolean enabled, int title, 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int clusterBy) { 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this(action, applied, enabled, title, title, clusterBy); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 71b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public ActionItem(int action, boolean applied, boolean enabled, int spinnerTitle, 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int dialogTitle, int clusterBy) { 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.action = action; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.enabled = enabled; 75b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen this.spinnerTitle = spinnerTitle; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.dialogTitle = dialogTitle; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.clusterBy = clusterBy; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.visible = true; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final ActionItem[] sClusterItems = new ActionItem[] { 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_ALBUM, true, false, R.string.albums, 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.group_by_album), 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_LOCATION, true, false, 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.locations, R.string.location, R.string.group_by_location), 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_TIME, true, false, R.string.times, 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.time, R.string.group_by_time), 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_FACE, true, false, R.string.people, 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.group_by_faces), 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_TAG, true, false, R.string.tags, 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.group_by_tags) 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen private class ClusterAdapter extends BaseAdapter { 96b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 977817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 98b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public int getCount() { 99b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems.length; 100b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 101b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1027817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 103b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public Object getItem(int position) { 104b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems[position]; 105b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 106b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1077817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 108b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public long getItemId(int position) { 109b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems[position].action; 110b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 111b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1127817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 113b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public View getView(int position, View convertView, ViewGroup parent) { 114b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen if (convertView == null) { 1155ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin convertView = mInflater.inflate(R.layout.action_bar_text, 116b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen parent, false); 117b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 118b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen TextView view = (TextView) convertView; 119b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen view.setText(sClusterItems[position].spinnerTitle); 120b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return convertView; 121b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 122b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 123b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1248cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public static String getClusterByTypeString(Context context, int type) { 1258cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen for (ActionItem item : sClusterItems) { 1268cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (item.action == type) { 1278cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return context.getString(item.clusterBy); 1288cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1298cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1308cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return null; 1318cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1328cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 1338cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public static ShareActionProvider initializeShareActionProvider(Menu menu) { 1348cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen MenuItem item = menu.findItem(R.id.action_share); 1358cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen ShareActionProvider shareActionProvider = null; 1368cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (item != null) { 1378cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen shareActionProvider = (ShareActionProvider) item.getActionProvider(); 1388cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1398cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return shareActionProvider; 1408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1425ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin public GalleryActionBar(GalleryActivity activity) { 1435ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActionBar = ((Activity) activity).getActionBar(); 1445ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mContext = activity.getAndroidContext(); 1455ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActivity = activity; 1465ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mInflater = ((Activity) mActivity).getLayoutInflater(); 147b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mCurrentIndex = 0; 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void createDialogData() { 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<CharSequence> titles = new ArrayList<CharSequence>(); 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActions = new ArrayList<Integer>(); 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (ActionItem item : sClusterItems) { 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item.enabled && item.visible) { 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin titles.add(mContext.getString(item.dialogTitle)); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActions.add(item.action); 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mTitles = new CharSequence[titles.size()]; 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin titles.toArray(mTitles); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1638cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public int getHeight() { 1648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return mActionBar != null ? mActionBar.getHeight() : 0; 1658cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1668cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setClusterItemEnabled(int id, boolean enabled) { 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (ActionItem item : sClusterItems) { 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item.action == id) { 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.enabled = enabled; 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setClusterItemVisibility(int id, boolean visible) { 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (ActionItem item : sClusterItems) { 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item.action == id) { 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.visible = visible; 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getClusterTypeAction() { 186b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems[mCurrentIndex].action; 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 189fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen public void enableClusterMenu(int action, ClusterRunner runner) { 1908cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) { 1918cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen // Don't set cluster runner until action bar is ready. 1928cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mClusterRunner = null; 1938cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setListNavigationCallbacks(mAdapter, this); 1948cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 1958cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen setSelectedAction(action); 1968cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mClusterRunner = runner; 1978cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 200fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // The only use case not to hideMenu in this method is to ensure 201fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // all elements disappear at the same time when exiting gallery. 202fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // hideMenu should always be true in all other cases. 203fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen public void disableClusterMenu(boolean hideMenu) { 2048cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) { 2058cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mClusterRunner = null; 2068cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (hideMenu) { 2078cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 2088cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 209fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen } 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void showClusterDialog(final ClusterRunner clusterRunner) { 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin createDialogData(); 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin final ArrayList<Integer> actions = mActions; 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new AlertDialog.Builder(mContext).setTitle(R.string.group_by).setItems( 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mTitles, new DialogInterface.OnClickListener() { 2177817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClick(DialogInterface dialog, int which) { 219677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // Need to lock rendering when operations invoked by system UI (main thread) are 220677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // modifying slot data used in GL thread for rendering. 221677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang mActivity.getGLRoot().lockRenderThread(); 222677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang try { 223677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang clusterRunner.doCluster(actions.get(which).intValue()); 224677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang } finally { 225677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang mActivity.getGLRoot().unlockRenderThread(); 226677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang } 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }).create().show(); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 231cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin @TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH) 232cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin private void setHomeButtonEnabled(boolean enabled) { 233cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin mActionBar.setHomeButtonEnabled(enabled); 234cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin } 235cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin 23684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen public void setDisplayOptions(boolean displayHomeAsUp, boolean showTitle) { 23784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mActionBar != null) { 23884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen int options = (displayHomeAsUp ? ActionBar.DISPLAY_HOME_AS_UP : 0) | 23984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen (showTitle ? ActionBar.DISPLAY_SHOW_TITLE : 0); 2408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setDisplayOptions(options, 24184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE); 242cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin setHomeButtonEnabled(displayHomeAsUp); 24384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 24484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 24584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setTitle(String title) { 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActionBar != null) mActionBar.setTitle(title); 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setTitle(int titleId) { 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActionBar != null) mActionBar.setTitle(titleId); 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setSubtitle(String title) { 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActionBar != null) mActionBar.setSubtitle(title); 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2588cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void show() { 2598cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.show(); 2608cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 2618cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 2628cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void hide() { 2638cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.hide(); 2648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 2658cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 2668cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 2678cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.addOnMenuVisibilityListener(listener); 2688cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 2698cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 2708cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 2718cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.removeOnMenuVisibilityListener(listener); 2728cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 2738cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 274b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public boolean setSelectedAction(int type) { 2758cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar == null) return false; 2768cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 277b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen for (int i = 0, n = sClusterItems.length; i < n; i++) { 2786cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin ActionItem item = sClusterItems[i]; 27900b5f3c66113d14a7fc6f37d3a4e9d0c9b566eaaRay Chen if (item.action == type) { 280b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mActionBar.setSelectedNavigationItem(i); 281b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mCurrentIndex = i; 2826cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin return true; 2836cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin } 2846cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin } 2856cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin return false; 2866cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin } 287b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 2885ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin @Override 289b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public boolean onNavigationItemSelected(int itemPosition, long itemId) { 290b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen if (itemPosition != mCurrentIndex && mClusterRunner != null) { 291677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // Need to lock rendering when operations invoked by system UI (main thread) are 292677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // modifying slot data used in GL thread for rendering. 2935ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActivity.getGLRoot().lockRenderThread(); 2945ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin try { 2955ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mClusterRunner.doCluster(sClusterItems[itemPosition].action); 2965ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin } finally { 2975ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActivity.getGLRoot().unlockRenderThread(); 2985ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin } 299b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 300b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return false; 301b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 303