1 /*
2  * Copyright (C) 2008 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 
17 package com.android.camera;
18 
19 import android.app.Activity;
20 import android.app.AlertDialog;
21 import android.content.ActivityNotFoundException;
22 import android.content.Context;
23 import android.content.DialogInterface;
24 import android.content.DialogInterface.OnClickListener;
25 import android.content.Intent;
26 import android.net.Uri;
27 import android.provider.MediaStore;
28 import android.provider.MediaStore.Images;
29 import android.util.Log;
30 import android.view.Menu;
31 import android.view.MenuItem;
32 import android.view.MenuItem.OnMenuItemClickListener;
33 
34 
35 /**
36  * A utility class to handle various kinds of menu operations.
37  */
38 public class MenuHelper {
39     private static final String TAG = "MenuHelper";
40 
41     // TODO: These should be public and added to frameworks.
42     private static final int INCLUDE_IMAGES = (1 << 0);
43     private static final int INCLUDE_VIDEOS = (1 << 2);
44 
45     private static final int NO_ANIMATION = 0;
46     private static final String CAMERA_CLASS = "com.android.camera.Camera";
47     private static final String PANORAMA_CLASS = "com.android.camera.panorama.PanoramaActivity";
48     private static final String VIDEO_CAMERA_CLASS = "com.android.camera.VideoCamera";
49 
addSwitchModeMenuItem(Menu menu, int mode, final Runnable r)50     public static void addSwitchModeMenuItem(Menu menu, int mode,
51             final Runnable r) {
52         int labelId, iconId;
53         switch(mode) {
54             case ModePicker.MODE_VIDEO:
55                 labelId = R.string.switch_to_video_label;
56                 iconId = R.drawable.ic_menu_camera_video_view;
57                 break;
58             case ModePicker.MODE_CAMERA:
59                 labelId = R.string.switch_to_camera_label;
60                 iconId = android.R.drawable.ic_menu_camera;
61                 break;
62             case ModePicker.MODE_PANORAMA:
63                 labelId = R.string.switch_to_panorama_label;
64                 iconId = R.drawable.btn_ic_panorama;
65                 break;
66             default:
67                   // incorrect mode, do nothing.
68                   return;
69         }
70         MenuItem item = menu.add(labelId).setOnMenuItemClickListener(
71                 new OnMenuItemClickListener() {
72             public boolean onMenuItemClick(MenuItem item) {
73                 r.run();
74                 return true;
75             }
76         });
77         item.setIcon(iconId);
78     }
79 
startCameraActivity(Activity activity, Intent intent, String className)80     private static void startCameraActivity(Activity activity, Intent intent,
81             String className) {
82         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
83         intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
84         intent.setClassName(activity.getPackageName(), className);
85 
86         // Keep the camera instance for a while.
87         // This avoids re-opening the camera and saves time.
88         CameraHolder.instance().keep();
89 
90         try {
91             activity.startActivity(intent);
92         } catch (ActivityNotFoundException e) {
93             intent.setComponent(null);
94             activity.startActivity(intent);
95         }
96         activity.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
97     }
98 
gotoMode(int mode, Activity activity)99     public static void gotoMode(int mode, Activity activity) {
100         String action, className;
101         switch (mode) {
102             case ModePicker.MODE_PANORAMA:
103                 action = PANORAMA_CLASS;
104                 className = PANORAMA_CLASS;
105                 break;
106             case ModePicker.MODE_VIDEO:
107                 action = MediaStore.INTENT_ACTION_VIDEO_CAMERA;
108                 className = VIDEO_CAMERA_CLASS;
109                 break;
110             case ModePicker.MODE_CAMERA:
111                 action = MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA;
112                 className = CAMERA_CLASS;
113                 break;
114             default:
115                 Log.e(TAG, "unknown camera mode:" + mode);
116                 return;
117         }
118         startCameraActivity(activity, new Intent(action), className);
119     }
120 
gotoVideoMode(Activity activity, boolean resetEffect)121     public static void gotoVideoMode(Activity activity, boolean resetEffect) {
122         Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
123         intent.putExtra(VideoCamera.RESET_EFFECT_EXTRA, resetEffect);
124         startCameraActivity(activity, intent, VIDEO_CAMERA_CLASS);
125     }
126 
gotoCameraMode(Activity activity)127     public static void gotoCameraMode(Activity activity) {
128         Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
129         startCameraActivity(activity, intent, CAMERA_CLASS);
130     }
131 
gotoVideoMode(Activity activity, Intent intent)132     public static void gotoVideoMode(Activity activity, Intent intent) {
133         startCameraActivity(activity, intent, VIDEO_CAMERA_CLASS);
134      }
135 
gotoCameraMode(Activity activity, Intent intent)136     public static void gotoCameraMode(Activity activity, Intent intent) {
137         startCameraActivity(activity, intent, CAMERA_CLASS);
138     }
139 
gotoCameraImageGallery(Activity activity)140     public static void gotoCameraImageGallery(Activity activity) {
141         gotoGallery(activity, R.string.gallery_camera_bucket_name, INCLUDE_IMAGES);
142     }
143 
gotoCameraVideoGallery(Activity activity)144     public static void gotoCameraVideoGallery(Activity activity) {
145         gotoGallery(activity, R.string.gallery_camera_videos_bucket_name, INCLUDE_VIDEOS);
146     }
147 
gotoGallery(Activity activity, int windowTitleId, int mediaTypes)148     private static void gotoGallery(Activity activity, int windowTitleId,
149             int mediaTypes) {
150         Uri target = Images.Media.EXTERNAL_CONTENT_URI.buildUpon()
151                 .appendQueryParameter("bucketId", Storage.BUCKET_ID).build();
152         Intent intent = new Intent(Intent.ACTION_VIEW, target);
153         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
154         intent.putExtra("windowTitle", activity.getString(windowTitleId));
155         intent.putExtra("mediaTypes", mediaTypes);
156 
157         try {
158             activity.startActivity(intent);
159         } catch (ActivityNotFoundException e) {
160             Log.e(TAG, "Could not start gallery activity", e);
161         }
162     }
163 }
164