From 80d8c5953efde1a579f67812a7403aefd418af87 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 27 Feb 2015 01:16:06 -0500 Subject: [PATCH] Rewrite the app art caching and fetching (again!) to finally address OOM problems and speed up art loading --- app/build.gradle | 4 - app/libs/limelight-common.jar | Bin 952898 -> 953008 bytes .../com/limelight/grid/AppGridAdapter.java | 31 +++++- .../grid/assets/CachedAppAssetLoader.java | 64 +++++++----- .../grid/assets/DiskAssetLoader.java | 15 ++- .../grid/assets/MemoryAssetLoader.java | 6 +- .../grid/assets/NetworkAssetLoader.java | 97 +++--------------- .../java/com/limelight/utils/CacheHelper.java | 9 ++ 8 files changed, 98 insertions(+), 128 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bff822c5..7eb77625 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,10 +67,6 @@ dependencies { compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.51' compile group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.51' - compile group: 'com.google.android', name: 'support-v4', version:'r7' - compile group: 'com.koushikdutta.ion', name: 'ion', version:'2.0.5' - compile group: 'com.google.code.gson', name: 'gson', version:'2.3.1' - compile group: 'com.squareup.okhttp', name: 'okhttp', version:'2.2.0' compile group: 'com.squareup.okio', name:'okio', version:'1.2.0' diff --git a/app/libs/limelight-common.jar b/app/libs/limelight-common.jar index 47febbf9117b0bcb547baccff8d69d641a9007bb..2bffce0616c1c3c0363d09f9ecfb5ddc58d36496 100644 GIT binary patch delta 10222 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 z { private final Activity activity; + private static final int ART_WIDTH_PX = 300; + private static final int SMALL_WIDTH_DP = 100; + private static final int LARGE_WIDTH_DP = 150; + private final CachedAppAssetLoader loader; private final ConcurrentHashMap, CachedAppAssetLoader.LoaderTuple> loadingTuples = new ConcurrentHashMap<>(); private final ConcurrentHashMap backgroundLoadingTuples = new ConcurrentHashMap<>(); @@ -33,8 +39,26 @@ public class AppGridAdapter extends GenericGridAdapter { public AppGridAdapter(Activity activity, boolean listMode, boolean small, ComputerDetails computer, String uniqueId) throws KeyManagementException, NoSuchAlgorithmException { super(activity, listMode ? R.layout.simple_row : (small ? R.layout.app_grid_item_small : R.layout.app_grid_item), R.drawable.image_loading); + int dpi = activity.getResources().getDisplayMetrics().densityDpi; + int dp; + + if (small) { + dp = SMALL_WIDTH_DP; + } + else { + dp = LARGE_WIDTH_DP; + } + + double scalingDivisor = ART_WIDTH_PX / (dp * (dpi / 160)); + if (scalingDivisor < 1.0) { + // We don't want to make them bigger before draw-time + scalingDivisor = 1.0; + } + LimeLog.info("Art scaling divisor: " + scalingDivisor); + this.activity = activity; - this.loader = new CachedAppAssetLoader(computer, uniqueId, new NetworkAssetLoader(context), + this.loader = new CachedAppAssetLoader(computer, uniqueId, scalingDivisor, + new NetworkAssetLoader(context, uniqueId), new MemoryAssetLoader(), new DiskAssetLoader(context.getCacheDir())); } @@ -102,7 +126,7 @@ public class AppGridAdapter extends GenericGridAdapter { } @Override - public void notifyLoadComplete(Object object, final Bitmap bitmap) { + public void notifyLoadComplete(Object object, Bitmap bitmap) { final WeakReference viewRef = (WeakReference) object; loadingTuples.remove(viewRef); @@ -117,12 +141,13 @@ public class AppGridAdapter extends GenericGridAdapter { return; } + final Bitmap viewBmp = bitmap; activity.runOnUiThread(new Runnable() { @Override public void run() { ImageView view = viewRef.get(); if (view != null) { - view.setImageBitmap(bitmap); + view.setImageBitmap(viewBmp); fadeInImage(view); } } diff --git a/app/src/main/java/com/limelight/grid/assets/CachedAppAssetLoader.java b/app/src/main/java/com/limelight/grid/assets/CachedAppAssetLoader.java index 172b05c2..3635040c 100644 --- a/app/src/main/java/com/limelight/grid/assets/CachedAppAssetLoader.java +++ b/app/src/main/java/com/limelight/grid/assets/CachedAppAssetLoader.java @@ -1,10 +1,12 @@ package com.limelight.grid.assets; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import com.limelight.nvstream.http.ComputerDetails; import com.limelight.nvstream.http.NvApp; +import java.io.InputStream; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -12,21 +14,34 @@ import java.util.concurrent.TimeUnit; public class CachedAppAssetLoader { private final ComputerDetails computer; private final String uniqueId; + private final double scalingDivider; private final ThreadPoolExecutor foregroundExecutor = new ThreadPoolExecutor(8, 8, Long.MAX_VALUE, TimeUnit.DAYS, new LinkedBlockingQueue()); private final ThreadPoolExecutor backgroundExecutor = new ThreadPoolExecutor(2, 2, Long.MAX_VALUE, TimeUnit.DAYS, new LinkedBlockingQueue()); - private final NetworkLoader networkLoader; - private final CachedLoader memoryLoader; - private final CachedLoader diskLoader; + private final NetworkAssetLoader networkLoader; + private final MemoryAssetLoader memoryLoader; + private final DiskAssetLoader diskLoader; - public CachedAppAssetLoader(ComputerDetails computer, String uniqueId, NetworkLoader networkLoader, CachedLoader memoryLoader, CachedLoader diskLoader) { + public CachedAppAssetLoader(ComputerDetails computer, String uniqueId, double scalingDivider, + NetworkAssetLoader networkLoader, MemoryAssetLoader memoryLoader, + DiskAssetLoader diskLoader) { this.computer = computer; this.uniqueId = uniqueId; + this.scalingDivider = scalingDivider; this.networkLoader = networkLoader; this.memoryLoader = memoryLoader; this.diskLoader = diskLoader; } + private static Bitmap scaleBitmapAndRecyle(Bitmap bmp, double scalingDivider) { + Bitmap newBmp = Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth() / scalingDivider), + (int)(bmp.getHeight() / scalingDivider), true); + if (newBmp != bmp) { + bmp.recycle(); + } + return newBmp; + } + private Runnable createLoaderRunnable(final LoaderTuple tuple, final Object context, final LoadListener listener) { return new Runnable() { @Override @@ -36,7 +51,7 @@ public class CachedAppAssetLoader { return; } - Bitmap bmp = diskLoader.loadBitmapFromCache(tuple); + Bitmap bmp = diskLoader.loadBitmapFromCache(tuple, (int) scalingDivider); if (bmp == null) { // Notify the listener that this may take a while listener.notifyLongLoad(context); @@ -48,20 +63,24 @@ public class CachedAppAssetLoader { return; } - bmp = networkLoader.loadBitmap(tuple); - if (bmp != null) { - break; + InputStream in = networkLoader.getBitmapStream(tuple); + if (in != null) { + // Write the stream straight to disk + diskLoader.populateCacheWithStream(tuple, in); + + // Read it back scaled + bmp = diskLoader.loadBitmapFromCache(tuple, (int) scalingDivider); + if (bmp != null) { + break; + } } // Wait 1 second with a bit of fuzz try { - Thread.sleep((int) (1000 + (Math.random()*500))); - } catch (InterruptedException e) {} - } - - if (bmp != null) { - // Populate the disk cache - diskLoader.populateCache(tuple, bmp); + Thread.sleep((int) (1000 + (Math.random() * 500))); + } catch (InterruptedException e) { + break; + } } } @@ -95,7 +114,7 @@ public class CachedAppAssetLoader { } private LoaderTuple loadBitmapWithContext(NvApp app, Object context, LoadListener listener, boolean background) { - LoaderTuple tuple = new LoaderTuple(computer, uniqueId, app); + LoaderTuple tuple = new LoaderTuple(computer, app); // First, try the memory cache in the current context Bitmap bmp = memoryLoader.loadBitmapFromCache(tuple); @@ -125,15 +144,13 @@ public class CachedAppAssetLoader { public class LoaderTuple { public final ComputerDetails computer; - public final String uniqueId; public final NvApp app; public boolean notified; public boolean cancelled; - public LoaderTuple(ComputerDetails computer, String uniqueId, NvApp app) { + public LoaderTuple(ComputerDetails computer, NvApp app) { this.computer = computer; - this.uniqueId = uniqueId; this.app = app; } @@ -150,15 +167,6 @@ public class CachedAppAssetLoader { } } - public interface NetworkLoader { - public Bitmap loadBitmap(LoaderTuple tuple); - } - - public interface CachedLoader { - public Bitmap loadBitmapFromCache(LoaderTuple tuple); - public void populateCache(LoaderTuple tuple, Bitmap bitmap); - } - public interface LoadListener { // Notifies that the load didn't hit any cache and is about to be dispatched // over the network diff --git a/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java b/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java index 219ca8a7..2da573de 100644 --- a/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java +++ b/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java @@ -11,20 +11,21 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -public class DiskAssetLoader implements CachedAppAssetLoader.CachedLoader { +public class DiskAssetLoader { private final File cacheDir; public DiskAssetLoader(File cacheDir) { this.cacheDir = cacheDir; } - @Override - public Bitmap loadBitmapFromCache(CachedAppAssetLoader.LoaderTuple tuple) { + public Bitmap loadBitmapFromCache(CachedAppAssetLoader.LoaderTuple tuple, int sampleSize) { InputStream in = null; Bitmap bmp = null; try { in = CacheHelper.openCacheFileForInput(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png"); - bmp = BitmapFactory.decodeStream(in); + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inSampleSize = sampleSize; + bmp = BitmapFactory.decodeStream(in, null, options); } catch (IOException e) { e.printStackTrace(); } finally { @@ -42,13 +43,11 @@ public class DiskAssetLoader implements CachedAppAssetLoader.CachedLoader { return bmp; } - @Override - public void populateCache(CachedAppAssetLoader.LoaderTuple tuple, Bitmap bitmap) { + public void populateCacheWithStream(CachedAppAssetLoader.LoaderTuple tuple, InputStream input) { OutputStream out = null; try { - // PNG ignores quality setting out = CacheHelper.openCacheFileForOutput(cacheDir, "boxart", tuple.computer.uuid.toString(), tuple.app.getAppId() + ".png"); - bitmap.compress(Bitmap.CompressFormat.PNG, 0, out); + CacheHelper.writeInputStreamToOutputStream(input, out); } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/app/src/main/java/com/limelight/grid/assets/MemoryAssetLoader.java b/app/src/main/java/com/limelight/grid/assets/MemoryAssetLoader.java index 4fa26fca..995a4f36 100644 --- a/app/src/main/java/com/limelight/grid/assets/MemoryAssetLoader.java +++ b/app/src/main/java/com/limelight/grid/assets/MemoryAssetLoader.java @@ -5,9 +5,9 @@ import android.util.LruCache; import com.limelight.LimeLog; -public class MemoryAssetLoader implements CachedAppAssetLoader.CachedLoader { +public class MemoryAssetLoader { private static final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); - private static final LruCache memoryCache = new LruCache(maxMemory / 8) { + private static final LruCache memoryCache = new LruCache(maxMemory / 12) { @Override protected int sizeOf(String key, Bitmap bitmap) { // Sizeof returns kilobytes @@ -19,7 +19,6 @@ public class MemoryAssetLoader implements CachedAppAssetLoader.CachedLoader { return tuple.computer.uuid.toString()+"-"+tuple.app.getAppId(); } - @Override public Bitmap loadBitmapFromCache(CachedAppAssetLoader.LoaderTuple tuple) { Bitmap bmp = memoryCache.get(constructKey(tuple)); if (bmp != null) { @@ -28,7 +27,6 @@ public class MemoryAssetLoader implements CachedAppAssetLoader.CachedLoader { return bmp; } - @Override public void populateCache(CachedAppAssetLoader.LoaderTuple tuple, Bitmap bitmap) { memoryCache.put(constructKey(tuple), bitmap); } diff --git a/app/src/main/java/com/limelight/grid/assets/NetworkAssetLoader.java b/app/src/main/java/com/limelight/grid/assets/NetworkAssetLoader.java index 0150b230..b80f09ee 100644 --- a/app/src/main/java/com/limelight/grid/assets/NetworkAssetLoader.java +++ b/app/src/main/java/com/limelight/grid/assets/NetworkAssetLoader.java @@ -2,109 +2,44 @@ package com.limelight.grid.assets; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; -import com.koushikdutta.ion.Ion; import com.limelight.LimeLog; import com.limelight.binding.PlatformBinding; import com.limelight.nvstream.http.ComputerDetails; -import com.limelight.nvstream.http.LimelightCryptoProvider; +import com.limelight.nvstream.http.NvHTTP; +import java.io.IOException; +import java.io.InputStream; import java.net.InetAddress; -import java.net.Socket; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; -import java.security.Principal; -import java.security.PrivateKey; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.KeyManager; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509KeyManager; -import javax.net.ssl.X509TrustManager; - -public class NetworkAssetLoader implements CachedAppAssetLoader.NetworkLoader { +public class NetworkAssetLoader { private final Context context; - private final LimelightCryptoProvider cryptoProvider; - private final SSLContext sslContext; + private final String uniqueId; - public NetworkAssetLoader(Context context) throws NoSuchAlgorithmException, KeyManagementException { + public NetworkAssetLoader(Context context, String uniqueId) throws NoSuchAlgorithmException, KeyManagementException { this.context = context; - - cryptoProvider = PlatformBinding.getCryptoProvider(context); - - sslContext = SSLContext.getInstance("SSL"); - sslContext.init(ourKeyman, trustAllCerts, new SecureRandom()); + this.uniqueId = uniqueId; } - private final TrustManager[] trustAllCerts = new TrustManager[] { - new X509TrustManager() { - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - public void checkClientTrusted(X509Certificate[] certs, String authType) {} - public void checkServerTrusted(X509Certificate[] certs, String authType) {} - }}; + public InputStream getBitmapStream(CachedAppAssetLoader.LoaderTuple tuple) { + NvHTTP http = new NvHTTP(getCurrentAddress(tuple.computer), uniqueId, null, PlatformBinding.getCryptoProvider(context)); - private final KeyManager[] ourKeyman = new KeyManager[] { - new X509KeyManager() { - public String chooseClientAlias(String[] keyTypes, - Principal[] issuers, Socket socket) { - return "Limelight-RSA"; - } + InputStream in = null; + try { + in = http.getBoxArt(tuple.app); + } catch (IOException e) {} - public String chooseServerAlias(String keyType, Principal[] issuers, - Socket socket) { - return null; - } - - public X509Certificate[] getCertificateChain(String alias) { - return new X509Certificate[] {cryptoProvider.getClientCertificate()}; - } - - public String[] getClientAliases(String keyType, Principal[] issuers) { - return null; - } - - public PrivateKey getPrivateKey(String alias) { - return cryptoProvider.getClientPrivateKey(); - } - - public String[] getServerAliases(String keyType, Principal[] issuers) { - return null; - } - } - }; - - // Ignore differences between given hostname and certificate hostname - private final HostnameVerifier hv = new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { return true; } - }; - - @Override - public Bitmap loadBitmap(CachedAppAssetLoader.LoaderTuple tuple) { - // Set SSL contexts correctly to allow us to authenticate - Ion.getDefault(context).getHttpClient().getSSLSocketMiddleware().setTrustManagers(trustAllCerts); - Ion.getDefault(context).getHttpClient().getSSLSocketMiddleware().setSSLContext(sslContext); - Ion.getDefault(context).getHttpClient().getSSLSocketMiddleware().setHostnameVerifier(hv); - Ion.getDefault(context).getBitmapCache().clear(); - - Bitmap bmp = Ion.with(context) - .load("https://" + getCurrentAddress(tuple.computer).getHostAddress() + ":47984/appasset?uniqueid=" + - tuple.uniqueId + "&appid=" + tuple.app.getAppId() + "&AssetType=2&AssetIdx=0") - .asBitmap() - .tryGet(); - if (bmp != null) { + if (in != null) { LimeLog.info("Network asset load complete: " + tuple); } else { LimeLog.info("Network asset load failed: " + tuple); } - return bmp; + return in; } private static InetAddress getCurrentAddress(ComputerDetails computer) { diff --git a/app/src/main/java/com/limelight/utils/CacheHelper.java b/app/src/main/java/com/limelight/utils/CacheHelper.java index 4bbebd46..581c26fa 100644 --- a/app/src/main/java/com/limelight/utils/CacheHelper.java +++ b/app/src/main/java/com/limelight/utils/CacheHelper.java @@ -38,6 +38,15 @@ public class CacheHelper { return new BufferedOutputStream(new FileOutputStream(openPath(true, root, path))); } + public static void writeInputStreamToOutputStream(InputStream in, OutputStream out) throws IOException { + byte[] buf = new byte[4096]; + int bytesRead; + + while ((bytesRead = in.read(buf)) != -1) { + out.write(buf, 0, bytesRead); + } + } + public static String readInputStreamToString(InputStream in) throws IOException { Reader r = new InputStreamReader(in);