diff options
author | Sascha Haeberling <haeberling@google.com> | 2014-10-23 17:28:37 -0700 |
---|---|---|
committer | Sascha Haeberling <haeberling@google.com> | 2014-10-23 17:28:37 -0700 |
commit | 770c2b3e82326d6272b1d2f65a65e5330c951abb (patch) | |
tree | d5fedb39a665c5646ea53f7fc456d150e9bf1f5e /src | |
parent | 47e9f17a13b391554c8121aae049e91b553688cf (diff) | |
download | android_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.java | 6 | ||||
-rw-r--r-- | src/com/android/camera/data/FixedFirstDataAdapter.java | 9 | ||||
-rw-r--r-- | src/com/android/camera/data/FixedLastDataAdapter.java | 12 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalData.java | 13 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalMediaData.java | 12 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalSessionData.java | 8 | ||||
-rw-r--r-- | src/com/android/camera/data/SimpleViewData.java | 6 | ||||
-rw-r--r-- | src/com/android/camera/filmstrip/DataAdapter.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/widget/FilmstripView.java | 35 |
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; } |