{"record":{"id":"dfd1f8b46c456852","repo":"MuntashirAkon/AppManager","slug":"input-must-contain-one-or-more-user-handles","errorCode":null,"errorMessage":"Input must contain one or more user handles","messagePattern":"Input must contain one or more user handles","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/rules/RulesImporter.java","lineNumber":47,"sourceCode":" * <br>\n * Format: <code>package_name component_name type mode|is_applied|is_granted</code>\n *\n * @see RulesExporter\n * @see RuleType\n */\npublic class RulesImporter implements Closeable {\n    @NonNull\n    private final HashMap<String, ComponentsBlocker>[] mComponentsBlockers;\n    @NonNull\n    private final List<RuleType> mTypesToImport;\n    @Nullable\n    private List<String> mPackagesToImport;\n    @NonNull\n    private final int[] mUserIds;\n\n    public RulesImporter(@NonNull List<RuleType> typesToImport, @NonNull int[] userIds) {\n        if (userIds.length == 0) {\n            throw new IllegalArgumentException(\"Input must contain one or more user handles\");\n        }\n        // Init CBs\n        //noinspection unchecked\n        mComponentsBlockers = new HashMap[userIds.length];\n        for (int i = 0; i < userIds.length; ++i) {\n            mComponentsBlockers[i] = new HashMap<>();\n        }\n        mTypesToImport = typesToImport;\n        mUserIds = userIds;\n    }\n\n    public void addRulesFromUri(Uri uri) throws IOException {\n        try (InputStream inputStream = ContextUtils.getContext().getContentResolver().openInputStream(uri)) {\n            if (inputStream == null) throw new IOException(\"Content provider has crashed.\");\n            try (BufferedReader TSVFile = new BufferedReader(new InputStreamReader(inputStream))) {\n                String dataRow;\n                while ((dataRow = TSVFile.readLine()) != null) {\n                    RuleEntry entry = RuleEntry.unflattenFromString(null, dataRow, true);","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/rules/RulesImporter.java#L29-L65","documentation":"The RulesImporter constructor requires at least one Android user handle because rules are imported per-user into per-user ComponentsBlocker instances. An empty int[] userIds cannot satisfy that, so it throws IllegalArgumentException immediately.","triggerScenarios":"new RulesImporter(typesToImport, new int[0]) — e.g. when the caller built the user list by filtering and all users were excluded, or passed an uninitialized array.","commonSituations":"Import UI invoked on a single-user device but with a user-selection bug; work profile removed between listing users and starting the import; hardcoded empty arrays in scripts/tests.","solutions":["Pass at least one valid user ID, e.g. the current user: new int[]{UserHandle.myUserId()}","Fix user-list construction so filtered results never silently yield an empty array","Validate userIds.length > 0 at the call site (UI level) before constructing RulesImporter"],"exampleFix":"// before\nimporter = new RulesImporter(types, selectedUsers); // selectedUsers may be empty\n// after\nif (selectedUsers.length == 0) {\n    selectedUsers = new int[]{UserHandle.myUserId()};\n}\nimporter = new RulesImporter(types, selectedUsers);","handlingStrategy":"validation","validationCode":"if (userIds == null || userIds.length == 0) {\n    userIds = new int[]{UserHandle.myUserId()};\n}","typeGuard":"boolean hasUsers(int[] ids) {\n    return ids != null && ids.length > 0;\n}","tryCatchPattern":"try {\n    importer = new RulesImporter(types, userIds);\n} catch (IllegalArgumentException e) {\n    showError(\"Select at least one user for import\");\n}","preventionTips":["Default empty user selections to the current user","Validate user selection in the UI before starting the import","Re-verify user list after work-profile changes"],"tags":["android","import","validation","multi-user"],"backgroundTag":"empty-required-field","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}