[Android] [PATCH] Use MRLs and libvlc_media_new_location everywhere

Rafaël Carré funman at videolan.org
Fri Mar 16 20:03:15 CET 2012


Le 2012-03-16 13:08, Jean-Baptiste Kempf a écrit :
> This crashes for me, with my old database.
> So, I cleaned it.
> 
> And then it blocks when rescanning my collection, by using wrong 
> encoding on some songs with Unicode names...

For example é.mp3 (0xc3a9) ?

> On 14/03/2012 17:06, Edward Wang wrote:
>> ---
>>   Update as of March 14, 2012 with all fixes
>>
>>   vlc-android/jni/libvlcjni.c                        |   18 ++--
>>   vlc-android/src/org/videolan/vlc/AudioService.java |   16 ++--
>>   .../src/org/videolan/vlc/DatabaseManager.java      |   59 +++++++++------
>>   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 |   25 +++---
>>   .../src/org/videolan/vlc/ThumbnailerManager.java   |    2 +-
>>   vlc-android/src/org/videolan/vlc/Util.java         |   31 ++++++++
>>   .../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   |   10 +-
>>   .../vlc/gui/video/VideoPlayerActivity.java         |   20 +++---
>>   .../org/videolan/vlc/interfaces/IAudioService.aidl |    2 +-
>>   18 files changed, 214 insertions(+), 136 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..3b9cd13 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());
>> @@ -323,7 +332,7 @@ public class DatabaseManager {
>>           return medias;
>>       }
>>
>> -    public synchronized Media getMedia(Context context, String path) {
>> +    public synchronized Media getMedia(Context context, String location) {
>>
>>           Cursor cursor;
>>           Media media = null;
>> @@ -342,8 +351,8 @@ public class DatabaseManager {
>>                           MEDIA_GENRE, //6 string
>>                           MEDIA_ALBUM //7 string
>>                   },
>> -                MEDIA_PATH + "=?",
>> -                new String[] { path },
>> +                MEDIA_LOCATION + "=?",
>> +                new String[] { location },
>>                   null, null, null);
>>           if (cursor.moveToFirst()) {
>>
>> @@ -352,21 +361,25 @@ 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(location)), 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 });
>> +    public synchronized void removeMedia(String location) {
>> +        mDb.delete(MEDIA_TABLE_NAME, MEDIA_LOCATION + "=?", new String[] { location });
>>       }
>>
>> -    public synchronized void updateMedia(String path, mediaColumn col,
>> +    public synchronized void updateMedia(String location, mediaColumn col,
>>               Object object) {
>>           ContentValues values = new ContentValues();
>>           switch (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[] { location });
>>       }
>>
>>       /**
>> 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..768105c 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;
>> @@ -132,10 +134,10 @@ public class MediaLibrary {
>>           return mItemList;
>>       }
>>
>> -    public Media getMediaItem(String path) {
>> +    public Media getMediaItem(String location) {
>>           for (int i = 0; i<  mItemList.size(); i++) {
>>               Media item = mItemList.get(i);
>> -            if (item.getPath().equals(path)) {
>> +            if (item.getLocation().equals(location)) {
>>                   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..509e21e 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,35 @@ 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 a Java URI
>> +     * Converts the file:///sdcard format back to the file:/sdcard format
>> +     *
>> +     * @param path the libvlc path (file:///)
>> +     * @return the Java URI (file:/)
>> +     * @throws URISyntaxException
>> +     */
>> +    public static URI VLCPathToURI(String path) throws URISyntaxException {
>> +        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..6b1c0dc 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);
>> @@ -62,8 +62,8 @@ public class VideoListAdapter extends ArrayAdapter<Media>
>>           }
>>       }
>>
>> -    public void setLastMedia(String lastPath) {
>> -        mLastPath = lastPath;
>> +    public void setLastMedia(String lastMRL) {
>> +        mLastMRL = lastMRL;
>>       }
>>
>>       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