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