{"record":{"id":"66842398a02de0e9","repo":"MuntashirAkon/AppManager","slug":"invalid-key-key-targetsdkoption","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/TargetSdkOption.java","lineNumber":47,"sourceCode":"    @Override\n    public Map<String, Integer> getKeysWithType() {\n        return mKeysWithType;\n    }\n\n    @NonNull\n    @Override\n    public TestResult test(@NonNull IFilterableAppInfo info, @NonNull TestResult result) {\n        switch (key) {\n            case KEY_ALL:\n                return result.setMatched(true);\n            case \"eq\":\n                return result.setMatched(info.getTargetSdk() == intValue);\n            case \"le\":\n                return result.setMatched(info.getTargetSdk() <= intValue);\n            case \"ge\":\n                return result.setMatched(info.getTargetSdk() >= intValue);\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(\"Target SDK\");\n        switch (key) {\n            case KEY_ALL:\n                return sb.append(LangUtils.getSeparatorString()).append(\"any\");\n            case \"eq\":\n                return sb.append(\" = \").append(Integer.toString(intValue));\n            case \"le\":\n                return sb.append(\" ≤ \").append(Integer.toString(intValue));\n            case \"ge\":\n                return sb.append(\" ≥ \").append(Integer.toString(intValue));\n            default:\n                throw new UnsupportedOperationException(\"Invalid key \" + key);","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/filters/options/TargetSdkOption.java#L29-L65","documentation":"TargetSdkOption.test() compares a package's target SDK version against an int filter value using keys eq/le/ge. An unrecognized key hits the default branch and throws UnsupportedOperationException('Invalid key ...'), because no comparison can be made.","triggerScenarios":"Running test() with a TargetSdkOption whose key is not eq/le/ge — from corrupted, outdated, or mistyped filter definitions.","commonSituations":"Old filter files persisted before key renames; constructing options programmatically with a wrong key string.","solutions":["Verify the option's key and set it to one of eq, le, or ge","Fix or migrate the persisted filter JSON to current key names","Add the missing key case if a new comparison mode was intended"],"exampleFix":"// before\nnew TargetSdkOption(\"less_than\", 28);\n// after\nnew TargetSdkOption(\"le\", 28);","handlingStrategy":"validation","validationCode":"if (!\"eq\".equals(key) && !\"le\".equals(key) && !\"ge\".equals(key)) {\n    throw new IllegalArgumentException(\"TargetSdk key must be eq/le/ge, got: \" + key);\n}","typeGuard":"boolean isTargetSdkKey(String k) { return \"eq\".equals(k) || \"le\".equals(k) || \"ge\".equals(k); }","tryCatchPattern":"try {\n    include = targetSdkOption.test(appInfo);\n} catch (UnsupportedOperationException e) {\n    include = false;\n    Log.w(TAG, \"Invalid target-SDK filter key\", e);\n}","preventionTips":["Use an enum or constants class for comparison keys","Validate filter files at load time","Cover each comparison key with unit tests"],"tags":["java","android","filters"],"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"}