[Android] [PATCH] Use MRLs and libvlc_media_new_location everywhere

Rafaël Carré funman at videolan.org
Wed Mar 14 05:48:55 CET 2012


I didn't test it yet but it looks OK except for inline remarks.

Xilasz any comment?

Le 2012-03-13 00:41, Edward Wang a écrit :
> ---
>  Wires stripped and rewired with correct colours
> 
>  vlc-android/jni/libvlcjni.c                        |   18 ++--
>  vlc-android/src/org/videolan/vlc/AudioService.java |   16 ++--
>  .../src/org/videolan/vlc/DatabaseManager.java      |   51 ++++++++-----
>  vlc-android/src/org/videolan/vlc/LibVLC.java       |   18 ++--
>  vlc-android/src/org/videolan/vlc/Media.java        |   81 ++++++++++++++------
>  vlc-android/src/org/videolan/vlc/MediaLibrary.java |   23 +++---
>  .../src/org/videolan/vlc/ThumbnailerManager.java   |    2 +-
>  vlc-android/src/org/videolan/vlc/Util.java         |   30 +++++++
>  .../src/org/videolan/vlc/gui/SearchActivity.java   |   10 +-
>  .../vlc/gui/audio/AudioBrowserActivity.java        |   14 ++--
>  .../videolan/vlc/gui/audio/AudioListActivity.java  |   14 ++--
>  .../vlc/gui/audio/AudioPlaylistAdapter.java        |    2 +-
>  .../vlc/gui/audio/AudioSongsListAdapter.java       |   16 ++--
>  .../videolan/vlc/gui/video/MediaInfoActivity.java  |   10 +-
>  .../videolan/vlc/gui/video/VideoListActivity.java  |    2 +-
>  .../videolan/vlc/gui/video/VideoListAdapter.java   |    8 +-
>  .../vlc/gui/video/VideoPlayerActivity.java         |   20 +++---
>  .../org/videolan/vlc/interfaces/IAudioService.aidl |    2 +-
>  18 files changed, 207 insertions(+), 130 deletions(-)
> 
> diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
> index ee8bf31..4b84f5e 100644
> --- a/vlc-android/jni/libvlcjni.c
> +++ b/vlc-android/jni/libvlcjni.c
> @@ -34,13 +34,13 @@
>  #define LOG_TAG "VLC/JNI/main"
>  #include "log.h"
>  
> -libvlc_media_t *new_media(jint instance, JNIEnv *env, jobject thiz, jstring filePath)
> +libvlc_media_t *new_media(jint instance, JNIEnv *env, jobject thiz, jstring fileLocation)
>  {
>      libvlc_instance_t *libvlc = (libvlc_instance_t*)instance;
>      jboolean isCopy;
> -    const char *psz_path = (*env)->GetStringUTFChars(env, filePath, &isCopy);
> -    libvlc_media_t *p_md = libvlc_media_new_path(libvlc, psz_path);
> -    (*env)->ReleaseStringUTFChars(env, filePath, psz_path);
> +    const char *psz_location = (*env)->GetStringUTFChars(env, fileLocation, &isCopy);
> +    libvlc_media_t *p_md = libvlc_media_new_location(libvlc, psz_location);
> +    (*env)->ReleaseStringUTFChars(env, fileLocation, psz_location);
>      if (!p_md)
>          return NULL;
>  
> @@ -444,10 +444,10 @@ void Java_org_videolan_vlc_LibVLC_readMedia(JNIEnv *env, jobject thiz,
>  }
>  
>  jboolean Java_org_videolan_vlc_LibVLC_hasVideoTrack(JNIEnv *env, jobject thiz,
> -                                                    jint i_instance, jstring filePath)
> +                                                    jint i_instance, jstring fileLocation)
>  {
>      /* Create a new item and assign it to the media player. */
> -    libvlc_media_t *p_m = new_media(i_instance, env, thiz, filePath);
> +    libvlc_media_t *p_m = new_media(i_instance, env, thiz, fileLocation);
>      if (p_m == NULL)
>      {
>          LOGE("Couldn't create the media!");
> @@ -558,8 +558,8 @@ static void length_changed_callback(const libvlc_event_t *ev, void *data)
>      pthread_mutex_unlock(&monitor->doneMutex);
>  }
>  
> -jlong Java_org_videolan_vlc_LibVLC_getLengthFromFile(JNIEnv *env, jobject thiz,
> -                                                     jint i_instance, jstring filePath)
> +jlong Java_org_videolan_vlc_LibVLC_getLengthFromLocation(JNIEnv *env, jobject thiz,
> +                                                     jint i_instance, jstring fileLocation)
>  {
>      jlong length = 0;
>      struct length_change_monitor *monitor;
> @@ -573,7 +573,7 @@ jlong Java_org_videolan_vlc_LibVLC_getLengthFromFile(JNIEnv *env, jobject thiz,
>      monitor->length_changed = false;
>  
>      /* Create a new item and assign it to the media player. */
> -    libvlc_media_t *m = new_media(i_instance, env, thiz, filePath);
> +    libvlc_media_t *m = new_media(i_instance, env, thiz, fileLocation);
>      if (m == NULL)
>      {
>          LOGE("Couldn't create the media to play!");
> diff --git a/vlc-android/src/org/videolan/vlc/AudioService.java b/vlc-android/src/org/videolan/vlc/AudioService.java
> index 233c276..81bbcf9 100644
> --- a/vlc-android/src/org/videolan/vlc/AudioService.java
> +++ b/vlc-android/src/org/videolan/vlc/AudioService.java
> @@ -292,7 +292,7 @@ public class AudioService extends Service {
>                  return;
>              }
>          }
> -        mLibVLC.readMedia(mCurrentMedia.getPath());
> +        mLibVLC.readMedia(mCurrentMedia.getLocation());
>          mHandler.sendEmptyMessage(SHOW_PROGRESS);
>          showNotification();
>          updateWidget(this);
> @@ -306,7 +306,7 @@ public class AudioService extends Service {
>              mCurrentMedia = mMediaList.get(index - 1);
>          else
>              return;
> -        mLibVLC.readMedia(mCurrentMedia.getPath());
> +        mLibVLC.readMedia(mCurrentMedia.getLocation());
>          mHandler.sendEmptyMessage(SHOW_PROGRESS);
>          showNotification();
>          updateWidget(this);
> @@ -344,7 +344,7 @@ public class AudioService extends Service {
>                  if (b != null)
>                      return b;
>              }
> -            File f = new File(mCurrentMedia.getPath());
> +            File f = new File(mCurrentMedia.getLocation());
>              for (File s : f.getParentFile().listFiles()) {
>                  if (s.getAbsolutePath().endsWith("png") ||
>                          s.getAbsolutePath().endsWith("jpg"))
> @@ -358,8 +358,8 @@ public class AudioService extends Service {
>      private IAudioService.Stub mInterface = new IAudioService.Stub() {
>  
>          @Override
> -        public String getCurrentMediaPath() throws RemoteException {
> -            return mCurrentMedia.getPath();
> +        public String getCurrentMediaLocation() throws RemoteException {
> +            return mCurrentMedia.getLocation();
>          }
>  
>          @Override
> @@ -478,7 +478,7 @@ public class AudioService extends Service {
>              }
>  
>              if (mCurrentMedia != null)
> -                mLibVLC.readMedia(mCurrentMedia.getPath());
> +                mLibVLC.readMedia(mCurrentMedia.getLocation());
>              showNotification();
>          }
>  
> @@ -501,14 +501,14 @@ public class AudioService extends Service {
>              ArrayList<String> medias = new ArrayList<String>();
>              for (int i = 0; i < mMediaList.size(); i++) {
>                  Media item = mMediaList.get(i);
> -                medias.add(item.getPath());
> +                medias.add(item.getLocation());
>              }
>              return medias;
>          }
>  
>          public String getItem() {
>              return mCurrentMedia != null
> -                    ? mCurrentMedia.getPath()
> +                    ? mCurrentMedia.getLocation()
>                      : null;
>          }
>  
> diff --git a/vlc-android/src/org/videolan/vlc/DatabaseManager.java b/vlc-android/src/org/videolan/vlc/DatabaseManager.java
> index bfc4358..e46ea2a 100644
> --- a/vlc-android/src/org/videolan/vlc/DatabaseManager.java
> +++ b/vlc-android/src/org/videolan/vlc/DatabaseManager.java
> @@ -22,6 +22,8 @@ package org.videolan.vlc;
>  
>  import java.io.ByteArrayOutputStream;
>  import java.io.File;
> +import java.net.URI;
> +import java.net.URISyntaxException;
>  import java.text.SimpleDateFormat;
>  import java.util.ArrayList;
>  import java.util.Date;
> @@ -51,7 +53,7 @@ public class DatabaseManager {
>      private final String DIR_ROW_PATH = "path";
>  
>      private final String MEDIA_TABLE_NAME = "media_table";
> -    private final String MEDIA_PATH = "path";
> +    private final String MEDIA_LOCATION = "location";
>      private final String MEDIA_TIME = "time";
>      private final String MEDIA_LENGTH = "length";
>      private final String MEDIA_TYPE = "type";
> @@ -115,7 +117,7 @@ public class DatabaseManager {
>  
>              String createMediaTabelQuery = "CREATE TABLE IF NOT EXISTS "
>                      + MEDIA_TABLE_NAME + " ("
> -                    + MEDIA_PATH + " TEXT PRIMARY KEY NOT NULL, "
> +                    + MEDIA_LOCATION + " TEXT PRIMARY KEY NOT NULL, "
>                      + MEDIA_TIME + " INTEGER, "
>                      + MEDIA_LENGTH + " INTEGER, "
>                      + MEDIA_TYPE + " INTEGER, "
> @@ -219,7 +221,7 @@ public class DatabaseManager {
>  
>          ContentValues values = new ContentValues();
>  
> -        values.put(MEDIA_PATH, media.getPath());
> +        values.put(MEDIA_LOCATION, media.getLocation());
>          values.put(MEDIA_TIME, media.getTime());
>          values.put(MEDIA_LENGTH, media.getLength());
>          values.put(MEDIA_TYPE, media.getType());
> @@ -259,7 +261,7 @@ public class DatabaseManager {
>  
>          cursor = mDb.query(
>                  MEDIA_TABLE_NAME,
> -                new String[] { MEDIA_PATH },
> +                new String[] { MEDIA_LOCATION },
>                  null, null, null, null, null);
>          cursor.moveToFirst();
>          if (!cursor.isAfterLast()) {
> @@ -293,7 +295,7 @@ public class DatabaseManager {
>                      MEDIA_ARTIST, //5 string
>                      MEDIA_GENRE, //6 string
>                      MEDIA_ALBUM, //7 string
> -                    MEDIA_PATH, //8 string
> +                    MEDIA_LOCATION, //8 string
>                      MEDIA_TABLE_NAME,
>                      CHUNK_SIZE,
>                      chunk_count * CHUNK_SIZE), null);
> @@ -305,12 +307,19 @@ public class DatabaseManager {
>                          picture = BitmapFactory.decodeByteArray(blob, 0, blob.length);
>                      }
>  
> -                    Media media = new Media(context, new File(cursor.getString(8)), cursor.getLong(0),
> -                            cursor.getLong(1), cursor.getInt(2),
> -                            picture, cursor.getString(4),
> -                            cursor.getString(5), cursor.getString(6),
> -                            cursor.getString(7));
> -                    medias.put(media.getPath(), media);
> +                    try {
> +                        Media media = new Media(context, new File(Util.VLCPathToURI(cursor.getString(8))), cursor.getLong(0),
> +                                cursor.getLong(1), cursor.getInt(2),
> +                                picture, cursor.getString(4),
> +                                cursor.getString(5), cursor.getString(6),
> +                                cursor.getString(7));
> +                        medias.put(media.getLocation(), media);
> +                    } catch (URISyntaxException e) {
> +                        // URISyntax
> +                        // Exception: Cannot happen
> +                        // But Java forced me
> +                    }
> +
>                      picture = null;
>                      count++;
>                  } while (cursor.moveToNext());
> @@ -342,7 +351,7 @@ public class DatabaseManager {
>                          MEDIA_GENRE, //6 string
>                          MEDIA_ALBUM //7 string
>                  },
> -                MEDIA_PATH + "=?",
> +                MEDIA_LOCATION + "=?",
>                  new String[] { path },
>                  null, null, null);
>          if (cursor.moveToFirst()) {
> @@ -352,18 +361,22 @@ public class DatabaseManager {
>                  picture = BitmapFactory.decodeByteArray(blob, 0, blob.length);
>              }
>  
> -            media = new Media(context, new File(path), cursor.getLong(0),
> -                    cursor.getLong(1), cursor.getInt(2),
> -                    picture, cursor.getString(4),
> -                    cursor.getString(5), cursor.getString(6),
> -                    cursor.getString(7));
> +            try {
> +                media = new Media(context, new File(Util.VLCPathToURI(path)), cursor.getLong(0),
> +                        cursor.getLong(1), cursor.getInt(2),
> +                        picture, cursor.getString(4),
> +                        cursor.getString(5), cursor.getString(6),
> +                        cursor.getString(7));
> +            } catch (URISyntaxException e) {
> +                //not possible, but java requires it
> +            }
>          }
>          cursor.close();
>          return media;
>      }
>  
>      public synchronized void removeMedia(String path) {
> -        mDb.delete(MEDIA_TABLE_NAME, MEDIA_PATH + "=?", new String[] { path });
> +        mDb.delete(MEDIA_TABLE_NAME, MEDIA_LOCATION + "=?", new String[] { path });

One missing here (String argument)

>      }
>  
>      public synchronized void updateMedia(String path, mediaColumn col,
> @@ -379,7 +392,7 @@ public class DatabaseManager {
>              default:
>                  return;
>          }
> -        mDb.update(MEDIA_TABLE_NAME, values, MEDIA_PATH + "=?", new String[] { path });
> +        mDb.update(MEDIA_TABLE_NAME, values, MEDIA_LOCATION + "=?", new String[] { path });
>      }
>  
>      /**
> diff --git a/vlc-android/src/org/videolan/vlc/LibVLC.java b/vlc-android/src/org/videolan/vlc/LibVLC.java
> index e3f7682..9bda5c7 100644
> --- a/vlc-android/src/org/videolan/vlc/LibVLC.java
> +++ b/vlc-android/src/org/videolan/vlc/LibVLC.java
> @@ -204,22 +204,22 @@ public class LibVLC {
>      /**
>       * Get a media thumbnail.
>       */
> -    public byte[] getThumbnail(String filePath, int i_width, int i_height) {
> -        return getThumbnail(mLibVlcInstance, filePath, i_width, i_height);
> +    public byte[] getThumbnail(String mrl, int i_width, int i_height) {
> +        return getThumbnail(mLibVlcInstance, mrl, i_width, i_height);
>      }
>  
>      /**
>       * Return true if there is a video track in the file
>       */
> -    public boolean hasVideoTrack(String filePath) {
> -        return hasVideoTrack(mLibVlcInstance, filePath);
> +    public boolean hasVideoTrack(String mrl) {
> +        return hasVideoTrack(mLibVlcInstance, mrl);
>      }
>  
>      /**
>       * Return true if there is a video track in the file
>       */
> -    public long getLengthFromFile(String filePath) {
> -        return getLengthFromFile(mLibVlcInstance, filePath);
> +    public long getLengthFromLocation(String mrl) {
> +        return getLengthFromLocation(mLibVlcInstance, mrl);
>      }
>  
>      /**
> @@ -335,12 +335,12 @@ public class LibVLC {
>       * Get a media thumbnail.
>       * @return a bytearray with the RGBA thumbnail data inside.
>       */
> -    private native byte[] getThumbnail(int instance, String filePath, int i_width, int i_height);
> +    private native byte[] getThumbnail(int instance, String mrl, int i_width, int i_height);
>  
>      /**
>       * Return true if there is a video track in the file
>       */
> -    private native boolean hasVideoTrack(int instance, String filePath);
> +    private native boolean hasVideoTrack(int instance, String mrl);
>  
>      private native String[] readMediaMeta(int instance, String mrl);
>  
> @@ -361,7 +361,7 @@ public class LibVLC {
>      /**
>       * Return true if there is a video track in the file
>       */
> -    private native long getLengthFromFile(int instance, String filePath);
> +    private native long getLengthFromLocation(int instance, String mrl);
>  
>      private native void setEventManager(EventManager eventManager);
>  
> diff --git a/vlc-android/src/org/videolan/vlc/Media.java b/vlc-android/src/org/videolan/vlc/Media.java
> index 9f1662c..e34300f 100644
> --- a/vlc-android/src/org/videolan/vlc/Media.java
> +++ b/vlc-android/src/org/videolan/vlc/Media.java
> @@ -21,6 +21,8 @@
>  package org.videolan.vlc;
>  
>  import java.io.File;
> +import java.net.MalformedURLException;
> +import java.net.URL;
>  
>  import android.content.Context;
>  import android.graphics.Bitmap;
> @@ -62,7 +64,13 @@ public class Media implements Comparable<Media> {
>      private String mEncodedBy;
>      private String mTrackID;
>  
> -    private File mFile;
> +    private String mLocation;
> +    private String mFilename;
> +    /**
> +     * To maintain compatibility in a couple of places
> +     * Only used internally now
> +     */
> +    private File mFile_internal;
>      private long mTime = 0;
>      private long mLength = 0;
>      private int mType;
> @@ -71,19 +79,33 @@ public class Media implements Comparable<Media> {
>      private Bitmap mPicture;
>  
>      /**
> -     * Create an new Media
> -     * @param file: path on the local storage
> +     * Create a new Media
> +     * @param context Application context of the caller
> +     * @param MRL the file's MRL (media resource locator)
> +     * @param addToDb Should it be added to the file database?
>       */
> -    public Media(Context context, File file) {
> -        this.mFile = file;
> +    public Media(Context context, String MRL, Boolean addToDb) {
> +        mFile_internal = null;
> +        mLocation = MRL;
> +        try {
> +            URL urlobj = new URL(MRL);
> +            mFilename = urlobj.getFile().substring(urlobj.getFile().lastIndexOf('/') + 1);
> +            /* empty filenames are awkward */
> +            if(mFilename.equals("")) {
> +                mFilename = urlobj.getHost();
> +            }
> +        } catch (MalformedURLException e1) {
> +            mFilename = "";
> +        }
> +        
>  
>          LibVLC mLibVlc = null;
>          try {
>              mLibVlc = LibVLC.getInstance();
> -            mType = (mLibVlc.hasVideoTrack(file.getPath())) ? TYPE_VIDEO : TYPE_AUDIO;
> -            mLength = mLibVlc.getLengthFromFile(file.getPath());
> +            mType = (mLibVlc.hasVideoTrack(mLocation)) ? TYPE_VIDEO : TYPE_AUDIO;
> +            mLength = mLibVlc.getLengthFromLocation(mLocation);
>  
> -            String[] array = mLibVlc.readMediaMeta(file.getPath());
> +            String[] array = mLibVlc.readMediaMeta(mLocation);
>  
>              int i;
>              for (i = 0; i < array.length; i++) {
> @@ -108,14 +130,30 @@ public class Media implements Comparable<Media> {
>              e.printStackTrace();
>          }
>  
> -        // Add this item to database
> -        DatabaseManager db = DatabaseManager.getInstance(context);
> -        db.addMedia(this);
> +        if(addToDb) {
> +            // Add this item to database
> +            DatabaseManager db = DatabaseManager.getInstance(context);
> +            db.addMedia(this);
> +        }
> +    }
> +    
> +    /**
> +     * Create from file
> +     * 
> +     * @param context Context of the caller
> +     * @param file File object of the file to be added
> +     */
> +    public Media(Context context, File file) {
> +        this(context, Util.FixURI(file.toURI()), true);
> +        mFile_internal = file;
> +        mFilename = mFile_internal.getName().substring(0, mFile_internal.getName().lastIndexOf('.'));
>      }
>  
>      public Media(Context context, File file, long time, long length, int type,
>              Bitmap picture, String title, String artist, String genre, String album) {
> -        mFile = file;
> +        mFile_internal = file;
> +        mLocation = Util.FixURI(file.toURI().toString());
> +        mFilename = mFile_internal.getName().substring(0, mFile_internal.getName().lastIndexOf('.'));
>          mTime = time;
>          mLength = length;
>          mType = type;
> @@ -135,12 +173,8 @@ public class Media implements Comparable<Media> {
>                  another.getTitle().toUpperCase());
>      }
>  
> -    public File getFile() {
> -        return mFile;
> -    }
> -
> -    public String getPath() {
> -        return mFile.getPath();
> +    public String getLocation() {
> +        return mLocation;
>      }
>  
>      public void updateMeta() {
> @@ -148,7 +182,7 @@ public class Media implements Comparable<Media> {
>      }
>  
>      public String getFileName() {
> -        return mFile.getName().substring(0, mFile.getName().lastIndexOf('.'));
> +        return mFilename;
>      }
>  
>      public long getTime() {
> @@ -182,17 +216,16 @@ public class Media implements Comparable<Media> {
>      public void setPicture(Context context, Bitmap p) {
>          Log.d(TAG, "Set new picture for " + getTitle());
>          DatabaseManager.getInstance(context).updateMedia(
> -                mFile.getPath(),
> +                mLocation,
>                  DatabaseManager.mediaColumn.MEDIA_PICTURE,
>                  p);
>          mPicture = p;
>      }
>  
>      public String getTitle() {
> -        if (mTitle == null)
> -            return mFile.getName().substring(0, mFile.getName().lastIndexOf('.'));
> -        else
> -            return mTitle;
> +        /* should never happen */
> +        assert (mTitle != null);
> +        return mTitle;
>      }
>  
>      public String getArtist() {
> diff --git a/vlc-android/src/org/videolan/vlc/MediaLibrary.java b/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> index 3a78992..63bc235 100644
> --- a/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> +++ b/vlc-android/src/org/videolan/vlc/MediaLibrary.java
> @@ -23,6 +23,8 @@ package org.videolan.vlc;
>  import java.io.File;
>  import java.io.FileFilter;
>  import java.lang.Thread.State;
> +import java.net.URI;
> +import java.net.URISyntaxException;
>  import java.util.ArrayList;
>  import java.util.Arrays;
>  import java.util.HashMap;
> @@ -135,7 +137,7 @@ public class MediaLibrary {
>      public Media getMediaItem(String path) {
>          for (int i = 0; i < mItemList.size(); i++) {
>              Media item = mItemList.get(i);
> -            if (item.getPath().equals(path)) {
> +            if (item.getLocation().equals(path)) {
>                  return item;
>              }
>          }
> @@ -183,9 +185,9 @@ public class MediaLibrary {
>              HashMap<String, Media> existingMedias = mDBManager.getMedias(mContext);
>  
>              // list of all added files
> -            HashSet<File> addedFiles = new HashSet<File>();
> +            HashSet<String> addedLocations = new HashSet<String>();
>  
> -            // clear all old item
> +            // clear all old items
>              mItemList.clear();
>  
>              MediaItemFilter mediaFileFilter = new MediaItemFilter();
> @@ -221,18 +223,17 @@ public class MediaLibrary {
>                          File file = f[i];
>  
>                          if (file.isFile()) {
> -
>                              MainActivity.sendTextInfo(mContext, file.getName(), count, total);
>                              count++;
> -
> -                            if (existingMedias.containsKey(file.getPath())) {
> +                            String fileURI = Util.FixURI(file.toURI().toString());
> +                            if (existingMedias.containsKey(fileURI)) {
>                                  /** only add file if it is not already in the
>                                   * list. eg. if user select an subfolder as well
>                                   */
> -                                if (!addedFiles.contains(file)) {
> +                                if (!addedLocations.contains(fileURI)) {
>                                      // get existing media item from database
> -                                    mItemList.add(existingMedias.get(file.getPath()));
> -                                    addedFiles.add(file);
> +                                    mItemList.add(existingMedias.get(fileURI));
> +                                    addedLocations.add(fileURI);
>                                  }
>                              } else {
>                                  // create new media item
> @@ -252,8 +253,8 @@ public class MediaLibrary {
>              }
>  
>              // remove file from database
> -            for (File file : addedFiles) {
> -                existingMedias.remove(file.getPath());
> +            for (String fileURI : addedLocations) {
> +                existingMedias.remove(fileURI);
>              }
>              for (String path : existingMedias.keySet()) {
>                  mDBManager.removeMedia(path);
> diff --git a/vlc-android/src/org/videolan/vlc/ThumbnailerManager.java b/vlc-android/src/org/videolan/vlc/ThumbnailerManager.java
> index 3e418fb..09eb48a 100644
> --- a/vlc-android/src/org/videolan/vlc/ThumbnailerManager.java
> +++ b/vlc-android/src/org/videolan/vlc/ThumbnailerManager.java
> @@ -122,7 +122,7 @@ public class ThumbnailerManager extends Thread {
>              // Get the thumbnail.
>              Bitmap thumbnail = Bitmap.createBitmap(width, height, Config.ARGB_8888);
>              //Log.i(TAG, "create new bitmap for: " + item.getName());
> -            byte[] b = mLibVlc.getThumbnail(item.getPath(), width, height);
> +            byte[] b = mLibVlc.getThumbnail(item.getLocation(), width, height);
>  
>              if (b == null) // We were not able to create a thumbnail for this item.
>                  continue;
> diff --git a/vlc-android/src/org/videolan/vlc/Util.java b/vlc-android/src/org/videolan/vlc/Util.java
> index bfdec1a..9f13dd1 100644
> --- a/vlc-android/src/org/videolan/vlc/Util.java
> +++ b/vlc-android/src/org/videolan/vlc/Util.java
> @@ -21,6 +21,8 @@
>  package org.videolan.vlc;
>  
>  import java.lang.reflect.Field;
> +import java.net.URI;
> +import java.net.URISyntaxException;
>  import java.text.DecimalFormat;
>  
>  import android.content.Context;
> @@ -40,6 +42,34 @@ public class Util {
>      }
>  
>      /**
> +     * A function to fix up the broken Java URI format
> +     * LibVLC expects the file:///sdcard/... format, but by default
> +     * Java gives the file:/sdcard format, which angers LibVLC
> +     * Reference: http://stackoverflow.com/questions/1131273/java-file-touri-tourl-on-windows-file
> +     * 
> +     * @param javaURI The URI returned by Java
> +     * @return Fixed URI for use by LibVLC
> +     */
> +    public static String FixURI(String javaURI) {
> +        return javaURI.replace("file:/", "file:///");
> +    }
> +    
> +    public static String FixURI(URI uri) {
> +        return FixURI(uri.toString());
> +    }
> +    
> +    /**
> +     * Function to convert a LibVLC path back to an URI

A file:// URI to a file: URI

> +     *
> +     * @param path the libvlc path

the file:// URI

> +     * @return the URI

the file: URI

> +     * @throws URISyntaxException
> +     */
> +    public static URI VLCPathToURI(String path) throws URISyntaxException {
                                             ^^^^
Use location or URI

> +        return new URI(path.replace("file://", "file:"));
> +    }
> +
> +    /**
>       * Convert time to a string
>       * @param millis e.g.time/length from file
>       * @return formated string (hh:)mm:ss
> diff --git a/vlc-android/src/org/videolan/vlc/gui/SearchActivity.java b/vlc-android/src/org/videolan/vlc/gui/SearchActivity.java
> index 0176cbd..a5d86d8 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/SearchActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/SearchActivity.java
> @@ -122,9 +122,9 @@ public class SearchActivity extends ListActivity {
>                  continue;
>              boolean add = true;
>              String name = item.getTitle().toLowerCase();
> -            String path = item.getPath().toLowerCase();
> +            String MRL = item.getLocation().toLowerCase();
>              for (int k = 0; k < keys.length; k++) {
> -                if (!(name.contains(keys[k].toLowerCase()) || path.contains(keys[k].toLowerCase()))) {
> +                if (!(name.contains(keys[k].toLowerCase()) || MRL.contains(keys[k].toLowerCase()))) {
>                      add = false;
>                      break;
>                  }
> @@ -252,15 +252,15 @@ public class SearchActivity extends ListActivity {
>              Intent intent;
>              if (item.getType() == Media.TYPE_VIDEO) {
>                  intent = new Intent(this, VideoPlayerActivity.class);
> -                intent.putExtra("filePath", item.getPath());
> +                intent.putExtra("itemLocation", item.getLocation());
>              } else {
>                  ArrayList<String> arr = new ArrayList<String>();
>                  for (int i = 0; i < getListAdapter().getCount(); i++) {
>                      Media audioItem = (Media) getListAdapter().getItem(i);
>                      if (audioItem.getType() == Media.TYPE_AUDIO)
> -                        arr.add(audioItem.getPath());
> +                        arr.add(audioItem.getLocation());
>                  }
> -                AudioServiceController.getInstance().load(arr, arr.indexOf(item.getPath()));
> +                AudioServiceController.getInstance().load(arr, arr.indexOf(item.getLocation()));
>                  intent = new Intent(this, AudioPlayerActivity.class);
>              }
>              startActivity(intent);
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserActivity.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserActivity.java
> index 0e9a76f..8cd2c02 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserActivity.java
> @@ -120,7 +120,7 @@ public class AudioBrowserActivity extends Activity implements ISortable {
>      OnItemClickListener songListener = new OnItemClickListener() {
>          @Override
>          public void onItemClick(AdapterView<?> av, View v, int p, long id) {
> -            mAudioController.load(mSongsAdapter.getPaths(), p);
> +            mAudioController.load(mSongsAdapter.getLocations(), p);
>              Intent intent = new Intent(AudioBrowserActivity.this, AudioPlayerActivity.class);
>              intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
>              startActivity(intent);
> @@ -165,14 +165,14 @@ public class AudioBrowserActivity extends Activity implements ISortable {
>  
>          if (play_all) {
>              start_position = menuInfo.position;
> -            medias = mSongsAdapter.getPaths();
> +            medias = mSongsAdapter.getLocations();
>          }
>          else {
>              start_position = 0;
>              switch (mFlingViewGroup.getPosition())
>              {
>                  case MODE_SONG:
> -                    medias = mSongsAdapter.getPath(menuInfo.position);
> +                    medias = mSongsAdapter.getLocation(menuInfo.position);
>                      break;
>                  case MODE_ARTIST:
>                      medias = mArtistsAdapter.getPlaylist(menuInfo.position);
> @@ -247,9 +247,9 @@ public class AudioBrowserActivity extends Activity implements ISortable {
>      }
>      };
>  
> -    private Comparator<Media> byPath = new Comparator<Media>() {
> +    private Comparator<Media> byMRL = new Comparator<Media>() {
>          public int compare(Media m1, Media m2) {
> -            return String.CASE_INSENSITIVE_ORDER.compare(m1.getFile().getPath(), m2.getFile().getPath());
> +            return String.CASE_INSENSITIVE_ORDER.compare(m1.getLocation(), m2.getLocation());
>          };
>      };
>  
> @@ -265,7 +265,7 @@ public class AudioBrowserActivity extends Activity implements ISortable {
>          public int compare(Media m1, Media m2) {
>              int res = String.CASE_INSENSITIVE_ORDER.compare(m1.getAlbum(), m2.getAlbum());
>              if (res == 0)
> -                res = byPath.compare(m1, m2);
> +                res = byMRL.compare(m1, m2);
>              return res;
>          };
>      };
> @@ -301,7 +301,7 @@ public class AudioBrowserActivity extends Activity implements ISortable {
>              break;
>          case SORT_BY_TITLE:
>          default:
> -            Collections.sort(audioList, byPath);
> +            Collections.sort(audioList, byMRL);
>              break;
>          }
>          if(mSortReverse) {
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioListActivity.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioListActivity.java
> index 1a3a68a..c424e12 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioListActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioListActivity.java
> @@ -106,7 +106,7 @@ public class AudioListActivity extends ListActivity {
>  
>      @Override
>      protected void onListItemClick(ListView l, View v, int position, long id) {
> -        mAudioController.load(mSongsAdapter.getPaths(), position);
> +        mAudioController.load(mSongsAdapter.getLocations(), position);
>          Intent intent = new Intent(AudioListActivity.this, AudioPlayerActivity.class);
>          intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
>          startActivity(intent);
> @@ -136,11 +136,11 @@ public class AudioListActivity extends ListActivity {
>  
>          if (play_all) {
>              start_position = menuInfo.position;
> -            medias = mSongsAdapter.getPaths();
> +            medias = mSongsAdapter.getLocations();
>          }
>          else {
>              start_position = 0;
> -            medias = mSongsAdapter.getPath(menuInfo.position);
> +            medias = mSongsAdapter.getLocation(menuInfo.position);
>          }
>          if (play_append)
>              mAudioController.append(medias);
> @@ -168,9 +168,9 @@ public class AudioListActivity extends ListActivity {
>          }
>      };
>  
> -    private Comparator<Media> byPath = new Comparator<Media>() {
> +    private Comparator<Media> byMRL = new Comparator<Media>() {
>          public int compare(Media m1, Media m2) {
> -            return String.CASE_INSENSITIVE_ORDER.compare(m1.getFile().getPath(), m2.getFile().getPath());
> +            return String.CASE_INSENSITIVE_ORDER.compare(m1.getLocation(), m2.getLocation());
>          };
>      };
>  
> @@ -211,7 +211,7 @@ public class AudioListActivity extends ListActivity {
>                  break;
>              case SORT_BY_TITLE:
>              default:
> -                Collections.sort(audioList, byPath);
> +                Collections.sort(audioList, byMRL);
>                  break;
>          }
>          if (mSortReverse) {
> @@ -220,7 +220,7 @@ public class AudioListActivity extends ListActivity {
>  
>          for (int i = 0; i < audioList.size(); i++) {
>              Media media = audioList.get(i);
> -            if (currentItem != null && currentItem.equals(media.getPath()))
> +            if (currentItem != null && currentItem.equals(media.getLocation()))
>                  currentIndex = i;
>              mSongsAdapter.add(media);
>          }
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlaylistAdapter.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlaylistAdapter.java
> index 530cf62..c383a70 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlaylistAdapter.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlaylistAdapter.java
> @@ -102,7 +102,7 @@ public class AudioPlaylistAdapter extends ArrayAdapter<String> {
>          if (position >= 0 && position < mTitles.size()) {
>              List<Media> mediaList = mPlaylists.get(mTitles.get(position));
>              for (int i = 0; i < mediaList.size(); i++) {
> -                playlist.add(mediaList.get(i).getPath());
> +                playlist.add(mediaList.get(i).getLocation());
>              }
>          }
>          return playlist;
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioSongsListAdapter.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioSongsListAdapter.java
> index b9d2c4a..1f95669 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioSongsListAdapter.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioSongsListAdapter.java
> @@ -82,19 +82,19 @@ public class AudioSongsListAdapter extends ArrayAdapter<Media> {
>          return v;
>      }
>  
> -    public List<String> getPath(int position) {
> -        List<String> paths = new ArrayList<String>();
> +    public List<String> getLocation(int position) {
> +        List<String> locations = new ArrayList<String>();
>          if (position >= 0 && position < mMediaList.size())
> -            paths.add(mMediaList.get(position).getPath());
> -        return paths;
> +            locations.add(mMediaList.get(position).getLocation());
> +        return locations;
>      }
>  
> -    public List<String> getPaths() {
> -        List<String> paths = new ArrayList<String>();
> +    public List<String> getLocations() {
> +        List<String> locations = new ArrayList<String>();
>          for (int i = 0; i < mMediaList.size(); i++) {
> -            paths.add(mMediaList.get(i).getPath());
> +            locations.add(mMediaList.get(i).getLocation());
>          }
> -        return paths;
> +        return locations;
>      }
>  
>      static class ViewHolder {
> diff --git a/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoActivity.java
> index bad0544..4835a72 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/MediaInfoActivity.java
> @@ -52,10 +52,10 @@ public class MediaInfoActivity extends ListActivity {
>      protected void onCreate(Bundle savedInstanceState) {
>          super.onCreate(savedInstanceState);
>          setContentView(R.layout.media_info);
> -        String path = getIntent().getExtras().getString("filePath");
> -        if (path == null)
> +        String MRL = getIntent().getExtras().getString("itemLocation");
> +        if (MRL == null)
>              return;
> -        mItem = MediaLibrary.getInstance(this).getMediaItem(path);
> +        mItem = MediaLibrary.getInstance(this).getMediaItem(MRL);
>  
>          // set title
>          TextView titleView = (TextView) findViewById(R.id.title);
> @@ -81,7 +81,7 @@ public class MediaInfoActivity extends ListActivity {
>                  return;
>              }
>  
> -            mTracks = mLibVlc.readTracksInfo(mItem.getPath());
> +            mTracks = mLibVlc.readTracksInfo(mItem.getLocation());
>              mHandler.sendEmptyMessage(NEW_TEXT);
>  
>              int width = Math.min(getWindowManager().getDefaultDisplay().getWidth(),
> @@ -91,7 +91,7 @@ public class MediaInfoActivity extends ListActivity {
>              // Get the thumbnail.
>              mImage = Bitmap.createBitmap(width, height, Config.ARGB_8888);
>  
> -            byte[] b = mLibVlc.getThumbnail(mItem.getPath(), width, height);
> +            byte[] b = mLibVlc.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/VideoListActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoListActivity.java
> index c038d18..e567baf 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoListActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoListActivity.java
> @@ -103,7 +103,7 @@ public class VideoListActivity extends ListActivity implements ISortable {
>  
>          Media item = (Media) getListAdapter().getItem(position);
>          Intent intent = new Intent(this, VideoPlayerActivity.class);
> -        intent.putExtra("filePath", item.getPath());
> +        intent.putExtra("itemLocation", item.getLocation());
>          startActivity(intent);
>          super.onListItemClick(l, v, position, id);
>      }
> 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 b230b42..8f61b1a 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.java
> @@ -46,7 +46,7 @@ public class VideoListAdapter extends ArrayAdapter<Media>
>      public final static int SORT_BY_LENGTH = 1;
>      private int mSortDirection = 1;
>      private int mSortBy = SORT_BY_TITLE;
> -    private String mLastPath;
> +    private String mLastMRL;
>  
>      public VideoListAdapter(Context context, int textViewResourceId) {
>          super(context, textViewResourceId);
> @@ -63,7 +63,7 @@ public class VideoListAdapter extends ArrayAdapter<Media>
>      }
>  
>      public void setLastMedia(String lastPath) {
                                       ^^^^^^^^
> -        mLastPath = lastPath;
> +        mLastMRL = lastPath;
                      ^^^^^^^^
Should be the last one according to grep -i "^\+.*path"

>      }
>  
>      public void sortBy(int sortby) {
> @@ -144,7 +144,7 @@ public class VideoListAdapter extends ArrayAdapter<Media>
>              holder.thumbnail.setImageBitmap(thumbnail);
>          }
>  
> -        holder.title.setTextColor(media.getPath().equals(mLastPath) ? Color.RED : Color.WHITE);
> +        holder.title.setTextColor(media.getLocation().equals(mLastMRL) ? Color.RED : Color.WHITE);
>          holder.more.setTag(media);
>          holder.more.setOnClickListener(moreClickListener);
>  
> @@ -157,7 +157,7 @@ public class VideoListAdapter extends ArrayAdapter<Media>
>          public void onClick(View v) {
>              Media item = (Media) v.getTag();
>              Intent intent = new Intent(getContext(), MediaInfoActivity.class);
> -            intent.putExtra("filePath", item.getPath());
> +            intent.putExtra("itemLocation", item.getLocation());
>              getContext().startActivity(intent);
>          }
>      };
> 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 26db89f..0506715 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> @@ -786,36 +786,36 @@ public class VideoPlayerActivity extends Activity {
>       *
>       */
>      private void load() {
> -        String path = null;
> +        String location = null;
>          String title = null;
> -        String lastPath = null;
> +        String lastLocation = null;
>          long lastTime = 0;
>          SharedPreferences preferences = getSharedPreferences(PreferencesActivity.NAME, MODE_PRIVATE);
>  
>          if (getIntent().getAction() != null
>                  && getIntent().getAction().equals(Intent.ACTION_VIEW)) {
>              /* Started from external application */
> -            path = getIntent().getDataString();
> +            location = getIntent().getDataString();
>          } else {
>              /* Started from VideoListActivity */
> -            path = getIntent().getExtras().getString("filePath");
> +            location = getIntent().getExtras().getString("itemLocation");
>          }
>  
> -        if (path != null && path.length() > 0) {
> -            mLibVLC.readMedia(path);
> +        if (location != null && location.length() > 0) {
> +            mLibVLC.readMedia(location);
>              if (!mWakeLock.isHeld())
>                  mWakeLock.acquire();
>  
>              // Save media for next time, and restore position if it's the same one as before
> -            lastPath = preferences.getString(PreferencesActivity.LAST_MEDIA, null);
> +            lastLocation = preferences.getString(PreferencesActivity.LAST_MEDIA, null);
>              lastTime = preferences.getLong(PreferencesActivity.LAST_TIME, 0);
>              SharedPreferences.Editor editor = preferences.edit();
> -            editor.putString(PreferencesActivity.LAST_MEDIA, path);
> +            editor.putString(PreferencesActivity.LAST_MEDIA, location);
>              editor.commit();
> -            if (lastTime > 0 && path.equals(lastPath))
> +            if (lastTime > 0 && location.equals(lastLocation))
>                  mLibVLC.setTime(lastTime);
>  
> -            title = new File(path).getName();
> +            title = new File(location).getName();
>              int dotIndex = title.lastIndexOf('.');
>              if (dotIndex != -1)
>                  title = title.substring(0, dotIndex);
> diff --git a/vlc-android/src/org/videolan/vlc/interfaces/IAudioService.aidl b/vlc-android/src/org/videolan/vlc/interfaces/IAudioService.aidl
> index eab36df..4525d94 100644
> --- a/vlc-android/src/org/videolan/vlc/interfaces/IAudioService.aidl
> +++ b/vlc-android/src/org/videolan/vlc/interfaces/IAudioService.aidl
> @@ -29,7 +29,7 @@ interface IAudioService {
>      void previous();
>      void shuffle();
>      void setTime(long time);
> -    String getCurrentMediaPath();
> +    String getCurrentMediaLocation();
>      void load(in List<String> mediaPathList, int position);
>      void append(in List<String> mediaPathList);
>      List<String> getItems();



More information about the Android mailing list