blob: 93b6e8b1e5b047505f39f8c675ed0a8e0981f5be [file] [log] [blame]
Owen Linf9a0a432011-08-17 22:07:43 +08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.app;
18
Owen Linf9a0a432011-08-17 22:07:43 +080019import android.app.ActionBar;
Owen Linf9a0a432011-08-17 22:07:43 +080020import android.app.Activity;
21import android.app.AlertDialog;
Owen Linf9a0a432011-08-17 22:07:43 +080022import android.content.Context;
23import android.content.DialogInterface;
Ray Chenb5f8d902011-09-13 18:35:28 +080024import android.view.LayoutInflater;
Owen Linf9a0a432011-08-17 22:07:43 +080025import android.view.Menu;
26import android.view.MenuItem;
Ray Chenb5f8d902011-09-13 18:35:28 +080027import android.view.View;
28import android.view.ViewGroup;
Ray Chenb5f8d902011-09-13 18:35:28 +080029import android.widget.BaseAdapter;
Owen Linf9a0a432011-08-17 22:07:43 +080030import android.widget.ShareActionProvider;
Ray Chenb5f8d902011-09-13 18:35:28 +080031import android.widget.TextView;
Owen Lin6cf80742011-08-28 10:50:21 +080032
Owen Lin2b3ee0e2012-03-14 17:27:24 +080033import com.android.gallery3d.R;
34
Owen Lin6cf80742011-08-28 10:50:21 +080035import java.util.ArrayList;
Owen Linf9a0a432011-08-17 22:07:43 +080036
Ray Chenb5f8d902011-09-13 18:35:28 +080037public class GalleryActionBar implements ActionBar.OnNavigationListener {
Owen Linf9a0a432011-08-17 22:07:43 +080038 private static final String TAG = "GalleryActionBar";
39
40 public interface ClusterRunner {
41 public void doCluster(int id);
42 }
43
44 private static class ActionItem {
45 public int action;
46 public boolean enabled;
47 public boolean visible;
Ray Chenb5f8d902011-09-13 18:35:28 +080048 public int spinnerTitle;
Owen Linf9a0a432011-08-17 22:07:43 +080049 public int dialogTitle;
50 public int clusterBy;
51
52 public ActionItem(int action, boolean applied, boolean enabled, int title,
53 int clusterBy) {
54 this(action, applied, enabled, title, title, clusterBy);
55 }
56
Ray Chenb5f8d902011-09-13 18:35:28 +080057 public ActionItem(int action, boolean applied, boolean enabled, int spinnerTitle,
Owen Linf9a0a432011-08-17 22:07:43 +080058 int dialogTitle, int clusterBy) {
59 this.action = action;
60 this.enabled = enabled;
Ray Chenb5f8d902011-09-13 18:35:28 +080061 this.spinnerTitle = spinnerTitle;
Owen Linf9a0a432011-08-17 22:07:43 +080062 this.dialogTitle = dialogTitle;
63 this.clusterBy = clusterBy;
64 this.visible = true;
65 }
66 }
67
68 private static final ActionItem[] sClusterItems = new ActionItem[] {
69 new ActionItem(FilterUtils.CLUSTER_BY_ALBUM, true, false, R.string.albums,
70 R.string.group_by_album),
71 new ActionItem(FilterUtils.CLUSTER_BY_LOCATION, true, false,
72 R.string.locations, R.string.location, R.string.group_by_location),
73 new ActionItem(FilterUtils.CLUSTER_BY_TIME, true, false, R.string.times,
74 R.string.time, R.string.group_by_time),
75 new ActionItem(FilterUtils.CLUSTER_BY_FACE, true, false, R.string.people,
76 R.string.group_by_faces),
77 new ActionItem(FilterUtils.CLUSTER_BY_TAG, true, false, R.string.tags,
78 R.string.group_by_tags)
79 };
80
Ray Chenb5f8d902011-09-13 18:35:28 +080081 private class ClusterAdapter extends BaseAdapter {
82
83 public int getCount() {
84 return sClusterItems.length;
85 }
86
87 public Object getItem(int position) {
88 return sClusterItems[position];
89 }
90
91 public long getItemId(int position) {
92 return sClusterItems[position].action;
93 }
94
95 public View getView(int position, View convertView, ViewGroup parent) {
96 if (convertView == null) {
Owen Lin5ccc96a2011-09-15 21:30:16 +080097 convertView = mInflater.inflate(R.layout.action_bar_text,
Ray Chenb5f8d902011-09-13 18:35:28 +080098 parent, false);
99 }
100 TextView view = (TextView) convertView;
101 view.setText(sClusterItems[position].spinnerTitle);
102 return convertView;
103 }
104 }
105
Owen Linf9a0a432011-08-17 22:07:43 +0800106 private ClusterRunner mClusterRunner;
107 private CharSequence[] mTitles;
108 private ArrayList<Integer> mActions;
109 private Context mContext;
Ray Chenb5f8d902011-09-13 18:35:28 +0800110 private LayoutInflater mInflater;
Owen Lin5ccc96a2011-09-15 21:30:16 +0800111 private GalleryActivity mActivity;
Owen Linf9a0a432011-08-17 22:07:43 +0800112 private ActionBar mActionBar;
Ray Chenb5f8d902011-09-13 18:35:28 +0800113 private int mCurrentIndex;
114 private ClusterAdapter mAdapter = new ClusterAdapter();
Owen Linf9a0a432011-08-17 22:07:43 +0800115
Owen Lin5ccc96a2011-09-15 21:30:16 +0800116 public GalleryActionBar(GalleryActivity activity) {
117 mActionBar = ((Activity) activity).getActionBar();
118 mContext = activity.getAndroidContext();
119 mActivity = activity;
120 mInflater = ((Activity) mActivity).getLayoutInflater();
Ray Chenb5f8d902011-09-13 18:35:28 +0800121 mCurrentIndex = 0;
Owen Linf9a0a432011-08-17 22:07:43 +0800122 }
123
124 public static int getHeight(Activity activity) {
125 ActionBar actionBar = activity.getActionBar();
126 return actionBar != null ? actionBar.getHeight() : 0;
127 }
128
129 private void createDialogData() {
130 ArrayList<CharSequence> titles = new ArrayList<CharSequence>();
131 mActions = new ArrayList<Integer>();
132 for (ActionItem item : sClusterItems) {
133 if (item.enabled && item.visible) {
134 titles.add(mContext.getString(item.dialogTitle));
135 mActions.add(item.action);
136 }
137 }
138 mTitles = new CharSequence[titles.size()];
139 titles.toArray(mTitles);
140 }
141
142 public void setClusterItemEnabled(int id, boolean enabled) {
143 for (ActionItem item : sClusterItems) {
144 if (item.action == id) {
145 item.enabled = enabled;
146 return;
147 }
148 }
149 }
150
151 public void setClusterItemVisibility(int id, boolean visible) {
152 for (ActionItem item : sClusterItems) {
153 if (item.action == id) {
154 item.visible = visible;
155 return;
156 }
157 }
158 }
159
160 public int getClusterTypeAction() {
Ray Chenb5f8d902011-09-13 18:35:28 +0800161 return sClusterItems[mCurrentIndex].action;
Owen Linf9a0a432011-08-17 22:07:43 +0800162 }
163
164 public static String getClusterByTypeString(Context context, int type) {
165 for (ActionItem item : sClusterItems) {
166 if (item.action == type) {
167 return context.getString(item.clusterBy);
168 }
169 }
170 return null;
171 }
172
173 public static ShareActionProvider initializeShareActionProvider(Menu menu) {
174 MenuItem item = menu.findItem(R.id.action_share);
175 ShareActionProvider shareActionProvider = null;
176 if (item != null) {
177 shareActionProvider = (ShareActionProvider) item.getActionProvider();
Owen Linf9a0a432011-08-17 22:07:43 +0800178 }
179 return shareActionProvider;
180 }
181
Ray Chenfe1625c2012-02-17 13:12:32 +0800182 public void enableClusterMenu(int action, ClusterRunner runner) {
Ray Chenb5f8d902011-09-13 18:35:28 +0800183 Log.v(TAG, "showClusterMenu: runner=" + runner);
184 // Don't set cluster runner until action bar is ready.
Ray Cheneab374b2011-09-09 11:20:58 +0800185 mClusterRunner = null;
Ray Chenb5f8d902011-09-13 18:35:28 +0800186 mActionBar.setListNavigationCallbacks(mAdapter, this);
187 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
188 setSelectedAction(action);
Owen Linf9a0a432011-08-17 22:07:43 +0800189 mClusterRunner = runner;
190 }
191
Ray Chenfe1625c2012-02-17 13:12:32 +0800192 // The only use case not to hideMenu in this method is to ensure
193 // all elements disappear at the same time when exiting gallery.
194 // hideMenu should always be true in all other cases.
195 public void disableClusterMenu(boolean hideMenu) {
Owen Linf9a0a432011-08-17 22:07:43 +0800196 mClusterRunner = null;
Ray Chenfe1625c2012-02-17 13:12:32 +0800197 if (hideMenu) {
198 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
199 }
Owen Linf9a0a432011-08-17 22:07:43 +0800200 }
201
202 public void showClusterDialog(final ClusterRunner clusterRunner) {
203 createDialogData();
204 final ArrayList<Integer> actions = mActions;
205 new AlertDialog.Builder(mContext).setTitle(R.string.group_by).setItems(
206 mTitles, new DialogInterface.OnClickListener() {
207 public void onClick(DialogInterface dialog, int which) {
208 clusterRunner.doCluster(actions.get(which).intValue());
209 }
210 }).create().show();
211 }
212
213 public void setTitle(String title) {
214 if (mActionBar != null) mActionBar.setTitle(title);
215 }
216
217 public void setTitle(int titleId) {
218 if (mActionBar != null) mActionBar.setTitle(titleId);
219 }
220
221 public void setSubtitle(String title) {
222 if (mActionBar != null) mActionBar.setSubtitle(title);
223 }
224
Ray Chenb5f8d902011-09-13 18:35:28 +0800225 public boolean setSelectedAction(int type) {
226 for (int i = 0, n = sClusterItems.length; i < n; i++) {
Owen Lin6cf80742011-08-28 10:50:21 +0800227 ActionItem item = sClusterItems[i];
Ray Chen00b5f3c2011-11-18 15:00:32 +0800228 if (item.action == type) {
Ray Chenb5f8d902011-09-13 18:35:28 +0800229 mActionBar.setSelectedNavigationItem(i);
230 mCurrentIndex = i;
Owen Lin6cf80742011-08-28 10:50:21 +0800231 return true;
232 }
233 }
234 return false;
235 }
Ray Chenb5f8d902011-09-13 18:35:28 +0800236
Owen Lin5ccc96a2011-09-15 21:30:16 +0800237 @Override
Ray Chenb5f8d902011-09-13 18:35:28 +0800238 public boolean onNavigationItemSelected(int itemPosition, long itemId) {
239 if (itemPosition != mCurrentIndex && mClusterRunner != null) {
Owen Lin5ccc96a2011-09-15 21:30:16 +0800240 mActivity.getGLRoot().lockRenderThread();
241 try {
242 mClusterRunner.doCluster(sClusterItems[itemPosition].action);
243 } finally {
244 mActivity.getGLRoot().unlockRenderThread();
245 }
Ray Chenb5f8d902011-09-13 18:35:28 +0800246 }
Ray Chenb5f8d902011-09-13 18:35:28 +0800247 return false;
248 }
Owen Linf9a0a432011-08-17 22:07:43 +0800249}