summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/camera/Camera.java55
-rw-r--r--src/com/android/camera/VideoCamera.java49
-rw-r--r--src/com/android/camera/ui/IndicatorWheel.java29
-rw-r--r--src/com/android/camera/ui/RotateImageView.java1
-rw-r--r--src/com/android/camera/ui/RotateLayout.java117
-rw-r--r--src/com/android/camera/ui/SharePopup.java143
6 files changed, 330 insertions, 64 deletions
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index 29534c3..8f99b23 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -23,6 +23,7 @@ import com.android.camera.ui.GLRootView;
import com.android.camera.ui.HeadUpDisplay;
import com.android.camera.ui.IndicatorWheel;
import com.android.camera.ui.RotateImageView;
+import com.android.camera.ui.SharePopup;
import com.android.camera.ui.ZoomControllerListener;
import com.android.camera.ui.ZoomPicker;
@@ -48,7 +49,6 @@ import android.location.LocationProvider;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -59,6 +59,7 @@ import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log;
import android.view.GestureDetector;
+import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -72,7 +73,6 @@ import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
-import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
@@ -136,9 +136,10 @@ public class Camera extends ActivityBase implements View.OnClickListener,
private Parameters mInitialParams;
private MyOrientationEventListener mOrientationListener;
- // The device orientation in degrees. Default is unknown.
+ // The degrees of the device rotated clockwise from its natural orientation.
private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
- // The orientation compensation for icons and thumbnails.
+ // The orientation compensation for icons and thumbnails. Ex: if the value
+ // is 90, the UI components should be rotated 90 degrees counter-clockwise.
private int mOrientationCompensation = 0;
private ComboPreferences mPreferences;
@@ -165,15 +166,14 @@ public class Camera extends ActivityBase implements View.OnClickListener,
private GLRootView mGLRootView;
- // A button showing the last captured picture thumbnail. Clicking on it
- // goes to gallery.
+ // A button showing the last captured picture thumbnail. Clicking on it will
+ // show the share popup window.
private RotateImageView mThumbnailButton;
+ // A popup window that contains a bigger thumbnail and a list of apps to share.
+ private SharePopup mSharePopup;
// The bitmap of the last captured picture thumbnail and the URI of the
// original picture.
private Thumbnail mThumbnail;
- // An review image having same size as preview. It is displayed when
- // share button is pressed.
- private ImageView mReviewImage;
// A button sharing the last picture.
private RotateImageView mShareButton;
private RotateImageView mCameraSwitchIcon;
@@ -977,7 +977,6 @@ public class Camera extends ActivityBase implements View.OnClickListener,
}
mFocusRectangle = (FocusRectangle) findViewById(R.id.focus_rectangle);
mThumbnailButton = (RotateImageView) findViewById(R.id.review_thumbnail);
- mReviewImage = (ImageView) findViewById(R.id.review_image);
mShareButton = (RotateImageView) findViewById(R.id.btn_share);
mCameraSwitchIcon = (RotateImageView) findViewById(R.id.camera_switch_icon);
mVideoSwitchIcon = (RotateImageView) findViewById(R.id.video_switch_icon);
@@ -1124,12 +1123,12 @@ public class Camera extends ActivityBase implements View.OnClickListener,
final String[] SETTING_KEYS = {
CameraSettings.KEY_FLASH_MODE,
CameraSettings.KEY_WHITE_BALANCE,
+ CameraSettings.KEY_COLOR_EFFECT,
CameraSettings.KEY_SCENE_MODE};
final String[] OTHER_SETTING_KEYS = {
CameraSettings.KEY_RECORD_LOCATION,
CameraSettings.KEY_FOCUS_MODE,
CameraSettings.KEY_EXPOSURE,
- CameraSettings.KEY_COLOR_EFFECT,
CameraSettings.KEY_PICTURE_SIZE,
CameraSettings.KEY_JPEG_QUALITY};
mIndicatorWheel.initialize(this, mPreferenceGroup, SETTING_KEYS,
@@ -1222,18 +1221,17 @@ public class Camera extends ActivityBase implements View.OnClickListener,
if (!mIsImageCaptureIntent) {
setOrientationIndicator(mOrientationCompensation);
}
- if (mHeadUpDisplay != null) {
- mHeadUpDisplay.setOrientation(mOrientationCompensation);
- }
}
}
}
private void setOrientationIndicator(int degree) {
+ if (mHeadUpDisplay != null) mHeadUpDisplay.setOrientation(mOrientationCompensation);
if (mThumbnailButton != null) mThumbnailButton.setDegree(degree);
if (mShareButton != null) mShareButton.setDegree(degree);
if (mCameraSwitchIcon != null) mCameraSwitchIcon.setDegree(degree);
if (mVideoSwitchIcon != null) mVideoSwitchIcon.setDegree(degree);
+ if (mSharePopup != null) mSharePopup.setOrientation(degree);
}
@Override
@@ -1274,7 +1272,9 @@ public class Camera extends ActivityBase implements View.OnClickListener,
gotoGallery();
break;
case R.id.btn_share:
- onShareButtonClicked();
+ if (isCameraIdle() && mThumbnail != null) {
+ createSharePopup();
+ }
break;
}
}
@@ -1456,8 +1456,6 @@ public class Camera extends ActivityBase implements View.OnClickListener,
mJpegPictureCallbackTime = 0;
mZoomValue = 0;
- mReviewImage.setVisibility(View.GONE);
-
// Start the preview if it is not started.
if (mCameraState == PREVIEW_STOPPED) {
try {
@@ -1517,6 +1515,8 @@ public class Camera extends ActivityBase implements View.OnClickListener,
hidePostCaptureAlert();
}
+ dismissSharePopup();
+
if (mDidRegister) {
unregisterReceiver(mReceiver);
mDidRegister = false;
@@ -2444,14 +2444,25 @@ public class Camera extends ActivityBase implements View.OnClickListener,
mNotSelectableToast.show();
}
+ private void createSharePopup() {
+ if (mSharePopup != null) mSharePopup.dismiss();
+ mSharePopup = new SharePopup(this, mThumbnail.getUri(),
+ mThumbnail.getBitmap(), mOrientationCompensation, mThumbnailButton);
+ mSharePopup.showAtLocation(mThumbnailButton, Gravity.NO_GRAVITY, 0, 0);
+ }
+
+ private void dismissSharePopup() {
+ if (mSharePopup != null) {
+ mSharePopup.dismiss();
+ mSharePopup = null;
+ }
+ }
+
private void onShareButtonClicked() {
if (mPausing) return;
// Share the last captured picture.
if (mThumbnail != null) {
- mReviewImage.setImageBitmap(mThumbnail.getBitmap());
- mReviewImage.setVisibility(View.VISIBLE);
-
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, mThumbnail.getUri());
@@ -2477,10 +2488,6 @@ public class Camera extends ActivityBase implements View.OnClickListener,
public void onOverriddenPreferencesClicked() {
Camera.this.onOverriddenPreferencesClicked();
}
-
- public void onShareButtonClicked() {
- Camera.this.onShareButtonClicked();
- }
}
private class MyCameraPickerListener implements CameraPicker.Listener {
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
index 6dcb42d..d1a81ae 100644
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -22,6 +22,7 @@ import com.android.camera.ui.GLRootView;
import com.android.camera.ui.HeadUpDisplay;
import com.android.camera.ui.IndicatorWheel;
import com.android.camera.ui.RotateImageView;
+import com.android.camera.ui.SharePopup;
import com.android.camera.ui.ZoomPicker;
import android.content.ActivityNotFoundException;
@@ -40,7 +41,6 @@ import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.media.ThumbnailUtils;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -51,6 +51,7 @@ import android.provider.MediaStore.Video;
import android.provider.Settings;
import android.util.Log;
import android.view.GestureDetector;
+import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -149,14 +150,16 @@ public class VideoCamera extends ActivityBase
private View mReviewControl;
private Toast mNoShareToast;
- // A button showing the last captured video thumbnail. Clicking on it
- // goes to gallery.
+ // A button showing the last captured video thumbnail. Clicking on it will
+ // show the share popup window.
private RotateImageView mThumbnailButton;
+ // A popup window that contains a bigger thumbnail and a list of apps to share.
+ private SharePopup mSharePopup;
// The bitmap of the last captured video thumbnail and the URI of the
// original video.
private Thumbnail mThumbnail;
// An review image having same size as preview. It is displayed when
- // recording is stopped in capture intent or share button is pressed.
+ // recording is stopped in capture intent.
private ImageView mReviewImage;
// A button sharing the last picture.
private RotateImageView mShareButton;
@@ -232,9 +235,10 @@ public class VideoCamera extends ActivityBase
private GestureDetector mPopupGestureDetector;
private MyOrientationEventListener mOrientationListener;
- // The device orientation in degrees. Default is unknown.
+ // The degrees of the device rotated clockwise from its natural orientation.
private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
- // The orientation compensation for icons and thumbnails.
+ // The orientation compensation for icons and thumbnails. Ex: if the value
+ // is 90, the UI components should be rotated 90 degrees counter-clockwise.
private int mOrientationCompensation = 0;
private int mOrientationHint; // the orientation hint for video playback
@@ -559,11 +563,10 @@ public class VideoCamera extends ActivityBase
final String[] SETTING_KEYS = {
CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE,
+ CameraSettings.KEY_WHITE_BALANCE,
CameraSettings.KEY_VIDEO_QUALITY,
CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL};
- final String[] OTHER_SETTING_KEYS = {
- CameraSettings.KEY_WHITE_BALANCE,
- CameraSettings.KEY_COLOR_EFFECT};
+ final String[] OTHER_SETTING_KEYS = {CameraSettings.KEY_COLOR_EFFECT};
mIndicatorWheel.initialize(this, mPreferenceGroup, SETTING_KEYS, OTHER_SETTING_KEYS);
mIndicatorWheel.setListener(new MyIndicatorWheelListener());
mPopupGestureDetector = new GestureDetector(this,
@@ -597,18 +600,17 @@ public class VideoCamera extends ActivityBase
if (!mIsVideoCaptureIntent) {
setOrientationIndicator(mOrientationCompensation);
}
- if (mHeadUpDisplay != null) {
- mHeadUpDisplay.setOrientation(mOrientationCompensation);
- }
}
}
}
private void setOrientationIndicator(int degree) {
+ if (mHeadUpDisplay != null) mHeadUpDisplay.setOrientation(mOrientationCompensation);
if (mThumbnailButton != null) mThumbnailButton.setDegree(degree);
if (mShareButton != null) mShareButton.setDegree(degree);
if (mCameraSwitchIcon != null) mCameraSwitchIcon.setDegree(degree);
if (mVideoSwitchIcon != null) mVideoSwitchIcon.setDegree(degree);
+ if (mSharePopup != null) mSharePopup.setOrientation(degree);
}
private void startPlayVideoActivity() {
@@ -645,7 +647,9 @@ public class VideoCamera extends ActivityBase
gotoGallery();
break;
case R.id.btn_share:
- onShareButtonClicked();
+ if (!mMediaRecorderRecording && mThumbnail != null) {
+ createSharePopup();
+ }
break;
}
}
@@ -976,6 +980,8 @@ public class VideoCamera extends ActivityBase
finishRecorderAndCloseCamera();
+ dismissSharePopup();
+
if (mReceiver != null) {
unregisterReceiver(mReceiver);
mReceiver = null;
@@ -1922,14 +1928,25 @@ public class VideoCamera extends ActivityBase
}
+ private void createSharePopup() {
+ if (mSharePopup != null) mSharePopup.dismiss();
+ mSharePopup = new SharePopup(this, mThumbnail.getUri(),
+ mThumbnail.getBitmap(), mOrientationCompensation, mThumbnailButton);
+ mSharePopup.showAtLocation(mThumbnailButton, Gravity.NO_GRAVITY, 0, 0);
+ }
+
+ private void dismissSharePopup() {
+ if (mSharePopup != null) {
+ mSharePopup.dismiss();
+ mSharePopup = null;
+ }
+ }
+
private void onShareButtonClicked() {
if (mPausing) return;
// Share the last captured video.
if (mThumbnail != null) {
- mReviewImage.setImageBitmap(mThumbnail.getBitmap());
- mReviewImage.setVisibility(View.VISIBLE);
-
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("video/*");
intent.putExtra(Intent.EXTRA_STREAM, mThumbnail.getUri());
diff --git a/src/com/android/camera/ui/IndicatorWheel.java b/src/com/android/camera/ui/IndicatorWheel.java
index 1a374da..c2d7d3c 100644
--- a/src/com/android/camera/ui/IndicatorWheel.java
+++ b/src/com/android/camera/ui/IndicatorWheel.java
@@ -16,7 +16,6 @@
package com.android.camera.ui;
-import com.android.camera.ComboPreferences;
import com.android.camera.IconListPreference;
import com.android.camera.PreferenceGroup;
import com.android.camera.R;
@@ -26,24 +25,22 @@ import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
-import android.os.Handler;
import android.os.SystemClock;
import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.ImageView;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
-import android.view.ViewGroup;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageView;
import java.util.ArrayList;
/**
* A view that contains shutter button and camera setting indicators. The
* indicators are spreaded around the shutter button. The first child is always
- * the shutter button. The last indicator is always the share button.
+ * the shutter button.
*/
public class IndicatorWheel extends ViewGroup implements
BasicSettingPopup.Listener, OtherSettingsPopup.Listener {
@@ -98,7 +95,6 @@ public class IndicatorWheel extends ViewGroup implements
public void onSharedPreferenceChanged();
public void onRestorePreferencesClicked();
public void onOverriddenPreferencesClicked();
- public void onShareButtonClicked();
}
public void setListener(Listener listener) {
@@ -467,9 +463,6 @@ public class IndicatorWheel extends ViewGroup implements
}
mSettingPopups = new AbstractSettingPopup[len];
- // Add share button. It is always the last one.
- addIndicator(context, R.drawable.ic_viewfinder_share);
-
requestLayout();
}
@@ -494,12 +487,6 @@ public class IndicatorWheel extends ViewGroup implements
}
}
- public void onShareButtonClicked() {
- if (mListener != null) {
- mListener.onShareButtonClicked();
- }
- }
-
private void initializeSettingPopup(int index) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
@@ -527,12 +514,6 @@ public class IndicatorWheel extends ViewGroup implements
private void showSettingPopup(int index) {
if (index == mSelectedIndex) return;
- // The share button is the last indicator.
- if (index == mIndicatorCount - 1) {
- onShareButtonClicked();
- return;
- }
-
if (mSettingPopups[index] == null) initializeSettingPopup(index);
if (mPrevAnimatingView != null) mPrevAnimatingView.clearAnimation();
diff --git a/src/com/android/camera/ui/RotateImageView.java b/src/com/android/camera/ui/RotateImageView.java
index 2d88a47..a76d7bc 100644
--- a/src/com/android/camera/ui/RotateImageView.java
+++ b/src/com/android/camera/ui/RotateImageView.java
@@ -56,6 +56,7 @@ public class RotateImageView extends ImageView {
mEnableAnimation = enable;
}
+ // Rotate the view counter-clockwise
public void setDegree(int degree) {
// make sure in the range of [0, 359]
degree = degree >= 0 ? degree % 360 : degree % 360 + 360;
diff --git a/src/com/android/camera/ui/RotateLayout.java b/src/com/android/camera/ui/RotateLayout.java
new file mode 100644
index 0000000..6e1aa92
--- /dev/null
+++ b/src/com/android/camera/ui/RotateLayout.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.ui;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+// A RotateLayout is designed to display a single item and provides the
+// capabilities to rotate the item.
+class RotateLayout extends ViewGroup {
+ private int mOrientation;
+ private View mChild;
+
+ public RotateLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ mChild = getChildAt(0);
+ }
+
+ @Override
+ protected void onLayout(
+ boolean change, int left, int top, int right, int bottom) {
+ int width = right - left;
+ int height = bottom - top;
+ switch (mOrientation) {
+ case 0:
+ case 180:
+ mChild.layout(0, 0, width, height);
+ break;
+ case 90:
+ case 270:
+ mChild.layout(0, 0, height, width);
+ break;
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthSpec, int heightSpec) {
+ switch(mOrientation) {
+ case 0:
+ case 180:
+ measureChild(mChild, widthSpec, heightSpec);
+ setMeasuredDimension(mChild.getMeasuredWidth(), mChild.getMeasuredHeight());
+ break;
+ case 90:
+ case 270:
+ measureChild(mChild, heightSpec, widthSpec);
+ setMeasuredDimension(mChild.getMeasuredHeight(), mChild.getMeasuredWidth());
+ break;
+ }
+ }
+
+ @Override
+ public void dispatchDraw(Canvas canvas) {
+ int w = getWidth();
+ int h = getHeight();
+ switch (mOrientation) {
+ case 90:
+ canvas.translate(0, h);
+ canvas.rotate(-mOrientation);
+ break;
+ case 180:
+ canvas.rotate(-mOrientation, w / 2, h / 2);
+ break;
+ case 270:
+ canvas.translate(w, 0);
+ canvas.rotate(-mOrientation);
+ break;
+ }
+ super.dispatchDraw(canvas);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+ float width = getWidth();
+ float height = getHeight();
+ switch (mOrientation) {
+ case 90: event.setLocation(height - y, x); break;
+ case 180: event.setLocation(width - x, height - y); break;
+ case 270: event.setLocation(y, width - x); break;
+ }
+ boolean result = mChild.dispatchTouchEvent(event);
+ event.setLocation(x, y);
+ return result;
+ }
+
+ // Rotate the view counter-clockwise
+ public void setOrientation(int orientation) {
+ orientation = orientation % 360;
+ if (mOrientation == orientation) return;
+ mOrientation = orientation;
+ requestLayout();
+ }
+}
diff --git a/src/com/android/camera/ui/SharePopup.java b/src/com/android/camera/ui/SharePopup.java
new file mode 100644
index 0000000..d182e2d
--- /dev/null
+++ b/src/com/android/camera/ui/SharePopup.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.ui;
+
+import com.android.camera.R;
+import com.android.camera.Util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.ColorDrawable;
+import android.net.Uri;
+import android.util.DisplayMetrics;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+
+// A popup window that contains a big thumbnail and a list of apps to share.
+public class SharePopup extends PopupWindow implements View.OnClickListener,
+ View.OnTouchListener {
+ private Context mContext;
+ private Uri mUri;
+
+ // The maximum width of the thumbnail in landscape orientation.
+ private final float mImageMaxWidthLandscape;
+ // The maximum height of the thumbnail in landscape orientation.
+ private final float mImageMaxHeightLandscape;
+ // The maximum width of the thumbnail in portrait orientation.
+ private final float mImageMaxWidthPortrait;
+ // The maximum height of the thumbnail in portrait orientation.
+ private final float mImageMaxHeightPortrait;
+
+ private ImageView mThumbnail;
+ private int mBitmapWidth, mBitmapHeight;
+ private RotateLayout mRotateLayout;
+
+ public SharePopup(Activity activity, Uri uri, Bitmap bitmap, int orientation, View anchor) {
+ super(activity);
+
+ // Initailize variables
+ mContext = activity;
+ mUri = uri;
+ LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ View contentView = inflater.inflate(R.layout.share_popup, null, false);
+ // This is required because popup window is full screen.
+ contentView.setOnTouchListener(this);
+ mRotateLayout = (RotateLayout) contentView.findViewById(R.id.rotate_layout);
+ mThumbnail = (ImageView) contentView.findViewById(R.id.expanded_thumbnail);
+ mThumbnail.setImageBitmap(bitmap);
+ mThumbnail.setOnClickListener(this);
+ mBitmapWidth = bitmap.getWidth();
+ mBitmapHeight = bitmap.getHeight();
+ Resources res = mContext.getResources();
+ mImageMaxWidthLandscape = res.getDimension(R.dimen.share_image_max_width_landscape);
+ mImageMaxHeightLandscape = res.getDimension(R.dimen.share_image_max_height_landscape);
+ mImageMaxWidthPortrait = res.getDimension(R.dimen.share_image_max_width_portrait);
+ mImageMaxHeightPortrait = res.getDimension(R.dimen.share_image_max_height_portrait);
+
+ // Initialize popup window
+ setWidth(WindowManager.LayoutParams.MATCH_PARENT);
+ setHeight(WindowManager.LayoutParams.MATCH_PARENT);
+ setBackgroundDrawable(new ColorDrawable());
+ setContentView(contentView);
+ setOrientation(orientation);
+
+ // Initialize view location
+ int location[] = new int[2];
+ anchor.getLocationOnScreen(location);
+ DisplayMetrics metrics = new DisplayMetrics();
+ activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
+ MarginLayoutParams params = (MarginLayoutParams) mRotateLayout.getLayoutParams();
+ params.topMargin = location[1] / 2;
+ params.rightMargin = (metrics.widthPixels - location[0] - anchor.getWidth()) / 2;
+ mRotateLayout.setLayoutParams(params);
+
+ // Start animation
+ Animation fadeIn = AnimationUtils.loadAnimation(mContext, R.anim.grow_fade_in_from_right);
+ mRotateLayout.startAnimation(fadeIn);
+ }
+
+ public void setOrientation(int orientation) {
+ // Calculate the width and the height of the thumbnail.
+ float width, height;
+ if (orientation == 90 || orientation == 270) {
+ width = mImageMaxWidthPortrait;
+ height = mImageMaxHeightPortrait;
+ } else {
+ width = mImageMaxWidthLandscape;
+ height = mImageMaxHeightLandscape;
+ }
+ LayoutParams params = mThumbnail.getLayoutParams();
+ if (width * mBitmapHeight > height * mBitmapWidth) {
+ params.width = Math.round(mBitmapWidth * height / mBitmapHeight);
+ params.height = Math.round(height);
+ } else {
+ params.width = Math.round(width);
+ params.height = Math.round(mBitmapHeight * params.width / mBitmapWidth);
+ }
+ mThumbnail.setLayoutParams(params);
+ mRotateLayout.setOrientation(orientation);
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.expanded_thumbnail:
+ Util.viewUri(mUri, mContext);
+ break;
+ }
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ dismiss();
+ return true;
+ }
+ return false;
+ }
+}