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