summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSascha Haeberling <haeberling@google.com>2014-10-23 17:28:37 -0700
committerSascha Haeberling <haeberling@google.com>2014-10-23 17:28:37 -0700
commit770c2b3e82326d6272b1d2f65a65e5330c951abb (patch)
treed5fedb39a665c5646ea53f7fc456d150e9bf1f5e /src
parent47e9f17a13b391554c8121aae049e91b553688cf (diff)
downloadandroid_packages_apps_Camera2-770c2b3e82326d6272b1d2f65a65e5330c951abb.tar.gz
android_packages_apps_Camera2-770c2b3e82326d6272b1d2f65a65e5330c951abb.tar.bz2
android_packages_apps_Camera2-770c2b3e82326d6272b1d2f65a65e5330c951abb.zip
Introduce ActionCallback for LocalData items.
Bug: 18105354 Fixes the bug where we try to cast a context to an activity. Change-Id: I3e82a2cda5fe004768276a4d48c07d75738b2a5e
Diffstat (limited to 'src')
-rw-r--r--src/com/android/camera/data/CameraDataAdapter.java6
-rw-r--r--src/com/android/camera/data/FixedFirstDataAdapter.java9
-rw-r--r--src/com/android/camera/data/FixedLastDataAdapter.java12
-rw-r--r--src/com/android/camera/data/LocalData.java13
-rw-r--r--src/com/android/camera/data/LocalMediaData.java12
-rw-r--r--src/com/android/camera/data/LocalSessionData.java8
-rw-r--r--src/com/android/camera/data/SimpleViewData.java6
-rw-r--r--src/com/android/camera/filmstrip/DataAdapter.java4
-rw-r--r--src/com/android/camera/widget/FilmstripView.java35
9 files changed, 75 insertions, 30 deletions
diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java
index 721b213bf..07100efbc 100644
--- a/src/com/android/camera/data/CameraDataAdapter.java
+++ b/src/com/android/camera/data/CameraDataAdapter.java
@@ -23,6 +23,7 @@ import android.os.AsyncTask;
import android.view.View;
import com.android.camera.Storage;
+import com.android.camera.data.LocalData.ActionCallback;
import com.android.camera.debug.Log;
import com.android.camera.filmstrip.ImageData;
import com.android.camera.util.Callback;
@@ -125,14 +126,15 @@ public class CameraDataAdapter implements LocalDataAdapter {
}
@Override
- public View getView(Context context, View recycled, int dataID) {
+ public View getView(Context context, View recycled, int dataID,
+ ActionCallback actionCallback) {
if (dataID >= mImages.size() || dataID < 0) {
return null;
}
return mImages.get(dataID).getView(
context, recycled, mSuggestedWidth, mSuggestedHeight,
- mPlaceHolderResourceId, this, /* inProgress */ false);
+ mPlaceHolderResourceId, this, /* inProgress */ false, actionCallback);
}
@Override
diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java
index 471fd19f9..f14a1c8a6 100644
--- a/src/com/android/camera/data/FixedFirstDataAdapter.java
+++ b/src/com/android/camera/data/FixedFirstDataAdapter.java
@@ -21,6 +21,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.view.View;
+import com.android.camera.data.LocalData.ActionCallback;
import com.android.camera.debug.Log;
import com.android.camera.filmstrip.DataAdapter;
import com.android.camera.filmstrip.ImageData;
@@ -110,12 +111,12 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper
}
@Override
- public View getView(Context context, View recycled, int dataID) {
+ public View getView(Context context, View recycled, int dataID, ActionCallback actionCallback) {
if (dataID == 0) {
- return mFirstData.getView(
- context, recycled, mSuggestedWidth, mSuggestedHeight, 0, null, false);
+ return mFirstData.getView(context, recycled, mSuggestedWidth, mSuggestedHeight, 0,
+ null, false, actionCallback);
}
- return mAdapter.getView(context, recycled, dataID - 1);
+ return mAdapter.getView(context, recycled, dataID - 1, actionCallback);
}
@Override
diff --git a/src/com/android/camera/data/FixedLastDataAdapter.java b/src/com/android/camera/data/FixedLastDataAdapter.java
index 35978d85b..a87a2dea4 100644
--- a/src/com/android/camera/data/FixedLastDataAdapter.java
+++ b/src/com/android/camera/data/FixedLastDataAdapter.java
@@ -21,6 +21,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.view.View;
+import com.android.camera.data.LocalData.ActionCallback;
import com.android.camera.filmstrip.ImageData;
/**
@@ -66,7 +67,6 @@ public class FixedLastDataAdapter extends AbstractLocalDataAdapterWrapper {
} else if (dataID == totalNumber) {
return mLastData;
}
-
return null;
}
@@ -112,16 +112,15 @@ public class FixedLastDataAdapter extends AbstractLocalDataAdapterWrapper {
}
@Override
- public View getView(Context context, View recycled, int dataID) {
+ public View getView(Context context, View recycled, int dataID, ActionCallback actionCallback) {
int totalNumber = mAdapter.getTotalNumber();
if (dataID < totalNumber) {
- return mAdapter.getView(context, recycled, dataID);
+ return mAdapter.getView(context, recycled, dataID, actionCallback);
} else if (dataID == totalNumber) {
- return mLastData.getView(context, recycled,
- mSuggestedWidth, mSuggestedHeight, 0, null, false);
+ return mLastData.getView(context, recycled, mSuggestedWidth, mSuggestedHeight, 0, null,
+ false, actionCallback);
}
-
return null;
}
@@ -134,7 +133,6 @@ public class FixedLastDataAdapter extends AbstractLocalDataAdapterWrapper {
} else if (dataId == totalNumber) {
return mLastData.getItemViewType().ordinal();
}
-
return -1;
}
diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java
index df2d9c220..d42bf9799 100644
--- a/src/com/android/camera/data/LocalData.java
+++ b/src/com/android/camera/data/LocalData.java
@@ -17,8 +17,10 @@
package com.android.camera.data;
import android.content.Context;
+import android.net.Uri;
import android.os.Bundle;
import android.view.View;
+
import com.android.camera.debug.Log;
import com.android.camera.filmstrip.ImageData;
@@ -32,6 +34,14 @@ import java.util.Comparator;
* can guarantee thread safety for LocalData.
*/
public interface LocalData extends ImageData {
+ /**
+ * An action callback to be used for actions on the local media data items.
+ */
+ public static interface ActionCallback {
+ /** Plays the video with the given URI and title. */
+ public void playVideo(Uri uri, String title);
+ }
+
static final Log.Tag TAG = new Log.Tag("LocalData");
public static final String MIME_TYPE_JPEG = "image/jpeg";
@@ -79,7 +89,8 @@ public interface LocalData extends ImageData {
* @param adapter Data adapter for this data item.
*/
View getView(Context context, View recycled, int thumbWidth, int thumbHeight,
- int placeHolderResourceId, LocalDataAdapter adapter, boolean isInProgress);
+ int placeHolderResourceId, LocalDataAdapter adapter, boolean isInProgress,
+ ActionCallback actionCallback);
/** Returns a unique identifier for the view created by this data so that the view
* can be reused.
diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java
index 3f7e41305..ab5705862 100644
--- a/src/com/android/camera/data/LocalMediaData.java
+++ b/src/com/android/camera/data/LocalMediaData.java
@@ -16,7 +16,6 @@
package com.android.camera.data;
-import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
@@ -32,7 +31,6 @@ import android.widget.ImageView;
import com.android.camera.Storage;
import com.android.camera.debug.Log;
-import com.android.camera.util.CameraUtil;
import com.android.camera2.R;
import com.bumptech.glide.BitmapRequestBuilder;
import com.bumptech.glide.Glide;
@@ -219,7 +217,8 @@ public abstract class LocalMediaData implements LocalData {
@Override
public View getView(Context context, View recycled, int thumbWidth, int thumbHeight,
- int placeHolderResourceId, LocalDataAdapter adapter, boolean isInProgress) {
+ int placeHolderResourceId, LocalDataAdapter adapter, boolean isInProgress,
+ ActionCallback actionCallback) {
final ImageView imageView;
if (recycled != null) {
imageView = (ImageView) recycled;
@@ -842,7 +841,8 @@ public abstract class LocalMediaData implements LocalData {
@Override
public View getView(final Context context, View recycled,
int thumbWidth, int thumbHeight, int placeHolderResourceId,
- LocalDataAdapter adapter, boolean isInProgress) {
+ LocalDataAdapter adapter, boolean isInProgress,
+ final ActionCallback actionCallback) {
final VideoViewHolder viewHolder;
final View result;
@@ -865,9 +865,7 @@ public abstract class LocalMediaData implements LocalData {
viewHolder.mPlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- // TODO: refactor this into activities to avoid this class
- // conversion.
- CameraUtil.playVideo((Activity) context, getUri(), mTitle);
+ actionCallback.playVideo(getUri(), mTitle);
}
});
diff --git a/src/com/android/camera/data/LocalSessionData.java b/src/com/android/camera/data/LocalSessionData.java
index 8254baaa9..8a5d6c6f3 100644
--- a/src/com/android/camera/data/LocalSessionData.java
+++ b/src/com/android/camera/data/LocalSessionData.java
@@ -26,7 +26,6 @@ import android.widget.ImageView;
import com.android.camera.Storage;
import com.android.camera2.R;
import com.bumptech.glide.Glide;
-import com.bumptech.glide.load.DecodeFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
@@ -37,9 +36,9 @@ import java.util.concurrent.TimeUnit;
*/
public class LocalSessionData implements LocalData {
- private Uri mUri;
+ private final Uri mUri;
// Units are GMT epoch milliseconds.
- private long mDateTaken;
+ private final long mDateTaken;
protected final Bundle mMetaData;
private int mWidth;
private int mHeight;
@@ -59,7 +58,8 @@ public class LocalSessionData implements LocalData {
@Override
public View getView(Context context, View recycled, int thumbWidth, int thumbHeight,
- int placeholderResourcedId, LocalDataAdapter adapter, boolean isInProgress) {
+ int placeholderResourcedId, LocalDataAdapter adapter, boolean isInProgress,
+ ActionCallback actionCallback) {
final ImageView imageView;
if (recycled != null) {
imageView = (ImageView) recycled;
diff --git a/src/com/android/camera/data/SimpleViewData.java b/src/com/android/camera/data/SimpleViewData.java
index 74f1073c3..3b6095825 100644
--- a/src/com/android/camera/data/SimpleViewData.java
+++ b/src/com/android/camera/data/SimpleViewData.java
@@ -17,7 +17,6 @@
package com.android.camera.data;
import android.content.Context;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
@@ -135,8 +134,9 @@ public class SimpleViewData implements LocalData {
}
@Override
- public View getView(Context context, View recycled, int width, int height, int placeHolderResourceId,
- LocalDataAdapter adapter, boolean isInProgressSession) {
+ public View getView(Context context, View recycled, int width, int height,
+ int placeHolderResourceId, LocalDataAdapter adapter, boolean isInProgressSession,
+ ActionCallback actionCallback) {
return mView;
}
diff --git a/src/com/android/camera/filmstrip/DataAdapter.java b/src/com/android/camera/filmstrip/DataAdapter.java
index e1ca61dea..65ae48a3a 100644
--- a/src/com/android/camera/filmstrip/DataAdapter.java
+++ b/src/com/android/camera/filmstrip/DataAdapter.java
@@ -19,6 +19,8 @@ package com.android.camera.filmstrip;
import android.content.Context;
import android.view.View;
+import com.android.camera.data.LocalData.ActionCallback;
+
/**
* An interface which defines the interactions between the
* {@link ImageData} and the
@@ -85,7 +87,7 @@ public interface DataAdapter {
* @return The view representing the image data. Null if unavailable or
* the {@code dataID} is out of range.
*/
- public View getView(Context context, View recycled, int dataID);
+ public View getView(Context context, View recycled, int dataID, ActionCallback actionCallback);
/** Returns a unique identifier for the view created by this data so that the view
* can be reused.
diff --git a/src/com/android/camera/widget/FilmstripView.java b/src/com/android/camera/widget/FilmstripView.java
index 70c2b8619..8743c43e7 100644
--- a/src/com/android/camera/widget/FilmstripView.java
+++ b/src/com/android/camera/widget/FilmstripView.java
@@ -21,6 +21,7 @@ import android.animation.AnimatorSet;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
+import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Point;
@@ -42,6 +43,7 @@ import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import com.android.camera.CameraActivity;
+import com.android.camera.data.LocalData.ActionCallback;
import com.android.camera.debug.Log;
import com.android.camera.filmstrip.DataAdapter;
import com.android.camera.filmstrip.FilmstripController;
@@ -52,11 +54,39 @@ import com.android.camera.util.ApiHelper;
import com.android.camera.util.CameraUtil;
import com.android.camera2.R;
+import java.lang.ref.WeakReference;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
public class FilmstripView extends ViewGroup {
+ /**
+ * An action callback to be used for actions on the local media data items.
+ */
+ public static class ActionCallbackImpl implements ActionCallback {
+ private final WeakReference<Activity> mActivity;
+
+ /**
+ * The given activity is used to start intents. It is wrapped in a weak
+ * reference to prevent leaks.
+ */
+ public ActionCallbackImpl(Activity activity) {
+ mActivity = new WeakReference<Activity>(activity);
+ }
+
+ /**
+ * Fires an intent to play the video with the given URI and title.
+ */
+ @Override
+ public void playVideo(Uri uri, String title) {
+ Activity activity = mActivity.get();
+ if (activity != null) {
+ CameraUtil.playVideo(activity, uri, title);
+ }
+ }
+ }
+
+
private static final Log.Tag TAG = new Log.Tag("FilmstripView");
private static final int BUFFER_SIZE = 5;
@@ -87,6 +117,7 @@ public class FilmstripView extends ViewGroup {
private static final int DECELERATION_FACTOR = 4;
private CameraActivity mActivity;
+ private ActionCallback mActionCallback;
private FilmstripGestureRecognizer mGestureRecognizer;
private FilmstripGestureRecognizer.Listener mGestureListener;
private DataAdapter mDataAdapter;
@@ -585,6 +616,7 @@ public class FilmstripView extends ViewGroup {
private void init(CameraActivity cameraActivity) {
setWillNotDraw(false);
mActivity = cameraActivity;
+ mActionCallback = new ActionCallbackImpl(mActivity);
mScale = 1.0f;
mDataIdOnUserScrolling = 0;
mController = new MyController(cameraActivity);
@@ -813,7 +845,8 @@ public class FilmstripView extends ViewGroup {
data.prepare();
View recycled = getRecycledView(dataID);
- View v = mDataAdapter.getView(mActivity.getAndroidContext(), recycled, dataID);
+ View v = mDataAdapter.getView(mActivity.getAndroidContext(), recycled, dataID,
+ mActionCallback);
if (v == null) {
return null;
}