diff --git a/vlc-android/src/org/videolan/vlc/DatabaseManager.java b/vlc-android/src/org/videolan/vlc/DatabaseManager.java index 3f2abb388dba3492dacb7cf5484afa83abc3fdff..2ba06b2a906890ea0086b2024b8eef3c5586c54e 100644 --- a/vlc-android/src/org/videolan/vlc/DatabaseManager.java +++ b/vlc-android/src/org/videolan/vlc/DatabaseManager.java @@ -358,6 +358,41 @@ public class DatabaseManager { return medias; } + public synchronized HashMap getVideoTimes(Context context) { + + Cursor cursor; + HashMap times = new HashMap(); + int chunk_count = 0; + int count = 0; + + do { + count = 0; + cursor = mDb.rawQuery(String.format(Locale.US, + "SELECT %s,%s FROM %s WHERE %s=%d LIMIT %d OFFSET %d", + MEDIA_LOCATION, //0 string + MEDIA_TIME, //1 long + MEDIA_TABLE_NAME, + MEDIA_TYPE, + Media.TYPE_VIDEO, + CHUNK_SIZE, + chunk_count * CHUNK_SIZE), null); + + if (cursor.moveToFirst()) { + do { + String location = cursor.getString(0); + long time = cursor.getLong(1); + times.put(location, time); + count++; + } while (cursor.moveToNext()); + } + + cursor.close(); + chunk_count++; + } while (count == CHUNK_SIZE); + + return times; + } + public synchronized Media getMedia(Context context, String location) { Cursor cursor; @@ -437,6 +472,10 @@ public class DatabaseManager { values.put(MEDIA_PICTURE, new byte[1]); } break; + case MEDIA_TIME: + if (object != null) + values.put(MEDIA_TIME, (Long)object); + break; default: return; } diff --git a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java index e3f926678445f2e387b612f6beb4ecbcb3529bcc..9e10bd63bb8f8d707e079259b86a738fdea83ee6 100644 --- a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java +++ b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java @@ -47,7 +47,6 @@ public class PreferencesActivity extends PreferenceActivity { public final static String NAME = "VlcSharedPreferences"; public final static String LAST_MEDIA = "LastMedia"; - public final static String LAST_TIME = "LastTime"; @SuppressWarnings("deprecation") @Override diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.java index 90049b183774704083d008affe7a2f2299fa2d96..57f233fed8f7f1910dc668bcdb84cf6bd55382b1 100644 --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.java +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.java @@ -21,6 +21,7 @@ package org.videolan.vlc.gui.video; import java.util.Comparator; +import java.util.HashMap; import org.videolan.vlc.Media; import org.videolan.vlc.R; @@ -46,7 +47,6 @@ public class VideoListAdapter extends ArrayAdapter public final static int SORT_BY_LENGTH = 1; private int mSortDirection = 1; private int mSortBy = SORT_BY_TITLE; - private long mLastTime; private String mLastMRL; public VideoListAdapter(Context context) { @@ -63,9 +63,15 @@ public class VideoListAdapter extends ArrayAdapter } } - public void setLastMedia(long lastTime, String lastMRL) { - mLastTime = lastTime; - mLastMRL = lastTime > 0 ? lastMRL : null; + public void setLastMedia(String lastMRL, HashMap times) { + mLastMRL = lastMRL; + // update times + for (int i = 0; i < getCount(); ++i) { + Media media = getItem(i); + Long time = times.get(media.getLocation()); + if (time != null) + media.setTime(time); + } } public void sortBy(int sortby) { @@ -148,17 +154,15 @@ public class VideoListAdapter extends ArrayAdapter holder.thumbnail.setImageBitmap(thumbnail); } - if (media.getLocation().equals(mLastMRL)) - { - holder.title.setTextColor(0xFFF48B00 /* ORANGE */); + holder.title.setTextColor(media.getLocation().equals(mLastMRL) ? 0xFFF48B00 /* ORANGE */ : Color.WHITE); + long lastTime = media.getTime(); + if (lastTime > 0) { holder.subtitle.setText(String.format("%s / %s - %dx%d", - Util.millisToString(mLastTime), + Util.millisToString(lastTime), Util.millisToString(media.getLength()), media.getWidth(), media.getHeight())); } - else - { - holder.title.setTextColor(Color.WHITE); + else { holder.subtitle.setText(String.format("%s - %dx%d", Util.millisToString(media.getLength()), media.getWidth(), media.getHeight())); diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoListFragment.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoListFragment.java index b660fb6971af0334a587eeb5440d8c6ce3ccf867..d8b473f89f5a70afd987f8a40deb7eae2ee656ec 100644 --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoListFragment.java +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoListFragment.java @@ -20,11 +20,13 @@ package org.videolan.vlc.gui.video; +import java.util.HashMap; import java.util.List; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import org.videolan.vlc.AudioServiceController; +import org.videolan.vlc.DatabaseManager; import org.videolan.vlc.Media; import org.videolan.vlc.MediaLibrary; import org.videolan.vlc.R; @@ -105,8 +107,8 @@ public class VideoListFragment extends SherlockListFragment implements ISortable //Get & highlight the last media SharedPreferences preferences = getActivity().getSharedPreferences(PreferencesActivity.NAME, Context.MODE_PRIVATE); String lastPath = preferences.getString(PreferencesActivity.LAST_MEDIA, null); - long lastTime = preferences.getLong(PreferencesActivity.LAST_TIME, 0); - mVideoAdapter.setLastMedia(lastTime, lastPath); + HashMap times = DatabaseManager.getInstance(getActivity()).getVideoTimes(getActivity()); + mVideoAdapter.setLastMedia(lastPath, times); mVideoAdapter.notifyDataSetChanged(); mMediaLibrary.addUpdateHandler(mHandler); super.onResume(); diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java index 0d4da85130052f31947e6059956515014af9e974..22d3372a16b36ff2aa793c885772987579b4b416 100644 --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java @@ -26,9 +26,11 @@ import java.lang.reflect.Method; import java.net.URLDecoder; import org.videolan.vlc.AudioServiceController; +import org.videolan.vlc.DatabaseManager; import org.videolan.vlc.EventManager; import org.videolan.vlc.LibVLC; import org.videolan.vlc.LibVlcException; +import org.videolan.vlc.Media; import org.videolan.vlc.R; import org.videolan.vlc.Util; import org.videolan.vlc.WeakHandler; @@ -306,8 +308,11 @@ public class VideoPlayerActivity extends Activity { SharedPreferences preferences = getSharedPreferences(PreferencesActivity.NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString(PreferencesActivity.LAST_MEDIA, mLocation); - editor.putLong(PreferencesActivity.LAST_TIME, time); editor.commit(); + DatabaseManager.getInstance(this).updateMedia( + mLocation, + DatabaseManager.mediaColumn.MEDIA_TIME, + time); } super.onPause(); } @@ -999,10 +1004,7 @@ public class VideoPlayerActivity extends Activity { private void load() { mLocation = null; String title = null; - String lastLocation = null; - long lastTime = 0; boolean dontParse = false; - SharedPreferences preferences = getSharedPreferences(PreferencesActivity.NAME, MODE_PRIVATE); if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_VIEW)) { @@ -1019,10 +1021,9 @@ public class VideoPlayerActivity extends Activity { mSurface.setKeepScreenOn(true); // restore last position - lastLocation = preferences.getString(PreferencesActivity.LAST_MEDIA, null); - lastTime = preferences.getLong(PreferencesActivity.LAST_TIME, 0); - if (lastTime > 0 && mLocation.equals(lastLocation)) - mLibVLC.setTime(lastTime); + Media media = DatabaseManager.getInstance(this).getMedia(this, mLocation); + if (media != null && media.getTime() > 0) + mLibVLC.setTime(media.getTime()); try { title = URLDecoder.decode(mLocation, "UTF-8");