{"record":{"id":"94c495ac2df31c2b","repo":"MuntashirAkon/AppManager","slug":"invalid-format-urigrant-not-found","errorCode":null,"errorMessage":"Invalid format: uriGrant not found","messagePattern":"Invalid format: uriGrant not found","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/UriGrantRule.java","lineNumber":26,"sourceCode":"import java.util.StringTokenizer;\n\nimport io.github.muntashirakon.AppManager.rules.RuleType;\nimport io.github.muntashirakon.AppManager.uri.UriManager;\n\npublic class UriGrantRule extends RuleEntry {\n    @NonNull\n    private final UriManager.UriGrant mUriGrant;\n\n    public UriGrantRule(@NonNull String packageName, @NonNull UriManager.UriGrant uriGrant) {\n        super(packageName, STUB, RuleType.URI_GRANT);\n        mUriGrant = uriGrant;\n    }\n\n    public UriGrantRule(@NonNull String packageName, @NonNull StringTokenizer tokenizer) {\n        super(packageName, STUB, RuleType.URI_GRANT);\n        if (tokenizer.hasMoreElements()) {\n            mUriGrant = UriManager.UriGrant.unflattenFromString(tokenizer.nextElement().toString());\n        } else throw new IllegalArgumentException(\"Invalid format: uriGrant not found\");\n    }\n\n    @NonNull\n    public UriManager.UriGrant getUriGrant() {\n        return mUriGrant;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return \"UriGrantRule{\" +\n                \"packageName='\" + packageName + '\\'' +\n                \", uriGrant=\" + mUriGrant +\n                '}';\n    }\n\n    @NonNull\n    @Override","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/UriGrantRule.java#L8-L44","documentation":"The UriGrantRule constructor reads the URI-grant payload from the tokenizer and passes it to UriManager.UriGrant.unflattenFromString. If no token remains, it throws IllegalArgumentException(\"Invalid format: uriGrant not found\") because a URI grant rule requires the grant descriptor.","triggerScenarios":"Parsing \"pkg\\tSTUB\\tURI_GRANT\" without a fourth tab-separated token containing the flattened UriGrant.","commonSituations":"Truncated or hand-edited rules file; a flattened uriGrant string that failed upstream parsing is a different failure; here it is simply absent.","solutions":["Append the flattened UriGrant field to the rule line.","Pre-check token count (>=4) for URI_GRANT rules before parsing and skip invalid lines.","Re-export rules from the originating device."],"exampleFix":"// before\nString line = pkg + \"\\tSTUB\\tURI_GRANT\";\n// after\nString line = pkg + \"\\tSTUB\\tURI_GRANT\\t\" + uriGrant.flattenToString();","handlingStrategy":"validation","validationCode":"String[] p = line.split(\"\\t\", -1);\nboolean ok = \"URI_GRANT\".equals(p[2]) ? p.length >= 4 : true;\n// only parse when ok","typeGuard":null,"tryCatchPattern":"try {\n    RuleEntry e = RuleEntry.unflattenFromString(null, line, false);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"uriGrant not found\")) repairOrSkip(line);\n}","preventionTips":["Always include the flattened UriGrant token when writing URI_GRANT rules.","Validate rules files with a dry-run parse before applying."],"tags":["parsing","missing-field","rules"],"backgroundTag":"missing-required-argument","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"}