blob: 717f16c6f9a4a2319134b11c59f77d1c22e711ba [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 com.android.gallery3d.R;
20
21import android.app.ActionBar;
Owen Linf9a0a432011-08-17 22:07:43 +080022import android.app.Activity;
23import android.app.AlertDialog;
Owen Linf9a0a432011-08-17 22:07:43 +080024import android.content.Context;
25import android.content.DialogInterface;
Ray Chenb5f8d902011-09-13 18:35:28 +080026import android.view.LayoutInflater;
Owen Linf9a0a432011-08-17 22:07:43 +080027import android.view.Menu;
28import android.view.MenuItem;
Ray Chenb5f8d902011-09-13 18:35:28 +080029import android.view.View;
30import android.view.ViewGroup;
Ray Chenb5f8d902011-09-13 18:35:28 +080031import android.widget.BaseAdapter;
Owen Linf9a0a432011-08-17 22:07:43 +080032import android.widget.ShareActionProvider;
Ray Chenb5f8d902011-09-13 18:35:28 +080033import android.widget.TextView;
Owen Lin6cf80742011-08-28 10:50:21 +080034
35import 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 Chenb5f8d902011-09-13 18:35:28 +0800182 public void showClusterMenu(int action, ClusterRunner runner) {
183 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 Chenb5f8d902011-09-13 18:35:28 +0800192 public void hideClusterMenu() {
Owen Linf9a0a432011-08-17 22:07:43 +0800193 mClusterRunner = null;
Ray Cheneab374b2011-09-09 11:20:58 +0800194 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
Owen Linf9a0a432011-08-17 22:07:43 +0800195 }
196
197 public void showClusterDialog(final ClusterRunner clusterRunner) {
198 createDialogData();
199 final ArrayList<Integer> actions = mActions;
200 new AlertDialog.Builder(mContext).setTitle(R.string.group_by).setItems(
201 mTitles, new DialogInterface.OnClickListener() {
202 public void onClick(DialogInterface dialog, int which) {
203 clusterRunner.doCluster(actions.get(which).intValue());
204 }
205 }).create().show();
206 }
207
208 public void setTitle(String title) {
209 if (mActionBar != null) mActionBar.setTitle(title);
210 }
211
212 public void setTitle(int titleId) {
213 if (mActionBar != null) mActionBar.setTitle(titleId);
214 }
215
216 public void setSubtitle(String title) {
217 if (mActionBar != null) mActionBar.setSubtitle(title);
218 }
219
220 public void setNavigationMode(int mode) {
221 if (mActionBar != null) mActionBar.setNavigationMode(mode);
222 }
223
224 public int getHeight() {
225 return mActionBar == null ? 0 : mActionBar.getHeight();
226 }
227
Ray Chenb5f8d902011-09-13 18:35:28 +0800228 public boolean setSelectedAction(int type) {
229 for (int i = 0, n = sClusterItems.length; i < n; i++) {
Owen Lin6cf80742011-08-28 10:50:21 +0800230 ActionItem item = sClusterItems[i];
Ray Chen00b5f3c2011-11-18 15:00:32 +0800231 if (item.action == type) {
Ray Chenb5f8d902011-09-13 18:35:28 +0800232 mActionBar.setSelectedNavigationItem(i);
233 mCurrentIndex = i;
Owen Lin6cf80742011-08-28 10:50:21 +0800234 return true;
235 }
236 }
237 return false;
238 }
Ray Chenb5f8d902011-09-13 18:35:28 +0800239
Owen Lin5ccc96a2011-09-15 21:30:16 +0800240 @Override
Ray Chenb5f8d902011-09-13 18:35:28 +0800241 public boolean onNavigationItemSelected(int itemPosition, long itemId) {
242 if (itemPosition != mCurrentIndex && mClusterRunner != null) {
Owen Lin5ccc96a2011-09-15 21:30:16 +0800243 mActivity.getGLRoot().lockRenderThread();
244 try {
245 mClusterRunner.doCluster(sClusterItems[itemPosition].action);
246 } finally {
247 mActivity.getGLRoot().unlockRenderThread();
248 }
Ray Chenb5f8d902011-09-13 18:35:28 +0800249 }
Ray Chenb5f8d902011-09-13 18:35:28 +0800250 return false;
251 }
Owen Linf9a0a432011-08-17 22:07:43 +0800252}