GalleryActionBar.java revision 1336062985c9824d7fd796b1cebd5eaa8e4163ca
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; 201336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.app.ActionBar; 211336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.app.ActionBar.OnMenuVisibilityListener; 221336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.app.ActionBar.OnNavigationListener; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.Activity; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.AlertDialog; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface; 272bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Linimport android.content.Intent; 283cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescuimport android.content.res.Resources; 29ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescuimport android.text.TextUtils.TruncateAt; 30b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.view.LayoutInflater; 311336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.Menu; 321336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.MenuItem; 33b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.view.View; 34b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.view.ViewGroup; 35b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.widget.BaseAdapter; 361336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.widget.ShareActionProvider; 37b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chenimport android.widget.TextView; 386cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 392b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.R; 40cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Linimport com.android.gallery3d.common.ApiHelper; 412b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin 426cf807453fb58ccd4cc513ff187b306c7090e67cOwen Linimport java.util.ArrayList; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 44b21b8e58a604f6c701245d84b141b5b87663192bOwen Linpublic class GalleryActionBar implements OnNavigationListener { 457817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @SuppressWarnings("unused") 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "GalleryActionBar"; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 488cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ClusterRunner mClusterRunner; 498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private CharSequence[] mTitles; 508cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ArrayList<Integer> mActions; 518cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private Context mContext; 528cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private LayoutInflater mInflater; 53b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private AbstractGalleryActivity mActivity; 54b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private ActionBar mActionBar; 558cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private int mCurrentIndex; 568cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private ClusterAdapter mAdapter = new ClusterAdapter(); 578cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 583cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private AlbumModeAdapter mAlbumModeAdapter; 593cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private OnAlbumModeSelectedListener mAlbumModeListener; 603cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private CharSequence [] mAlbumModes; 613cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public static final int ALBUM_FILMSTRIP_MODE_SELECTED = 0; 623cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public static final int ALBUM_GRID_MODE_SELECTED = 1; 633cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public interface ClusterRunner { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void doCluster(int id); 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 683cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public interface OnAlbumModeSelectedListener { 693cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public void onAlbumModeSelected(int mode); 703cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 713cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static class ActionItem { 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int action; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean enabled; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean visible; 76b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public int spinnerTitle; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int dialogTitle; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int clusterBy; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ActionItem(int action, boolean applied, boolean enabled, int title, 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int clusterBy) { 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this(action, applied, enabled, title, title, clusterBy); 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 85b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public ActionItem(int action, boolean applied, boolean enabled, int spinnerTitle, 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int dialogTitle, int clusterBy) { 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.action = action; 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.enabled = enabled; 89b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen this.spinnerTitle = spinnerTitle; 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.dialogTitle = dialogTitle; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.clusterBy = clusterBy; 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this.visible = true; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final ActionItem[] sClusterItems = new ActionItem[] { 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_ALBUM, true, false, R.string.albums, 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.group_by_album), 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_LOCATION, true, false, 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.locations, R.string.location, R.string.group_by_location), 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_TIME, true, false, R.string.times, 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.time, R.string.group_by_time), 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_FACE, true, false, R.string.people, 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.group_by_faces), 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ActionItem(FilterUtils.CLUSTER_BY_TAG, true, false, R.string.tags, 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.string.group_by_tags) 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 109b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen private class ClusterAdapter extends BaseAdapter { 110b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1117817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 112b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public int getCount() { 113b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems.length; 114b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 115b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1167817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 117b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public Object getItem(int position) { 118b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems[position]; 119b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 120b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1217817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 122b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public long getItemId(int position) { 123b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems[position].action; 124b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 125b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1267817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 127b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public View getView(int position, View convertView, ViewGroup parent) { 128b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen if (convertView == null) { 1295ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin convertView = mInflater.inflate(R.layout.action_bar_text, 130b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen parent, false); 131b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 132b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen TextView view = (TextView) convertView; 133b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen view.setText(sClusterItems[position].spinnerTitle); 134b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return convertView; 135b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 136b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 137b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 1383cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private class AlbumModeAdapter extends BaseAdapter { 1393cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 1403cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public int getCount() { 1413cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu return mAlbumModes.length; 1423cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1433cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1443cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 1453cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public Object getItem(int position) { 1463cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu return mAlbumModes[position]; 1473cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1483cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1493cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 1503cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public long getItemId(int position) { 1513cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu return position; 1523cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1533cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 154ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu private View getView(CharSequence label, View convertView, 155ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu ViewGroup parent, boolean ellipsize) { 1563cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (convertView == null) { 1573cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu convertView = mInflater.inflate(R.layout.action_bar_text, 1583cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu parent, false); 1593cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1603cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu TextView view = (TextView) convertView; 161ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu view.setEllipsize(ellipsize ? TruncateAt.END : null); 1623cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu view.setText(label); 1633cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu return convertView; 1643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1653cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1663cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 1673cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public View getView(int position, View convertView, ViewGroup parent) { 168ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu return getView(mActionBar.getTitle(), convertView, parent, true); 1693cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1703cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1713cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 1723cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public View getDropDownView(int position, View convertView, ViewGroup parent) { 173ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu return getView((CharSequence) getItem(position), convertView, parent, false); 1743cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1753cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 1763cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1778cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public static String getClusterByTypeString(Context context, int type) { 1788cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen for (ActionItem item : sClusterItems) { 1798cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (item.action == type) { 1808cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return context.getString(item.clusterBy); 1818cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1828cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1838cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return null; 1848cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 1858cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 186b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public GalleryActionBar(AbstractGalleryActivity activity) { 1871336062985c9824d7fd796b1cebd5eaa8e4163caOwen Lin mActionBar = activity.getActionBar(); 1885ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mContext = activity.getAndroidContext(); 1895ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActivity = activity; 1905ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mInflater = ((Activity) mActivity).getLayoutInflater(); 191b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mCurrentIndex = 0; 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void createDialogData() { 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<CharSequence> titles = new ArrayList<CharSequence>(); 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActions = new ArrayList<Integer>(); 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (ActionItem item : sClusterItems) { 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item.enabled && item.visible) { 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin titles.add(mContext.getString(item.dialogTitle)); 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActions.add(item.action); 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mTitles = new CharSequence[titles.size()]; 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin titles.toArray(mTitles); 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2078cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public int getHeight() { 2088cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return mActionBar != null ? mActionBar.getHeight() : 0; 2098cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 2108cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setClusterItemEnabled(int id, boolean enabled) { 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (ActionItem item : sClusterItems) { 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item.action == id) { 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.enabled = enabled; 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setClusterItemVisibility(int id, boolean visible) { 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (ActionItem item : sClusterItems) { 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item.action == id) { 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.visible = visible; 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getClusterTypeAction() { 230b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return sClusterItems[mCurrentIndex].action; 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 233fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen public void enableClusterMenu(int action, ClusterRunner runner) { 2348cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) { 2358cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen // Don't set cluster runner until action bar is ready. 2368cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mClusterRunner = null; 2378cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setListNavigationCallbacks(mAdapter, this); 238b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 2398cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen setSelectedAction(action); 2408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mClusterRunner = runner; 2418cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 244fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // The only use case not to hideMenu in this method is to ensure 245fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // all elements disappear at the same time when exiting gallery. 246fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // hideMenu should always be true in all other cases. 247fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen public void disableClusterMenu(boolean hideMenu) { 2488cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) { 2498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mClusterRunner = null; 2508cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (hideMenu) { 251b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 2528cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 253fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen } 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2563cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public void enableAlbumModeMenu(int selected, OnAlbumModeSelectedListener listener) { 2573cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mActionBar != null) { 2583cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mAlbumModeAdapter == null) { 2593cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // Initialize the album mode options if they haven't been already 2603cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu Resources res = mActivity.getResources(); 2613cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAlbumModes = new CharSequence[] { 2623cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu res.getString(R.string.switch_photo_filmstrip), 2633cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu res.getString(R.string.switch_photo_grid)}; 2643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAlbumModeAdapter = new AlbumModeAdapter(); 2653cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 2663cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAlbumModeListener = null; 2673cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActionBar.setListNavigationCallbacks(mAlbumModeAdapter, this); 2683cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 2693cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActionBar.setSelectedNavigationItem(selected); 2703cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAlbumModeListener = listener; 2713cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 2723cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 2733cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 2743cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public void disableAlbumModeMenu(boolean hideMenu) { 2753cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mActionBar != null) { 2763cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAlbumModeListener = null; 2773cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (hideMenu) { 2783cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 2793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 2803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 2813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 2823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void showClusterDialog(final ClusterRunner clusterRunner) { 284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin createDialogData(); 285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin final ArrayList<Integer> actions = mActions; 286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new AlertDialog.Builder(mContext).setTitle(R.string.group_by).setItems( 287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mTitles, new DialogInterface.OnClickListener() { 2887817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClick(DialogInterface dialog, int which) { 290677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // Need to lock rendering when operations invoked by system UI (main thread) are 291677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // modifying slot data used in GL thread for rendering. 292677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang mActivity.getGLRoot().lockRenderThread(); 293677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang try { 294677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang clusterRunner.doCluster(actions.get(which).intValue()); 295677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang } finally { 296677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang mActivity.getGLRoot().unlockRenderThread(); 297677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang } 298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }).create().show(); 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 302cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin @TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH) 303cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin private void setHomeButtonEnabled(boolean enabled) { 304b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (mActionBar != null) mActionBar.setHomeButtonEnabled(enabled); 305cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin } 306cc8e7ab7ae0912186beff20e7f042fd6c1e78b35Owen Lin 30784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen public void setDisplayOptions(boolean displayHomeAsUp, boolean showTitle) { 3082bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (mActionBar == null) return; 3092bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin int options = 0; 310b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (displayHomeAsUp) options |= ActionBar.DISPLAY_HOME_AS_UP; 311b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (showTitle) options |= ActionBar.DISPLAY_SHOW_TITLE; 3122bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 3132bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionBar.setDisplayOptions(options, 314b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE); 3152bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionBar.setHomeButtonEnabled(displayHomeAsUp); 31684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 31784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setTitle(String title) { 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActionBar != null) mActionBar.setTitle(title); 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setTitle(int titleId) { 3232bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (mActionBar != null) { 3242bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionBar.setTitle(mContext.getString(titleId)); 3252bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setSubtitle(String title) { 329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActionBar != null) mActionBar.setSubtitle(title); 330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 331f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3328cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void show() { 3338cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.show(); 3348cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 3358cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 3368cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void hide() { 3378cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.hide(); 3388cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 3398cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 3408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 3418cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.addOnMenuVisibilityListener(listener); 3428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 3438cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 3448cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 3458cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar != null) mActionBar.removeOnMenuVisibilityListener(listener); 3468cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 3478cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 348b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public boolean setSelectedAction(int type) { 3498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar == null) return false; 3508cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen 351b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen for (int i = 0, n = sClusterItems.length; i < n; i++) { 3526cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin ActionItem item = sClusterItems[i]; 35300b5f3c66113d14a7fc6f37d3a4e9d0c9b566eaaRay Chen if (item.action == type) { 354b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mActionBar.setSelectedNavigationItem(i); 355b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mCurrentIndex = i; 3566cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin return true; 3576cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin } 3586cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin } 3596cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin return false; 3606cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin } 361b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen 3625ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin @Override 363b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public boolean onNavigationItemSelected(int itemPosition, long itemId) { 3643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (itemPosition != mCurrentIndex && mClusterRunner != null 3653cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu || mAlbumModeListener != null) { 366677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // Need to lock rendering when operations invoked by system UI (main thread) are 367677584c7242d21ef2ca8adbedb5f9e3f016b54b3Yuli Huang // modifying slot data used in GL thread for rendering. 3685ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActivity.getGLRoot().lockRenderThread(); 3695ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin try { 3703cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mAlbumModeListener != null) { 3713cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAlbumModeListener.onAlbumModeSelected(itemPosition); 3723cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } else { 3733cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mClusterRunner.doCluster(sClusterItems[itemPosition].action); 3743cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 3755ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin } finally { 3765ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin mActivity.getGLRoot().unlockRenderThread(); 3775ccc96ac39f9513f13977de4419d814112c23ab8Owen Lin } 378b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 379b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen return false; 380b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen } 3812bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 382b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private Menu mActionBarMenu; 3835172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private MenuItem mSharePanoramaMenuItem; 384b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private MenuItem mShareMenuItem; 3855172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private ShareActionProvider mSharePanoramaActionProvider; 3865172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private ShareActionProvider mShareActionProvider; 3872bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 388b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public void createActionBarMenu(int menuRes, Menu menu) { 3891336062985c9824d7fd796b1cebd5eaa8e4163caOwen Lin mActivity.getMenuInflater().inflate(menuRes, menu); 390b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBarMenu = menu; 3915172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware 3925172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaMenuItem = menu.findItem(R.id.action_share_panorama); 3935172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaActionProvider = (ShareActionProvider) 3945172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaMenuItem.getActionProvider(); 3955172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaActionProvider.setShareHistoryFileName("panorama_share_history.xml"); 3965172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware 397b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mShareMenuItem = menu.findItem(R.id.action_share); 3985172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareActionProvider = (ShareActionProvider) 3995172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareMenuItem.getActionProvider(); 4005172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareActionProvider.setShareHistoryFileName("share_history.xml"); 4012bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 4022bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 403b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public Menu getMenu() { 404b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return mActionBarMenu; 4052bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 4062bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 4075172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware public void setShareIntents(Intent sharePanoramaIntent, Intent shareIntent) { 4085172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware // if panorama sharing is enabled, rename share to share as photo, 4095172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware // and move it to overflow 410f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware if (mSharePanoramaMenuItem != null) { 411f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware if (sharePanoramaIntent != null) { 412f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mActivity.invalidateOptionsMenu(); 413f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 414f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mShareMenuItem.setTitle( 415f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mContext.getResources().getString(R.string.share_as_photo)); 416f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware } else { 417f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mSharePanoramaMenuItem.setVisible(false); 418f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 419f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mShareMenuItem.setTitle( 420f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mContext.getResources().getString(R.string.share)); 421f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware } 422f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mSharePanoramaActionProvider.setShareIntent(sharePanoramaIntent); 423f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware } 424f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware if (mShareMenuItem != null) { 425f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mShareActionProvider.setShareIntent(shareIntent); 42624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin } 4272bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 429