1b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/*
2b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
4b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * you may not use this file except in compliance with the License.
6b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * You may obtain a copy of the License at
7b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
8b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
10b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * See the License for the specific language governing permissions and
14b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * limitations under the License.
15b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */
16b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
17b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.camera;
18b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
19b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.app.Activity;
20b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.app.AlertDialog;
21b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.ActivityNotFoundException;
226795ff166eea7205e33fe2f160e639c39365f373Owen Linimport android.content.Context;
23b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.DialogInterface;
240e48fe644678ccdbcf8768e19961cccab726291fChih-Chung Changimport android.content.DialogInterface.OnClickListener;
2512a37600880bacb5207520eb74a857a75e2cddefWu-cheng Liimport android.content.Intent;
26b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.net.Uri;
27b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.provider.MediaStore;
28b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.provider.MediaStore.Images;
29b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.util.Log;
309ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Changimport android.view.Menu;
319ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Changimport android.view.MenuItem;
329ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Changimport android.view.MenuItem.OnMenuItemClickListener;
33e594b19809c160637f34550f27dd7ff4a3aaf5beOwen Lin
34b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
35d5142de4d6997b05e1e05d85e1f49b7c910b5ae8Ray Chen/**
36d5142de4d6997b05e1e05d85e1f49b7c910b5ae8Ray Chen * A utility class to handle various kinds of menu operations.
37d5142de4d6997b05e1e05d85e1f49b7c910b5ae8Ray Chen */
38b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpublic class MenuHelper {
399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang    private static final String TAG = "MenuHelper";
409ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang
419e1fcfe35695fd1e71d6c86f28075ca356e5bad5Wu-cheng Li    // TODO: These should be public and added to frameworks.
429e1fcfe35695fd1e71d6c86f28075ca356e5bad5Wu-cheng Li    private static final int INCLUDE_IMAGES = (1 << 0);
439e1fcfe35695fd1e71d6c86f28075ca356e5bad5Wu-cheng Li    private static final int INCLUDE_VIDEOS = (1 << 2);
44d189083d760820ad0b0d88e11feb897e4ab5011cChih-Chung Chang
45b6be8b6567cc7d758ce58bc8ba1b05e1e9debfaeWei-Ta Chen    private static final int NO_ANIMATION = 0;
4612a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li    private static final String CAMERA_CLASS = "com.android.camera.Camera";
47a72d73cbac59db43d413291e4db66763be08143arepo sync    private static final String PANORAMA_CLASS = "com.android.camera.panorama.PanoramaActivity";
4812a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li    private static final String VIDEO_CAMERA_CLASS = "com.android.camera.VideoCamera";
49b6be8b6567cc7d758ce58bc8ba1b05e1e9debfaeWei-Ta Chen
50c159dfe54fbc0f055a1d760f1614db4a8bcec94cAngus Kong    public static void addSwitchModeMenuItem(Menu menu, int mode,
519ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang            final Runnable r) {
52a72d73cbac59db43d413291e4db66763be08143arepo sync        int labelId, iconId;
53a72d73cbac59db43d413291e4db66763be08143arepo sync        switch(mode) {
54a72d73cbac59db43d413291e4db66763be08143arepo sync            case ModePicker.MODE_VIDEO:
55a72d73cbac59db43d413291e4db66763be08143arepo sync                labelId = R.string.switch_to_video_label;
56a72d73cbac59db43d413291e4db66763be08143arepo sync                iconId = R.drawable.ic_menu_camera_video_view;
57a72d73cbac59db43d413291e4db66763be08143arepo sync                break;
58a72d73cbac59db43d413291e4db66763be08143arepo sync            case ModePicker.MODE_CAMERA:
59a72d73cbac59db43d413291e4db66763be08143arepo sync                labelId = R.string.switch_to_camera_label;
60a72d73cbac59db43d413291e4db66763be08143arepo sync                iconId = android.R.drawable.ic_menu_camera;
61a72d73cbac59db43d413291e4db66763be08143arepo sync                break;
62a72d73cbac59db43d413291e4db66763be08143arepo sync            case ModePicker.MODE_PANORAMA:
63a72d73cbac59db43d413291e4db66763be08143arepo sync                labelId = R.string.switch_to_panorama_label;
64a72d73cbac59db43d413291e4db66763be08143arepo sync                iconId = R.drawable.btn_ic_panorama;
65a72d73cbac59db43d413291e4db66763be08143arepo sync                break;
66a72d73cbac59db43d413291e4db66763be08143arepo sync            default:
67a72d73cbac59db43d413291e4db66763be08143arepo sync                  // incorrect mode, do nothing.
68a72d73cbac59db43d413291e4db66763be08143arepo sync                  return;
69a72d73cbac59db43d413291e4db66763be08143arepo sync        }
70a72d73cbac59db43d413291e4db66763be08143arepo sync        MenuItem item = menu.add(labelId).setOnMenuItemClickListener(
71a72d73cbac59db43d413291e4db66763be08143arepo sync                new OnMenuItemClickListener() {
729ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang            public boolean onMenuItemClick(MenuItem item) {
739ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang                r.run();
749ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang                return true;
759ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang            }
769ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang        });
779ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang        item.setIcon(iconId);
789ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang    }
799ae7d027bb8f55b85a158cddeb7ed84c5a0a7983Chih-Chung Chang
80bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li    private static void startCameraActivity(Activity activity, Intent intent,
8112a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li            String className) {
82272c3fdc60d4b4f773dfdff46ad3dd643ce22d5cChih-Chung Chang        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
83272c3fdc60d4b4f773dfdff46ad3dd643ce22d5cChih-Chung Chang        intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
8412a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li        intent.setClassName(activity.getPackageName(), className);
85cd65be31531717fb032b7423f8d5a77df465cfcaChih-Chung Chang
86cd65be31531717fb032b7423f8d5a77df465cfcaChih-Chung Chang        // Keep the camera instance for a while.
87cd65be31531717fb032b7423f8d5a77df465cfcaChih-Chung Chang        // This avoids re-opening the camera and saves time.
88cd65be31531717fb032b7423f8d5a77df465cfcaChih-Chung Chang        CameraHolder.instance().keep();
89cd65be31531717fb032b7423f8d5a77df465cfcaChih-Chung Chang
9012a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li        try {
9112a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li            activity.startActivity(intent);
9212a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li        } catch (ActivityNotFoundException e) {
9312a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li            intent.setComponent(null);
9412a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li            activity.startActivity(intent);
9512a37600880bacb5207520eb74a857a75e2cddefWu-cheng Li        }
96fc8589f38b3864875ee9c6de04b89d41542b53ceWu-cheng Li        activity.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
97059daa36dc6e83ca24a16d9b99925e71010bccebOwen Lin    }
98059daa36dc6e83ca24a16d9b99925e71010bccebOwen Lin
99a72d73cbac59db43d413291e4db66763be08143arepo sync    public static void gotoMode(int mode, Activity activity) {
100a72d73cbac59db43d413291e4db66763be08143arepo sync        String action, className;
101a72d73cbac59db43d413291e4db66763be08143arepo sync        switch (mode) {
102a72d73cbac59db43d413291e4db66763be08143arepo sync            case ModePicker.MODE_PANORAMA:
103a72d73cbac59db43d413291e4db66763be08143arepo sync                action = PANORAMA_CLASS;
104a72d73cbac59db43d413291e4db66763be08143arepo sync                className = PANORAMA_CLASS;
105a72d73cbac59db43d413291e4db66763be08143arepo sync                break;
106a72d73cbac59db43d413291e4db66763be08143arepo sync            case ModePicker.MODE_VIDEO:
107a72d73cbac59db43d413291e4db66763be08143arepo sync                action = MediaStore.INTENT_ACTION_VIDEO_CAMERA;
108a72d73cbac59db43d413291e4db66763be08143arepo sync                className = VIDEO_CAMERA_CLASS;
109a72d73cbac59db43d413291e4db66763be08143arepo sync                break;
110a72d73cbac59db43d413291e4db66763be08143arepo sync            case ModePicker.MODE_CAMERA:
111a72d73cbac59db43d413291e4db66763be08143arepo sync                action = MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA;
112a72d73cbac59db43d413291e4db66763be08143arepo sync                className = CAMERA_CLASS;
113a72d73cbac59db43d413291e4db66763be08143arepo sync                break;
114a72d73cbac59db43d413291e4db66763be08143arepo sync            default:
115a72d73cbac59db43d413291e4db66763be08143arepo sync                Log.e(TAG, "unknown camera mode:" + mode);
116a72d73cbac59db43d413291e4db66763be08143arepo sync                return;
117a72d73cbac59db43d413291e4db66763be08143arepo sync        }
118a72d73cbac59db43d413291e4db66763be08143arepo sync        startCameraActivity(activity, new Intent(action), className);
119a72d73cbac59db43d413291e4db66763be08143arepo sync    }
120a72d73cbac59db43d413291e4db66763be08143arepo sync
121eeeea93f90ff788a3d86e1e3bb2bb4725adff9eeWu-cheng Li    public static void gotoVideoMode(Activity activity, boolean resetEffect) {
122bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li        Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
123eeeea93f90ff788a3d86e1e3bb2bb4725adff9eeWu-cheng Li        intent.putExtra(VideoCamera.RESET_EFFECT_EXTRA, resetEffect);
124bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li        startCameraActivity(activity, intent, VIDEO_CAMERA_CLASS);
125059daa36dc6e83ca24a16d9b99925e71010bccebOwen Lin    }
126059daa36dc6e83ca24a16d9b99925e71010bccebOwen Lin
1273283e049aa080c375457de46bbf180a88899228aOwen Lin    public static void gotoCameraMode(Activity activity) {
128bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li        Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
129bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li        startCameraActivity(activity, intent, CAMERA_CLASS);
130bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li    }
131bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li
132bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li    public static void gotoVideoMode(Activity activity, Intent intent) {
133bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li        startCameraActivity(activity, intent, VIDEO_CAMERA_CLASS);
134bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li     }
135bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li
136bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li    public static void gotoCameraMode(Activity activity, Intent intent) {
137bcf6200327be0b408426221767467ad2ce132a08Wu-cheng Li        startCameraActivity(activity, intent, CAMERA_CLASS);
138b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
139b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
1403283e049aa080c375457de46bbf180a88899228aOwen Lin    public static void gotoCameraImageGallery(Activity activity) {
1410aaed976b603c56006213d196e6b0703285dafd5Chia-chi Yeh        gotoGallery(activity, R.string.gallery_camera_bucket_name, INCLUDE_IMAGES);
142b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
143b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
1443283e049aa080c375457de46bbf180a88899228aOwen Lin    public static void gotoCameraVideoGallery(Activity activity) {
1450aaed976b603c56006213d196e6b0703285dafd5Chia-chi Yeh        gotoGallery(activity, R.string.gallery_camera_videos_bucket_name, INCLUDE_VIDEOS);
146b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
147b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
1489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang    private static void gotoGallery(Activity activity, int windowTitleId,
1499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang            int mediaTypes) {
150df926b6e115e0f7fb4342abf0702258b8c285b7cRay Chen        Uri target = Images.Media.EXTERNAL_CONTENT_URI.buildUpon()
151d1ec4e36667086836cd243bee38aded5e1fd88b1Chia-chi Yeh                .appendQueryParameter("bucketId", Storage.BUCKET_ID).build();
152b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW, target);
153e3f4516c2154539cb5778ef061abf8a0ccf90a5eThe Android Open Source Project        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
154b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        intent.putExtra("windowTitle", activity.getString(windowTitleId));
155b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        intent.putExtra("mediaTypes", mediaTypes);
1569ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang
157b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        try {
158b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            activity.startActivity(intent);
159b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        } catch (ActivityNotFoundException e) {
160b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            Log.e(TAG, "Could not start gallery activity", e);
161b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
162b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
163b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
164