OSDN Git Service

Update to sharing panorama
authorMangesh Ghiware <mghiware@google.com>
Fri, 28 Sep 2012 04:05:41 +0000 (21:05 -0700)
committerMangesh Ghiware <mghiware@google.com>
Fri, 28 Sep 2012 06:43:45 +0000 (23:43 -0700)
Bug: 7150324

Use separate share intents for sharing panoarma and regular JPGs.

If photo is a 360 panorama, promote sharing it on the action bar,
and move sharing as JPG to overflow menu.

MIME type changed to specify panorama360.

Change-Id: I8d52733d105820ac17ff36a6ad9d7525893f6d27

res/menu/operation.xml
res/menu/photo.xml
res/values/strings.xml
src/com/android/gallery3d/app/GalleryActionBar.java
src/com/android/gallery3d/app/PhotoPage.java
src/com/android/gallery3d/ui/ActionModeHandler.java
src/com/android/gallery3d/ui/MenuExecutor.java
src/com/android/gallery3d/util/GalleryUtils.java

index aeef78f..984a944 100644 (file)
             android:icon="@drawable/ic_menu_ptp_holo_light"
             android:showAsAction="always|withText"
             android:visible="false" />
+    <!-- Ideally, showAsAction for share_panorama and share should be reversed.
+         But, if share_panorama is set to never, it doesn't seem to get promoted
+         to the action bar and stays on the overflow menu. -->
+    <item android:id="@+id/action_share_panorama"
+            android:icon="@drawable/ic_menu_share_holo_light"
+            android:title="@string/share_panorama"
+            android:visible="false"
+            android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
+            android:showAsAction="ifRoom">
+    </item>
     <item android:id="@+id/action_share"
             android:icon="@drawable/ic_menu_share_holo_light"
             android:title="@string/share"
             android:visible="false"
             android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
-            android:showAsAction="ifRoom">
+            android:showAsAction="never">
     </item>
     <item android:id="@+id/action_delete"
             android:icon="@drawable/ic_menu_trash_holo_light"
index 0dcc3f7..5fe5187 100644 (file)
             android:icon="@drawable/ic_menu_ptp_holo_light"
             android:showAsAction="always|withText"
             android:visible="false" />
+    <!-- Ideally, showAsAction for share_panorama and share should be reversed.
+         But, if share_panorama is set to never, it doesn't seem to get promoted
+         to the action bar and stays on the overflow menu. -->
+    <item android:id="@+id/action_share_panorama"
+            android:icon="@drawable/ic_menu_share_holo_light"
+            android:title="@string/share_panorama"
+            android:visible="false"
+            android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
+            android:showAsAction="ifRoom" />
     <item android:id="@+id/action_share"
             android:icon="@drawable/ic_menu_share_holo_light"
             android:title="@string/share"
-            android:enabled="true"
             android:visible="false"
             android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
-            android:showAsAction="ifRoom" />
+            android:showAsAction="never" />
     <item android:id="@+id/action_grid"
             android:icon="@android:drawable/ic_dialog_dialer"
             android:title="@string/switch_photo_grid"
index ed121d4..7323a7d 100644 (file)
     <string name="confirm">Confirm</string>
     <string name="cancel">Cancel</string>
     <string name="share">Share</string>
+    <string name="share_panorama">Share panorama</string>
+    <string name="share_as_photo">Share as photo</string>
 
     <!-- The label shown after an image is deleted [CHAR LIMIT=16] -->
     <string name="deleted">Deleted</string>
index 0aac60e..867ca6b 100644 (file)
@@ -297,28 +297,45 @@ public class GalleryActionBar implements OnNavigationListener {
     }
 
     private Menu mActionBarMenu;
+    private MenuItem mSharePanoramaMenuItem;
     private MenuItem mShareMenuItem;
-    private Intent mShareIntent;
+    private ShareActionProvider mSharePanoramaActionProvider;
+    private ShareActionProvider mShareActionProvider;
 
     public void createActionBarMenu(int menuRes, Menu menu) {
         mActivity.getSupportMenuInflater().inflate(menuRes, menu);
         mActionBarMenu = menu;
+
+        mSharePanoramaMenuItem = menu.findItem(R.id.action_share_panorama);
+        mSharePanoramaActionProvider = (ShareActionProvider)
+            mSharePanoramaMenuItem.getActionProvider();
+        mSharePanoramaActionProvider.setShareHistoryFileName("panorama_share_history.xml");
+
         mShareMenuItem = menu.findItem(R.id.action_share);
-        if (mShareMenuItem != null) {
-            ((ShareActionProvider) mShareMenuItem.getActionProvider())
-                    .setShareIntent(mShareIntent);
-        }
+        mShareActionProvider = (ShareActionProvider)
+            mShareMenuItem.getActionProvider();
+        mShareActionProvider.setShareHistoryFileName("share_history.xml");
     }
 
     public Menu getMenu() {
         return mActionBarMenu;
     }
 
-    public void setShareIntent(Intent shareIntent) {
-        mShareIntent = shareIntent;
-        if (mShareMenuItem != null) {
-            ((ShareActionProvider) mShareMenuItem.getActionProvider())
-                    .setShareIntent(shareIntent);
+    public void setShareIntents(Intent sharePanoramaIntent, Intent shareIntent) {
+        // if panorama sharing is enabled, rename share to share as photo,
+        // and move it to overflow
+        if (sharePanoramaIntent != null) {
+            mActivity.invalidateOptionsMenu();
+            mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+            mShareMenuItem.setTitle(
+                    mContext.getResources().getString(R.string.share_as_photo));
+        } else {
+            mSharePanoramaMenuItem.setVisible(false);
+            mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            mShareMenuItem.setTitle(
+                    mContext.getResources().getString(R.string.share));
         }
+        mSharePanoramaActionProvider.setShareIntent(sharePanoramaIntent);
+        mShareActionProvider.setShareIntent(shareIntent);
     }
 }
index 49d1e6e..caa5fde 100644 (file)
@@ -485,14 +485,24 @@ public class PhotoPage extends ActivityState implements
     private Intent createShareIntent(Path path) {
         DataManager manager = mActivity.getDataManager();
         int type = manager.getMediaType(path);
-        int support = manager.getSupportedOperations(path);
-        boolean isPanorama = (support & MediaObject.SUPPORT_PANORAMA) != 0;
         Intent intent = new Intent(Intent.ACTION_SEND);
-        intent.setType(MenuExecutor.getMimeType(type, isPanorama));
+        intent.setType(MenuExecutor.getMimeType(type));
         Uri uri = manager.getContentUri(path);
         intent.putExtra(Intent.EXTRA_STREAM, uri);
         return intent;
+    }
 
+    private Intent createSharePanoramaIntent(Path path) {
+        DataManager manager = mActivity.getDataManager();
+        int supported = manager.getSupportedOperations(path);
+        if ((supported & MediaObject.SUPPORT_PANORAMA) == 0) {
+            return null;
+        }
+        Intent intent = new Intent(Intent.ACTION_SEND);
+        intent.setType(GalleryUtils.MIME_TYPE_PANORAMA);
+        Uri uri = manager.getContentUri(path);
+        intent.putExtra(Intent.EXTRA_STREAM, uri);
+        return intent;
     }
 
     private void launchPhotoEditor() {
@@ -512,8 +522,10 @@ public class PhotoPage extends ActivityState implements
 
     private void updateShareURI(Path path) {
         DataManager manager = mActivity.getDataManager();
+        mActionBar.setShareIntents(
+                createSharePanoramaIntent(path),
+                createShareIntent(path));
         Uri uri = manager.getContentUri(path);
-        mActionBar.setShareIntent(createShareIntent(path));
         setNfcBeamPushUri(uri);
     }
 
index 2adb05c..f0ddde8 100644 (file)
@@ -54,7 +54,8 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
 
     private static final int SUPPORT_MULTIPLE_MASK = MediaObject.SUPPORT_DELETE
             | MediaObject.SUPPORT_ROTATE | MediaObject.SUPPORT_SHARE
-            | MediaObject.SUPPORT_CACHE | MediaObject.SUPPORT_IMPORT;
+            | MediaObject.SUPPORT_CACHE | MediaObject.SUPPORT_IMPORT
+            | MediaObject.SUPPORT_PANORAMA;
 
     public interface ActionModeListener {
         public boolean onActionItemClicked(MenuItem item);
@@ -65,7 +66,10 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
     private final SelectionManager mSelectionManager;
     private final NfcAdapter mNfcAdapter;
     private Menu mMenu;
+    private MenuItem mSharePanoramaMenuItem;
     private MenuItem mShareMenuItem;
+    private ShareActionProvider mSharePanoramaActionProvider;
+    private ShareActionProvider mShareActionProvider;
     private SelectionMenu mSelectionMenu;
     private ActionModeListener mListener;
     private Future<?> mMenuTask;
@@ -183,10 +187,21 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
         mode.getMenuInflater().inflate(R.menu.operation, menu);
 
         mMenu = menu;
+        mSharePanoramaMenuItem = menu.findItem(R.id.action_share_panorama);
+        if (mSharePanoramaMenuItem != null) {
+            mSharePanoramaActionProvider = (ShareActionProvider) mSharePanoramaMenuItem
+                .getActionProvider();
+            mSharePanoramaActionProvider.setOnShareTargetSelectedListener(
+                    mShareTargetSelectedListener);
+            mSharePanoramaActionProvider.setShareHistoryFileName("panorama_share_history.xml");
+        }
         mShareMenuItem = menu.findItem(R.id.action_share);
         if (mShareMenuItem != null) {
-            ((ShareActionProvider) mShareMenuItem.getActionProvider())
-                    .setOnShareTargetSelectedListener(mShareTargetSelectedListener);
+            mShareActionProvider = (ShareActionProvider) mShareMenuItem
+                .getActionProvider();
+            mShareActionProvider.setOnShareTargetSelectedListener(
+                    mShareTargetSelectedListener);
+            mShareActionProvider.setShareHistoryFileName("share_history.xml");
         }
         return true;
     }
@@ -219,7 +234,7 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
 
         switch (unexpandedPaths.size()) {
             case 1:
-                final String mimeType = MenuExecutor.getMimeType(type, false);
+                final String mimeType = MenuExecutor.getMimeType(type);
                 if (!GalleryUtils.isEditorAvailable(mActivity, mimeType)) {
                     operation &= ~MediaObject.SUPPORT_EDIT;
                 }
@@ -240,6 +255,35 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
 
     // Share intent needs to expand the selection set so we can get URI of
     // each media item
+    private Intent computePanoramaSharingIntent(JobContext jc) {
+        ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true);
+        if (expandedPaths.size() == 0) {
+            return null;
+        }
+        final ArrayList<Uri> uris = new ArrayList<Uri>();
+        DataManager manager = mActivity.getDataManager();
+        final Intent intent = new Intent();
+        for (Path path : expandedPaths) {
+            if (jc.isCancelled()) return null;
+            uris.add(manager.getContentUri(path));
+        }
+
+        final int size = uris.size();
+        if (size > 0) {
+            if (size > 1) {
+                intent.setAction(Intent.ACTION_SEND_MULTIPLE);
+                intent.setType(GalleryUtils.MIME_TYPE_PANORAMA);
+                intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
+            } else {
+                intent.setAction(Intent.ACTION_SEND);
+                intent.setType(GalleryUtils.MIME_TYPE_PANORAMA);
+                intent.putExtra(Intent.EXTRA_STREAM, uris.get(0));
+            }
+        }
+
+        return intent;
+    }
+
     private Intent computeSharingIntent(JobContext jc) {
         ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true);
         if (expandedPaths.size() == 0) {
@@ -249,7 +293,6 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
         final ArrayList<Uri> uris = new ArrayList<Uri>();
         DataManager manager = mActivity.getDataManager();
         int type = 0;
-        boolean isPanorama = true;
         final Intent intent = new Intent();
         for (Path path : expandedPaths) {
             if (jc.isCancelled()) return null;
@@ -259,14 +302,11 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
             if ((support & MediaObject.SUPPORT_SHARE) != 0) {
                 uris.add(manager.getContentUri(path));
             }
-            if ((support & MediaObject.SUPPORT_PANORAMA) == 0) {
-                isPanorama = false;
-            }
         }
 
         final int size = uris.size();
         if (size > 0) {
-            final String mimeType = MenuExecutor.getMimeType(type, isPanorama);
+            final String mimeType = MenuExecutor.getMimeType(type);
             if (size > 1) {
                 intent.setAction(Intent.ACTION_SEND_MULTIPLE).setType(mimeType);
                 intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
@@ -293,7 +333,8 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
 
         updateSelectionMenu();
 
-        // Disable share action until share intent is in good shape
+        // Disable share actions until share intent is in good shape
+        if (mSharePanoramaMenuItem != null) mSharePanoramaMenuItem.setEnabled(false);
         if (mShareMenuItem != null) mShareMenuItem.setEnabled(false);
 
         // Generate sharing intent and update supported operations in the background
@@ -305,17 +346,32 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi
                 final int operation = computeMenuOptions(jc);
 
                 // Pass2: Deal with expanded media object list for sharing operation.
-                final Intent intent = (mShareMenuItem != null) ? computeSharingIntent(jc) : null;
+                final Intent share_panorama_intent = computePanoramaSharingIntent(jc);
+                final Intent share_intent = computeSharingIntent(jc);
                 mMainHandler.post(new Runnable() {
                     @Override
                     public void run() {
                         mMenuTask = null;
                         if (jc.isCancelled()) return;
                         MenuExecutor.updateMenuOperation(mMenu, operation);
+                        if (mSharePanoramaMenuItem != null) {
+                            mSharePanoramaMenuItem.setEnabled(true);
+                            if ((operation & MediaObject.SUPPORT_PANORAMA) != 0) {
+                                mActivity.invalidateOptionsMenu();
+                                mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+                                mShareMenuItem.setTitle(
+                                    mActivity.getResources().getString(R.string.share_as_photo));
+                            } else {
+                                mSharePanoramaMenuItem.setVisible(false);
+                                mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+                                mShareMenuItem.setTitle(
+                                    mActivity.getResources().getString(R.string.share));
+                            }
+                            mSharePanoramaActionProvider.setShareIntent(share_panorama_intent);
+                        }
                         if (mShareMenuItem != null) {
                             mShareMenuItem.setEnabled(true);
-                            ((ShareActionProvider) mShareMenuItem.getActionProvider())
-                                    .setShareIntent(intent);
+                            mShareActionProvider.setShareIntent(share_intent);
                         }
                     }
                 });
index 1f28555..f866688 100644 (file)
@@ -49,11 +49,6 @@ public class MenuExecutor {
     @SuppressWarnings("unused")
     private static final String TAG = "MenuExecutor";
 
-    private static final String MIME_TYPE_IMAGE = "image/*";
-    private static final String MIME_TYPE_VIDEO = "video/*";
-    private static final String MIME_TYPE_PANORAMA = "application/vnd.google.panorama+jpg";
-    private static final String MIME_TYPE_ALL = "*/*";
-
     private static final int MSG_TASK_COMPLETE = 1;
     private static final int MSG_TASK_UPDATE = 2;
     private static final int MSG_TASK_START = 3;
@@ -166,6 +161,7 @@ public class MenuExecutor {
         boolean supportRotate = (supported & MediaObject.SUPPORT_ROTATE) != 0;
         boolean supportCrop = (supported & MediaObject.SUPPORT_CROP) != 0;
         boolean supportTrim = (supported & MediaObject.SUPPORT_TRIM) != 0;
+        boolean supportSharePanorama = (supported & MediaObject.SUPPORT_PANORAMA) != 0;
         boolean supportShare = (supported & MediaObject.SUPPORT_SHARE) != 0;
         boolean supportSetAs = (supported & MediaObject.SUPPORT_SETAS) != 0;
         boolean supportShowOnMap = (supported & MediaObject.SUPPORT_SHOW_ON_MAP) != 0;
@@ -179,6 +175,7 @@ public class MenuExecutor {
         setMenuItemVisible(menu, R.id.action_rotate_cw, supportRotate);
         setMenuItemVisible(menu, R.id.action_crop, supportCrop);
         setMenuItemVisible(menu, R.id.action_trim, supportTrim);
+        setMenuItemVisible(menu, R.id.action_share_panorama, supportSharePanorama);
         setMenuItemVisible(menu, R.id.action_share, supportShare);
         setMenuItemVisible(menu, R.id.action_setas, supportSetAs);
         setMenuItemVisible(menu, R.id.action_show_on_map, supportShowOnMap);
@@ -201,9 +198,7 @@ public class MenuExecutor {
     private Intent getIntentBySingleSelectedPath(String action) {
         DataManager manager = mActivity.getDataManager();
         Path path = getSingleSelectedPath();
-        int support = manager.getSupportedOperations(path);
-        boolean isPanorama = (support & MediaObject.SUPPORT_PANORAMA) != 0;
-        String mimeType = getMimeType(manager.getMediaType(path), isPanorama);
+        String mimeType = getMimeType(manager.getMediaType(path));
         return new Intent(action).setDataAndType(manager.getContentUri(path), mimeType);
     }
 
@@ -331,14 +326,13 @@ public class MenuExecutor {
         mWaitOnStop = waitOnStop;
     }
 
-    public static String getMimeType(int type, boolean isPanorama) {
-        if (isPanorama) return MIME_TYPE_PANORAMA;
+    public static String getMimeType(int type) {
         switch (type) {
             case MediaObject.MEDIA_TYPE_IMAGE :
-                return MIME_TYPE_IMAGE;
+                return GalleryUtils.MIME_TYPE_IMAGE;
             case MediaObject.MEDIA_TYPE_VIDEO :
-                return MIME_TYPE_VIDEO;
-            default: return MIME_TYPE_ALL;
+                return GalleryUtils.MIME_TYPE_VIDEO;
+            default: return GalleryUtils.MIME_TYPE_ALL;
         }
     }
 
index 6639c55..a3eccb8 100644 (file)
@@ -56,9 +56,11 @@ public class GalleryUtils {
     private static final String MAPS_CLASS_NAME = "com.google.android.maps.MapsActivity";
     private static final String CAMERA_LAUNCHER_NAME = "com.android.camera.CameraLauncher";
 
-    private static final String MIME_TYPE_IMAGE = "image/*";
-    private static final String MIME_TYPE_VIDEO = "video/*";
-    private static final String MIME_TYPE_ALL = "*/*";
+    public static final String MIME_TYPE_IMAGE = "image/*";
+    public static final String MIME_TYPE_VIDEO = "video/*";
+    public static final String MIME_TYPE_PANORAMA = "application/vnd.google.panorama360+jpg";
+    public static final String MIME_TYPE_ALL = "*/*";
+
     private static final String DIR_TYPE_IMAGE = "vnd.android.cursor.dir/image";
     private static final String DIR_TYPE_VIDEO = "vnd.android.cursor.dir/video";