From b56ca19206a2aebf08e5fd60be63b126838c0dc1 Mon Sep 17 00:00:00 2001 From: Andrea Torlaschi Date: Thu, 4 Aug 2016 11:49:26 +0200 Subject: [PATCH] ImportKeys: Use cache for Highlighter --- .../ui/adapter/ImportKeysAdapterBinding.java | 17 ++++++++++++-- .../keychain/util/LruCache.java | 22 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/LruCache.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapterBinding.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapterBinding.java index 26e3e5639..82cb85328 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapterBinding.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapterBinding.java @@ -9,6 +9,7 @@ import android.widget.TextView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.util.Highlighter; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.util.LruCache; public class ImportKeysAdapterBinding { @@ -25,7 +26,7 @@ public class ImportKeysAdapterBinding { if (secret) { userId = resources.getString(R.string.secret_key) + " " + userId; } else { - Highlighter highlighter = new Highlighter(context, query); + Highlighter highlighter = getHighlighter(context, query); userId = highlighter.highlight(userId); } textView.setText(userId); @@ -46,7 +47,7 @@ public class ImportKeysAdapterBinding { if (userEmail == null) userEmail = ""; - Highlighter highlighter = new Highlighter(context, query); + Highlighter highlighter = getHighlighter(context, query); textView.setText(highlighter.highlight(userEmail)); if (revokedOrExpired) { @@ -69,4 +70,16 @@ public class ImportKeysAdapterBinding { textView.setText(KeyFormattingUtils.beautifyKeyIdWithPrefix(keyId)); } + private static LruCache highlighterCache = new LruCache<>(1); + + private static Highlighter getHighlighter(Context context, String query) { + Highlighter highlighter = highlighterCache.get(query); + if (highlighter == null) { + highlighter = new Highlighter(context, query); + highlighterCache.put(query, highlighter); + } + + return highlighter; + } + } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/LruCache.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/LruCache.java new file mode 100644 index 000000000..3034a2440 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/LruCache.java @@ -0,0 +1,22 @@ +package org.sufficientlysecure.keychain.util; + +import java.util.LinkedHashMap; +import java.util.Map; + + +// Source: http://stackoverflow.com/a/1953516 +public class LruCache extends LinkedHashMap { + + private final int maxEntries; + + public LruCache(final int maxEntries) { + super(maxEntries + 1, 1.0f, true); + this.maxEntries = maxEntries; + } + + @Override + protected boolean removeEldestEntry(final Map.Entry eldest) { + return super.size() > maxEntries; + } + +}