summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/app/MovieActivity.java52
-rw-r--r--src/com/android/gallery3d/app/MoviePlayer.java112
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/IActivityHooker.java118
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/IMoviePlayer.java36
-rwxr-xr-xsrc/com/qcom/gallery3d/video/ExtensionHelper.java88
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/ext/ActivityHooker.java (renamed from src/com/qcom/gallery3d/ext/ActivityHooker.java)33
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/ext/ActivityHookerGroup.java (renamed from src/com/qcom/gallery3d/ext/ActivityHookerGroup.java)66
-rw-r--r--src/org/codeaurora/gallery3d/ext/IActivityHooker.java99
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/ext/IMovieItem.java (renamed from src/com/qcom/gallery3d/ext/IMovieItem.java)20
-rw-r--r--src/org/codeaurora/gallery3d/ext/IMoviePlayer.java17
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/ext/MovieItem.java (renamed from src/com/qcom/gallery3d/ext/MovieItem.java)86
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/ext/MovieUtils.java (renamed from src/com/qcom/gallery3d/ext/MovieUtils.java)29
-rwxr-xr-xsrc/org/codeaurora/gallery3d/video/ExtensionHelper.java27
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/video/LoopVideoHooker.java (renamed from src/com/qcom/gallery3d/video/LoopVideoHooker.java)33
-rw-r--r--[-rwxr-xr-x]src/org/codeaurora/gallery3d/video/MovieHooker.java (renamed from src/com/qcom/gallery3d/video/MovieHooker.java)28
15 files changed, 421 insertions, 423 deletions
diff --git a/src/com/android/gallery3d/app/MovieActivity.java b/src/com/android/gallery3d/app/MovieActivity.java
index 30b12243f..5152e5b39 100644
--- a/src/com/android/gallery3d/app/MovieActivity.java
+++ b/src/com/android/gallery3d/app/MovieActivity.java
@@ -62,6 +62,10 @@ import com.android.gallery3d.R;
import com.android.gallery3d.common.ApiHelper;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.ui.Knob;
+import org.codeaurora.gallery3d.ext.IActivityHooker;
+import org.codeaurora.gallery3d.ext.MovieItem;
+import org.codeaurora.gallery3d.ext.IMovieItem;
+import org.codeaurora.gallery3d.video.ExtensionHelper;
/**
* This activity plays a video from a specified URI.
@@ -79,7 +83,6 @@ public class MovieActivity extends Activity {
private MoviePlayer mPlayer;
private boolean mFinishOnCompletion;
private Uri mUri;
- private boolean mTreatUpAsBack;
private static final short BASSBOOST_MAX_STRENGTH = 1000;
private static final short VIRTUALIZER_MAX_STRENGTH = 1000;
@@ -100,6 +103,9 @@ public class MovieActivity extends Activity {
private Knob mBassBoostKnob;
private Knob mVirtualizerKnob;
+ private IMovieItem mMovieItem;
+ private IActivityHooker mMovieHooker;
+
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
@@ -153,11 +159,14 @@ public class MovieActivity extends Activity {
setSystemUiVisibility(rootView);
Intent intent = getIntent();
+
+ mMovieHooker = ExtensionHelper.getHooker(this);
+ initMovieInfo(intent);
+
initializeActionBar(intent);
mFinishOnCompletion = intent.getBooleanExtra(
MediaStore.EXTRA_FINISH_ON_COMPLETION, true);
- mTreatUpAsBack = intent.getBooleanExtra(KEY_TREAT_UP_AS_BACK, false);
- mPlayer = new MoviePlayer(rootView, this, intent.getData(), savedInstanceState,
+ mPlayer = new MoviePlayer(rootView, this, mMovieItem, savedInstanceState,
!mFinishOnCompletion) {
@Override
public void onCompletion() {
@@ -183,7 +192,10 @@ public class MovieActivity extends Activity {
// We set the background in the theme to have the launching animation.
// But for the performance (and battery), we remove the background here.
win.setBackgroundDrawable(null);
-
+ mMovieHooker.init(this, intent);
+ mMovieHooker.setParameter(null, mPlayer.getMoviePlayerExt());
+ mMovieHooker.setParameter(null, mMovieItem);
+ mMovieHooker.setParameter(null, mPlayer.getVideoSurface());
// Determine available/supported effects
final Descriptor[] effects = AudioEffect.queryEffects();
for (final Descriptor effect : effects) {
@@ -299,6 +311,14 @@ public class MovieActivity extends Activity {
return true;
}
});
+ mMovieHooker.onCreateOptionsMenu(menu);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+ mMovieHooker.onPrepareOptionsMenu(menu);
return true;
}
@@ -402,19 +422,16 @@ public class MovieActivity extends Activity {
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
- if (mTreatUpAsBack) {
- finish();
- } else {
- startActivity(new Intent(this, GalleryActivity.class));
- finish();
- }
+ // If click back up button, we will always finish current activity and
+ // back to previous one.
+ finish();
return true;
} else if (id == R.id.action_share) {
startActivity(Intent.createChooser(createShareIntent(),
getString(R.string.share)));
return true;
}
- return false;
+ return mMovieHooker.onOptionsItemSelected(item);
}
public void showHeadsetPlugToast() {
@@ -494,4 +511,17 @@ public class MovieActivity extends Activity {
return mPlayer.onKeyUp(keyCode, event)
|| super.onKeyUp(keyCode, event);
}
+
+ private boolean isSharable() {
+ String scheme = mUri.getScheme();
+ return ContentResolver.SCHEME_FILE.equals(scheme)
+ || (ContentResolver.SCHEME_CONTENT.equals(scheme) && MediaStore.AUTHORITY
+ .equals(mUri.getAuthority()));
+ }
+ private void initMovieInfo(Intent intent) {
+ Uri original = intent.getData();
+ String mimeType = intent.getType();
+ mMovieItem = new MovieItem(original, mimeType, null);
+ mMovieItem.setOriginalUri(original);
+ }
}
diff --git a/src/com/android/gallery3d/app/MoviePlayer.java b/src/com/android/gallery3d/app/MoviePlayer.java
index 962afeafb..09fd272ae 100644
--- a/src/com/android/gallery3d/app/MoviePlayer.java
+++ b/src/com/android/gallery3d/app/MoviePlayer.java
@@ -35,6 +35,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.VideoView;
@@ -44,6 +45,9 @@ import com.android.gallery3d.common.ApiHelper;
import com.android.gallery3d.common.BlobCache;
import com.android.gallery3d.util.CacheManager;
import com.android.gallery3d.util.GalleryUtils;
+import org.codeaurora.gallery3d.ext.IMoviePlayer;
+import org.codeaurora.gallery3d.ext.IMovieItem;
+import org.codeaurora.gallery3d.video.ExtensionHelper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -75,6 +79,9 @@ public class MoviePlayer implements
// Otherwise, we pause the player.
private static final long RESUMEABLE_TIMEOUT = 3 * 60 * 1000; // 3 mins
+ public static final int STREAMING_LOCAL = 0;
+ private int mStreamingType = STREAMING_LOCAL;
+
private Context mContext;
private final VideoView mVideoView;
private final View mRootView;
@@ -97,6 +104,24 @@ public class MoviePlayer implements
private Virtualizer mVirtualizer;
+ private MoviePlayerExtension mPlayerExt = new MoviePlayerExtension();
+ private boolean mCanReplay;
+ private TState mTState = TState.PLAYING;
+ private IMovieItem mMovieItem;
+
+ private enum TState {
+ PLAYING,
+ PAUSED,
+ STOPED,
+ COMPELTED,
+ RETRY_ERROR
+ }
+
+ interface Restorable {
+ void onRestoreInstanceState(Bundle icicle);
+ void onSaveInstanceState(Bundle outState);
+ }
+
private final Runnable mPlayingChecker = new Runnable() {
@Override
public void run() {
@@ -117,18 +142,20 @@ public class MoviePlayer implements
};
public MoviePlayer(View rootView, final MovieActivity movieActivity,
- Uri videoUri, Bundle savedInstance, boolean canReplay) {
+ IMovieItem info, Bundle savedInstance, boolean canReplay) {
mContext = movieActivity.getApplicationContext();
mRootView = rootView;
mVideoView = (VideoView) rootView.findViewById(R.id.surface_view);
mBookmarker = new Bookmarker(movieActivity);
- mUri = videoUri;
mController = new MovieControllerOverlay(mContext);
((ViewGroup)rootView).addView(mController.getView());
mController.setListener(this);
mController.setCanReplay(canReplay);
+ init(info, canReplay);
+ mUri = mMovieItem.getUri();
+
mVideoView.setOnErrorListener(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setVideoURI(mUri);
@@ -191,6 +218,7 @@ public class MoviePlayer implements
mResumeableTime = savedInstance.getLong(KEY_RESUMEABLE_TIME, Long.MAX_VALUE);
mVideoView.start();
mVideoView.suspend();
+ onRestoreInstanceState(savedInstance);
mHasPaused = true;
} else {
final Integer bookmark = mBookmarker.getBookmark(mUri);
@@ -242,6 +270,7 @@ public class MoviePlayer implements
public void onSaveInstanceState(Bundle outState) {
outState.putInt(KEY_VIDEO_POSITION, mVideoPosition);
outState.putLong(KEY_RESUMEABLE_TIME, mResumeableTime);
+ onSaveInstanceStateMore(outState);
}
private void showResumeDialog(Context context, final int bookmark) {
@@ -332,6 +361,11 @@ public class MoviePlayer implements
}
mVideoView.start();
+ //we may start video from stopVideo,
+ //this case, we should reset canReplay flag according canReplay and loop
+ boolean loop = mPlayerExt.getLoop();
+ boolean canReplay = loop ? loop : mCanReplay;
+ mController.setCanReplay(canReplay);
setProgress();
}
@@ -358,8 +392,15 @@ public class MoviePlayer implements
@Override
public void onCompletion(MediaPlayer mp) {
- mController.showEnded();
- onCompletion();
+ if (mPlayerExt.getLoop()) {
+ onReplay();
+ } else { //original logic
+ mTState = TState.COMPELTED;
+ if (mCanReplay) {
+ mController.showEnded();
+ }
+ onCompletion();
+ }
}
public void onCompletion() {
@@ -459,6 +500,11 @@ public class MoviePlayer implements
|| keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE;
}
+ private void init(IMovieItem info, boolean canReplay) {
+ mCanReplay = canReplay;
+ mMovieItem = info;
+ }
+
// We want to pause when the headset is unplugged.
private class AudioBecomingNoisyReceiver extends BroadcastReceiver {
@@ -484,6 +530,64 @@ public class MoviePlayer implements
public void setOnPreparedListener(MediaPlayer.OnPreparedListener listener) {
mVideoView.setOnPreparedListener(listener);
}
+
+ public boolean isLocalFile() {
+ if (mStreamingType == STREAMING_LOCAL) {
+ return true;
+ }
+ return false;
+ }
+
+ public IMoviePlayer getMoviePlayerExt() {
+ return mPlayerExt;
+ }
+
+ public SurfaceView getVideoSurface() {
+ return mVideoView;
+ }
+
+ private void onSaveInstanceStateMore(Bundle outState) {
+
+ mPlayerExt.onSaveInstanceState(outState);
+ }
+
+ private void onRestoreInstanceState(Bundle icicle) {
+
+ mPlayerExt.onRestoreInstanceState(icicle);
+ }
+
+ private class MoviePlayerExtension implements IMoviePlayer, Restorable {
+
+ private static final String KEY_VIDEO_IS_LOOP = "video_is_loop";
+
+ private boolean mIsLoop;
+
+ @Override
+ public boolean getLoop() {
+ return mIsLoop;
+ }
+
+ @Override
+ public void setLoop(boolean loop) {
+ if (isLocalFile()) {
+ mIsLoop = loop;
+ mController.setCanReplay(loop);
+ }
+ }
+
+ @Override
+ public void onRestoreInstanceState(Bundle icicle) {
+ mIsLoop = icicle.getBoolean(KEY_VIDEO_IS_LOOP, false);
+ if (mIsLoop) {
+ mController.setCanReplay(true);
+ } // else will get can replay from intent.
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(KEY_VIDEO_IS_LOOP, mIsLoop);
+ }
+ };
}
class Bookmarker {
diff --git a/src/com/qcom/gallery3d/ext/IActivityHooker.java b/src/com/qcom/gallery3d/ext/IActivityHooker.java
deleted file mode 100755
index 3be707c6d..000000000
--- a/src/com/qcom/gallery3d/ext/IActivityHooker.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.qcom.gallery3d.ext;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-
-/**
- * Activity action hooker class.
- * Host app's activity will call this hooker's functions in its lifecycle.
- * For example: HostActivity.onCreate()-->hooker.onCreate().
- * But void init(Activity context, Intent intent) will be called before other functions.
- * <br/>
- * IActivityHooker objects may show menus, but we should give a unique menu id to every menus.
- * Hooker can call getMenuActivityId(int) to get a global unique menu id to be used in menu.add(),
- * and can call getMenuOriginalId(int) to get the original menu id.
- * the example:
- * class Hooker implements IActivityHooker {
- * private static final int MENU_EXAMPLE = 1;
- * @Override
- * public boolean onCreateOptionsMenu(Menu menu) {
- * super.onCreateOptionsMenu(menu);
- * menu.add(0, getMenuActivityId(MENU_EXAMPLE), 0, android.R.string.ok);
- * return true;
- * }
- * @Override
- * public boolean onOptionsItemSelected(MenuItem item) {
- * switch(getMenuOriginalId(item.getItemId())) {
- * case MENU_EXAMPLE:
- * //do something
- * return true;
- * default:
- * return false;
- * }
- * }
- * }
- */
-public interface IActivityHooker {
- /**
- * Will be called in Host Activity.onCreate(Bundle savedInstanceState)
- * @param savedInstanceState
- */
- void onCreate(Bundle savedInstanceState);
- /**
- * Will be called in Host Activity.onStart()
- */
- void onStart();
- /**
- * Will be called in Host Activity.onStop()
- */
- void onStop();
- /**
- * Will be called in Host Activity.onPause()
- */
- void onPause();
- /**
- * Will be called in Host Activity.onResume()
- */
- void onResume();
- /**
- * Will be called in Host Activity.onDestroy()
- */
- void onDestroy();
- /**
- * Will be called in Host Activity.onCreateOptionsMenu(Menu menu)
- * @param menu
- * @return
- */
- boolean onCreateOptionsMenu(Menu menu);
- /**
- * Will be called in Host Activity.onPrepareOptionsMenu(Menu menu)
- * @param menu
- * @return
- */
- boolean onPrepareOptionsMenu(Menu menu);
- /**
- * Will be called in Host Activity.onOptionsItemSelected(MenuItem item)
- * @param item
- * @return
- */
- boolean onOptionsItemSelected(MenuItem item);
-
- /**
- * Should be called before any other functions.
- * @param context
- * @param intent
- */
- void init(Activity context, Intent intent);
- /**
- * @return return activity set by init(Activity context, Intent intent)
- */
- Activity getContext();
- /**
- * @return return intent set by init(Activity context, Intent intent)
- */
- Intent getIntent();
- /**
- * IActivityHooker objects may show menus, but we should give a unique menu id to every menus.
- * Hooker can call this function to get a global unique menu id to be used in menu.add()
- * @param id
- * @return
- */
- int getMenuActivityId(int id);
- /**
- * When onOptionsItemSelected is called, we can get menu's id from parameter.
- * You can get the original menu id by calling this function.
- * @param id
- * @return
- */
- int getMenuOriginalId(int id);
- /**
- * Host activity will call this function to set parameter to hooker activity.
- * @param key
- * @param value
- */
- void setParameter(String key, Object value);
-}
diff --git a/src/com/qcom/gallery3d/ext/IMoviePlayer.java b/src/com/qcom/gallery3d/ext/IMoviePlayer.java
deleted file mode 100755
index 3a353639c..000000000
--- a/src/com/qcom/gallery3d/ext/IMoviePlayer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.qcom.gallery3d.ext;
-
-public interface IMoviePlayer {
- /**
- * add new bookmark Uri.
- */
- void addBookmark();
- /**
- * start current item and stop playing video.
- * @param item
- */
- void startNextVideo(IMovieItem item);
- /**
- * Loop current video.
- * @param loop
- */
- void setLoop(boolean loop);
- /**
- * Loop current video or not
- * @return
- */
- boolean getLoop();
- /**
- * Show video details.
- */
- void showDetail();
- /**
- * Can stop current video or not.
- * @return
- */
- boolean canStop();
- /**
- * Stop current video.
- */
- void stopVideo();
-}
diff --git a/src/com/qcom/gallery3d/video/ExtensionHelper.java b/src/com/qcom/gallery3d/video/ExtensionHelper.java
deleted file mode 100755
index ae667eeb5..000000000
--- a/src/com/qcom/gallery3d/video/ExtensionHelper.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.qcom.gallery3d.video;
-
-import android.content.Context;
-
-import com.android.gallery3d.app.MovieActivity;
-import com.qcom.gallery3d.ext.ActivityHookerGroup;
-import com.qcom.gallery3d.ext.IActivityHooker;
-import com.qcom.gallery3d.ext.IMovieExtension;
-import com.qcom.gallery3d.ext.IMovieStrategy;
-import com.qcom.gallery3d.ext.MovieExtension;
-import com.qcom.gallery3d.ext.MovieStrategy;
-import com.qcom.gallery3d.ext.QcomLog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ExtensionHelper {
- private static final String TAG = "ExtensionHelper";
- private static final boolean LOG = true;
-
- private static List<IMovieExtension> sMovieExtensions;
- private static void ensureMovieExtension(final Context context) {
- if (sMovieExtensions == null) {
- sMovieExtensions = new ArrayList<IMovieExtension>();
- sMovieExtensions.add(new MovieExtension(MovieExtension.CMCC_EXTENSION_FUNCTIONS));
- }
- }
-
- public static IActivityHooker getHooker(final Context context) {
- ensureMovieExtension(context);
- final ActivityHookerGroup group = new ActivityHookerGroup();
- if (!(ExtensionHelper.getMovieStrategy(context).shouldEnableRewindAndForward())) {
- group.addHooker(new StopVideoHooker());//add it for common feature.
- }
- group.addHooker(new LoopVideoHooker()); //add it for common feature.
-
- for (final IMovieExtension ext : sMovieExtensions) { //add common feature in host app
- final List<Integer> list = ext.getFeatureList();
- if (list != null) {
- for (int i = 0, size = list.size(); i < size; i++) {
- final int feature = list.get(i);
- switch(feature) {
- case IMovieExtension.FEATURE_ENABLE_STOP:
- //group.addHooker(new StopVideoHooker());
- break;
- // case IMovieExtension.FEATURE_ENABLE_NOTIFICATION_PLUS:
- // group.addHooker(new NotificationPlusHooker());
- // break;
- case IMovieExtension.FEATURE_ENABLE_STREAMING:
- group.addHooker(new StreamingHooker());
- break;
- case IMovieExtension.FEATURE_ENABLE_BOOKMARK:
- group.addHooker(new BookmarkHooker());
- break;
- case IMovieExtension.FEATURE_ENABLE_VIDEO_LIST:
- group.addHooker(new MovieListHooker());
- break;
- case IMovieExtension.FEATURE_ENABLE_STEREO_AUDIO:
- group.addHooker(new StereoAudioHooker());
- break;
- case IMovieExtension.FEATURE_ENABLE_SETTINGS:
- group.addHooker(new StepOptionSettingsHooker());
- break;
- default:
- break;
- }
- }
- }
- }
- for (final IMovieExtension ext : sMovieExtensions) { //add other feature in plugin app
- final IActivityHooker hooker = ext.getHooker();
- if (hooker != null) {
- group.addHooker(hooker);
- }
- }
- for (int i = 0, count = group.size(); i < count; i++) {
- if (LOG) {
- QcomLog.v(TAG, "getHooker() [" + i + "]=" + group.getHooker(i));
- }
- }
- return group;
- }
-
- public static IMovieStrategy getMovieStrategy(final Context context) {
- return new MovieStrategy();
- }
-
-}
diff --git a/src/com/qcom/gallery3d/ext/ActivityHooker.java b/src/org/codeaurora/gallery3d/ext/ActivityHooker.java
index 3d1999bc1..039c5a04e 100755..100644
--- a/src/com/qcom/gallery3d/ext/ActivityHooker.java
+++ b/src/org/codeaurora/gallery3d/ext/ActivityHooker.java
@@ -1,21 +1,23 @@
-package com.qcom.gallery3d.ext;
+package org.codeaurora.gallery3d.ext;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
+
/**
* Default implemention class of IActivityHooker.
*/
public class ActivityHooker implements IActivityHooker {
+
private static final int MENU_MAX_NUMBER = 100;
private static int sMenuId = 1;
private int mMenuId;
private static Object sMenuLock = new Object();
private Activity mContext;
private Intent mIntent;
-
+
public ActivityHooker() {
synchronized (sMenuLock) {
sMenuId++;
@@ -32,13 +34,13 @@ public class ActivityHooker implements IActivityHooker {
public int getMenuOriginalId(int id) {
return id - mMenuId;
}
-
+
@Override
public void init(Activity context, Intent intent) {
mContext = context;
mIntent = intent;
}
-
+
@Override
public Activity getContext() {
return mContext;
@@ -48,34 +50,17 @@ public class ActivityHooker implements IActivityHooker {
public Intent getIntent() {
return mIntent;
}
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- }
- @Override
- public void onStart() {
- }
- @Override
- public void onResume() {
- }
- @Override
- public void onPause() {
- }
- @Override
- public void onStop() {
- }
- @Override
- public void onDestroy() {
- }
-
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return false;
}
+
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return false;
diff --git a/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java b/src/org/codeaurora/gallery3d/ext/ActivityHookerGroup.java
index b1da185fd..2e24aa688 100755..100644
--- a/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java
+++ b/src/org/codeaurora/gallery3d/ext/ActivityHookerGroup.java
@@ -1,4 +1,4 @@
-package com.qcom.gallery3d.ext;
+package org.codeaurora.gallery3d.ext;
import android.app.Activity;
import android.content.Intent;
@@ -9,85 +9,41 @@ import android.view.MenuItem;
import java.util.ArrayList;
/**
- * The composite pattern class.
- * It will deliver every action to its leaf hookers.
+ * The composite pattern class. It will deliver every action to its leaf
+ * hookers.
*/
public class ActivityHookerGroup extends ActivityHooker {
private ArrayList<IActivityHooker> mHooks = new ArrayList<IActivityHooker>();
+
/**
* Add hooker to current group.
+ *
* @param hooker
* @return
*/
public boolean addHooker(IActivityHooker hooker) {
return mHooks.add(hooker);
}
+
/**
* Remove hooker from current group.
+ *
* @param hooker
* @return
*/
public boolean removeHooker(IActivityHooker hooker) {
return mHooks.remove(hooker);
}
- /**
- * Hooker size of current group.
- * @return
- */
- public int size() {
- return mHooks.size();
- }
+
/**
* Get hooker of requested location.
+ *
* @param index
* @return
*/
public IActivityHooker getHooker(int index) {
return mHooks.get(index);
}
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- for (IActivityHooker hook : mHooks) {
- hook.onCreate(savedInstanceState);
- }
- }
- @Override
- public void onStart() {
- super.onStart();
- for (IActivityHooker hook : mHooks) {
- hook.onStart();
- }
- }
- @Override
- public void onResume() {
- super.onResume();
- for (IActivityHooker hook : mHooks) {
- hook.onResume();
- }
- }
- @Override
- public void onPause() {
- super.onPause();
- for (IActivityHooker hook : mHooks) {
- hook.onPause();
- }
- }
- @Override
- public void onStop() {
- super.onStop();
- for (IActivityHooker hook : mHooks) {
- hook.onStop();
- }
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- for (IActivityHooker hook : mHooks) {
- hook.onDestroy();
- }
- }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@@ -101,6 +57,7 @@ public class ActivityHookerGroup extends ActivityHooker {
}
return handle;
}
+
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
@@ -113,6 +70,7 @@ public class ActivityHookerGroup extends ActivityHooker {
}
return handle;
}
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
@@ -133,7 +91,7 @@ public class ActivityHookerGroup extends ActivityHooker {
hook.setParameter(key, value);
}
}
-
+
@Override
public void init(Activity context, Intent intent) {
super.init(context, intent);
diff --git a/src/org/codeaurora/gallery3d/ext/IActivityHooker.java b/src/org/codeaurora/gallery3d/ext/IActivityHooker.java
new file mode 100644
index 000000000..fa1b5c0a0
--- /dev/null
+++ b/src/org/codeaurora/gallery3d/ext/IActivityHooker.java
@@ -0,0 +1,99 @@
+package org.codeaurora.gallery3d.ext;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+
+/**
+ * Activity action hooker class. Host app's activity will call this hooker's
+ * functions in its lifecycle. For example:
+ * HostActivity.onCreate()-->hooker.onCreate(). But void init(Activity context,
+ * Intent intent) will be called before other functions. <br/>
+ * IActivityHooker objects may show menus, but we should give a unique menu id
+ * to every menus. Hooker can call getMenuActivityId(int) to get a global unique
+ * menu id to be used in menu.add(), and can call getMenuOriginalId(int) to get
+ * the original menu id. the example: class Hooker implements IActivityHooker {
+ * private static final int MENU_EXAMPLE = 1;
+ *
+ * @Override public boolean onCreateOptionsMenu(Menu menu) {
+ * super.onCreateOptionsMenu(menu); menu.add(0,
+ * getMenuActivityId(MENU_EXAMPLE), 0, android.R.string.ok); return
+ * true; }
+ * @Override public boolean onOptionsItemSelected(MenuItem item) {
+ * switch(getMenuOriginalId(item.getItemId())) { case MENU_EXAMPLE:
+ * //do something return true; default: return false; } } }
+ */
+public interface IActivityHooker {
+
+ /**
+ * Will be called in Host Activity.onCreateOptionsMenu(Menu menu)
+ *
+ * @param menu
+ * @return
+ */
+ boolean onCreateOptionsMenu(Menu menu);
+
+ /**
+ * Will be called in Host Activity.onPrepareOptionsMenu(Menu menu)
+ *
+ * @param menu
+ * @return
+ */
+ boolean onPrepareOptionsMenu(Menu menu);
+
+ /**
+ * Will be called in Host Activity.onOptionsItemSelected(MenuItem item)
+ *
+ * @param item
+ * @return
+ */
+ boolean onOptionsItemSelected(MenuItem item);
+
+ /**
+ * Should be called before any other functions.
+ *
+ * @param context
+ * @param intent
+ */
+ void init(Activity context, Intent intent);
+
+ /**
+ * @return return activity set by init(Activity context, Intent intent)
+ */
+ Activity getContext();
+
+ /**
+ * @return return intent set by init(Activity context, Intent intent)
+ */
+ Intent getIntent();
+
+ /**
+ * IActivityHooker objects may show menus, but we should give a unique menu
+ * id to every menus. Hooker can call this function to get a global unique
+ * menu id to be used in menu.add()
+ *
+ * @param id
+ * @return
+ */
+ int getMenuActivityId(int id);
+
+ /**
+ * When onOptionsItemSelected is called, we can get menu's id from
+ * parameter. You can get the original menu id by calling this function.
+ *
+ * @param id
+ * @return
+ */
+ int getMenuOriginalId(int id);
+
+ /**
+ * Host activity will call this function to set parameter to hooker
+ * activity.
+ *
+ * @param key
+ * @param value
+ */
+ void setParameter(String key, Object value);
+}
diff --git a/src/com/qcom/gallery3d/ext/IMovieItem.java b/src/org/codeaurora/gallery3d/ext/IMovieItem.java
index 6c7f4dd20..dece4e803 100755..100644
--- a/src/com/qcom/gallery3d/ext/IMovieItem.java
+++ b/src/org/codeaurora/gallery3d/ext/IMovieItem.java
@@ -1,6 +1,7 @@
-package com.qcom.gallery3d.ext;
+package org.codeaurora.gallery3d.ext;
import android.net.Uri;
+
/**
* Movie info class
*/
@@ -9,34 +10,39 @@ public interface IMovieItem {
* @return movie Uri, it's may be not the original Uri.
*/
Uri getUri();
+
/**
- *
* @return MIME type of video
*/
String getMimeType();
+
/**
- *
* @return title of video
*/
String getTitle();
+
/**
- *
* @return whether error occured or not.
*/
boolean getError();
/**
* set title of video
+ *
* @param title
*/
void setTitle(String title);
+
/**
* set video Uri
+ *
* @param uri
*/
void setUri(Uri uri);
+
/**
* Set MIME type of video
+ *
* @param mimeType
*/
void setMimeType(String mimeType);
@@ -45,14 +51,16 @@ public interface IMovieItem {
* Set error occured flag
*/
void setError();
+
/**
- *
* @return return original Uri of video.
*/
Uri getOriginalUri();
+
/**
* Set video original Uri.
+ *
* @param uri
*/
void setOriginalUri(Uri uri);
-} \ No newline at end of file
+}
diff --git a/src/org/codeaurora/gallery3d/ext/IMoviePlayer.java b/src/org/codeaurora/gallery3d/ext/IMoviePlayer.java
new file mode 100644
index 000000000..9248ebdf4
--- /dev/null
+++ b/src/org/codeaurora/gallery3d/ext/IMoviePlayer.java
@@ -0,0 +1,17 @@
+package org.codeaurora.gallery3d.ext;
+
+public interface IMoviePlayer {
+ /**
+ * Loop current video.
+ *
+ * @param loop
+ */
+ void setLoop(boolean loop);
+
+ /**
+ * Loop current video or not
+ *
+ * @return
+ */
+ boolean getLoop();
+}
diff --git a/src/com/qcom/gallery3d/ext/MovieItem.java b/src/org/codeaurora/gallery3d/ext/MovieItem.java
index 2da1c2628..c6d53d031 100755..100644
--- a/src/com/qcom/gallery3d/ext/MovieItem.java
+++ b/src/org/codeaurora/gallery3d/ext/MovieItem.java
@@ -1,4 +1,4 @@
-package com.qcom.gallery3d.ext;
+package org.codeaurora.gallery3d.ext;
import android.net.Uri;
import android.provider.MediaStore;
@@ -6,80 +6,80 @@ import android.provider.MediaStore;
public class MovieItem implements IMovieItem {
private static final String TAG = "MovieItem";
private static final boolean LOG = true;
-
+
private Uri mUri;
private String mMimeType;
private String mTitle;
private boolean mError;
-// private int mStereoType;
+ // private int mStereoType;
private Uri mOriginal;
-
+
private static final int STREO_TYPE_2D = 1;
-
+
public MovieItem(Uri uri, String mimeType, String title, int stereoType) {
mUri = uri;
mMimeType = mimeType;
mTitle = title;
-// mStereoType = stereoType;
+ // mStereoType = stereoType;
mOriginal = uri;
}
-
+
public MovieItem(String uri, String mimeType, String title, int stereoType) {
this(Uri.parse(uri), mimeType, title, stereoType);
}
-
+
public MovieItem(Uri uri, String mimeType, String title) {
- this(uri, mimeType, title, STREO_TYPE_2D);
+ this(uri, mimeType, title, STREO_TYPE_2D);
}
-
+
public MovieItem(String uri, String mimeType, String title) {
this(Uri.parse(uri), mimeType, title);
}
-
+
@Override
public Uri getUri() {
return mUri;
}
-
+
@Override
public String getMimeType() {
return mMimeType;
}
-
+
@Override
public String getTitle() {
return mTitle;
}
-
+
@Override
public boolean getError() {
return mError;
}
-
-// @Override
-// public int getStereoType() {
-// return mStereoType;
-// }
-
+
+ // @Override
+ // public int getStereoType() {
+ // return mStereoType;
+ // }
+
public void setTitle(String title) {
mTitle = title;
}
-
+
@Override
public void setUri(Uri uri) {
mUri = uri;
}
-
+
@Override
public void setMimeType(String mimeType) {
mMimeType = mimeType;
}
-
-// @Override
-// public void setStereoType(int stereoType) {
-// mStereoType = stereoType;
-// }
-
+
+ // @Override
+ // public void setStereoType(int stereoType) {
+ // mStereoType = stereoType;
+ // }
+
@Override
public void setError() {
mError = true;
@@ -94,22 +94,22 @@ public class MovieItem implements IMovieItem {
public void setOriginalUri(Uri uri) {
mOriginal = uri;
}
-
+
@Override
public String toString() {
return new StringBuilder().append("MovieItem(uri=")
- .append(mUri)
- .append(", mime=")
- .append(mMimeType)
- .append(", title=")
- .append(mTitle)
- .append(", error=")
- .append(mError)
-// .append(", support3D=")
-// .append(mStereoType)
- .append(", mOriginal=")
- .append(mOriginal)
- .append(")")
- .toString();
+ .append(mUri)
+ .append(", mime=")
+ .append(mMimeType)
+ .append(", title=")
+ .append(mTitle)
+ .append(", error=")
+ .append(mError)
+ // .append(", support3D=")
+ // .append(mStereoType)
+ .append(", mOriginal=")
+ .append(mOriginal)
+ .append(")")
+ .toString();
}
-} \ No newline at end of file
+}
diff --git a/src/com/qcom/gallery3d/ext/MovieUtils.java b/src/org/codeaurora/gallery3d/ext/MovieUtils.java
index 16b7b6375..2846ab584 100755..100644
--- a/src/com/qcom/gallery3d/ext/MovieUtils.java
+++ b/src/org/codeaurora/gallery3d/ext/MovieUtils.java
@@ -1,6 +1,7 @@
-package com.qcom.gallery3d.ext;
+package org.codeaurora.gallery3d.ext;
import android.net.Uri;
+import android.util.Log;
import java.util.Locale;
@@ -10,10 +11,13 @@ import java.util.Locale;
public class MovieUtils {
private static final String TAG = "MovieUtils";
private static final boolean LOG = true;
-
- private MovieUtils() {}
+
+ private MovieUtils() {
+ }
+
/**
- * Whether current video(Uri) is RTSP streaming or not.
+ * Whether current video(Uri) is RTSP streaming or not.
+ *
* @param uri
* @param mimeType
* @return
@@ -24,14 +28,16 @@ public class MovieUtils {
if ("rtsp".equalsIgnoreCase(uri.getScheme())) {
rtsp = true;
}
- }
+ }
if (LOG) {
- QcomLog.v(TAG, "isRtspStreaming(" + uri + ", " + mimeType + ") return " + rtsp);
+ Log.v(TAG, "isRtspStreaming(" + uri + ", " + mimeType + ") return " + rtsp);
}
return rtsp;
}
+
/**
* Whether current video(Uri) is HTTP streaming or not.
+ *
* @param uri
* @param mimeType
* @return
@@ -46,12 +52,14 @@ public class MovieUtils {
}
}
if (LOG) {
- QcomLog.v(TAG, "isHttpStreaming(" + uri + ", " + mimeType + ") return " + http);
+ Log.v(TAG, "isHttpStreaming(" + uri + ", " + mimeType + ") return " + http);
}
return http;
}
+
/**
* Whether current video(Uri) is live streaming or not.
+ *
* @param uri
* @param mimeType
* @return
@@ -66,13 +74,14 @@ public class MovieUtils {
}
}
if (LOG) {
- QcomLog.v(TAG, "isSdpStreaming(" + uri + ", " + mimeType + ") return " + sdp);
+ Log.v(TAG, "isSdpStreaming(" + uri + ", " + mimeType + ") return " + sdp);
}
return sdp;
}
-
+
/**
* Whether current video(Uri) is local file or not.
+ *
* @param uri
* @param mimeType
* @return
@@ -82,7 +91,7 @@ public class MovieUtils {
&& !isRtspStreaming(uri, mimeType)
&& !isHttpStreaming(uri, mimeType));
if (LOG) {
- QcomLog.v(TAG, "isLocalFile(" + uri + ", " + mimeType + ") return " + local);
+ Log.v(TAG, "isLocalFile(" + uri + ", " + mimeType + ") return " + local);
}
return local;
}
diff --git a/src/org/codeaurora/gallery3d/video/ExtensionHelper.java b/src/org/codeaurora/gallery3d/video/ExtensionHelper.java
new file mode 100755
index 000000000..cef0f96d7
--- /dev/null
+++ b/src/org/codeaurora/gallery3d/video/ExtensionHelper.java
@@ -0,0 +1,27 @@
+package org.codeaurora.gallery3d.video;
+
+import android.content.Context;
+
+import com.android.gallery3d.app.MovieActivity;
+import com.android.gallery3d.R;
+
+import org.codeaurora.gallery3d.ext.ActivityHookerGroup;
+import org.codeaurora.gallery3d.ext.IActivityHooker;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExtensionHelper {
+
+ public static IActivityHooker getHooker(final Context context) {
+
+ final ActivityHookerGroup group = new ActivityHookerGroup();
+ boolean loop = context.getResources().getBoolean(R.bool.loop);
+
+ if (loop == true) {
+ group.addHooker(new LoopVideoHooker()); // add it for common feature.
+ }
+
+ return group;
+ }
+}
diff --git a/src/com/qcom/gallery3d/video/LoopVideoHooker.java b/src/org/codeaurora/gallery3d/video/LoopVideoHooker.java
index 2b5380f5d..468e8a878 100755..100644
--- a/src/com/qcom/gallery3d/video/LoopVideoHooker.java
+++ b/src/org/codeaurora/gallery3d/video/LoopVideoHooker.java
@@ -1,49 +1,46 @@
-package com.qcom.gallery3d.video;
+package org.codeaurora.gallery3d.video;
import android.view.Menu;
import android.view.MenuItem;
import com.android.gallery3d.R;
-import com.qcom.gallery3d.ext.MovieUtils;
-import com.qcom.gallery3d.ext.QcomLog;
+import org.codeaurora.gallery3d.ext.MovieUtils;
public class LoopVideoHooker extends MovieHooker {
+
private static final String TAG = "LoopVideoHooker";
private static final boolean LOG = true;
-
private static final int MENU_LOOP = 1;
-
+
private MenuItem mMenuLoopButton;
-
+
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
super.onCreateOptionsMenu(menu);
mMenuLoopButton = menu.add(0, getMenuActivityId(MENU_LOOP), 0, R.string.loop);
return true;
}
+
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
super.onPrepareOptionsMenu(menu);
updateLoop();
return true;
}
+
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
super.onOptionsItemSelected(item);
- switch(getMenuOriginalId(item.getItemId())) {
- case MENU_LOOP:
- getPlayer().setLoop(!getPlayer().getLoop());
- updateLoop();
- return true;
- default:
- return false;
+ switch (getMenuOriginalId(item.getItemId())) {
+ case MENU_LOOP:
+ getPlayer().setLoop(!getPlayer().getLoop());
+ return true;
+ default:
+ return false;
}
}
-
+
private void updateLoop() {
- if (LOG) {
- QcomLog.v(TAG, "updateLoop() mLoopButton=" + mMenuLoopButton);
- }
if (mMenuLoopButton != null) {
if (MovieUtils.isLocalFile(getMovieItem().getUri(), getMovieItem().getMimeType())) {
mMenuLoopButton.setVisible(true);
@@ -60,4 +57,4 @@ public class LoopVideoHooker extends MovieHooker {
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/qcom/gallery3d/video/MovieHooker.java b/src/org/codeaurora/gallery3d/video/MovieHooker.java
index d5cbb347c..47e4bcee8 100755..100644
--- a/src/com/qcom/gallery3d/video/MovieHooker.java
+++ b/src/org/codeaurora/gallery3d/video/MovieHooker.java
@@ -1,21 +1,23 @@
-package com.qcom.gallery3d.video;
+package org.codeaurora.gallery3d.video;
-import com.qcom.gallery3d.ext.ActivityHooker;
-import com.qcom.gallery3d.ext.IMovieItem;
-import com.qcom.gallery3d.ext.IMoviePlayer;
-import com.qcom.gallery3d.ext.QcomLog;
+import android.util.Log;
+
+import org.codeaurora.gallery3d.ext.ActivityHooker;
+import org.codeaurora.gallery3d.ext.IMovieItem;
+import org.codeaurora.gallery3d.ext.IMoviePlayer;
public class MovieHooker extends ActivityHooker {
+
private static final String TAG = "MovieHooker";
private static final boolean LOG = true;
private IMovieItem mMovieItem;
private IMoviePlayer mPlayer;
-
+
@Override
public void setParameter(final String key, final Object value) {
super.setParameter(key, value);
if (LOG) {
- QcomLog.v(TAG, "setParameter(" + key + ", " + value + ")");
+ Log.v(TAG, "setParameter(" + key + ", " + value + ")");
}
if (value instanceof IMovieItem) {
mMovieItem = (IMovieItem) value;
@@ -25,14 +27,18 @@ public class MovieHooker extends ActivityHooker {
onMoviePlayerChanged(mPlayer);
}
}
-
+
public IMovieItem getMovieItem() {
return mMovieItem;
}
+
public IMoviePlayer getPlayer() {
return mPlayer;
}
-
- public void onMovieItemChanged(final IMovieItem item){}
- public void onMoviePlayerChanged(final IMoviePlayer player){}
+
+ public void onMovieItemChanged(final IMovieItem item) {
+ }
+
+ public void onMoviePlayerChanged(final IMoviePlayer player) {
+ }
}