(#) Mutating an Immutable SharedPrefs Set
!!! WARNING: Mutating an Immutable SharedPrefs Set
This is a warning.
Id
: `MutatingSharedPrefs`
Summary
: Mutating an Immutable SharedPrefs Set
Severity
: Warning
Category
: Correctness
Platform
: Android
Vendor
: Android Open Source Project
Feedback
: https://issuetracker.google.com/issues/new?component=192708
Since
: 4.2.0 (May 2021)
Affects
: Kotlin and Java files
Editing
: This check runs on the fly in the IDE editor
Implementation
: [Source Code](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/SharedPrefsDetector.kt)
Tests
: [Source Code](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-tests/src/test/java/com/android/tools/lint/checks/SharedPrefsDetectorTest.kt)
As stated in the docs for `SharedPreferences.getStringSet`, you must not
modify the set returned by `getStringSet`:
"Note that you must not modify the set instance returned
by this call. The consistency of the stored data is not guaranteed
if you do, nor is your ability to modify the instance at all."
(##) Example
Here is an example of lint warnings produced by this check:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~text
src/test/pkg/test.kt:11:Warning: Do not modify the set returned by
SharedPreferences.getStringSet()` [MutatingSharedPrefs]
s.removeIf { it.length < 3 }
----------------------------
src/test/pkg/test.kt:12:Warning: Do not modify the set returned by
SharedPreferences.getStringSet()` [MutatingSharedPrefs]
s.add("error")
--------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is the source file referenced above:
`src/test/pkg/test.kt`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
package test.pkg
import android.content.SharedPreferences
import android.os.Build
import androidx.annotation.RequiresApi
@RequiresApi(Build.VERSION_CODES.N)
fun editSet(prefs: SharedPreferences) {
val s = prefs.getStringSet("key", null) // ?: return
s ?: return
s.removeIf { it.length < 3 }
s.add("error")
val t = mutableSetOf