blob: 237d7e138f7218590af74b534a37fd44aa761996 [file] [log] [blame]
package org.codeaurora.gallery3d.ext;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;
import java.io.File;
import java.util.ArrayList;
/**
* Movie list loader class. It will load videos from MediaProvider database.
* If MoviePlayer starting activity doesn't set any thing, default OrderBy will be used.
* Default OrderBy: MediaStore.Video.Media.DATE_TAKEN + " DESC, " + MediaStore.Video.Media._ID + " DESC ";
*/
public class MovieListLoader implements IMovieListLoader {
private static final String TAG = "MovieListLoader";
private static final boolean LOG = false;
private MovieListFetcherTask mListTask;
@Override
public void fillVideoList(Activity activity, Intent intent, final LoaderListener l,
IMovieItem currentMovieItem) {
// determine if a video playlist has been passed in through the intent
// if a playlist does exist, use that
ArrayList<Uri> uris = intent.getParcelableArrayListExtra("EXTRA_FILE_LIST");
if (uris != null) {
final MovieList movieList = new MovieList();
ContentResolver cr = activity.getContentResolver();
for(Uri uri : uris) {
// add currentMovieItem in its proper place in the video playlist
// 'Next' and 'Previous' functionality in MovieListHooker is dependent on reference
// matching currentMovieItem
if (currentMovieItem.getOriginalUri().equals(uri)) {
movieList.add(currentMovieItem);
continue;
}
File videoFile = new File(uri.getPath());
movieList.add(new MovieItem(uri, cr.getType(uri), videoFile.getName()));
}
// notify callback on main thread
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
l.onListLoaded(movieList);
}
});
return;
}
// proceed with creating a playlist if one isn't found
boolean fetechAll = false;
if (intent.hasExtra(EXTRA_ALL_VIDEO_FOLDER)) {
fetechAll = intent.getBooleanExtra(EXTRA_ALL_VIDEO_FOLDER, false);
}
//default order by
String orderBy = MediaStore.Video.Media.DATE_TAKEN + " DESC, " + MediaStore.Video.Media._ID + " DESC ";
if (intent.hasExtra(EXTRA_ORDERBY)) {
orderBy = intent.getStringExtra(EXTRA_ORDERBY);
}
cancelList();
mListTask = new MovieListFetcherTask(activity, fetechAll, l, orderBy);
mListTask.execute(currentMovieItem);
if (LOG) {
Log.v(TAG, "fillVideoList() fetechAll=" + fetechAll + ", orderBy=" + orderBy);
}
}
@Override
public boolean isEnabledVideoList(Intent intent) {
boolean enable = true;
if (intent != null && intent.hasExtra(EXTRA_ENABLE_VIDEO_LIST)) {
enable = intent.getBooleanExtra(EXTRA_ENABLE_VIDEO_LIST, true);
}
if (LOG) {
Log.v(TAG, "isEnabledVideoList() return " + enable);
}
return enable;
}
@Override
public void cancelList() {
if (mListTask != null) {
mListTask.cancel(true);
}
}
private class MovieListFetcherTask extends AsyncTask<IMovieItem, Void, IMovieList> {
private static final String TAG = "MovieListFetcherTask";
private static final boolean LOG = false;
// TODO comments by sunlei
// public static final String COLUMN_STEREO_TYPE = MediaStore.Video.Media.STEREO_TYPE;
// public static final String COLUMN_STEREO_TYPE = "STEREO_TYPE";
private final ContentResolver mCr;
private final LoaderListener mFetecherListener;
private final boolean mFetechAll;
private final String mOrderBy;
public MovieListFetcherTask(Context context, boolean fetechAll, LoaderListener l, String orderBy) {
mCr = context.getContentResolver();
mFetecherListener = l;
mFetechAll = fetechAll;
mOrderBy = orderBy;
if (LOG) {
Log.v(TAG, "MovieListFetcherTask() fetechAll=" + fetechAll + ", orderBy=" + orderBy);
}
}
@Override
protected void onPostExecute(IMovieList params) {
if (LOG) {
Log.v(TAG, "onPostExecute() isCancelled()=" + isCancelled());
}
if (isCancelled()) {
return;
}
if (mFetecherListener != null) {
mFetecherListener.onListLoaded(params);
}
}
@Override
protected IMovieList doInBackground(IMovieItem... params) {
if (LOG) {
Log.v(TAG, "doInBackground() begin");
}
if (params[0] == null) {
return null;
}
IMovieList movieList = null;
Uri uri = params[0].getUri();
String mime = params[0].getMimeType();
if (mFetechAll) { //get all list
if (MovieUtils.isLocalFile(uri, mime)) {
String uristr = String.valueOf(uri);
if (uristr.toLowerCase().startsWith("content://media")) {
//from gallery, gallery3D, videoplayer
long curId = Long.parseLong(uri.getPathSegments().get(3));
movieList = fillUriList(null, null, curId, params[0]);
} else if (uristr.toLowerCase().startsWith("file://")) {
long curId = getCursorId(uri);
movieList = fillUriList(null, null, curId, params[0]);
}
}
} else { //get current list
if (MovieUtils.isLocalFile(uri, mime)) {
String uristr = String.valueOf(uri);
if (uristr.toLowerCase().startsWith("content://media")) {
Cursor cursor = mCr.query(uri,
new String[]{MediaStore.Video.Media.BUCKET_ID},
null, null, null);
long bucketId = -1;
if (cursor != null) {
if (cursor.moveToFirst()) {
bucketId = cursor.getLong(0);
}
cursor.close();
}
try {
long curId = Long.parseLong(uri.getPathSegments().get(3));
movieList = fillUriList(MediaStore.Video.Media.BUCKET_ID + "=? ",
new String[]{String.valueOf(bucketId)}, curId, params[0]);
} catch (Exception e) {
Log.e(TAG, "Exception while creating movie list. " + e);
return null;
}
} else if (uristr.toLowerCase().startsWith("file://")) {
String data = Uri.decode(uri.toString());
data = data.replaceAll("'", "''");
String where = "_data LIKE '%" + data.replaceFirst("file:///", "") + "'";
Cursor cursor = mCr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
new String[]{"_id", MediaStore.Video.Media.BUCKET_ID},
where, null, null);
long bucketId = -1;
long curId = -1;
if (cursor != null) {
if (cursor.moveToFirst()) {
curId = cursor.getLong(0);
bucketId = cursor.getLong(1);
}
cursor.close();
}
movieList = fillUriList(MediaStore.Video.Media.BUCKET_ID + "=? ",
new String[]{String.valueOf(bucketId)}, curId, params[0]);
}
}
}
if (LOG) {
Log.v(TAG, "doInBackground() done return " + movieList);
}
return movieList;
}
private IMovieList fillUriList(String where, String[] whereArgs, long curId, IMovieItem current) {
IMovieList movieList = null;
Cursor cursor = null;
try {
cursor = mCr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
new String[]{"_id", "mime_type", OpenableColumns.DISPLAY_NAME},
where,
whereArgs,
mOrderBy);
boolean find = false;
if (cursor != null && cursor.getCount() > 0) {
movieList = new MovieList();
while (cursor.moveToNext()) {
long id = cursor.getLong(0);
if (!find && id == curId) {
find = true;
movieList.add(current);
continue;
}
Uri uri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);
String mimeType = cursor.getString(1);
String title = cursor.getString(2);
movieList.add(new MovieItem(uri, mimeType, title));
}
}
} catch (final SQLiteException e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
if (LOG) {
Log.v(TAG, "fillUriList() cursor=" + cursor + ", return " + movieList);
}
return movieList;
}
private long getCursorId(Uri uri) {
long curId = -1;
Cursor cursor = null;
String data = Uri.decode(uri.toString());
data = data.replaceAll("'", "''");
String where = "_data LIKE '%" + data.replaceFirst("file:///", "") + "'";
try {
cursor = mCr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
new String[] {
"_id"
}, where, null, null);
if (cursor != null && cursor.moveToFirst()) {
curId = cursor.getLong(0);
}
} catch (final SQLiteException e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return curId;
}
}
}