diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandGroup.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandGroup.java index 817225b533dd7a9d9bf67f227e4e1f1896f099e7..36ec753faf43a332d6501020c2b30fcf10e81405 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandGroup.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandGroup.java @@ -3,7 +3,10 @@ package ohi.andre.consolelauncher.commands; import android.content.Context; import java.io.IOException; +import java.lang.reflect.Constructor; +import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import ohi.andre.consolelauncher.tuils.Tuils; @@ -11,35 +14,68 @@ import ohi.andre.consolelauncher.tuils.Tuils; public class CommandGroup { private String packageName; - - private List<String> commands; + private CommandAbstraction[] commands; + private String[] commandNames; public CommandGroup(Context c, String packageName) { this.packageName = packageName; + List<String> cmds; try { - this.commands = Tuils.getClassesInPackage(packageName, c); + cmds = Tuils.getClassesInPackage(packageName, c); } catch (IOException e) { + return; } - Collections.sort(commands); - } + List<CommandAbstraction> cmdAbs = new ArrayList<>(); + Iterator<String> iterator = cmds.iterator(); + while (iterator.hasNext()) { + String s = iterator.next(); + CommandAbstraction ca = buildCommand(s); + if(ca != null) { + cmdAbs.add(ca); + } else { + iterator.remove(); + } + } - public CommandAbstraction getCommandByName(String name) throws Exception { - for (int count = 0; count < commands.size(); count++) { - String cmdName = commands.get(count); - if (!cmdName.equals(name)) - continue; + Collections.sort(cmds); + commandNames = new String[cmds.size()]; + cmds.toArray(commandNames); + commands = new CommandAbstraction[cmdAbs.size()]; + cmdAbs.toArray(commands); + } - String fullCmdName = packageName + "." + cmdName; - return Tuils.getCommandInstance(fullCmdName); + public CommandAbstraction getCommandByName(String name) { + for(CommandAbstraction c : commands) { + if(c.getClass().getName().endsWith(Tuils.DOT.concat(name))) { + return c; + } } return null; } - public List<String> getCommands() { + private CommandAbstraction buildCommand(String name) { + String fullCmdName = packageName + Tuils.DOT + name; + try { + Class<CommandAbstraction> clazz = (Class<CommandAbstraction>) Class.forName(fullCmdName); + if(CommandAbstraction.class.isAssignableFrom(clazz)) { + Constructor<CommandAbstraction> constructor = clazz.getConstructor(); + return constructor.newInstance(); + } + return null; + } catch (Exception e) { + return null; + } + } + + public CommandAbstraction[] getCommands() { return commands; } + public String[] getCommandNames() { + return commandNames; + } + }