diff options
Diffstat (limited to 'src')
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) { + } } |