[shared_preferences] Fix possible clash of string with double entry (#3895)

diff --git a/packages/shared_preferences/shared_preferences/CHANGELOG.md b/packages/shared_preferences/shared_preferences/CHANGELOG.md
index 48abf9a..57b35a8 100644
--- a/packages/shared_preferences/shared_preferences/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences/CHANGELOG.md
@@ -1,7 +1,8 @@
-## NEXT
+## 2.0.7
 
 * Add iOS unit test target.
 * Updated Android lint settings.
+* Fix string clash with double entries on Android
 
 ## 2.0.6
 
diff --git a/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java b/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java
index 71ec14e..cea3f34 100644
--- a/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java
+++ b/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java
@@ -86,7 +86,9 @@
           break;
         case "setString":
           String value = (String) call.argument("value");
-          if (value.startsWith(LIST_IDENTIFIER) || value.startsWith(BIG_INTEGER_PREFIX)) {
+          if (value.startsWith(LIST_IDENTIFIER)
+              || value.startsWith(BIG_INTEGER_PREFIX)
+              || value.startsWith(DOUBLE_PREFIX)) {
             result.error(
                 "StorageError",
                 "This string cannot be stored as it clashes with special identifier prefixes.",
diff --git a/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart
index 1d46ed5..e8498f4 100644
--- a/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:io';
+import 'package:flutter/services.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 import 'package:integration_test/integration_test.dart';
@@ -102,5 +104,39 @@
       // The last write should win.
       expect(preferences.getInt('int'), writeCount);
     });
+
+    testWidgets(
+        'string clash with lists, big integers and doubles (Android only)',
+        (WidgetTester _) async {
+      await preferences.clear();
+      // special prefixes plus a string value
+      expect(
+          // prefix for lists
+          preferences.setString(
+              'String',
+              'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu' +
+                  kTestValues2['flutter.String']),
+          throwsA(isA<PlatformException>()));
+      await preferences.reload();
+      expect(preferences.getString('String'), null);
+      expect(
+          // prefix for big integers
+          preferences.setString(
+              'String',
+              'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy' +
+                  kTestValues2['flutter.String']),
+          throwsA(isA<PlatformException>()));
+      await preferences.reload();
+      expect(preferences.getString('String'), null);
+      expect(
+          // prefix for doubles
+          preferences.setString(
+              'String',
+              'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu' +
+                  kTestValues2['flutter.String']),
+          throwsA(isA<PlatformException>()));
+      await preferences.reload();
+      expect(preferences.getString('String'), null);
+    }, skip: !Platform.isAndroid);
   });
 }
diff --git a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart
index 3d2dd05..841d615 100644
--- a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart
+++ b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart
@@ -128,6 +128,13 @@
       _setValue('Double', key, value);
 
   /// Saves a string [value] to persistent storage in the background.
+  ///
+  /// Note: Due to limitations in Android's SharedPreferences,
+  /// values cannot start with any one of the following:
+  ///
+  /// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu'
+  /// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy'
+  /// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu'
   Future<bool> setString(String key, String value) =>
       _setValue('String', key, value);
 
diff --git a/packages/shared_preferences/shared_preferences/pubspec.yaml b/packages/shared_preferences/shared_preferences/pubspec.yaml
index c3039a9..e3cdfe4 100644
--- a/packages/shared_preferences/shared_preferences/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences/pubspec.yaml
@@ -3,7 +3,7 @@
   Wraps NSUserDefaults on iOS and SharedPreferences on Android.
 repository: https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.0.6
+version: 2.0.7
 
 environment:
   sdk: ">=2.12.0 <3.0.0"