[Android] [PATCH] Only one way to get LibVLC instance.
Thomas Guillem
thomas at gllm.fr
Mon Mar 23 11:16:02 CET 2015
Ok, we still need CompatErrorActivity to output an error when the apk
ABI doesn't match with the device ABI.
A v2 is comming
On Mon, Mar 23, 2015, at 11:07, Thomas Guillem wrote:
> There were 2 differents way to get a LibVLC instance. For now, use only
> VLCInstance.get() utility method. This method will init LibVLC if it's
> not
> already done.
>
> This method will throw an IllegalStateException if LibVLC.init() failed.
> The
> application will crash with the default android crash dialog instead of
> the
> custom CompatErrorActivity. It allows the error to be reported to the
> google
> play dev console.
> ---
> libvlc/src/org/videolan/libvlc/LibVLC.java | 43 +----------
> vlc-android/AndroidManifest.xml | 1 -
> vlc-android/src/org/videolan/vlc/MediaLibrary.java | 8 +-
> .../videolan/vlc/RemoteControlClientReceiver.java | 11 +--
> vlc-android/src/org/videolan/vlc/Thumbnailer.java | 10 +--
> .../src/org/videolan/vlc/audio/AudioService.java | 16 ++--
> .../org/videolan/vlc/gui/CompatErrorActivity.java | 88
> ----------------------
> .../videolan/vlc/gui/DirectoryViewFragment.java | 5 +-
> .../src/org/videolan/vlc/gui/MainActivity.java | 33 +-------
> .../org/videolan/vlc/gui/PreferencesActivity.java | 2 +-
> .../videolan/vlc/gui/audio/EqualizerFragment.java | 4 +-
> .../videolan/vlc/gui/dialogs/JumpToTimeDialog.java | 2 +-
> .../videolan/vlc/gui/dialogs/PickTimeFragment.java | 3 +-
> .../vlc/gui/dialogs/TimePickerDialogFragment.java | 4 +-
> .../videolan/vlc/gui/expandable/JumpToTime.java | 9 ++-
> .../videolan/vlc/gui/expandable/SpeedSelector.java | 12 ++-
> .../videolan/vlc/gui/network/NetworkFragment.java | 5 +-
> .../videolan/vlc/gui/video/AdvOptionsDialog.java | 9 ++-
> .../videolan/vlc/gui/video/MediaInfoFragment.java | 10 ++-
> .../videolan/vlc/gui/video/VideoGridFragment.java | 5 +-
> .../vlc/gui/video/VideoPlayerActivity.java | 36 ++++-----
> .../src/org/videolan/vlc/util/VLCInstance.java | 59 +++++++++------
> .../org/videolan/vlc/gui/tv/MainTvActivity.java | 18 +----
> 23 files changed, 107 insertions(+), 286 deletions(-)
> delete mode 100644
> vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java
>
> diff --git a/libvlc/src/org/videolan/libvlc/LibVLC.java
> b/libvlc/src/org/videolan/libvlc/LibVLC.java
> index a0f6bf3..01bed0b 100644
> --- a/libvlc/src/org/videolan/libvlc/LibVLC.java
> +++ b/libvlc/src/org/videolan/libvlc/LibVLC.java
> @@ -61,8 +61,6 @@ public class LibVLC {
> private static final String DEFAULT_CODEC_LIST =
> "mediacodec,iomx,all";
> private static final boolean HAS_WINDOW_VOUT =
> LibVlcUtil.isGingerbreadOrLater();
>
> - private static LibVLC sInstance;
> -
> /** libVLC instance C pointer */
> private long mLibVlcInstance = 0; // Read-only, reserved for JNI
> /** libvlc_media_player pointer */
> @@ -155,38 +153,10 @@ public class LibVLC {
> }
>
> /**
> - * Singleton constructor of libVLC Without surface and vout to
> create the
> - * thumbnail and get information e.g. on the MediaLibraryActivity
> - *
> - * @return libVLC instance
> - */
> - public static LibVLC getInstance() {
> - synchronized (LibVLC.class) {
> - if (sInstance == null) {
> - /* First call */
> - sInstance = new LibVLC();
> - }
> - return sInstance;
> - }
> - }
> -
> - /**
> - * Return an existing instance of libVLC Call it when it is NOT
> important
> - * that this fails
> - *
> - * @return libVLC instance OR null
> - */
> - public static LibVLC getExistingInstance() {
> - synchronized (LibVLC.class) {
> - return sInstance;
> - }
> - }
> -
> - /**
> * Constructor
> * It is private because this class is a singleton.
> */
> - private LibVLC() {
> + public LibVLC() {
> }
>
> /**
> @@ -208,17 +178,6 @@ public class LibVLC {
> */
> public native void setSurface(Surface f);
>
> - public static synchronized void restart(Context context) {
> - if (sInstance != null) {
> - try {
> - sInstance.destroy();
> - sInstance.init(context);
> - } catch (LibVlcException lve) {
> - Log.e(TAG, "Unable to reinit libvlc: " + lve);
> - }
> - }
> - }
> -
> /**
> * those get/is* are called from native code to get settings values.
> */
> diff --git a/vlc-android/AndroidManifest.xml
> b/vlc-android/AndroidManifest.xml
> index 20f2499..82a6d2d 100644
> --- a/vlc-android/AndroidManifest.xml
> +++ b/vlc-android/AndroidManifest.xml
> @@ -62,7 +62,6 @@
> <activity
> android:name=".gui.SecondaryActivity"
> android:theme="@style/Theme.VLC"/>
> - <activity android:name=".gui.CompatErrorActivity" />
> <activity android:name=".gui.PreferencesActivity"
> android:theme="@style/Theme.VLC" />
> <activity
> diff --git a/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> b/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> index d87e3d7..bd277d1 100644
> --- a/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> +++ b/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> @@ -208,13 +208,7 @@ public class MediaLibrary {
>
> @Override
> public void run() {
> - LibVLC libVlcInstance;
> - try {
> - libVlcInstance = VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e1) {
> - Log.e(TAG, "ERROR: LibVLCException while trying to get
> instance");
> - return;
> - }
> + LibVLC libVlcInstance = VLCInstance.get();
>
> // Initialize variables
> final MediaDatabase mediaDatabase =
> MediaDatabase.getInstance();
> diff --git
> a/vlc-android/src/org/videolan/vlc/RemoteControlClientReceiver.java
> b/vlc-android/src/org/videolan/vlc/RemoteControlClientReceiver.java
> index 8af007e..eaaa524 100644
> --- a/vlc-android/src/org/videolan/vlc/RemoteControlClientReceiver.java
> +++ b/vlc-android/src/org/videolan/vlc/RemoteControlClientReceiver.java
> @@ -44,14 +44,7 @@ public class RemoteControlClientReceiver extends
> BroadcastReceiver {
> @Override
> public void onReceive(Context context, Intent intent) {
> String action = intent.getAction();
> - LibVLC mLibVLC;
> - try {
> - mLibVLC = VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e) {
> - return;
> - }
> - if(mLibVLC == null)
> - return;
> + LibVLC libVLC = VLCInstance.get();
>
> if(action.equalsIgnoreCase(Intent.ACTION_MEDIA_BUTTON)) {
>
> @@ -92,7 +85,7 @@ public class RemoteControlClientReceiver extends
> BroadcastReceiver {
> }
> // one click
> else {
> - if (mLibVLC.isPlaying())
> + if (libVLC.isPlaying())
> i = new
> Intent(AudioService.ACTION_REMOTE_PAUSE);
> else {
> i = new Intent(context,
> AudioService.class);
> diff --git a/vlc-android/src/org/videolan/vlc/Thumbnailer.java
> b/vlc-android/src/org/videolan/vlc/Thumbnailer.java
> index 3f74da7..2097be8 100644
> --- a/vlc-android/src/org/videolan/vlc/Thumbnailer.java
> +++ b/vlc-android/src/org/videolan/vlc/Thumbnailer.java
> @@ -67,15 +67,7 @@ public class Thumbnailer implements Runnable {
> }
>
> public void start(IVideoBrowser videoBrowser) {
> - if (mLibVlc == null) {
> - try {
> - mLibVlc = VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e) {
> - Log.e(TAG, "Can't obtain libvlc instance");
> - e.printStackTrace();
> - return;
> - }
> - }
> + mLibVlc = VLCInstance.get();
>
> isStopping = false;
> if (mThread == null || mThread.getState() == State.TERMINATED) {
> diff --git a/vlc-android/src/org/videolan/vlc/audio/AudioService.java
> b/vlc-android/src/org/videolan/vlc/audio/AudioService.java
> index ca0c0ea..9d28717 100644
> --- a/vlc-android/src/org/videolan/vlc/audio/AudioService.java
> +++ b/vlc-android/src/org/videolan/vlc/audio/AudioService.java
> @@ -159,11 +159,8 @@ public class AudioService extends Service {
> super.onCreate();
>
> // Get libVLC instance
> - try {
> - mLibVLC = VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e) {
> - e.printStackTrace();
> - }
> + mLibVLC = VLCInstance.get();
> +
> mMediaListPlayer = MediaWrapperListPlayer.getInstance(mLibVLC);
>
> mCallback = new HashMap<IAudioServiceCallback, Integer>();
> @@ -320,12 +317,11 @@ public class AudioService extends Service {
> audioFocusListener = new OnAudioFocusChangeListener() {
> @Override
> public void onAudioFocusChange(int focusChange) {
> - LibVLC libVLC = LibVLC.getExistingInstance();
> switch (focusChange)
> {
> case AudioManager.AUDIOFOCUS_LOSS:
> - if (libVLC.isPlaying())
> - libVLC.pause();
> + if (mLibVLC.isPlaying())
> + mLibVLC.pause();
> break;
> case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
> case
> AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
> @@ -333,12 +329,12 @@ public class AudioService extends Service {
> * Lower the volume to 36% to "duck" when an
> alert or something
> * needs to be played.
> */
> - libVLC.setVolume(36);
> + mLibVLC.setVolume(36);
> break;
> case AudioManager.AUDIOFOCUS_GAIN:
> case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
> case
> AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
> - libVLC.setVolume(100);
> + mLibVLC.setVolume(100);
> break;
> }
> }
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java
> b/vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java
> deleted file mode 100644
> index 616cd57..0000000
> --- a/vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java
> +++ /dev/null
> @@ -1,88 +0,0 @@
> -package org.videolan.vlc.gui;
> -
> -import java.io.IOException;
> -import java.util.ArrayList;
> -import java.util.List;
> -
> -import org.apache.http.NameValuePair;
> -import org.apache.http.client.ClientProtocolException;
> -import org.apache.http.client.HttpClient;
> -import org.apache.http.client.entity.UrlEncodedFormEntity;
> -import org.apache.http.client.methods.HttpPost;
> -import org.apache.http.impl.client.DefaultHttpClient;
> -import org.apache.http.message.BasicNameValuePair;
> -import org.videolan.libvlc.LibVlcUtil;
> -import org.videolan.vlc.R;
> -
> -import android.app.Activity;
> -import android.os.AsyncTask;
> -import android.os.Bundle;
> -import android.util.Log;
> -import android.widget.TextView;
> -
> -public class CompatErrorActivity extends Activity {
> - public final static String TAG = "VLC/CompatErrorActivity";
> -
> - /**
> - * Simple friendly activity to tell the user something's wrong.
> - *
> - * Intent parameters (all optional):
> - * runtimeError (bool) - Set to true if you want to show a runtime
> error
> - * (defaults to a compatibility error)
> - * message (string) - the more detailed problem
> - */
> - @Override
> - protected void onCreate(Bundle savedInstanceState) {
> - super.onCreate(savedInstanceState);
> - setContentView(R.layout.not_compatible);
> -
> - String errorMsg = LibVlcUtil.getErrorMsg();
> - if(getIntent().getBooleanExtra("runtimeError", false))
> - if(getIntent().getStringExtra("message") != null) {
> - errorMsg = getIntent().getStringExtra("message");
> - TextView tvo = (TextView)findViewById(R.id.message);
> - tvo.setText(R.string.error_problem);
> - }
> -
> - TextView tv = (TextView)findViewById(R.id.errormsg);
> - tv.setText(getResources().getString(R.string.error_message_is) +
> "\n" + errorMsg);
> -
> - //AsyncHttpRequest asyncHttpRequest = new AsyncHttpRequest();
> - //asyncHttpRequest.execute(Build.MODEL, Build.DEVICE);
> - }
> -
> - public static class AsyncHttpRequest extends AsyncTask<String,
> String, Boolean> {
> -
> - public AsyncHttpRequest() { }
> -
> - @Override
> - protected Boolean doInBackground(String... params) {
> - if (params[0].length() == 0)
> - return false;
> - HttpClient httpClient = new DefaultHttpClient();
> - HttpPost httpPost = new
> HttpPost("http://people.videolan.org/~jb/blacklist/vlc-devices.php");
> -
> - try {
> - List<NameValuePair> nameValuePairs = new
> ArrayList<NameValuePair>(1);
> - nameValuePairs.add(new BasicNameValuePair("model",
> params[0]));
> - nameValuePairs.add(new BasicNameValuePair("device",
> params[1]));
> - httpPost.setEntity(new
> UrlEncodedFormEntity(nameValuePairs));
> -
> - httpClient.execute(httpPost);
> - } catch (ClientProtocolException e) {
> - e.printStackTrace();
> - return false;
> - } catch (IOException e) {
> - e.printStackTrace();
> - return false;
> - }
> - Log.d(TAG, "Device model sent.");
> - return true;
> - }
> -
> - @Override
> - protected void onPostExecute(Boolean result) {
> -
> - }
> - }
> -}
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/DirectoryViewFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/DirectoryViewFragment.java
> index 8666384..5ec2332 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/DirectoryViewFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/DirectoryViewFragment.java
> @@ -32,6 +32,7 @@ import org.videolan.vlc.audio.AudioServiceController;
> import org.videolan.vlc.gui.video.VideoPlayerActivity;
> import org.videolan.vlc.interfaces.IRefreshable;
> import org.videolan.vlc.util.Util;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.util.VLCRunnable;
> import org.videolan.vlc.widget.SwipeRefreshLayout;
>
> @@ -258,8 +259,8 @@ public class DirectoryViewFragment extends
> BrowserFragment implements IRefreshab
> String mediaFile = mDirectoryAdapter.getMediaLocation(p);
>
> try {
> - if (LibVLC.getExistingInstance() == null
> - ||
> !LibVLC.getExistingInstance().hasVideoTrack(mediaFile)) {
> + final LibVLC libVLC = VLCInstance.get();
> + if (!libVLC.hasVideoTrack(mediaFile)) {
> List<String> mediaLocations =
> mDirectoryAdapter.getAllMediaLocations();
> audioController.load(mediaLocations,
> mediaLocations.indexOf(mediaFile));
> } else {
> diff --git a/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
> b/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
> index ac6529e..4f9fd20 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
> @@ -73,12 +73,9 @@ import org.videolan.vlc.VLCApplication;
> import org.videolan.vlc.audio.AudioService;
> import org.videolan.vlc.audio.AudioServiceController;
> import org.videolan.vlc.gui.SidebarAdapter.SidebarEntry;
> -import org.videolan.vlc.gui.audio.AudioAlbumsSongsFragment;
> import org.videolan.vlc.gui.audio.AudioBrowserFragment;
> import org.videolan.vlc.gui.audio.AudioPlayer;
> -import org.videolan.vlc.gui.audio.EqualizerFragment;
> import org.videolan.vlc.gui.network.NetworkFragment;
> -import org.videolan.vlc.gui.video.MediaInfoFragment;
> import org.videolan.vlc.gui.video.VideoGridFragment;
> import org.videolan.vlc.gui.video.VideoListAdapter;
> import org.videolan.vlc.gui.video.VideoPlayerActivity;
> @@ -91,10 +88,6 @@ import org.videolan.vlc.util.WeakHandler;
> import org.videolan.vlc.widget.HackyDrawerLayout;
> import org.videolan.vlc.widget.SlidingPaneLayout;
>
> -import java.util.Arrays;
> -import java.util.HashMap;
> -import java.util.List;
> -
> public class MainActivity extends ActionBarActivity implements
> OnItemClickListener, SearchSuggestionsAdapter.SuggestionDisplay,
> FilterQueryProvider {
> public final static String TAG = "VLC/MainActivity";
>
> @@ -139,16 +132,10 @@ public class MainActivity extends ActionBarActivity
> implements OnItemClickListen
>
> @Override
> protected void onCreate(Bundle savedInstanceState) {
> + super.onCreate(savedInstanceState);
> +
> /* Enable the indeterminate progress feature */
> supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
> - if (!LibVlcUtil.hasCompatibleCPU(this)) {
> - Log.e(TAG, LibVlcUtil.getErrorMsg());
> - Intent i = new Intent(this, CompatErrorActivity.class);
> - startActivity(i);
> - finish();
> - super.onCreate(savedInstanceState);
> - return;
> - }
>
> mContext = this;
> /* Get the current version from package */
> @@ -165,28 +152,12 @@ public class MainActivity extends ActionBarActivity
> implements OnItemClickListen
> Util.commitPreferences(editor);
> }
>
> - try {
> - // Start LibVLC
> - VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e) {
> - e.printStackTrace();
> - Intent i = new Intent(this, CompatErrorActivity.class);
> - i.putExtra("runtimeError", true);
> - i.putExtra("message", "LibVLC failed to initialize
> (LibVlcException)");
> - startActivity(i);
> - finish();
> - super.onCreate(savedInstanceState);
> - return;
> - }
> -
> /* Load media items from database and storage */
> MediaLibrary.getInstance().loadMediaItems();
>
> /* Theme must be applied before super.onCreate */
> applyTheme();
>
> - super.onCreate(savedInstanceState);
> -
> /*** Start initializing the UI ***/
>
> setContentView(R.layout.main);
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> index a46865c..d3fa303 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> @@ -345,7 +345,7 @@ public class PreferencesActivity extends
> PreferenceActivity implements OnSharedP
> || key.equalsIgnoreCase("network_caching")
> || key.equalsIgnoreCase("dev_hardware_decoder")) {
> VLCInstance.updateLibVlcSettings(sharedPreferences);
> - LibVLC.restart(this);
> + VLCInstance.restart(this);
> }
> }
>
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.java
> index dd6c240..5ee46b4 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.java
> @@ -46,6 +46,7 @@ import org.videolan.vlc.VLCApplication;
> import org.videolan.vlc.interfaces.OnEqualizerBarChangeListener;
> import org.videolan.vlc.util.Preferences;
> import org.videolan.vlc.util.Util;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.widget.EqualizerBar;
>
> public class EqualizerFragment extends Fragment {
> @@ -90,7 +91,8 @@ public class EqualizerFragment extends Fragment {
> SharedPreferences preferences =
> PreferenceManager.getDefaultSharedPreferences(VLCApplication.getAppContext());
> float[] bands = null;
> String[] presets = null;
> - libVlc = LibVLC.getInstance();
> + libVlc = VLCInstance.get();
> +
> bands = libVlc.getBands();
> presets = libVlc.getPresets();
> if (equalizer == null)
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.java
> b/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.java
> index bbd07f3..e2e4b4a 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.java
> @@ -62,7 +62,7 @@ public class JumpToTimeDialog extends PickTimeFragment
> {
> long hours = mHours != null ?
> Long.parseLong(mHours.getText().toString()) * HOURS_IN_MICROS :
> 0l;
> long minutes = Long.parseLong(mMinutes.getText().toString()) *
> MINUTES_IN_MICROS ;
> long seconds = Long.parseLong(mSeconds.getText().toString()) *
> SECONDS_IN_MICROS;
> - LibVLC.getExistingInstance().setTime((hours + minutes +
> seconds)/1000l); //Time in ms
> + mLibVLC.setTime((hours + minutes + seconds)/1000l); //Time in
> ms
> dismiss();
> }
>
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.java
> index 213c2a0..9db6fd6 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.java
> @@ -38,6 +38,7 @@ import android.widget.TextView;
> import org.videolan.libvlc.LibVLC;
> import org.videolan.vlc.R;
> import org.videolan.vlc.util.AndroidDevices;
> +import org.videolan.vlc.util.VLCInstance;
>
> public abstract class PickTimeFragment extends DialogFragment implements
> DialogInterface.OnKeyListener, View.OnClickListener,
> View.OnFocusChangeListener, TextView.OnEditorActionListener {
>
> @@ -61,7 +62,7 @@ public abstract class PickTimeFragment extends
> DialogFragment implements DialogI
> protected long max = -1;
>
> public PickTimeFragment(){
> - mLibVLC = LibVLC.getInstance();
> + mLibVLC = VLCInstance.get();
> }
>
> @Override
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/dialogs/TimePickerDialogFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/dialogs/TimePickerDialogFragment.java
> index 1d8077a..e1eeb2d 100644
> ---
> a/vlc-android/src/org/videolan/vlc/gui/dialogs/TimePickerDialogFragment.java
> +++
> b/vlc-android/src/org/videolan/vlc/gui/dialogs/TimePickerDialogFragment.java
> @@ -32,6 +32,7 @@ import org.videolan.libvlc.LibVLC;
> import org.videolan.libvlc.LibVlcUtil;
> import org.videolan.vlc.VLCApplication;
> import org.videolan.vlc.gui.video.AdvOptionsDialog;
> +import org.videolan.vlc.util.VLCInstance;
>
> import java.util.Calendar;
>
> @@ -90,7 +91,8 @@ public class TimePickerDialogFragment extends
> DialogFragment implements TimePick
> break;
> case ACTION_JUMP:
> long time = ( hourOfDay * 60l + minute ) * 60000l;
> - LibVLC.getExistingInstance().setTime(time);
> + final LibVLC libVLC = VLCInstance.get();
> + libVLC.setTime(time);
> break;
> }
> }
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/expandable/JumpToTime.java
> b/vlc-android/src/org/videolan/vlc/gui/expandable/JumpToTime.java
> index 1e843ef..4a1f08c 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/expandable/JumpToTime.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/expandable/JumpToTime.java
> @@ -30,6 +30,7 @@ import org.videolan.libvlc.LibVLC;
> import org.videolan.vlc.R;
> import org.videolan.vlc.audio.AudioServiceController;
> import org.videolan.vlc.util.Util;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.widget.ExpandableLayout;
>
> import android.content.Context;
> @@ -88,10 +89,10 @@ public class JumpToTime extends ExpandableLayout {
> private OnClickListener mOnOkListener = new OnClickListener() {
> @Override
> public void onClick(View v) {
> - LibVLC.getExistingInstance().setTime(
> - 1000 * (mHourWheel.getCurrentItem() * 60 * 60 +
> - mMinWheel.getCurrentItem() * 60 +
> - mSecWheel.getCurrentItem()));
> + final LibVLC libVLC = VLCInstance.get();
> + libVLC.setTime(1000 * (mHourWheel.getCurrentItem() * 60 * 60
> +
> + mMinWheel.getCurrentItem() * 60 +
> + mSecWheel.getCurrentItem()));
> dismiss();
> }
> };
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/expandable/SpeedSelector.java
> b/vlc-android/src/org/videolan/vlc/gui/expandable/SpeedSelector.java
> index 7143bd9..f173297 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/expandable/SpeedSelector.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/expandable/SpeedSelector.java
> @@ -24,6 +24,7 @@ import org.videolan.libvlc.LibVLC;
> import org.videolan.vlc.R;
> import org.videolan.vlc.util.Strings;
> import org.videolan.vlc.util.Util;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.widget.ExpandableLayout;
>
> import android.content.Context;
> @@ -50,11 +51,8 @@ public class SpeedSelector extends ExpandableLayout {
> float rate = 1.0f;
>
> //libvlc is not available in layout editor
> - if (!isInEditMode()) {
> - LibVLC libVLC = LibVLC.getExistingInstance();
> - if (libVLC != null)
> - rate = libVLC.getRate();
> - }
> + if (!isInEditMode())
> + rate = VLCInstance.get().getRate();
>
> setText(Strings.formatRateString(rate));
> mSeekbar.setProgress((int) (((Math.log(rate) / Math.log(4)) + 1)
> * 100));
> @@ -68,7 +66,7 @@ public class SpeedSelector extends ExpandableLayout {
> public void onProgressChanged(SeekBar seekBar, int progress,
> boolean fromUser) {
> float rate = (float) Math.pow(4, ((double) progress /
> (double) 100) - 1);
> setText(Strings.formatRateString(rate));
> - LibVLC.getExistingInstance().setRate(rate);
> + VLCInstance.get().setRate(rate);
> }
>
> @Override
> @@ -84,7 +82,7 @@ public class SpeedSelector extends ExpandableLayout {
> @Override
> public void onClick(View v) {
> mSeekbar.setProgress(100);
> - LibVLC.getExistingInstance().setRate(1);
> + VLCInstance.get().setRate(1);
> }
> };
> }
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/network/NetworkFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/network/NetworkFragment.java
> index 7138957..0d73deb 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/network/NetworkFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/network/NetworkFragment.java
> @@ -49,6 +49,7 @@ import org.videolan.vlc.gui.MainActivity;
> import org.videolan.vlc.interfaces.IRefreshable;
> import org.videolan.vlc.util.AndroidDevices;
> import org.videolan.vlc.util.Strings;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.util.WeakHandler;
> import org.videolan.vlc.widget.SwipeRefreshLayout;
>
> @@ -74,10 +75,12 @@ public class NetworkFragment extends BrowserFragment
> implements IRefreshable, Me
> private MediaWrapper mCurrentMedia;
> private int mSavedPosition = -1, mFavorites = 0;
> private boolean mRoot;
> - LibVLC mLibVLC = LibVLC.getExistingInstance();
> + private LibVLC mLibVLC;
>
> public void onCreate(Bundle bundle){
> super.onCreate(bundle);
> + mLibVLC = VLCInstance.get();
> +
> if (bundle == null)
> bundle = getArguments();
> if (bundle != null){
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/video/AdvOptionsDialog.java
> b/vlc-android/src/org/videolan/vlc/gui/video/AdvOptionsDialog.java
> index 994ac31..c111e97 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/AdvOptionsDialog.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/AdvOptionsDialog.java
> @@ -51,6 +51,7 @@ import
> org.videolan.vlc.gui.dialogs.TimePickerDialogFragment;
> import org.videolan.vlc.interfaces.IDelayController;
> import org.videolan.vlc.util.AndroidDevices;
> import org.videolan.vlc.util.Strings;
> +import org.videolan.vlc.util.VLCInstance;
>
> import java.util.Calendar;
>
> @@ -150,9 +151,9 @@ public class AdvOptionsDialog extends DialogFragment
> implements View.OnClickList
> mHandler.sendEmptyMessage(TOGGLE_CANCEL);
> mTextColor = mSleepTitle.getCurrentTextColor();
>
> - double speed = LibVLC.getExistingInstance().getRate();
> + double speed = VLCInstance.get().getRate();
> if (speed != 1.0d) {
> - speed = 100*(1+Math.log(speed)/Math.log(4));
> + speed = 100 * (1 + Math.log(speed) / Math.log(4));
> mSeek.setProgress((int) speed);
> }
> return root;
> @@ -163,7 +164,7 @@ public class AdvOptionsDialog extends DialogFragment
> implements View.OnClickList
> public void onProgressChanged(SeekBar seekBar, int progress,
> boolean fromUser) {
> float rate = (float) Math.pow(4, ((double) progress /
> (double) 100) - 1);
> mHandler.obtainMessage(SPEED_TEXT,
> Strings.formatRateString(rate)).sendToTarget();
> - LibVLC.getExistingInstance().setRate(rate);
> + VLCInstance.get().setRate(rate);
> }
>
> public void onStartTrackingTouch(SeekBar seekBar) {}
> @@ -174,7 +175,7 @@ public class AdvOptionsDialog extends DialogFragment
> implements View.OnClickList
> @Override
> public void onClick(View v) {
> mSeek.setProgress(100);
> - LibVLC.getExistingInstance().setRate(1);
> + VLCInstance.get().setRate(1);
> }
> };
>
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoFragment.java
> index 5eddcbc..43fb511 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoFragment.java
> @@ -48,6 +48,7 @@ import org.videolan.vlc.gui.MainActivity;
> import org.videolan.vlc.util.BitmapUtil;
> import org.videolan.vlc.util.Strings;
> import org.videolan.vlc.util.Util;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.util.WeakHandler;
>
> import java.io.File;
> @@ -58,7 +59,6 @@ import java.util.concurrent.Executors;
> public class MediaInfoFragment extends ListFragment {
>
> public final static String TAG = "VLC/MediaInfoFragment";
> - LibVLC mLibVlc = null;
>
> private MediaWrapper mItem;
> private Bitmap mImage;
> @@ -202,8 +202,10 @@ public class MediaInfoFragment extends ListFragment
> {
> Runnable mLoadImage = new Runnable() {
> @Override
> public void run() {
> - mLibVlc = LibVLC.getInstance();
> - mMedia = new Media(mLibVlc, mItem.getLocation());
> + final LibVLC libVlc = VLCInstance.get();
> + if (libVlc == null)
> + return;
> + mMedia = new Media(libVlc, mItem.getLocation());
> mMedia.parse();
> mMedia.release();
> int videoHeight = mItem.getHeight();
> @@ -226,7 +228,7 @@ public class MediaInfoFragment extends ListFragment {
> // Get the thumbnail.
> mImage = Bitmap.createBitmap(width, height,
> Config.ARGB_8888);
>
> - byte[] b = mLibVlc.getThumbnail(mItem.getLocation(), width,
> height);
> + byte[] b = libVlc.getThumbnail(mItem.getLocation(), width,
> height);
>
> if (b == null) // We were not able to create a thumbnail for
> this item.
> return;
> diff --git
> a/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> b/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> index 5dd04f0..d96212c 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> @@ -72,6 +72,7 @@ import org.videolan.vlc.gui.SecondaryActivity;
> import org.videolan.vlc.interfaces.ISortable;
> import org.videolan.vlc.interfaces.IVideoBrowser;
> import org.videolan.vlc.util.Util;
> +import org.videolan.vlc.util.VLCInstance;
> import org.videolan.vlc.util.VLCRunnable;
> import org.videolan.vlc.widget.SwipeRefreshLayout;
>
> @@ -103,7 +104,6 @@ public class VideoGridFragment extends
> BrowserFragment implements ISortable, IVi
>
> private VideoListAdapter mVideoAdapter;
> private MediaLibrary mMediaLibrary;
> - private LibVLC mLibVlc;
> private Thumbnailer mThumbnailer;
> private VideoGridAnimator mAnimator;
>
> @@ -129,7 +129,6 @@ public class VideoGridFragment extends
> BrowserFragment implements ISortable, IVi
> FragmentActivity activity = getActivity();
> if (activity != null)
> mThumbnailer = new Thumbnailer(activity,
> activity.getWindowManager().getDefaultDisplay());
> - mLibVlc = LibVLC.getInstance();
> }
> @Override
> public View onCreateView(LayoutInflater inflater, ViewGroup
> container, Bundle savedInstanceState){
> @@ -352,7 +351,7 @@ public class VideoGridFragment extends
> BrowserFragment implements ISortable, IVi
> menu.findItem(R.id.video_list_play_from_start).setVisible(true);
>
> boolean hasInfo = false;
> - final Media media = new Media(mLibVlc,
> mediaWrapper.getLocation());
> + final Media media = new Media(VLCInstance.get(),
> mediaWrapper.getLocation());
> media.parse();
> media.release();
> if (media.getMeta(Media.Meta.Title) != null)
> 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 f715e54..aea54ae 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> @@ -305,6 +305,9 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
> protected void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> +
> + mLibVLC = VLCInstance.get();
> +
> if (LibVlcUtil.isJellyBeanMR1OrLater()) {
> // Get the media router service (Miracast)
> mMediaRouter = (MediaRouter)
> getSystemService(Context.MEDIA_ROUTER_SERVICE);
> @@ -405,12 +408,6 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> mDelayPlus = (ImageView) findViewById(R.id.player_delay_plus);
> mDelayMinus = (ImageView) findViewById(R.id.player_delay_minus);
>
> - try {
> - mLibVLC = VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e) {
> - Log.d(TAG, "LibVLC initialisation failed");
> - return;
> - }
> mMediaListPlayer = MediaWrapperListPlayer.getInstance(mLibVLC);
>
> mSurfaceView = (SurfaceView) findViewById(R.id.player_surface);
> @@ -565,7 +562,8 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> @Override
> protected void onDestroy() {
> super.onDestroy();
> - unregisterReceiver(mReceiver);
> + if (mReceiver != null)
> + unregisterReceiver(mReceiver);
>
> mAudioManager = null;
> }
> @@ -1849,12 +1847,16 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> showInfo(getString(R.string.volume) + '\u00A0' +
> Integer.toString(vol),1000);
> }
>
> - private void updateMute () {
> - mMute = !mMute;
> + private void mute(boolean mute) {
> + mMute = mute;
> if (mMute)
> mVolSave = mLibVLC.getVolume();
> mLibVLC.setVolume(mMute ? 0 : mVolSave);
> - showInfo(mMute ? R.string.sound_off :
> R.string.sound_on,1000);
> + }
> +
> + private void updateMute () {
> + mute(!mMute);
> + showInfo(mMute ? R.string.sound_off : R.string.sound_on,1000);
> }
>
> @TargetApi(android.os.Build.VERSION_CODES.FROYO)
> @@ -2578,9 +2580,6 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> fromStart = getIntent().getExtras().getBoolean("fromStart");
> }
>
> - if(mLibVLC == null)
> - return;
> -
> /* WARNING: hack to avoid a crash in mediacodec on KitKat.
> * Disable hardware acceleration if the media has a ts
> extension. */
> if (mLocation != null && LibVlcUtil.isKitKatOrLater()) {
> @@ -2774,7 +2773,7 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> if (presentationDisplay != null) {
> // Show a new presentation if possible.
> Log.i(TAG, "Showing presentation on display: " +
> presentationDisplay);
> - mPresentation = new SecondaryDisplay(this,
> presentationDisplay);
> + mPresentation = new SecondaryDisplay(this, mLibVLC,
> presentationDisplay);
> mPresentation.setOnDismissListener(mOnDismissListener);
> try {
> mPresentation.show();
> @@ -2828,17 +2827,12 @@ public class VideoPlayerActivity extends
> ActionBarActivity implements IVideoPlay
> private FrameLayout mSurfaceFrame;
> private LibVLC mLibVLC;
>
> - public SecondaryDisplay(Context context, Display display) {
> + public SecondaryDisplay(Context context, LibVLC libVLC, Display
> display) {
> super(context, display);
> if (context instanceof ActionBarActivity) {
> setOwnerActivity((ActionBarActivity) context);
> }
> - try {
> - mLibVLC = VLCInstance.getLibVlcInstance();
> - } catch (LibVlcException e) {
> - Log.d(TAG, "LibVLC initialisation failed");
> - return;
> - }
> + mLibVLC = libVLC;
> }
>
> @Override
> diff --git a/vlc-android/src/org/videolan/vlc/util/VLCInstance.java
> b/vlc-android/src/org/videolan/vlc/util/VLCInstance.java
> index 17b6bb5..0853d51 100644
> --- a/vlc-android/src/org/videolan/vlc/util/VLCInstance.java
> +++ b/vlc-android/src/org/videolan/vlc/util/VLCInstance.java
> @@ -22,6 +22,7 @@ package org.videolan.vlc.util;
>
> import org.videolan.libvlc.LibVLC;
> import org.videolan.libvlc.LibVlcException;
> +import org.videolan.libvlc.LibVlcUtil;
> import org.videolan.vlc.VLCApplication;
> import org.videolan.vlc.VLCCrashHandler;
> import org.videolan.vlc.gui.NativeCrashActivity;
> @@ -33,18 +34,22 @@ import android.preference.PreferenceManager;
>
> public class VLCInstance {
> public final static String TAG = "VLC/Util/VLCInstance";
> + private static LibVLC sLibVLC = null;
>
> /** A set of utility functions for the VLC application */
> - public static LibVLC getLibVlcInstance() throws LibVlcException {
> - LibVLC instance = LibVLC.getExistingInstance();
> - if (instance == null) {
> + public synchronized static LibVLC get() throws IllegalStateException
> {
> + if (sLibVLC == null) {
> Thread.setDefaultUncaughtExceptionHandler(new
> VLCCrashHandler());
>
> - instance = LibVLC.getInstance();
> + sLibVLC = new LibVLC();
> final Context context = VLCApplication.getAppContext();
> SharedPreferences pref =
> PreferenceManager.getDefaultSharedPreferences(context);
> VLCInstance.updateLibVlcSettings(pref);
> - instance.init(context);
> + try {
> + sLibVLC.init(context);
> + } catch (LibVlcException e) {
> + throw new IllegalStateException("LibVLC initialisation
> failed: " + LibVlcUtil.getErrorMsg());
> + }
> LibVLC.setOnNativeCrashListener(new
> LibVLC.OnNativeCrashListener() {
> @Override
> public void onNativeCrash() {
> @@ -55,22 +60,32 @@ public class VLCInstance {
> }
> });
> }
> - return instance;
> + return sLibVLC;
> }
>
> - public static void updateLibVlcSettings(SharedPreferences pref) {
> - LibVLC instance = LibVLC.getExistingInstance();
> - if (instance == null)
> + public static synchronized void restart(Context context) throws
> IllegalStateException {
> + if (sLibVLC != null) {
> + try {
> + sLibVLC.destroy();
> + sLibVLC.init(context);
> + } catch (LibVlcException lve) {
> + throw new IllegalStateException("LibVLC initialisation
> failed: " + LibVlcUtil.getErrorMsg());
> + }
> + }
> + }
> +
> + public static synchronized void
> updateLibVlcSettings(SharedPreferences pref) {
> + if (sLibVLC == null)
> return;
>
> -
> instance.setSubtitlesEncoding(pref.getString("subtitle_text_encoding",
> ""));
> -
> instance.setTimeStretching(pref.getBoolean("enable_time_stretching_audio",
> false));
> - instance.setFrameSkip(pref.getBoolean("enable_frame_skip",
> false));
> - instance.setChroma(pref.getString("chroma_format", ""));
> - instance.setVerboseMode(pref.getBoolean("enable_verbose_mode",
> true));
> +
> sLibVLC.setSubtitlesEncoding(pref.getString("subtitle_text_encoding",
> ""));
> +
> sLibVLC.setTimeStretching(pref.getBoolean("enable_time_stretching_audio",
> false));
> + sLibVLC.setFrameSkip(pref.getBoolean("enable_frame_skip",
> false));
> + sLibVLC.setChroma(pref.getString("chroma_format", ""));
> + sLibVLC.setVerboseMode(pref.getBoolean("enable_verbose_mode",
> true));
>
> if (pref.getBoolean("equalizer_enabled", false))
> - instance.setEqualizer(Preferences.getFloatArray(pref,
> "equalizer_values"));
> + sLibVLC.setEqualizer(Preferences.getFloatArray(pref,
> "equalizer_values"));
>
> int aout;
> try {
> @@ -112,13 +127,11 @@ public class VLCInstance {
> networkCaching = 60000;
> else if(networkCaching < 0)
> networkCaching = 0;
> - instance.setAout(aout);
> - instance.setVout(vout);
> - instance.setDeblocking(deblocking);
> - instance.setNetworkCaching(networkCaching);
> - instance.setHardwareAcceleration(hardwareAcceleration);
> - instance.setDevHardwareDecoder(devHardwareDecoder);
> + sLibVLC.setAout(aout);
> + sLibVLC.setVout(vout);
> + sLibVLC.setDeblocking(deblocking);
> + sLibVLC.setNetworkCaching(networkCaching);
> + sLibVLC.setHardwareAcceleration(hardwareAcceleration);
> + sLibVLC.setDevHardwareDecoder(devHardwareDecoder);
> }
> -
> -
> }
> diff --git
> a/vlc-android/tv/src/org/videolan/vlc/gui/tv/MainTvActivity.java
> b/vlc-android/tv/src/org/videolan/vlc/gui/tv/MainTvActivity.java
> index b87853e..ae91177 100644
> --- a/vlc-android/tv/src/org/videolan/vlc/gui/tv/MainTvActivity.java
> +++ b/vlc-android/tv/src/org/videolan/vlc/gui/tv/MainTvActivity.java
> @@ -24,14 +24,11 @@ import java.util.HashMap;
> import java.util.concurrent.BrokenBarrierException;
> import java.util.concurrent.CyclicBarrier;
>
> -import org.videolan.libvlc.LibVLC;
> -import org.videolan.libvlc.LibVlcException;
> import org.videolan.vlc.MediaDatabase;
> import org.videolan.vlc.MediaLibrary;
> import org.videolan.vlc.MediaWrapper;
> import org.videolan.vlc.R;
> import org.videolan.vlc.Thumbnailer;
> -import org.videolan.vlc.gui.CompatErrorActivity;
> import org.videolan.vlc.gui.PreferencesActivity;
> import org.videolan.vlc.gui.tv.audioplayer.AudioPlayerActivity;
> import org.videolan.vlc.gui.tv.browser.MusicFragment;
> @@ -107,21 +104,12 @@ public class MainTvActivity extends Activity
> implements IVideoBrowser, OnItemVie
> /*
> * skip browser and show directly Audio Player if a song is
> playing
> */
> - try {
> - if (VLCInstance.getLibVlcInstance() != null){
> - if (LibVLC.getExistingInstance().isPlaying()){
> - startActivity(new Intent(this,
> AudioPlayerActivity.class));
> - finish();
> - return;
> - }
> - }
> - } catch (LibVlcException e) {
> - Intent i = new Intent(this, CompatErrorActivity.class);
> - startActivity(i);
> + if (VLCInstance.get().isPlaying()){
> + startActivity(new Intent(this, AudioPlayerActivity.class));
> finish();
> - super.onCreate(savedInstanceState);
> return;
> }
> +
> mContext = this;
> setContentView(R.layout.tv_main_fragment);
>
> --
> 2.1.3
>
More information about the Android
mailing list