OSDN Git Service

Invoke LightCycle viewer for panoramas.
authorAngus Kong <shkong@google.com>
Fri, 24 Aug 2012 11:30:08 +0000 (19:30 +0800)
committerAngus Kong <shkong@google.com>
Wed, 29 Aug 2012 11:43:12 +0000 (19:43 +0800)
1. Add SUPPORT_PANORAMA_VIEW to supported operations.
2. Add helper methods in LightCycleHelper:
  a. checks if the image file is a panorama.
  b. invokes the panorama view activity.

bug:6912297
Change-Id: I7909e49632cad02a795943a113bca6aec17df9dd

gallerycommon/src/com/android/gallery3d/common/LightCycleHelper.java
src/com/android/gallery3d/app/PhotoPage.java
src/com/android/gallery3d/data/LocalImage.java
src/com/android/gallery3d/data/MediaObject.java

index f8df29d..c4fb61a 100644 (file)
 
 package com.android.gallery3d.common;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.net.Uri;
 
 public class LightCycleHelper {
+    public static final String EXTRA_OUTPUT_DIR = "output_dir";
+    private static final String PANORAMA_FILENAME_PREFIX = "panorama_";
     public static final String LIGHTCYCLE_PACKAGE =
             "com.google.android.apps.lightcycle";
     public static final String LIGHTCYCLE_CAPTURE_CLASS =
             "com.google.android.apps.lightcycle.PanoramaCaptureActivity";
-    public static final String LIGHTCYCLE_VIEW_CLASS =
+    private static final String LIGHTCYCLE_VIEW_CLASS =
             "com.google.android.apps.lightcycle.PanoramaViewActivity";
-    public static final String EXTRA_OUTPUT_DIR = "output_dir";
 
     private static boolean sUpdated;
     private static boolean sHasViewActivity;
@@ -45,35 +48,50 @@ public class LightCycleHelper {
         sHasCaptureActivity = hasLightCycleActivity(pm, LIGHTCYCLE_CAPTURE_CLASS);
     }
 
-    public synchronized static boolean hasLightCycleView(PackageManager pm) {
+    public static synchronized boolean hasLightCycleView(PackageManager pm) {
         if (!sUpdated) {
             update(pm);
         }
         return sHasViewActivity;
     }
 
-    public synchronized static boolean hasLightCycleCapture(PackageManager pm) {
+    public static synchronized boolean hasLightCycleCapture(PackageManager pm) {
         if (!sUpdated) {
             update(pm);
         }
         return sHasCaptureActivity;
     }
 
-    public synchronized static void onPackageAdded(Context context, String packageName) {
+    public static synchronized void onPackageAdded(Context context, String packageName) {
         if (LIGHTCYCLE_PACKAGE.equals(packageName)) {
             update(context.getPackageManager());
         }
     }
 
-    public synchronized static void onPackageRemoved(Context context, String packageName) {
+    public static synchronized void onPackageRemoved(Context context, String packageName) {
         if (LIGHTCYCLE_PACKAGE.equals(packageName)) {
             update(context.getPackageManager());
         }
     }
 
-    public synchronized static void onPackageChanged(Context context, String packageName) {
+    public static synchronized void onPackageChanged(Context context, String packageName) {
         if (LIGHTCYCLE_PACKAGE.equals(packageName)) {
             update(context.getPackageManager());
         }
     }
+
+    public static void viewPanorama(Activity activity, Uri uri, String type) {
+        try {
+            Intent intent = new Intent(Intent.ACTION_VIEW)
+                    .setDataAndType(uri, type)
+                    .setClassName(LIGHTCYCLE_PACKAGE, LIGHTCYCLE_VIEW_CLASS);
+            activity.startActivity(intent);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static boolean isPanorama(String filename) {
+        return filename.startsWith(PANORAMA_FILENAME_PREFIX);
+    }
 }
index 71f8861..d101aac 100644 (file)
@@ -37,9 +37,11 @@ import com.actionbarsherlock.view.MenuItem;
 import com.android.gallery3d.R;
 import com.android.gallery3d.anim.FloatAnimation;
 import com.android.gallery3d.common.ApiHelper;
+import com.android.gallery3d.common.LightCycleHelper;
 import com.android.gallery3d.common.Utils;
 import com.android.gallery3d.data.DataManager;
 import com.android.gallery3d.data.FilterDeleteSet;
+import com.android.gallery3d.data.LocalImage;
 import com.android.gallery3d.data.MediaDetails;
 import com.android.gallery3d.data.MediaItem;
 import com.android.gallery3d.data.MediaObject;
@@ -182,15 +184,15 @@ public class PhotoPage extends ActivityState implements
     private final GLView mRootPane = new GLView() {
         @Override
         protected void renderBackground(GLCanvas view) {
-            if(mFadeOutTexture != null) {
-                if(mBackgroundFade.calculate(AnimationTime.get())) invalidate();
-                if(!mBackgroundFade.isActive()) {
+            if (mFadeOutTexture != null) {
+                if (mBackgroundFade.calculate(AnimationTime.get())) invalidate();
+                if (!mBackgroundFade.isActive()) {
                     mFadeOutTexture = null;
                     mOpenAnimationRect = null;
                     BitmapScreenNail.enableDrawPlaceholder();
                 } else {
                     float fadeAlpha = mBackgroundFade.get();
-                    if(fadeAlpha < 1f) {
+                    if (fadeAlpha < 1f) {
                         view.clearBuffer(getBackgroundColor());
                         view.setAlpha(fadeAlpha);
                     }
@@ -224,7 +226,7 @@ public class PhotoPage extends ActivityState implements
         mPhotoView = new PhotoView(mActivity);
         mPhotoView.setListener(this);
         mRootPane.addComponent(mPhotoView);
-        mApplication = (GalleryApp)((Activity) mActivity).getApplication();
+        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
         mOrientationManager = mActivity.getOrientationManager();
         mOrientationManager.addListener(this);
         mActivity.getGLRoot().setOrientationSource(mOrientationManager);
@@ -364,7 +366,7 @@ public class PhotoPage extends ActivityState implements
         // start the opening animation only if it's not restored.
         if (restoreState == null) {
             mFadeOutTexture = mActivity.getTransitionStore().get(AlbumPage.KEY_FADE_TEXTURE);
-            if(mFadeOutTexture != null) {
+            if (mFadeOutTexture != null) {
                 mBackgroundFade.start();
                 BitmapScreenNail.disableDrawPlaceholder();
                 mOpenAnimationRect = (Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT);
@@ -751,6 +753,8 @@ public class PhotoPage extends ActivityState implements
 
         boolean playVideo = (mSecureAlbum == null) &&
                 ((item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0);
+        boolean viewPanorama =
+                (item.getSupportedOperations() & MediaItem.SUPPORT_VIEW_PANORAMA) != 0;
 
         if (playVideo) {
             // determine if the point is at center (1/6) of the photo view.
@@ -763,6 +767,10 @@ public class PhotoPage extends ActivityState implements
 
         if (playVideo) {
             playVideo(mActivity, item.getPlayUri(), item.getName());
+        } else if (viewPanorama) {
+            LocalImage img = (LocalImage) item;
+            LightCycleHelper.viewPanorama(
+                    mActivity, img.getContentUri(), img.getMimeType());
         } else {
             toggleBars();
         }
index b10b962..93287bc 100644 (file)
@@ -34,6 +34,7 @@ import android.util.Log;
 import com.android.gallery3d.app.GalleryApp;
 import com.android.gallery3d.common.ApiHelper;
 import com.android.gallery3d.common.BitmapUtils;
+import com.android.gallery3d.common.LightCycleHelper;
 import com.android.gallery3d.util.GalleryUtils;
 import com.android.gallery3d.util.ThreadPool.Job;
 import com.android.gallery3d.util.ThreadPool.JobContext;
@@ -239,6 +240,12 @@ public class LocalImage extends LocalMediaItem {
         if (GalleryUtils.isValidLocation(latitude, longitude)) {
             operation |= SUPPORT_SHOW_ON_MAP;
         }
+
+        if (LightCycleHelper.isPanorama(caption) &&
+                LightCycleHelper.hasLightCycleView(
+                        mApplication.getAndroidContext().getPackageManager())) {
+            operation |= SUPPORT_VIEW_PANORAMA;
+        }
         return operation;
     }
 
index 45f425f..87f567d 100644 (file)
@@ -37,6 +37,7 @@ public abstract class MediaObject {
     public static final int SUPPORT_INFO = 1 << 10;
     public static final int SUPPORT_IMPORT = 1 << 11;
     public static final int SUPPORT_TRIM = 1 << 12;
+    public static final int SUPPORT_VIEW_PANORAMA = 1 << 13;
     public static final int SUPPORT_ALL = 0xffffffff;
 
     // These are the bits returned from getMediaType():