diff --git a/benchmark/src/main/java/com/orhanobut/benchmark/MainActivity.java b/benchmark/src/main/java/com/orhanobut/benchmark/MainActivity.java index e8bf3aa..f8fb106 100644 --- a/benchmark/src/main/java/com/orhanobut/benchmark/MainActivity.java +++ b/benchmark/src/main/java/com/orhanobut/benchmark/MainActivity.java @@ -7,6 +7,8 @@ import com.orhanobut.hawk.Hawk; import com.orhanobut.hawk.LogInterceptor; +import java.util.Arrays; + public class MainActivity extends Activity { @Override @@ -19,7 +21,9 @@ protected void onCreate(Bundle savedInstanceState) { timeHawkGet(); timeHawkContains(); timeHawkCount(); + timeHawkGetKeys(); timeHawkDelete(); + timeHawkSelectiveDelete(); } private void timeHawkInit() { @@ -79,4 +83,22 @@ private void timeHawkDelete() { long endTime = System.currentTimeMillis(); System.out.println("Hawk.count: " + (endTime - startTime) + "ms"); } + + private void timeHawkGetKeys() { + long startTime = System.currentTimeMillis(); + + Hawk.getAllKeys(); + + long endTime = System.currentTimeMillis(); + System.out.println("Hawk.getAllKeys: " + (endTime - startTime) + "ms"); + } + + private void timeHawkSelectiveDelete() { + long startTime = System.currentTimeMillis(); + + Hawk.selectiveDelete(Arrays.asList("key", "key2", "key3")); + + long endTime = System.currentTimeMillis(); + System.out.println("Hawk.getAllKeys: " + (endTime - startTime) + "ms"); + } } diff --git a/hawk/src/main/java/com/orhanobut/hawk/DefaultHawkFacade.java b/hawk/src/main/java/com/orhanobut/hawk/DefaultHawkFacade.java index 2593fda..ad307ff 100644 --- a/hawk/src/main/java/com/orhanobut/hawk/DefaultHawkFacade.java +++ b/hawk/src/main/java/com/orhanobut/hawk/DefaultHawkFacade.java @@ -1,5 +1,7 @@ package com.orhanobut.hawk; +import java.util.List; + public class DefaultHawkFacade implements HawkFacade { private final Storage storage; @@ -145,6 +147,15 @@ public DefaultHawkFacade(HawkBuilder builder) { @Override public void destroy() { } + @Override public List getAllKeys() { + return storage.getAllKeys(); + } + + @Override + public long selectiveDelete(List keys) { + return storage.selectiveDelete(keys); + } + private void log(String message) { logInterceptor.onLog(message); } diff --git a/hawk/src/main/java/com/orhanobut/hawk/Hawk.java b/hawk/src/main/java/com/orhanobut/hawk/Hawk.java index 35e8b46..15d97e2 100644 --- a/hawk/src/main/java/com/orhanobut/hawk/Hawk.java +++ b/hawk/src/main/java/com/orhanobut/hawk/Hawk.java @@ -2,6 +2,7 @@ import android.content.Context; +import java.util.List; public final class Hawk { @@ -118,4 +119,21 @@ public static void destroy() { hawkFacade.destroy(); } + /** + * Use this method to get all the keys saved + * + * @return the list of all keys saved in the DB + */ + public static List getAllKeys() { + return hawkFacade.getAllKeys(); + } + + /** + * Use this method to clear all, except a list of keys + * + * @return the number of objects deleted + */ + public static long selectiveDelete(List keys) { + return hawkFacade.selectiveDelete(keys); + } } diff --git a/hawk/src/main/java/com/orhanobut/hawk/HawkFacade.java b/hawk/src/main/java/com/orhanobut/hawk/HawkFacade.java index 3c40135..d0eb4f4 100644 --- a/hawk/src/main/java/com/orhanobut/hawk/HawkFacade.java +++ b/hawk/src/main/java/com/orhanobut/hawk/HawkFacade.java @@ -1,5 +1,7 @@ package com.orhanobut.hawk; +import java.util.List; + public interface HawkFacade { boolean put(String key, T value); @@ -20,6 +22,10 @@ public interface HawkFacade { void destroy(); + List getAllKeys(); + + long selectiveDelete(List keys); + class EmptyHawkFacade implements HawkFacade { @Override public boolean put(String key, T value) { @@ -65,6 +71,16 @@ class EmptyHawkFacade implements HawkFacade { throwValidation(); } + @Override public List getAllKeys() { + throwValidation(); + return null; + } + + @Override public long selectiveDelete(List keys) { + throwValidation(); + return 0; + } + private void throwValidation() { throw new IllegalStateException("Hawk is not built. " + "Please call build() and wait the initialisation finishes."); diff --git a/hawk/src/main/java/com/orhanobut/hawk/SharedPreferencesStorage.java b/hawk/src/main/java/com/orhanobut/hawk/SharedPreferencesStorage.java index 465e265..184921b 100644 --- a/hawk/src/main/java/com/orhanobut/hawk/SharedPreferencesStorage.java +++ b/hawk/src/main/java/com/orhanobut/hawk/SharedPreferencesStorage.java @@ -3,6 +3,10 @@ import android.content.Context; import android.content.SharedPreferences; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + final class SharedPreferencesStorage implements Storage { private final SharedPreferences preferences; @@ -45,4 +49,26 @@ private SharedPreferences.Editor getEditor() { return preferences.edit(); } + @Override + public List getAllKeys() { + List result = new ArrayList<>(); + Map allEntries = preferences.getAll(); + for (Map.Entry entry : allEntries.entrySet()) { + result.add(entry.getKey()); + } + return result; + } + + @Override + public long selectiveDelete(List keys) { + long result = 0; + Map allEntries = preferences.getAll(); + for (Map.Entry entry : allEntries.entrySet()) { + if (!keys.contains(entry.getKey())) { + delete(entry.getKey()); + result++; + } + } + return result; + } } diff --git a/hawk/src/main/java/com/orhanobut/hawk/Storage.java b/hawk/src/main/java/com/orhanobut/hawk/Storage.java index bfad5cc..aff8697 100644 --- a/hawk/src/main/java/com/orhanobut/hawk/Storage.java +++ b/hawk/src/main/java/com/orhanobut/hawk/Storage.java @@ -1,5 +1,7 @@ package com.orhanobut.hawk; +import java.util.List; + @SuppressWarnings("WeakerAccess") public interface Storage { @@ -56,4 +58,17 @@ public interface Storage { */ boolean contains(String key); + /** + * Retrieve a list with all the keys in the storage + * + * @return list of keys + */ + List getAllKeys(); + + /** + * Clear all the data stored except the keys specified. + * @param keys to don't delete + * @return the number of items deleted + */ + long selectiveDelete(List keys); } diff --git a/hawk/src/test/java/com/orhanobut/hawk/HawkBuilderTest.java b/hawk/src/test/java/com/orhanobut/hawk/HawkBuilderTest.java index bd0c252..bb35c67 100644 --- a/hawk/src/test/java/com/orhanobut/hawk/HawkBuilderTest.java +++ b/hawk/src/test/java/com/orhanobut/hawk/HawkBuilderTest.java @@ -8,6 +8,7 @@ import org.robolectric.annotation.Config; import java.lang.reflect.Type; +import java.util.List; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.fail; @@ -62,6 +63,16 @@ class MyStorage implements Storage { @Override public boolean contains(String key) { return false; } + + @Override + public List getAllKeys() { + return null; + } + + @Override + public long selectiveDelete(List keys) { + return 0; + } } builder.setStorage(new MyStorage()).build(); assertThat(builder.getStorage()).isInstanceOf(MyStorage.class);