diff options
| author | Vincent Breitmoser <valodim@mugenguild.com> | 2015-04-27 13:51:39 +0200 | 
|---|---|---|
| committer | Vincent Breitmoser <valodim@mugenguild.com> | 2015-04-27 13:52:38 +0200 | 
| commit | 8dbb82a8b61922e788e844e747b43f1838e6e58f (patch) | |
| tree | 6eeb333e604f650e97baa029cf42d407c601f83a /OpenKeychain | |
| parent | 9eb98f6eb712ec6130ce45772fd6c351afdab1b2 (diff) | |
| download | open-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.java | 14 | ||||
| -rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java | 48 | 
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;          } +      }  }  | 
