mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-20 11:33:06 +00:00
Limit box art assets to 5 MB each to prevent OOM crashes
This commit is contained in:
parent
2beee168e3
commit
59a00a38c9
@ -13,6 +13,9 @@ import java.io.InputStream;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class DiskAssetLoader {
|
public class DiskAssetLoader {
|
||||||
|
// 5 MB
|
||||||
|
private final long MAX_ASSET_SIZE = 5 * 1024 * 1024;
|
||||||
|
|
||||||
private final File cacheDir;
|
private final File cacheDir;
|
||||||
|
|
||||||
public DiskAssetLoader(File cacheDir) {
|
public DiskAssetLoader(File cacheDir) {
|
||||||
@ -27,6 +30,13 @@ public class DiskAssetLoader {
|
|||||||
InputStream in = null;
|
InputStream in = null;
|
||||||
Bitmap bmp = null;
|
Bitmap bmp = null;
|
||||||
try {
|
try {
|
||||||
|
// Make sure the cached asset doesn't exceed the maximum size
|
||||||
|
if (CacheHelper.getFileSize(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png") > MAX_ASSET_SIZE) {
|
||||||
|
LimeLog.warning("Removing cached tuple exceeding size threshold: "+tuple);
|
||||||
|
CacheHelper.deleteCacheFile(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
in = CacheHelper.openCacheFileForInput(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png");
|
in = CacheHelper.openCacheFileForInput(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png");
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
options.inSampleSize = sampleSize;
|
options.inSampleSize = sampleSize;
|
||||||
@ -51,9 +61,11 @@ public class DiskAssetLoader {
|
|||||||
|
|
||||||
public void populateCacheWithStream(CachedAppAssetLoader.LoaderTuple tuple, InputStream input) {
|
public void populateCacheWithStream(CachedAppAssetLoader.LoaderTuple tuple, InputStream input) {
|
||||||
OutputStream out = null;
|
OutputStream out = null;
|
||||||
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
out = CacheHelper.openCacheFileForOutput(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png");
|
out = CacheHelper.openCacheFileForOutput(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png");
|
||||||
CacheHelper.writeInputStreamToOutputStream(input, out);
|
CacheHelper.writeInputStreamToOutputStream(input, out, MAX_ASSET_SIZE);
|
||||||
|
success = true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
@ -62,6 +74,11 @@ public class DiskAssetLoader {
|
|||||||
out.close();
|
out.close();
|
||||||
} catch (IOException ignored) {}
|
} catch (IOException ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
LimeLog.warning("Unable to populate cache with tuple: "+tuple);
|
||||||
|
CacheHelper.deleteCacheFile(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,14 @@ public class CacheHelper {
|
|||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long getFileSize(File root, String... path) {
|
||||||
|
return openPath(false, root, path).length();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean deleteCacheFile(File root, String... path) {
|
||||||
|
return openPath(false, root, path).delete();
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean cacheFileExists(File root, String... path) {
|
public static boolean cacheFileExists(File root, String... path) {
|
||||||
return openPath(false, root, path).exists();
|
return openPath(false, root, path).exists();
|
||||||
}
|
}
|
||||||
@ -42,11 +50,15 @@ public class CacheHelper {
|
|||||||
return new BufferedOutputStream(new FileOutputStream(openPath(true, root, path)));
|
return new BufferedOutputStream(new FileOutputStream(openPath(true, root, path)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeInputStreamToOutputStream(InputStream in, OutputStream out) throws IOException {
|
public static void writeInputStreamToOutputStream(InputStream in, OutputStream out, long maxLength) throws IOException {
|
||||||
byte[] buf = new byte[4096];
|
byte[] buf = new byte[4096];
|
||||||
int bytesRead;
|
int bytesRead;
|
||||||
|
|
||||||
while ((bytesRead = in.read(buf)) != -1) {
|
while ((bytesRead = in.read(buf)) != -1) {
|
||||||
|
maxLength -= bytesRead;
|
||||||
|
if (maxLength <= 0) {
|
||||||
|
throw new IOException("Stream exceeded max size");
|
||||||
|
}
|
||||||
out.write(buf, 0, bytesRead);
|
out.write(buf, 0, bytesRead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user