[Android] [PATCH] Option to ask for resume video or play from start

Geoffrey Métais geoffrey.metais at gmail.com
Thu Apr 2 14:19:10 CEST 2015


---
 vlc-android/res/values/strings.xml                 |  4 +
 vlc-android/res/xml/preferences.xml                |  6 ++
 .../vlc/gui/video/VideoPlayerActivity.java         | 91 +++++++++++++++++-----
 3 files changed, 82 insertions(+), 19 deletions(-)

diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml
index 5f23d6f..2888f36 100644
--- a/vlc-android/res/values/strings.xml
+++ b/vlc-android/res/values/strings.xml
@@ -329,6 +329,10 @@
     <string name="playlist_save">Save Playlist</string>
     <string name="playlist_name_hint">playlist name</string>
     <string name="go_to_chapter">Go to chapter…</string>
+    <string name="resume_from_position">Resume from last position</string>
+    <string name="confirm_resume">Resume from last position?</string>
+    <string name="confirm_resume_title">Ask confirmation to resume</string>
+    <string name="confirm_resume_summary">if activated you will be asked to confirm when a video can be resumed from last position</string>
 
     <string-array name="hardware_acceleration_list">
         <item>@string/automatic</item>
diff --git a/vlc-android/res/xml/preferences.xml b/vlc-android/res/xml/preferences.xml
index dd0283a..1136f6f 100644
--- a/vlc-android/res/xml/preferences.xml
+++ b/vlc-android/res/xml/preferences.xml
@@ -53,6 +53,12 @@
             <PreferenceCategory android:title="@string/interface_other_category" >
                 <CheckBoxPreference
                     android:defaultValue="false"
+                    android:key="dialog_confirm_resume"
+                    android:summary="@string/confirm_resume_summary"
+                    android:widgetLayout="@layout/custom_chexbox"
+                    android:title="@string/confirm_resume_title" />
+                <CheckBoxPreference
+                    android:defaultValue="false"
                     android:key="force_list_portrait"
                     android:summary="@string/force_list_portrait_summary"
                     android:widgetLayout="@layout/custom_chexbox"
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 a0ddf2c..59c1a58 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
@@ -21,7 +21,9 @@
 package org.videolan.vlc.gui.video;
 
 import android.annotation.TargetApi;
+import android.app.Activity;
 import android.app.AlertDialog;
+import android.app.Dialog;
 import android.app.KeyguardManager;
 import android.app.Presentation;
 import android.content.ActivityNotFoundException;
@@ -52,6 +54,7 @@ import android.preference.PreferenceManager;
 import android.provider.MediaStore;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
+import android.support.v4.app.DialogFragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.view.GestureDetectorCompat;
 import android.support.v4.view.MenuItemCompat;
@@ -158,6 +161,7 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
     private LibVLC mLibVLC;
     private MediaWrapperListPlayer mMediaListPlayer;
     private String mLocation;
+    private boolean mAskResume = true;
     private GestureDetectorCompat mDetector;
 
     private static final int SURFACE_BEST_FIT = 0;
@@ -448,6 +452,7 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
         mHardwareAccelerationError = false;
         mEndReached = false;
 
+        mAskResume = mSettings.getBoolean("dialog_confirm_resume", false);
         // Clear the resume time, since it is only used for resumes in external
         // videos.
         SharedPreferences.Editor editor = mSettings.edit();
@@ -2467,6 +2472,16 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
         mSurfaceView.setKeepScreenOn(false);
     }
 
+    /*
+     * Additionnal method to prevent alert dialog to pop up
+     */
+    @SuppressWarnings({ "unchecked" })
+    private void loadMedia(boolean fromStart) {
+        mAskResume = false;
+        getIntent().putExtra(PLAY_EXTRA_FROM_START, fromStart);
+        loadMedia();
+    }
+
     /**
      * External extras:
      * - position (long) - position of the video to start with (in ms)
@@ -2479,6 +2494,7 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
         Uri data;
         String itemTitle = null;
         long intentPosition = -1; // position passed in by intent (ms)
+        long mediaLength = 0l;
 
         boolean wasPaused;
         /*
@@ -2594,6 +2610,7 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
             fromStart = getIntent().getExtras().getBoolean(PLAY_EXTRA_FROM_START);
             if (getIntent().hasExtra(PLAY_EXTRA_SUBTITLES_LOCATION))
                 mSubtitleSelectedFiles.add(getIntent().getExtras().getString(PLAY_EXTRA_SUBTITLES_LOCATION));
+            mAskResume &= !fromStart;
         }
 
         /* WARNING: hack to avoid a crash in mediacodec on KitKat.
@@ -2611,19 +2628,15 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
             }
         }
 
-        /* Start / resume playback */
-        if (savedIndexPosition > -1) {
-            AudioServiceController.getInstance().stop(); // Stop the previous playback.
-            mMediaListPlayer.playIndex(savedIndexPosition, wasPaused);
-        } else if (mLocation != null && mLocation.length() > 0) {
-            AudioServiceController.getInstance().stop(); // Stop the previous playback.
+        /* prepare playback */
+        AudioServiceController.getInstance().stop(); // Stop the previous playback.
+        if (savedIndexPosition == -1 && mLocation != null && mLocation.length() > 0) {
             mMediaListPlayer.getMediaList().clear();
             final Media media = new Media(mLibVLC, mLocation);
             media.parse(); // FIXME: parse should'nt be done asynchronously
             media.release();
             mMediaListPlayer.getMediaList().add(new MediaWrapper(media));
             savedIndexPosition = mMediaListPlayer.getMediaList().size() - 1;
-            mMediaListPlayer.playIndex(savedIndexPosition, wasPaused);
         }
         mCanSeek = false;
 
@@ -2632,8 +2645,15 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
             MediaWrapper media = MediaDatabase.getInstance().getMedia(mLocation);
             if(media != null) {
                 // in media library
-                if(media.getTime() > 0 && !fromStart)
-                    seek(media.getTime(), media.getLength());
+                if(media.getTime() > 0 && !fromStart) {
+                    if (mAskResume) {
+                        showConfirmResumeDialog();
+                        return;
+                    } else {
+                        intentPosition = media.getTime();
+                        mediaLength = media.getLength();
+                    }
+                }
                 // Consume fromStart option after first use to prevent
                 // restarting again when playback is paused.
                 getIntent().putExtra(PLAY_EXTRA_FROM_START, false);
@@ -2642,19 +2662,31 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
                 mLastSpuTrack = media.getSpuTrack();
             } else {
                 // not in media library
-                long rTime = mSettings.getLong(PreferencesActivity.VIDEO_RESUME_TIME, -1);
-                if (rTime > 0) {
-                    Editor editor = mSettings.edit();
-                    editor.putLong(PreferencesActivity.VIDEO_RESUME_TIME, -1);
-                    Util.commitPreferences(editor);
-                }
 
-                if (intentPosition > 0)
-                    seek(intentPosition);
-                else if (rTime > 0)
-                        seek(rTime);
+                if (intentPosition > 0 && mAskResume) {
+                    showConfirmResumeDialog();
+                    return;
+                } else {
+                    long rTime = mSettings.getLong(PreferencesActivity.VIDEO_RESUME_TIME, -1);
+                    if (rTime > 0 && !fromStart) {
+                        if (mAskResume) {
+                            showConfirmResumeDialog();
+                            return;
+                        } else {
+                            Editor editor = mSettings.edit();
+                            editor.putLong(PreferencesActivity.VIDEO_RESUME_TIME, -1);
+                            Util.commitPreferences(editor);
+                            intentPosition = rTime;
+                        }
+                    }
+                }
             }
 
+            // Start playback & seek
+            mMediaListPlayer.playIndex(savedIndexPosition, wasPaused);
+            seek(intentPosition, mediaLength);
+
+
             // Get possible subtitles
             String subtitleList_serialized = mSettings.getString(PreferencesActivity.VIDEO_SUBTITLE_FILES, null);
             ArrayList<String> prefsList = new ArrayList<String>();
@@ -2764,6 +2796,27 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
         }
     }
 
+    public void showConfirmResumeDialog() {
+        if (isFinishing())
+            return;
+        pause();
+        /* Encountered Error, exit player with a message */
+        mAlertDialog = new AlertDialog.Builder(VideoPlayerActivity.this)
+                .setMessage(R.string.confirm_resume)
+                .setPositiveButton(R.string.resume_from_position, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int id) {
+                        loadMedia(false);
+                    }
+                })
+                .setNegativeButton(R.string.play_from_start, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int id) {
+                        loadMedia(true);
+                    }
+                })
+                .create();
+        mAlertDialog.show();
+    }
+
     public void showAdvancedOptions(View v) {
         FragmentManager fm = getSupportFragmentManager();
         AdvOptionsDialog advOptionsDialog = new AdvOptionsDialog();
-- 
2.1.0



More information about the Android mailing list