{"record":{"id":"e07ffabccb552847","repo":"MuntashirAkon/AppManager","slug":"invalid-key-key-permissionsoption","errorCode":null,"errorMessage":"Invalid key ${key}","messagePattern":"Invalid key (.+?)","errorType":"validation","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/filters/options/PermissionsOption.java","lineNumber":104,"sourceCode":"                        filteredPermissions.add(permission);\n                    }\n                }\n                return result.setMatched(!filteredPermissions.isEmpty())\n                        .setMatchedPermissions(filteredPermissions);\n            }\n            case \"regex\": {\n                Objects.requireNonNull(value);\n                List<String> filteredPermissions = new ArrayList<>();\n                for (String permission : permissions) {\n                    if (regexValue.matcher(permission).matches()) {\n                        filteredPermissions.add(permission);\n                    }\n                }\n                return result.setMatched(!filteredPermissions.isEmpty())\n                        .setMatchedPermissions(filteredPermissions);\n            }\n            default:\n                throw new UnsupportedOperationException(\"Invalid key \" + key);\n        }\n    }\n\n    @NonNull\n    @Override\n    public CharSequence toLocalizedString(@NonNull Context context) {\n        SpannableStringBuilder sb = new SpannableStringBuilder(\"Permissions\");\n        switch (key) {\n            case KEY_ALL:\n                return sb.append(LangUtils.getSeparatorString()).append(\"any\");\n            case \"eq\":\n                return sb.append(\" = '\").append(value).append(\"'\");\n            case \"contains\":\n                return sb.append(\" contains '\").append(value).append(\"'\");\n            case \"starts_with\":\n                return sb.append(\" starts with '\").append(value).append(\"'\");\n            case \"ends_with\":\n                return sb.append(\" ends with '\").append(value).append(\"'\");","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/filters/options/PermissionsOption.java#L86-L122","documentation":"PermissionsOption.test filters requested permissions by switching on the key (e.g. permission-name matching modes). An unrecognized key falls into default and throws UnsupportedOperationException 'Invalid key <key>'. The option received a key it has no matching logic for.","triggerScenarios":"Calling test() on a PermissionsOption whose key is not among the supported permission-filter keys — from a mistyped filter file entry, a key renamed between versions, or a key copied from another option type.","commonSituations":"Shared/edited filter JSON with wrong key; filters created by a different App Manager version; scripted filter generation using raw unvalidated strings.","solutions":["Set the key to a value supported by PermissionsOption.","Re-create the filter in the UI.","Validate keys during filter deserialization.","Add the missing case to the switch if a new mode is required."],"exampleFix":"// before\nnew PermissionsOption(\"permissions\", \"contain\", \"android.permission.CAMERA\");\n// after\nnew PermissionsOption(\"permissions\", \"starts_with\", \"android.permission.CAMERA\");","handlingStrategy":"validation","validationCode":"if (!SUPPORTED_KEYS.contains(option.getKey())) throw new IllegalArgumentException(\"Unsupported permissions key: \" + option.getKey());","typeGuard":"boolean isValidKey(String k) { return k != null && SUPPORTED_KEYS.contains(k); } // SUPPORTED_KEYS mirrors the switch cases","tryCatchPattern":"try { matched = option.test(info); } catch (UnsupportedOperationException e) { matched = false; Log.w(TAG, \"Bad filter key\", e); }","preventionTips":["Mirror the switch cases in a shared key set","Validate filter files at load time","Avoid sharing filters across incompatible versions","Add a default-case test"],"tags":["android","filter-options","unsupported-key","permissions"],"backgroundTag":"invalid-enum-value","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}