MenuHelper.java revision 9ae6df03a2d07ef400ec80f60cf14263649bcba1
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 19101d528d59f447847d5c6b7578642132c2b76f4fOwen Linimport com.android.camera.gallery.IImage; 20101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 21b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.app.Activity; 22b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.app.AlertDialog; 23b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.ActivityNotFoundException; 24b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.DialogInterface; 25b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.Intent; 26b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.SharedPreferences; 27b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.res.Configuration; 28b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.media.MediaMetadataRetriever; 29b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.net.Uri; 30b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.Environment; 31b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.Handler; 32b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.StatFs; 33b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.provider.MediaStore; 34b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.provider.MediaStore.Images; 35b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.util.Config; 36b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.util.Log; 37b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.Menu; 38b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.MenuItem; 399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Changimport android.view.MenuItem.OnMenuItemClickListener; 40b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.SubMenu; 41b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.View; 42b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.widget.ImageView; 43b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.widget.TextView; 44b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.widget.Toast; 45b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 469ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Changimport java.io.Closeable; 479ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Changimport java.text.SimpleDateFormat; 489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Changimport java.util.ArrayList; 499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Changimport java.util.Date; 50b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 51b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpublic class MenuHelper { 529ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static final String TAG = "MenuHelper"; 539ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 549ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int GENERIC_ITEM = 1; 559ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int IMAGE_SAVING_ITEM = 2; 569ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int VIDEO_SAVING_ITEM = 3; 579ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int IMAGE_MODE_ITEM = 4; 589ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int VIDEO_MODE_ITEM = 5; 599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_ITEM_MAX = 5; 609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 619ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_ALL = 0xFFFFFFFF; 629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_VIEWPLAY_MENU = (1 << 0); 639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_SHARE_MENU = (1 << 1); 649ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_SET_MENU = (1 << 2); 659ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_CROP_MENU = (1 << 3); 669ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_DELETE_MENU = (1 << 4); 679ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_ROTATE_MENU = (1 << 5); 689ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int INCLUDE_DETAILS_MENU = (1 << 6); 699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_SWITCH_CAMERA_MODE = 0; 719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_CAPTURE_PICTURE = 1; 729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_CAPTURE_VIDEO = 2; 739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_SHARE = 10; 749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_SET = 14; 759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_SET_WALLPAPER = 15; 769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_SET_CONTACT = 16; 779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_SET_MYFAVE = 17; 789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_CROP = 18; 799ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_ROTATE = 19; 809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_ROTATE_LEFT = 20; 819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_ROTATE_RIGHT = 21; 829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_IMAGE_TOSS = 22; 839ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_VIDEO_PLAY = 23; 849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_VIDEO_SHARE = 24; 859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static final int MENU_VIDEO_TOSS = 27; 869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 879ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static final long SHARE_FILE_LENGTH_LIMIT = 3L * 1024L * 1024L; 88e3f4516c2154539cb5778ef061abf8a0ccf90a5eThe Android Open Source Project 89b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static final int NO_STORAGE_ERROR = -1; 90b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static final int CANNOT_STAT_ERROR = -2; 91b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 92b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project /** Activity result code used to report crop results. 93b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */ 94b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static final int RESULT_COMMON_MENU_CROP = 490; 95b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 96b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public interface MenuItemsResult { 97101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public void gettingReadyToOpen(Menu menu, IImage image); 98101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public void aboutToCall(MenuItem item, IImage image); 99b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 100b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 101b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public interface MenuInvoker { 102b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public void run(MenuCallback r); 103b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 104b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 105b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public interface MenuCallback { 106101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public void run(Uri uri, IImage image); 107b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 108b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 109b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project private static void closeSilently(Closeable target) { 110b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project try { 111b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (target != null) target.close(); 112b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } catch (Throwable t) { 113b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // ignore all exceptions, that's what silently means 114b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 115b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 116b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 117101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public static long getImageFileSize(IImage image) { 118b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project java.io.InputStream data = image.fullSizeImageData(); 1199c9be2eb4a86fc3468dbba1ec5f7bfdb37d22c74The Android Open Source Project if (data == null) return -1; 120b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project try { 121b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return data.available(); 122b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } catch (java.io.IOException ex) { 123b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return -1; 124b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } finally { 125b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project closeSilently(data); 126b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 127b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 128b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 12947bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang // This is a hack before we find a solution to pass a permission to other 13047bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang // applications. See bug #1735149. 13147bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang // Checks if the URI starts with "content://mms". 13247bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang public static boolean isMMSUri(Uri uri) { 13347bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang return (uri != null) && 13447bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang uri.getScheme().equals("content") && 13547bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang uri.getAuthority().equals("mms"); 13647bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang } 13747bf4ced40df23a26db78fe5aec5dfce98ed797eChih-Chung Chang 138eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang public static void enableShareMenuItem(Menu menu, boolean enabled) { 139eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang MenuItem item = menu.findItem(MENU_IMAGE_SHARE); 140eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang if (item != null) { 141eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang item.setVisible(enabled); 142eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang item.setEnabled(enabled); 143eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang } 144eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang } 145eb9d8a271a8c16514cc75a0ba1c54cfcf5d311fdChih-Chung Chang 1469ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onDetailsClicked(MenuInvoker onInvoke, 1479ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final Activity activity, 1489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final boolean isImage) { 1499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 1509ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri u, IImage image) { 1519ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (image == null) { 1529ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return; 1539ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 1549ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 1559ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang AlertDialog.Builder builder = new AlertDialog.Builder(activity); 1569ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 1579ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final View d = View.inflate(activity, R.layout.detailsview, 1589ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang null); 1599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 1609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ImageView imageView = (ImageView) d.findViewById( 1619ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_thumbnail_image); 1629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang imageView.setImageBitmap(image.miniThumbBitmap()); 1639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 1649ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang TextView textView = (TextView) d.findViewById( 1659ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_image_title); 1669ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang textView.setText(image.getDisplayName()); 1679ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 1689ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang long length = getImageFileSize(image); 1699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String lengthString = lengthString = length < 0 ? "" 1709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang : android.text.format.Formatter.formatFileSize( 1719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity, length); 1729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d 1739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .findViewById(R.id.details_file_size_value)) 1749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(lengthString); 1759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 1769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int dimensionWidth = 0; 1779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int dimensionHeight = 0; 1789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (isImage) { 1799ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionWidth = image.getWidth(); 1809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionHeight = image.getHeight(); 1819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_duration_row) 1829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 1839ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_frame_rate_row) 1849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 1859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_bit_rate_row) 1869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 1879ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_format_row) 1889ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 1899ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_codec_row) 1909ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 1919ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } else { 1929ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever retriever 1939ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang = new MediaMetadataRetriever(); 1949ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 1959ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.setMode(MediaMetadataRetriever 1969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .MODE_GET_METADATA_ONLY); 1979ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.setDataSource(image.getDataPath()); 1989ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 1999ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionWidth = Integer.parseInt( 2009ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.extractMetadata( 2019ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever 2029ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .METADATA_KEY_VIDEO_WIDTH)); 2039ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionHeight = Integer.parseInt( 2049ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.extractMetadata( 2059ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever 2069ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .METADATA_KEY_VIDEO_HEIGHT)); 2079ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (NumberFormatException e) { 2089ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionWidth = 0; 2099ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionHeight = 0; 2109ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2119ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2129ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 2139ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int durationMs = Integer.parseInt( 2149ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.extractMetadata( 2159ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever 2169ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .METADATA_KEY_DURATION)); 2179ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String durationValue = formatDuration( 2189ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity, durationMs); 2199ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d.findViewById( 2209ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_duration_value)) 2219ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(durationValue); 2229ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (NumberFormatException e) { 2239ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById( 2249ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_frame_rate_row) 2259ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 2269ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2279ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2289ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 2299ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String frameRate = String.format( 2309ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.getString(R.string.details_fps), 2319ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Integer.parseInt( 2329ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.extractMetadata( 2339ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever 2349ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .METADATA_KEY_FRAME_RATE))); 2359ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d.findViewById( 2369ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_frame_rate_value)) 2379ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(frameRate); 2389ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (NumberFormatException e) { 2399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById( 2409ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_frame_rate_row) 2419ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 2429ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2439ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2449ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 2459ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang long bitRate = Long.parseLong( 2469ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.extractMetadata( 2479ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever 2489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .METADATA_KEY_BIT_RATE)); 2499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String bps; 2509ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (bitRate < 1000000) { 2519ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang bps = String.format( 2529ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.getString( 2539ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.details_kbps), 2549ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang bitRate / 1000); 2559ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } else { 2569ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang bps = String.format( 2579ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.getString( 2589ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.details_mbps), 2599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((double) bitRate) / 1000000.0); 2609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2619ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d.findViewById( 2629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_bit_rate_value)) 2639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(bps); 2649ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (NumberFormatException e) { 2659ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_bit_rate_row) 2669ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 2679ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2689ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String format = retriever.extractMetadata( 2709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever 2719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .METADATA_KEY_VIDEO_FORMAT); 2729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d.findViewById( 2739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_format_value)) 2749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(format); 2759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String codec = retriever.extractMetadata( 2779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaMetadataRetriever.METADATA_KEY_CODEC); 2789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2799ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (codec == null) { 2809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_codec_row). 2819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang setVisibility(View.GONE); 2829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } else { 2839ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d.findViewById( 2849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.id.details_codec_value)) 2859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(codec); 2869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2879ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (RuntimeException ex) { 2889ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // Assume this is a corrupt video file. 2899ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } finally { 2909ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 2919ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang retriever.release(); 2929ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (RuntimeException ex) { 2939ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // Ignore failures while cleaning up. 2949ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2959ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 2979ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 2989ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String dimensionsString = String.format( 2999ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.getString(R.string.details_dimension_x), 3009ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dimensionWidth, dimensionHeight); 3019ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d 3029ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .findViewById(R.id.details_resolution_value)) 3039ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(dimensionsString); 3049ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3059ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String dateString = ""; 3069ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang long dateTaken = image.getDateTaken(); 3079ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (dateTaken != 0) { 3089ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Date date = new Date(image.getDateTaken()); 3099ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang SimpleDateFormat dateFormat = new SimpleDateFormat(); 3109ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dateString = dateFormat.format(date); 3119ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3129ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ((TextView) d 3139ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .findViewById(R.id.details_date_taken_value)) 3149ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setText(dateString); 3159ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } else { 3169ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang d.findViewById(R.id.details_date_taken_row) 3179ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setVisibility(View.GONE); 3189ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3199ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3209ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang builder.setNeutralButton(R.string.details_ok, 3219ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new DialogInterface.OnClickListener() { 3229ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void onClick(DialogInterface dialog, 3239ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int which) { 3249ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang dialog.dismiss(); 3259ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3269ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 3279ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3289ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang builder.setIcon(android.R.drawable.ic_dialog_info) 3299ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setTitle(R.string.details_panel_title) 3309ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setView(d) 3319ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .show(); 3329ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3339ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 3349ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 3359ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3369ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3379ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onRotateLeftClicked(MenuInvoker onInvoke) { 3389ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 3399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri u, IImage image) { 3409ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (image == null || image.isReadonly()) { 3419ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return; 3429ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3439ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang image.rotateImageBy(-90); 3449ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3459ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 3469ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 3479ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onRotateRightClicked(MenuInvoker onInvoke) { 3509ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 3519ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri u, IImage image) { 3529ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (image == null || image.isReadonly()) { 3539ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return; 3549ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3559ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang image.rotateImageBy(90); 3569ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3579ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 3589ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 3599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3619ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onCropClicked(MenuInvoker onInvoke, 3629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final Activity activity) { 3639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 3649ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri u, IImage image) { 3659ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (u == null) { 3669ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return; 3679ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3689ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent cropIntent = new Intent(); 3709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang cropIntent.setClass(activity, CropImage.class); 3719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang cropIntent.setData(u); 3729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivityForResult(cropIntent, 3739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang RESULT_COMMON_MENU_CROP); 3749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 3769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 3779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3799ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onImageSaveClicked(MenuInvoker onInvoke, 3809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final Activity activity) { 3819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 3829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri u, IImage image) { 3839ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (u == null || image == null) { 3849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return; 3859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 3879ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (Config.LOGV) { 3889ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Log.v(TAG, "in callback u is " + u + "; mime type is " 3899ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang + image.getMimeType()); 3909ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3919ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent intent = new Intent(Intent.ACTION_ATTACH_DATA); 3929ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.setDataAndType(u, image.getMimeType()); 3939ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.putExtra("mimeType", image.getMimeType()); 3949ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivity(Intent.createChooser(intent, 3959ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.getText(R.string.setImage))); 3969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 3979ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 3989ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 3999ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4009ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 4019ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onImageShareClicked(MenuInvoker onInvoke, 4029ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final Activity activity, final boolean isImage) { 4039ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 4049ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri u, IImage image) { 4059ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (image == null) return; 4069ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (!isImage && getImageFileSize(image) 4079ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang > SHARE_FILE_LENGTH_LIMIT) { 4089ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Toast.makeText(activity, 4099ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.too_large_to_attach, 4109ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Toast.LENGTH_LONG).show(); 4119ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return; 4129ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4139ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 4149ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent intent = new Intent(); 4159ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.setAction(Intent.ACTION_SEND); 4169ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String mimeType = image.getMimeType(); 4179ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.setType(mimeType); 4189ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.putExtra(Intent.EXTRA_STREAM, u); 4199ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang boolean isImage = ImageManager.isImageMimeType(mimeType); 4209ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 4219ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivity(Intent.createChooser(intent, 4229ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.getText(isImage 4239ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? R.string.sendImage 4249ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang : R.string.sendVideo))); 4259ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (android.content.ActivityNotFoundException ex) { 4269ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Toast.makeText(activity, isImage 4279ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? R.string.no_way_to_share_image 4289ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang : R.string.no_way_to_share_video, 4299ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Toast.LENGTH_SHORT).show(); 4309ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4319ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4329ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 4339ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 4349ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4359ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 4369ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onViewPlayClicked(MenuInvoker onInvoke, 4379ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final Activity activity) { 4389ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onInvoke.run(new MenuCallback() { 4399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void run(Uri uri, IImage image) { 4409ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (image != null) { 4419ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent intent = new Intent(Intent.ACTION_VIEW, 4429ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang image.fullSizeImageUri()); 4439ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivity(intent); 4449ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4459ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }}); 4469ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 4479ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 4489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 449b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static MenuItemsResult addImageMenuItems( 450b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Menu menu, 451b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int inclusions, 452b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final boolean isImage, 453b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final Activity activity, 454b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final Handler handler, 455b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final Runnable onDelete, 456b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final MenuInvoker onInvoke) { 4579ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final ArrayList<MenuItem> requiresWriteAccessItems = 4589ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new ArrayList<MenuItem>(); 4599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final ArrayList<MenuItem> requiresNoDrmAccessItems = 4609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new ArrayList<MenuItem>(); 461b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 462b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (isImage && ((inclusions & INCLUDE_ROTATE_MENU) != 0)) { 4639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang SubMenu rotateSubmenu = menu.addSubMenu(IMAGE_SAVING_ITEM, 4649ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MENU_IMAGE_ROTATE, 40, R.string.rotate) 4659ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setIcon(android.R.drawable.ic_menu_rotate); 466b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // Don't show the rotate submenu if the item at hand is read only 4679ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // since the items within the submenu won't be shown anyway. This 4689ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // is really a framework bug in that it shouldn't show the submenu 4699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // if the submenu has no visible items. 470b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project requiresWriteAccessItems.add(rotateSubmenu.getItem()); 471b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (rotateSubmenu != null) { 4729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang requiresWriteAccessItems.add( 4739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang rotateSubmenu.add(0, MENU_IMAGE_ROTATE_LEFT, 50, 4749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.rotate_left) 4759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener( 4769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 4779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 4789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onRotateLeftClicked(onInvoke); 479b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 4809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }).setAlphabeticShortcut('l')); 4819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang requiresWriteAccessItems.add( 4829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang rotateSubmenu.add(0, MENU_IMAGE_ROTATE_RIGHT, 60, 4839ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.rotate_right) 4849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener( 4859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 4869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 4879ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onRotateRightClicked(onInvoke); 488b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 4899ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }).setAlphabeticShortcut('r')); 490b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 491b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 492b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 493b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (isImage && ((inclusions & INCLUDE_CROP_MENU) != 0)) { 494b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project MenuItem autoCrop = menu.add(IMAGE_SAVING_ITEM, MENU_IMAGE_CROP, 73, 4959ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.camera_crop); 4969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang autoCrop.setIcon(android.R.drawable.ic_menu_crop); 4979ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang autoCrop.setOnMenuItemClickListener( 4989ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 4999ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 5009ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onCropClicked(onInvoke, activity); 501b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 502b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }); 503b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project requiresWriteAccessItems.add(autoCrop); 504b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 505b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 506b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (isImage && ((inclusions & INCLUDE_SET_MENU) != 0)) { 5079ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MenuItem setMenu = menu.add(IMAGE_SAVING_ITEM, MENU_IMAGE_SET, 75, 5089ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.camera_set); 509b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project setMenu.setIcon(android.R.drawable.ic_menu_set_as); 5109ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang setMenu.setOnMenuItemClickListener( 5119ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 5129ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 5139ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onImageSaveClicked(onInvoke, activity); 514b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 515b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }); 516b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 517b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 518b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if ((inclusions & INCLUDE_SHARE_MENU) != 0) { 519b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project MenuItem item1 = menu.add(IMAGE_SAVING_ITEM, MENU_IMAGE_SHARE, 10, 520b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project R.string.camera_share).setOnMenuItemClickListener( 521b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project new MenuItem.OnMenuItemClickListener() { 5229ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 5239ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onImageShareClicked(onInvoke, activity, 5249ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang isImage); 525b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 526b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }); 527b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project item1.setIcon(android.R.drawable.ic_menu_share); 528b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project MenuItem item = item1; 529b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project requiresNoDrmAccessItems.add(item); 530b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 531b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 532b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if ((inclusions & INCLUDE_DELETE_MENU) != 0) { 5339ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MenuItem deleteItem = menu.add(IMAGE_SAVING_ITEM, MENU_IMAGE_TOSS, 5349ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 70, R.string.camera_toss); 535b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project requiresWriteAccessItems.add(deleteItem); 5369ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang deleteItem.setOnMenuItemClickListener( 5379ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 5389ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 5399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang deleteImpl(activity, onDelete, isImage); 5409ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 5419ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 5429ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }) 5439ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setAlphabeticShortcut('d') 5449ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setIcon(android.R.drawable.ic_menu_delete); 545b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 546b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 547b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if ((inclusions & INCLUDE_DETAILS_MENU) != 0) { 5489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MenuItem detailsMenu = menu.add(0, 0, 80, R.string.details) 5499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 550b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 5519ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onDetailsClicked(onInvoke, activity, isImage); 552b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 553b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }); 554b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project detailsMenu.setIcon(R.drawable.ic_menu_view_details); 555b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 556b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 557b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if ((!isImage) && ((inclusions & INCLUDE_VIEWPLAY_MENU) != 0)) { 558b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project menu.add(VIDEO_SAVING_ITEM, MENU_VIDEO_PLAY, 0, R.string.video_play) 5599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener( 5609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 561b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 5629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onViewPlayClicked(onInvoke, activity); 563b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 564b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }); 565b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 566b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 567b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 568b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return new MenuItemsResult() { 569101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public void gettingReadyToOpen(Menu menu, IImage image) { 5709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // protect against null here. this isn't strictly speaking 5719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // required but if a client app isn't handling sdcard removal 5729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // properly it could happen 573b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (image == null) { 574b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return; 575b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 576b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project boolean readOnly = image.isReadonly(); 577b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project boolean isDrm = image.isDrm(); 5789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (Config.LOGV) { 579b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Log.v(TAG, "readOnly: " + readOnly + "; drm: " + isDrm); 5809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 5819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang for (MenuItem item : requiresWriteAccessItems) { 5829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (Config.LOGV) { 583b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Log.v(TAG, "item is " + item.toString()); 5849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 5859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang item.setVisible(!readOnly); 5869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang item.setEnabled(!readOnly); 587b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 5889ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang for (MenuItem item : requiresNoDrmAccessItems) { 5899ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (Config.LOGV) { 590b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Log.v(TAG, "item is " + item.toString()); 5919ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 5929ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang item.setVisible(!isDrm); 5939ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang item.setEnabled(!isDrm); 594b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 595b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 5969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 597101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public void aboutToCall(MenuItem menu, IImage image) { 598b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 599b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }; 600b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 601b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 602b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static void deletePhoto(Activity activity, Runnable onDelete) { 6037638a541959f3f371b9998844a0bbef2df4aa3eeRay Chen deleteImpl(activity, onDelete, true); 6047638a541959f3f371b9998844a0bbef2df4aa3eeRay Chen } 605095afa19556bf550262e3cccb9edacc04e6f726aOwen Lin 6067638a541959f3f371b9998844a0bbef2df4aa3eeRay Chen static void deleteVideo(Activity activity, Runnable onDelete) { 6077638a541959f3f371b9998844a0bbef2df4aa3eeRay Chen deleteImpl(activity, onDelete, false); 608b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 609b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6109ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang static void deleteImage(Activity activity, Runnable onDelete, 6119ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang IImage image) { 612b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (image != null) { 6137638a541959f3f371b9998844a0bbef2df4aa3eeRay Chen deleteImpl(activity, onDelete, ImageManager.isImage(image)); 614b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 615b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 616b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6179ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static void deleteImpl(Activity activity, final Runnable onDelete, 6189ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang boolean isPhoto) { 6199ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang boolean confirm = android.preference.PreferenceManager 6209ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .getDefaultSharedPreferences(activity) 6219ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .getBoolean("pref_gallery_confirm_delete_key", true); 622b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (!confirm) { 6239ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (onDelete != null) { 624b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project onDelete.run(); 6259ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 626b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } else { 627b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project displayDeleteDialog(activity, onDelete, isPhoto); 628b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 629b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 630b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 631b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static void displayDeleteDialog(Activity activity, 632b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final Runnable onDelete, boolean isPhoto) { 6339ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang android.app.AlertDialog.Builder b = 6349ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new android.app.AlertDialog.Builder(activity); 635b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project b.setIcon(android.R.drawable.ic_dialog_alert); 636b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project b.setTitle(R.string.confirm_delete_title); 6379ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang b.setMessage(isPhoto 6389ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? R.string.confirm_delete_message 639b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project : R.string.confirm_delete_video_message); 6409ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang b.setPositiveButton(android.R.string.ok, 6419ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new android.content.DialogInterface.OnClickListener() { 6429ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void onClick(android.content.DialogInterface v, 6439ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int x) { 6449ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (onDelete != null) { 6459ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang onDelete.run(); 6469ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 6479ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 6489ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 6499ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang b.setNegativeButton(android.R.string.cancel, 6509ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new android.content.DialogInterface.OnClickListener() { 6519ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public void onClick(android.content.DialogInterface v, 6529ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int x) { 6539ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 6549ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 655b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project b.create().show(); 656b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 657b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 658b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static void addSwitchModeMenuItem(Menu menu, final Activity activity, 659b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project final boolean switchToVideo) { 6609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int group = switchToVideo 6619ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? MenuHelper.IMAGE_MODE_ITEM 6629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang : MenuHelper.VIDEO_MODE_ITEM; 6639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int labelId = switchToVideo 6649ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? R.string.switch_to_video_lable 665b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project : R.string.switch_to_camera_lable; 6669ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int iconId = switchToVideo 6679ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? R.drawable.ic_menu_camera_video_view 668b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project : android.R.drawable.ic_menu_camera; 6699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MenuItem item = menu.add(group, MENU_SWITCH_CAMERA_MODE, 0, labelId) 6709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener(new OnMenuItemClickListener() { 6719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 6729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String action = switchToVideo 6739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ? MediaStore.INTENT_ACTION_VIDEO_CAMERA 6749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang : MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA; 6759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent intent = new Intent(action); 6769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 6779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 6789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivity(intent); 6799ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 6809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 6819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }); 682b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project item.setIcon(iconId); 683b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 684b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 685b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static void gotoStillImageCapture(Activity activity) { 686b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); 687b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 688b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project try { 689b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project activity.startActivity(intent); 690b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } catch (ActivityNotFoundException e) { 691b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Log.e(TAG, "Could not start still image capture activity", e); 692b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 693b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 694b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 695b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static void gotoCameraImageGallery(Activity activity) { 6969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang gotoGallery(activity, R.string.gallery_camera_bucket_name, 6979ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang ImageManager.INCLUDE_IMAGES); 698b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 699b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 700b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static void gotoCameraVideoGallery(Activity activity) { 701b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project gotoGallery(activity, R.string.gallery_camera_videos_bucket_name, 702b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project ImageManager.INCLUDE_VIDEOS); 703b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 704b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 7059ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static void gotoGallery(Activity activity, int windowTitleId, 7069ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int mediaTypes) { 7079ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Uri target = Images.Media.INTERNAL_CONTENT_URI.buildUpon() 7089ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .appendQueryParameter("bucketId", 709b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project ImageManager.CAMERA_IMAGE_BUCKET_ID).build(); 710b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW, target); 711e3f4516c2154539cb5778ef061abf8a0ccf90a5eThe Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 712b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project intent.putExtra("windowTitle", activity.getString(windowTitleId)); 713b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project intent.putExtra("mediaTypes", mediaTypes); 7149ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 7159ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // Request unspecified so that we match the current camera orientation 7169ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // rather than matching the "flip orientation" preference. 717b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // Disabled because people don't care for it. Also it's 7189ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // not as compelling now that we have implemented have quick orientation 7199ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // flipping. 720b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, 7219ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // android.content.pm.ActivityInfo 7229ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // .SCREEN_ORIENTATION_UNSPECIFIED); 723b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project try { 724b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project activity.startActivity(intent); 725b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } catch (ActivityNotFoundException e) { 726b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Log.e(TAG, "Could not start gallery activity", e); 727b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 728b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 729b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 730de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project static void addCapturePictureMenuItems(Menu menu, final Activity activity) { 731b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project menu.add(0, MENU_CAPTURE_PICTURE, 1, R.string.capture_picture) 7329ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener( 7339ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 7349ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 7359ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent intent = new Intent( 7369ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); 737e3f4516c2154539cb5778ef061abf8a0ccf90a5eThe Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 738b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project try { 7399ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivity(intent); 740b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } catch (android.content.ActivityNotFoundException e) { 741b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // Ignore exception 742b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 7439ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 7449ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 7459ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }).setIcon(android.R.drawable.ic_menu_camera); 746de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project } 747b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 748de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project static void addCaptureVideoMenuItems(Menu menu, final Activity activity) { 749b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project menu.add(0, MENU_CAPTURE_VIDEO, 2, R.string.capture_video) 7509ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .setOnMenuItemClickListener( 7519ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 7529ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 7539ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Intent intent = new Intent( 7549ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MediaStore.INTENT_ACTION_VIDEO_CAMERA); 7559ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 7569ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang try { 7579ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang activity.startActivity(intent); 7589ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } catch (android.content.ActivityNotFoundException e) { 7599ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // Ignore exception 7609ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 7619ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 7629ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 7639ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }).setIcon(R.drawable.ic_menu_camera_video_view); 764b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 765de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project 766de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project static void addCaptureMenuItems(Menu menu, final Activity activity) { 767de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project addCapturePictureMenuItems(menu, activity); 768de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project addCaptureVideoMenuItems(menu, activity); 769de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project } 770de365d87520c97d6b1636442e6b5c82a3e036f29The Android Open Source Project 7719ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static boolean onFlipOrientationClicked(Activity activity, 7729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang SharedPreferences prefs) { 7739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // Check what our actual orientation is 7749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int current = activity.getResources().getConfiguration().orientation; 7759ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int newOrientation = android.content.pm.ActivityInfo 7769ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .SCREEN_ORIENTATION_LANDSCAPE; 7779ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang if (current == Configuration.ORIENTATION_LANDSCAPE) { 7789ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang newOrientation = android.content.pm.ActivityInfo 7799ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .SCREEN_ORIENTATION_UNSPECIFIED; 7809ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 7819ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang SharedPreferences.Editor editor = prefs.edit(); 7829ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang editor.putInt("nuorientation", newOrientation); 7839ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang editor.commit(); 7849ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang requestOrientation(activity, prefs, true); 7859ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return true; 7869ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 7879ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang 7889ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang static MenuItem addFlipOrientation(Menu menu, final Activity activity, 7899ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang final SharedPreferences prefs) { 790b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // position 41 after rotate 791b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // D 792b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return menu 7939ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .add(Menu.CATEGORY_SECONDARY, 304, 41, 7949ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang R.string.flip_orientation) 795b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project .setOnMenuItemClickListener( 7969ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang new MenuItem.OnMenuItemClickListener() { 7979ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public boolean onMenuItemClick(MenuItem item) { 7989ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return onFlipOrientationClicked(activity, prefs); 7999ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang } 8009ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang }).setIcon( 8019ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang android.R.drawable.ic_menu_always_landscape_portrait); 802b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 803b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 804b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project static void requestOrientation(Activity activity, SharedPreferences prefs) { 805b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project requestOrientation(activity, prefs, false); 806b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 807b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 8089ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang private static void requestOrientation(Activity activity, 8099ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang SharedPreferences prefs, boolean ignoreIntentExtra) { 8109ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // Disable orientation for now. If it is set to 8119ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang // SCREEN_ORIENTATION_SENSOR, a duplicated orientation will be observed. 8128d0dd0e2ee9a9f8d729ed96597102777cf14701fThe Android Open Source Project 8138d0dd0e2ee9a9f8d729ed96597102777cf14701fThe Android Open Source Project return; 814b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 815b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 8169ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang static void setFlipOrientationEnabled(Activity activity, 8179ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang MenuItem flipItem) { 8189ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int keyboard = activity.getResources().getConfiguration() 8199ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .hardKeyboardHidden; 8209ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang flipItem.setEnabled(keyboard != android.content.res.Configuration 8219ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang .HARDKEYBOARDHIDDEN_NO); 822b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 823b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 8249ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang public static String formatDuration(final Activity activity, 8259ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang int durationMs) { 826b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int duration = durationMs / 1000; 827b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int h = duration / 3600; 828b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int m = (duration - h * 3600) / 60; 829b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int s = duration - (h * 3600 + m * 60); 830b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project String durationValue; 831b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (h == 0) { 832b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project durationValue = String.format( 833b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project activity.getString(R.string.details_ms), m, s); 834b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } else { 835b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project durationValue = String.format( 836b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project activity.getString(R.string.details_hms), h, m, s); 837b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 838b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return durationValue; 839b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 840b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 841b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static void showStorageToast(Activity activity) { 8429ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang showStorageToast(activity, calculatePicturesRemaining()); 843b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 844b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 845b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static void showStorageToast(Activity activity, int remaining) { 846b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project String noStorageText = null; 847b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 848b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (remaining == MenuHelper.NO_STORAGE_ERROR) { 849b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project String state = Environment.getExternalStorageState(); 850b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (state == Environment.MEDIA_CHECKING) { 851b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project noStorageText = activity.getString(R.string.preparing_sd); 852b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } else { 853b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project noStorageText = activity.getString(R.string.no_storage); 854b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 855b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } else if (remaining < 1) { 856b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project noStorageText = activity.getString(R.string.not_enough_space); 857b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 858b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 859b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (noStorageText != null) { 860b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project Toast.makeText(activity, noStorageText, 5000).show(); 861b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 862b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 863b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 864b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static int calculatePicturesRemaining() { 865b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project try { 866b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (!ImageManager.hasStorage()) { 867b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return NO_STORAGE_ERROR; 868b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } else { 8699ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang String storageDirectory = 8709ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang Environment.getExternalStorageDirectory().toString(); 871b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project StatFs stat = new StatFs(storageDirectory); 8729ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang float remaining = ((float) stat.getAvailableBlocks() 8739ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang * (float) stat.getBlockSize()) / 400000F; 8749ae6df03a2d07ef400ec80f60cf14263649bcba1Chih-Chung Chang return (int) remaining; 875b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 876b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } catch (Exception ex) { 877b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // if we can't stat the filesystem then we don't know how many 878b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // pictures are remaining. it might be zero but just leave it 879b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // blank since we really don't know. 880b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project return CANNOT_STAT_ERROR; 881b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 882b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 883b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 884