From ac3e41ec8087b52f38990d9a0a81a9f9439db4c6 Mon Sep 17 00:00:00 2001 From: Ash Zarif Date: Tue, 8 Apr 2025 15:06:30 -0700 Subject: [PATCH] [shared_preferences_android] Allow reading int as long in SharedPreferences (#165781) --- .../shared_preferences_android/CHANGELOG.md | 4 ++++ .../sharedpreferences/SharedPreferencesPlugin.kt | 8 +++++++- .../shared_preferences_example/MainActivity.java | 3 ++- .../integration_test/shared_preferences_test.dart | 12 ++++++++++++ .../shared_preferences_android/pubspec.yaml | 2 +- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md index d07fda05552e..f801ee978960 100644 --- a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.4.9 + +* Enables callers to use `getInt` to read preference of type `int` that was written to shared preferences by native code without passing though plugin code. + ## 2.4.8 * Updates compileSdk 34 to flutter.compileSdkVersion. diff --git a/packages/shared_preferences/shared_preferences_android/android/src/main/kotlin/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.kt b/packages/shared_preferences/shared_preferences_android/android/src/main/kotlin/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.kt index 32b628a91c0b..d6456df3ef5c 100644 --- a/packages/shared_preferences/shared_preferences_android/android/src/main/kotlin/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.kt +++ b/packages/shared_preferences/shared_preferences_android/android/src/main/kotlin/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.kt @@ -23,6 +23,7 @@ import io.flutter.plugin.common.BinaryMessenger import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.ObjectOutputStream +import java.lang.ClassCastException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map @@ -379,7 +380,12 @@ class SharedPreferencesBackend( override fun getInt(key: String, options: SharedPreferencesPigeonOptions): Long? { val preferences = createSharedPreferences(options) return if (preferences.contains(key)) { - preferences.getLong(key, 0) + try { + preferences.getLong(key, 0) + } catch (e: ClassCastException) { + // Retry with getInt in case the preference was written by native code directly. + preferences.getInt(key, 0).toLong() + } } else { null } diff --git a/packages/shared_preferences/shared_preferences_android/example/android/app/src/main/java/dev/flutter/plugins/shared_preferences_example/MainActivity.java b/packages/shared_preferences/shared_preferences_android/example/android/app/src/main/java/dev/flutter/plugins/shared_preferences_example/MainActivity.java index 1ef654a61dc0..2fb6e1471b9d 100644 --- a/packages/shared_preferences/shared_preferences_android/example/android/app/src/main/java/dev/flutter/plugins/shared_preferences_example/MainActivity.java +++ b/packages/shared_preferences/shared_preferences_android/example/android/app/src/main/java/dev/flutter/plugins/shared_preferences_example/MainActivity.java @@ -17,9 +17,10 @@ public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - // This call adds a preference for later testing in the Dart integration tests. + // These calls add preferences for later testing in the Dart integration tests. preferences .edit() + .putInt("thisIntIsWrittenInTheExampleAppJavaCode", 5) .putString("thisStringIsWrittenInTheExampleAppJavaCode", "testString") .commit(); } diff --git a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart index 6a221bfdfab3..80663a4dc6d6 100644 --- a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart @@ -914,4 +914,16 @@ void main() { 'thisStringIsWrittenInTheExampleAppJavaCode', options), 'testString'); }); + + testWidgets('Shared Preferences can read ints by conversion to long', + (WidgetTester _) async { + final SharedPreferencesAsyncAndroidOptions options = + getOptions(useDataStore: false); + final SharedPreferencesAsyncPlatform preferences = getPreferences(); + + expect( + await preferences.getInt( + 'thisIntIsWrittenInTheExampleAppJavaCode', options), + 5); + }); } diff --git a/packages/shared_preferences/shared_preferences_android/pubspec.yaml b/packages/shared_preferences/shared_preferences_android/pubspec.yaml index e0e858decdf6..2fcf2454e401 100644 --- a/packages/shared_preferences/shared_preferences_android/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_android/pubspec.yaml @@ -2,7 +2,7 @@ name: shared_preferences_android description: Android implementation of the shared_preferences plugin repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22 -version: 2.4.8 +version: 2.4.9 environment: sdk: ^3.6.0