Browse Source

Medialibrary: fix context leak

merge-requests/1666/merge
Nicolas Pomepuy 3 years ago
parent
commit
adc0ad8940
  1. 47
      medialibrary/src/org/videolan/medialibrary/MLContextTools.java
  2. 10
      medialibrary/src/org/videolan/medialibrary/MedialibraryImpl.java
  3. 5
      medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java
  4. 3
      medialibrary/src/org/videolan/medialibrary/interfaces/media/Album.java
  5. 7
      medialibrary/src/org/videolan/medialibrary/interfaces/media/Artist.java
  6. 6
      medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java

47
medialibrary/src/org/videolan/medialibrary/MLContextTools.java

@ -0,0 +1,47 @@
/*
* ************************************************************************
* ContextTools.java
* *************************************************************************
* Copyright © 2023 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.medialibrary;
import android.content.Context;
public final class MLContextTools {
private static MLContextTools sInstance;
private Context mContext;
public void setContext(Context context) {
this.mContext = context.getApplicationContext();
}
public static MLContextTools getInstance() {
if (sInstance == null) {
sInstance = new MLContextTools();
}
return sInstance;
}
public Context getContext() {
return mContext;
}
}

10
medialibrary/src/org/videolan/medialibrary/MedialibraryImpl.java

@ -25,10 +25,12 @@ import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.util.*;
import org.videolan.libvlc.util.VLCUtil;
import org.videolan.medialibrary.interfaces.Medialibrary;
import org.videolan.medialibrary.interfaces.media.Album;
import org.videolan.medialibrary.interfaces.media.Artist;
@ -48,7 +50,7 @@ public class MedialibraryImpl extends Medialibrary {
public boolean construct(Context context) {
if (context == null) throw new IllegalStateException("context cannot be null");
if (mIsInitiated) return false;
sContext = context;
MLContextTools.getInstance().setContext(context);
final File extFilesDir = context.getExternalFilesDir(null);
File dbDirectory = context.getDir("db", Context.MODE_PRIVATE);
if (extFilesDir == null || !extFilesDir.exists()
@ -83,7 +85,7 @@ public class MedialibraryImpl extends Medialibrary {
public int init(Context context) {
if (context == null) return ML_INIT_FAILED;
if (mIsInitiated) return ML_INIT_ALREADY_INITIALIZED;
if (sContext == null) throw new IllegalStateException("Medialibrary construct has to be called before init");
if (MLContextTools.getInstance().getContext() == null) throw new IllegalStateException("Medialibrary construct has to be called before init");
File dbDirectory = context.getDir("db", Context.MODE_PRIVATE);
int initCode = nativeInit(dbDirectory + VLC_MEDIA_DB_NAME);
if (initCode == ML_INIT_DB_CORRUPTED) {

5
medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java

@ -117,15 +117,10 @@ abstract public class Medialibrary {
protected final List<DevicesDiscoveryCb> devicesDiscoveryCbList = new ArrayList<>();
protected final List<EntryPointsEventsCb> entryPointsEventsCbList = new ArrayList<>();
private MedialibraryExceptionHandler mExceptionHandler;
protected static Context sContext;
public static final LiveData<MediaWrapper> lastThumb = new SingleEvent<>();
protected static final Medialibrary instance = MLServiceLocator.getAbstractMedialibrary();
public static Context getContext() {
return sContext;
}
public static LiveData<Boolean> getState() {
return sRunning;
}

3
medialibrary/src/org/videolan/medialibrary/interfaces/media/Album.java

@ -7,6 +7,7 @@ import android.util.Log;
import org.videolan.BuildConfig;
import org.videolan.libvlc.util.VLCUtil;
import org.videolan.medialibrary.MLContextTools;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.R;
import org.videolan.medialibrary.interfaces.Medialibrary;
@ -14,7 +15,7 @@ import org.videolan.medialibrary.media.MediaLibraryItem;
public abstract class Album extends MediaLibraryItem {
public static class SpecialRes {
public static String UNKNOWN_ALBUM = Medialibrary.getContext().getString(R.string.unknown_album);
public static String UNKNOWN_ALBUM = MLContextTools.getInstance().getContext().getString(R.string.unknown_album);
}
protected int releaseYear;

7
medialibrary/src/org/videolan/medialibrary/interfaces/media/Artist.java

@ -4,8 +4,9 @@ import android.os.Parcel;
import android.os.Parcelable;
import org.videolan.libvlc.util.VLCUtil;
import org.videolan.medialibrary.R;
import org.videolan.medialibrary.MLContextTools;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.R;
import org.videolan.medialibrary.interfaces.Medialibrary;
import org.videolan.medialibrary.media.MediaLibraryItem;
@ -19,8 +20,8 @@ abstract public class Artist extends MediaLibraryItem {
private int presentTracksCount;
public static class SpecialRes {
public static String UNKNOWN_ARTIST = Medialibrary.getContext().getString(R.string.unknown_artist);
public static String VARIOUS_ARTISTS = Medialibrary.getContext().getString(R.string.various_artists);
public static String UNKNOWN_ARTIST = MLContextTools.getInstance().getContext().getString(R.string.unknown_artist);
public static String VARIOUS_ARTISTS = MLContextTools.getInstance().getContext().getString(R.string.various_artists);
}
public Artist(long id, String name, String shortBio, String artworkMrl, String musicBrainzId, int albumsCount, int tracksCount, int presentTracksCount, boolean isFavorite) {

6
medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java

@ -7,6 +7,7 @@ import android.webkit.URLUtil;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.videolan.medialibrary.MLContextTools;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.Tools;
import org.videolan.medialibrary.interfaces.Medialibrary;
@ -30,13 +31,12 @@ public class StubMedialibrary extends Medialibrary {
private StubDataSource dt = StubDataSource.getInstance();
public boolean construct(Context context) {
if (context == null) return false;
sContext = context;
return true;
}
public int init(Context context) {
if (context == null || sContext == null) return ML_INIT_FAILED;
if (context == null) return ML_INIT_FAILED;
MLContextTools.getInstance().setContext(context);
return ML_INIT_SUCCESS;
}

Loading…
Cancel
Save