aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-04-27 13:51:39 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2015-04-27 13:52:38 +0200
commit8dbb82a8b61922e788e844e747b43f1838e6e58f (patch)
tree6eeb333e604f650e97baa029cf42d407c601f83a /OpenKeychain
parent9eb98f6eb712ec6130ce45772fd6c351afdab1b2 (diff)
downloadopen-keychain-8dbb82a8b61922e788e844e747b43f1838e6e58f.tar.gz
open-keychain-8dbb82a8b61922e788e844e747b43f1838e6e58f.tar.bz2
open-keychain-8dbb82a8b61922e788e844e747b43f1838e6e58f.zip
profiling says: caching qrCode bitmaps is a good idea
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java48
2 files changed, 43 insertions, 19 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
index d26ccbe57..710dbf8aa 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
@@ -24,6 +24,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
@@ -40,6 +41,8 @@ import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.TlsHelper;
import java.security.Security;
+import java.util.HashMap;
+
public class KeychainApplication extends Application {
@@ -100,6 +103,17 @@ public class KeychainApplication extends Application {
checkConsolidateRecovery();
}
+ public static HashMap<String,Bitmap> qrCodeCache = new HashMap<>();
+
+ @Override
+ public void onTrimMemory(int level) {
+ super.onTrimMemory(level);
+
+ if (level >= TRIM_MEMORY_UI_HIDDEN) {
+ qrCodeCache.clear();
+ }
+ }
+
/**
* Restart consolidate process if it has been interruped before
*/
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java
index b8d4ea7d2..5f71abdab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java
@@ -29,6 +29,7 @@ import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.util.Log;
import java.util.Hashtable;
@@ -40,36 +41,45 @@ public class QrCodeUtils {
/**
* Generate Bitmap with QR Code based on input.
- *
- * @param input
- * @param size
* @return QR Code as Bitmap
*/
public static Bitmap getQRCodeBitmap(final String input, final int size) {
+
try {
- final Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
- hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
- final BitMatrix result = new QRCodeWriter().encode(input, BarcodeFormat.QR_CODE, size,
- size, hints);
-
- final int width = result.getWidth();
- final int height = result.getHeight();
- final int[] pixels = new int[width * height];
-
- for (int y = 0; y < height; y++) {
- final int offset = y * width;
- for (int x = 0; x < width; x++) {
- pixels[offset + x] = result.get(x, y) ? Color.BLACK : Color.TRANSPARENT;
+
+ // the qrCodeCache is handled in KeychainApplication so we can
+ // properly react to onTrimMemory calls
+ Bitmap bitmap = KeychainApplication.qrCodeCache.get(input);
+ if (bitmap == null) {
+
+ Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
+ hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+ BitMatrix result = new QRCodeWriter().encode(input, BarcodeFormat.QR_CODE, size,
+ size, hints);
+
+ int width = result.getWidth();
+ int height = result.getHeight();
+ int[] pixels = new int[width * height];
+
+ for (int y = 0; y < height; y++) {
+ final int offset = y * width;
+ for (int x = 0; x < width; x++) {
+ pixels[offset + x] = result.get(x, y) ? Color.BLACK : Color.TRANSPARENT;
+ }
}
+
+ bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
+
+ KeychainApplication.qrCodeCache.put(input, bitmap);
}
- final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
- } catch (final WriterException e) {
+ } catch (WriterException e) {
Log.e(Constants.TAG, "QrCodeUtils", e);
return null;
}
+
}
}