{"record":{"id":"a3e8357a07b12db5","repo":"microg/GmsCore","slug":"unknown-key-key","errorCode":null,"errorMessage":"Unknown key: $key","messagePattern":"Unknown key: \\$key","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"play-services-base/core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt","lineNumber":178,"sourceCode":"\n    private fun queryGcm(p: Array<out String>): Cursor = MatrixCursor(p).addRow(p) { key ->\n        when (key) {\n            Gcm.ENABLE_GCM -> getSettingsBoolean(key, false)\n            Gcm.FULL_LOG -> getSettingsBoolean(key, true)\n            Gcm.CONFIRM_NEW_APPS -> getSettingsBoolean(key, false)\n\n            Gcm.LAST_PERSISTENT_ID -> preferences.getString(key, \"\") ?: \"\"\n\n            Gcm.NETWORK_MOBILE -> Integer.parseInt(preferences.getString(key, \"0\") ?: \"0\")\n            Gcm.NETWORK_WIFI -> Integer.parseInt(preferences.getString(key, \"0\") ?: \"0\")\n            Gcm.NETWORK_ROAMING -> Integer.parseInt(preferences.getString(key, \"0\") ?: \"0\")\n            Gcm.NETWORK_OTHER -> Integer.parseInt(preferences.getString(key, \"0\") ?: \"0\")\n\n            Gcm.LEARNT_MOBILE -> preferences.getInt(key, 300000)\n            Gcm.LEARNT_WIFI -> preferences.getInt(key, 300000)\n            Gcm.LEARNT_OTHER -> preferences.getInt(key, 300000)\n\n            else -> throw IllegalArgumentException(\"Unknown key: $key\")\n        }\n    }\n\n    private fun updateGcm(values: ContentValues) {\n        if (values.size() == 0) return\n        val editor = preferences.edit()\n        values.valueSet().forEach { (key, value) ->\n            when (key) {\n                Gcm.ENABLE_GCM -> editor.putBoolean(key, value as Boolean)\n                Gcm.FULL_LOG -> editor.putBoolean(key, value as Boolean)\n                Gcm.CONFIRM_NEW_APPS -> editor.putBoolean(key, value as Boolean)\n\n                Gcm.LAST_PERSISTENT_ID -> editor.putString(key, value as String?)\n\n                Gcm.NETWORK_MOBILE -> editor.putString(key, (value as Int).toString())\n                Gcm.NETWORK_WIFI -> editor.putString(key, (value as Int).toString())\n                Gcm.NETWORK_ROAMING -> editor.putString(key, (value as Int).toString())\n                Gcm.NETWORK_OTHER -> editor.putString(key, (value as Int).toString())","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-base/core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt#L160-L196","documentation":"SettingsProvider.queryGcm resolves GCM settings keys in a `when` expression and throws IllegalArgumentException for any key outside the known set (e.g. Gcm.NETWORK_MOBILE/NETWORK_WIFI/NETWORK_OTHER/LEARNT_*). It is thrown when query() receives a projection column that is not a recognized GCM setting.","triggerScenarios":"query(contentUri=gcmSettings, projection=[unknownKey]) — the requested key does not match any constant in the Gcm settings object (typo, key removed/renamed in a newer/older version, or querying an auth/exposure/etc. key through the GCM branch).","commonSituations":"Caller builds the projection string dynamically or hardcodes a key name from an old microG version; passing keys belonging to other settings groups (Auth.*, DroidGuard.*) to the gcm URI.","solutions":["Use only keys defined in org.microg.gms.settings.Gcm (check the constants in your microG version)","Add a version check or try-catch around provider queries when keys may differ between versions","If adding new settings, extend queryGcm's `when` to cover them"],"exampleFix":"// before\ncursor = resolver.query(GCM_URI, arrayOf(\"gcm.learnMobile\"), null, null, null) // typo\n// after\ncursor = resolver.query(GCM_URI, arrayOf(Gcm.LEARNT_MOBILE), null, null, null)","handlingStrategy":"validation","validationCode":"val known = setOf(Gcm.NETWORK_MOBILE, Gcm.NETWORK_WIFI, Gcm.NETWORK_OTHER, Gcm.LEARNT_MOBILE, Gcm.LEARNT_WIFI, Gcm.LEARNT_OTHER)\nrequire(keys.all { it in known }) { \"Unknown GCM keys: ${keys - known}\" }","typeGuard":null,"tryCatchPattern":"try {\n    cursor = resolver.query(GCM_URI, keys, null, null, null)\n} catch (e: IllegalArgumentException) {\n    Log.w(TAG, \"Unsupported GCM key for this microG version\", e)\n    cursor = null\n}","preventionTips":["Reference Gcm.* constants instead of string literals","Re-check key names after microG version upgrades","Unit-test provider queries against the running microG version"],"tags":["android","content-provider","settings","illegal-argument"],"backgroundTag":"invalid-enum-value","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}