From 57e81bf037475fceb118943cd53b8005b5954303 Mon Sep 17 00:00:00 2001 From: Nino Uzelac Date: Sat, 24 Aug 2019 16:58:22 +0200 Subject: [PATCH 1/3] [shared_preferences] Unhardcode Flutter prefix in platform code --- .../sharedpreferences/SharedPreferencesPlugin.java | 8 ++++---- .../ios/Classes/SharedPreferencesPlugin.m | 10 ++++++---- .../shared_preferences/lib/shared_preferences.dart | 10 ++++++++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java b/packages/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java index affb56d33ce6..0a1963051aea 100644 --- a/packages/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java +++ b/packages/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java @@ -77,11 +77,11 @@ private String encodeList(List list) throws IOException { } // Filter preferences to only those set by the flutter app. - private Map getAllPrefs() throws IOException { + private Map getAllPrefs(String prefix) throws IOException { Map allPrefs = preferences.getAll(); Map filteredPrefs = new HashMap<>(); for (String key : allPrefs.keySet()) { - if (key.startsWith("flutter.")) { + if (key.startsWith(prefix)) { Object value = allPrefs.get(key); if (value instanceof String) { String stringValue = (String) value; @@ -179,13 +179,13 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { result.success(true); break; case "getAll": - result.success(getAllPrefs()); + result.success(getAllPrefs((String) call.argument("prefix"))); return; case "remove": commitAsync(preferences.edit().remove(key), result); break; case "clear": - Set keySet = getAllPrefs().keySet(); + Set keySet = getAllPrefs((String) call.argument("prefix")).keySet(); Editor clearEditor = preferences.edit(); for (String keyToDelete : keySet) { clearEditor.remove(keyToDelete); diff --git a/packages/shared_preferences/ios/Classes/SharedPreferencesPlugin.m b/packages/shared_preferences/ios/Classes/SharedPreferencesPlugin.m index 74ebff28d03d..546c1dc92571 100644 --- a/packages/shared_preferences/ios/Classes/SharedPreferencesPlugin.m +++ b/packages/shared_preferences/ios/Classes/SharedPreferencesPlugin.m @@ -16,7 +16,8 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSDictionary *arguments = [call arguments]; if ([method isEqualToString:@"getAll"]) { - result(getAllPrefs()); + NSString *prefix = arguments[@"prefix"]; + result(getAllPrefs(prefix)); } else if ([method isEqualToString:@"setBool"]) { NSString *key = arguments[@"key"]; NSNumber *value = arguments[@"value"]; @@ -54,7 +55,8 @@ + (void)registerWithRegistrar:(NSObject *)registrar { result(@YES); } else if ([method isEqualToString:@"clear"]) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - for (NSString *key in getAllPrefs()) { + NSString *prefix = arguments[@"prefix"]; + for (NSString *key in getAllPrefs(prefix)) { [defaults removeObjectForKey:key]; } result(@YES); @@ -66,13 +68,13 @@ + (void)registerWithRegistrar:(NSObject *)registrar { #pragma mark - Private -static NSMutableDictionary *getAllPrefs() { +static NSMutableDictionary *getAllPrefs(NSString *prefix) { NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; NSDictionary *prefs = [[NSUserDefaults standardUserDefaults] persistentDomainForName:appDomain]; NSMutableDictionary *filteredPrefs = [NSMutableDictionary dictionary]; if (prefs != nil) { for (NSString *candidateKey in prefs) { - if ([candidateKey hasPrefix:@"flutter."]) { + if ([candidateKey hasPrefix:prefix]) { [filteredPrefs setObject:prefs[candidateKey] forKey:candidateKey]; } } diff --git a/packages/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/lib/shared_preferences.dart index aece19b6e29e..bf82e656919b 100644 --- a/packages/shared_preferences/lib/shared_preferences.dart +++ b/packages/shared_preferences/lib/shared_preferences.dart @@ -148,8 +148,11 @@ class SharedPreferences { /// Completes with true once the user preferences for the app has been cleared. Future clear() async { + final Map params = { + 'prefix': '$_prefix', + }; _preferenceCache.clear(); - return await _kChannel.invokeMethod('clear'); + return await _kChannel.invokeMethod('clear', params); } /// Fetches the latest values from the host platform. @@ -164,8 +167,11 @@ class SharedPreferences { } static Future> _getSharedPreferencesMap() async { + final Map params = { + 'prefix': '$_prefix', + }; final Map fromSystem = - await _kChannel.invokeMapMethod('getAll'); + await _kChannel.invokeMapMethod('getAll', params); assert(fromSystem != null); // Strip the flutter. prefix from the returned preferences. final Map preferencesMap = {}; From 1da3845ff6a8281c8d24ccdd49146c6c9554ac52 Mon Sep 17 00:00:00 2001 From: Nino Uzelac Date: Sat, 24 Aug 2019 17:11:30 +0200 Subject: [PATCH 2/3] Update pubspec.yaml, changelog & authors --- AUTHORS | 1 + packages/shared_preferences/CHANGELOG.md | 4 ++++ packages/shared_preferences/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index a24dfd196966..b10d47886d94 100644 --- a/AUTHORS +++ b/AUTHORS @@ -43,3 +43,4 @@ Audrius Karosevicius Lukasz Piliszczuk SoundReply Solutions GmbH Rafal Wachol +Nino Uzelac \ No newline at end of file diff --git a/packages/shared_preferences/CHANGELOG.md b/packages/shared_preferences/CHANGELOG.md index 00d5adfce0a3..3a82a2fc8bf4 100644 --- a/packages/shared_preferences/CHANGELOG.md +++ b/packages/shared_preferences/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.4 + +* Remove hardcoded prefix from internal platform calls + ## 0.5.3+4 * Copy `List` instances when reading and writing values to prevent mutations from propagating. diff --git a/packages/shared_preferences/pubspec.yaml b/packages/shared_preferences/pubspec.yaml index 1b1feb2d73a6..43ba9d86234f 100644 --- a/packages/shared_preferences/pubspec.yaml +++ b/packages/shared_preferences/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/shared_preferences -version: 0.5.3+4 +version: 0.5.4 flutter: plugin: From 4b7c5fa4bce41bf4b0f38a5a6917f933b1fdbdc9 Mon Sep 17 00:00:00 2001 From: Nino Uzelac Date: Sat, 24 Aug 2019 17:26:51 +0200 Subject: [PATCH 3/3] [shared_preferences] Fix failing test --- .../shared_preferences/test/shared_preferences_test.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/test/shared_preferences_test.dart index 8ebcb96c0ad8..2582cb3f1005 100755 --- a/packages/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/test/shared_preferences_test.dart @@ -143,7 +143,11 @@ void main() { expect(preferences.getInt('int'), null); expect(preferences.getDouble('double'), null); expect(preferences.getStringList('List'), null); - expect(log, [isMethodCall('clear', arguments: null)]); + expect(log, [ + isMethodCall('clear', arguments: { + 'prefix': 'flutter.', + }) + ]); }); test('reloading', () async {