From af05ddc2ad57fa38e71d45a6c32f2e048136c5ac Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi <andreuzzi.francesco@gmail.com> Date: Sat, 17 Jun 2017 23:02:15 +0200 Subject: [PATCH] 5.3e --- app/build.gradle | 4 +- .../consolelauncher/LauncherActivity.java | 12 +- .../andre/consolelauncher/MainManager.java | 25 +-- .../ohi/andre/consolelauncher/UIManager.java | 162 +++++++++--------- .../consolelauncher/commands/Command.java | 7 +- .../commands/CommandTuils.java | 31 +--- .../commands/main/raw/alias.java | 119 +++++++++++-- .../commands/main/raw/apps.java | 14 ++ .../commands/main/raw/config.java | 13 +- .../commands/main/raw/hideapp.java | 71 -------- .../commands/main/raw/notifications.java | 49 +++++- .../commands/main/raw/unhideapp.java | 70 -------- .../commands/specific/ParamCommand.java | 9 +- .../commands/tuixt/TuixtActivity.java | 16 ++ .../managers/AliasManager.java | 26 ++- .../consolelauncher/managers/AppsManager.java | 8 +- .../managers/TerminalMAnager.java | 46 ++--- .../managers/XMLPrefsManager.java | 56 ++++-- .../notifications/NotificationManager.java | 147 ++++++++-------- .../notifications/NotificationService.java | 10 +- .../suggestions/SuggestionsManager.java | 30 ++-- .../consolelauncher/tuils/ShellUtils.java | 78 +++------ .../tuils/StoppableThread.java | 12 +- app/src/main/res/values/strings.xml | 27 +-- 24 files changed, 523 insertions(+), 519 deletions(-) delete mode 100644 app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/hideapp.java delete mode 100644 app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/unhideapp.java diff --git a/app/build.gradle b/app/build.gradle index 9803dca..0fdbfb1 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { minSdkVersion 8 targetSdkVersion 23 - versionCode 90 - versionName "5.3b" + versionCode 91 + versionName "5.3e" } buildTypes { diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java index 5dea24c..a41d2b7 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java @@ -117,7 +117,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public void onOutput(String output) { try { - ui.setOutput(output); + ui.setOutput(output, true); } catch (NullPointerException e) { e.printStackTrace(); } @@ -199,7 +199,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { } NotificationManager.create(); - boolean notifications = NotificationManager.get(boolean.class, NotificationManager.Options.enabled); + boolean notifications = XMLPrefsManager.get(boolean.class, NotificationManager.Options.enabled); if(notifications) { LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, new IntentFilter("Msg")); if(!Tuils.hasNotificationAccess(this)) { @@ -366,7 +366,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { MainPack info = main.getMainPack(); main.onCommand(info.lastCommand, null); } else { - ui.setOutput(getString(R.string.output_nopermissions)); + ui.setOutput(getString(R.string.output_nopermissions), false); main.sendPermissionNotGrantedWarning(); } break; @@ -385,7 +385,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { break; case COMMAND_SUGGESTION_REQUEST_PERMISSION: if (grantResults.length == 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { - ui.setOutput(getString(R.string.output_nopermissions)); + ui.setOutput(getString(R.string.output_nopermissions), false); } break; } @@ -403,14 +403,12 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public void onReceive(Context context, Intent intent) { -// Log.e("andre", "received"); - String pack = intent.getStringExtra("package"); String title = intent.getStringExtra("title"); String text = intent.getStringExtra("text"); if(ui != null) { - ui.setOutput(pack + ": " + (title == null ? Tuils.EMPTYSTRING : title + (text == null ? Tuils.EMPTYSTRING : " --- ")) + (text == null ? Tuils.EMPTYSTRING : text), intent.getIntExtra("color", Color.RED)); + ui.setOutput(pack + ": " + (title == null ? Tuils.EMPTYSTRING : title + (text == null ? Tuils.EMPTYSTRING : " --- ")) + (text == null ? Tuils.EMPTYSTRING : text), intent.getIntExtra("color", Color.RED), false); } } }; diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java index 874bade..fc90af8 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java @@ -8,6 +8,8 @@ import android.os.Handler; import android.os.Looper; import android.util.Log; +import java.util.Arrays; + import ohi.andre.consolelauncher.commands.Command; import ohi.andre.consolelauncher.commands.CommandGroup; import ohi.andre.consolelauncher.commands.CommandTuils; @@ -98,6 +100,7 @@ public class MainManager { private Thread thread; private boolean busy = false; + private boolean ctrlced = false; private void busy() { busy = true; @@ -148,10 +151,12 @@ public class MainManager { // command manager public void onCommand(String input, String alias) { - if(busy) { if(input.equalsIgnoreCase("ctrlc")) { thread.interrupt(); + + ctrlced = true; + notBusy(); return; } @@ -239,15 +244,6 @@ public class MainManager { // this is the last trigger, it has to say "command not found" -// boolean su = false; -// if (CommandTuils.isSuCommand(input)) { -// su = true; -// input = input.substring(3); -// if (input.startsWith(ShellUtils.COMMAND_SU_ADD + Tuils.SPACE)) { -// input = input.substring(3); -// } -// } - final String cmd = input; final boolean useSU = false; @@ -262,13 +258,18 @@ public class MainManager { ShellUtils.CommandResult result = ShellUtils.execCommand(new String[] {cmd}, useSU, mainPack.currentDirectory.getAbsolutePath(), out); if(Thread.interrupted()) return; + if(ctrlced) { + ctrlced = false; + return; + } + if (result == null || result.result == COMMAND_NOTFOUND || result.result == -1) { out.onOutput(mContext.getString(R.string.output_commandnotfound)); } else { String output = result.toString(); if(output != null) { output = output.trim(); - if(output.length() == 0 ) { + if(output.length() == 0 && result.result > 0) { output = mainPack.res.getString(R.string.output_commandexitvalue) + Tuils.SPACE + result.result; } } @@ -336,7 +337,7 @@ public class MainManager { String output = command.exec(mContext.getResources(), info); if(Thread.interrupted()) return; - if(output != null) { + if(output != null && !ctrlced) { out.onOutput(output); } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java index 7484bc6..f2ac2c9 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java @@ -112,38 +112,38 @@ public class UIManager implements OnTouchListener { return; } - if(st == s.length() - 1 && b == 0 && c == 1 && s.subSequence(st, s.length()).toString().equals(Tuils.SPACE)) { - nOfSpace++; - originalText = s.toString(); - } else { - nOfSpace = -1; - originalText = null; - navigatingWithSpace = false; - } - - if(nOfSpace == suggestionsView.getChildCount() + 1) { - nOfSpace = -2; - navigatingWithSpace = false; - } - - if(nOfSpace >= 0) { - if(nOfSpace == 1 && suggestionsView.getChildCount() == 1) { - nOfSpace = -1; - originalText = null; - navigatingWithSpace = false; - } else { - for(int count = 0; count < suggestionsView.getChildCount(); count++) { - SuggestionsManager.Suggestion suggestion = (SuggestionsManager.Suggestion) suggestionsView.getChildAt(count).getTag(R.id.suggestion_id); - if(originalText.trim().endsWith(suggestion.text)) { - nOfSpace = -1; - originalText = null; - navigatingWithSpace = false; - break; - } - if(count == suggestionsView.getChildCount() - 1) return; - } - } - } +// if(st == s.length() - 1 && b == 0 && c == 1 && s.subSequence(st, s.length()).toString().equals(Tuils.SPACE) && !navigatingWithSpace) { +// nOfSpace++; +// originalText = s.toString(); +// } else if(!navigatingWithSpace) { +// nOfSpace = -1; +// originalText = null; +// navigatingWithSpace = false; +// } +// +// if(nOfSpace == suggestionsView.getChildCount() + 1) { +// nOfSpace = -2; +// navigatingWithSpace = false; +// } +// +// if(nOfSpace >= 0) { +// if(nOfSpace == 1 && suggestionsView.getChildCount() == 1) { +// nOfSpace = -1; +// originalText = null; +// navigatingWithSpace = false; +// } else { +// for(int count = 0; count < suggestionsView.getChildCount(); count++) { +// SuggestionsManager.Suggestion suggestion = (SuggestionsManager.Suggestion) suggestionsView.getChildAt(count).getTag(R.id.suggestion_id); +// if(originalText.trim().endsWith(suggestion.text)) { +// nOfSpace = -1; +// originalText = null; +// navigatingWithSpace = false; +// break; +// } +// if(count == suggestionsView.getChildCount() - 1) return; +// } +// } +// } String text = s.toString(); int lastSpace = text.lastIndexOf(Tuils.SPACE); @@ -156,53 +156,53 @@ public class UIManager implements OnTouchListener { @Override public void afterTextChanged(Editable s) { - if(nOfSpace == -2) { - s.replace(0,s.length(),originalText); - originalText = null; - return; - } - - if(nOfSpace > 0 && s.length() > 0 && call) { - - if(nOfSpace == 1) { - call = false; - s.replace(s.length() - 1, s.length(), Tuils.EMPTYSTRING); - call = true; - } - - navigatingWithSpace = true; - - call = false; - s.replace(s.length() - 1, s.length(), Tuils.EMPTYSTRING); - call = true; - -// int count = suggestionsView.getChildCount(); - int index = nOfSpace - 1; -// if(nOfSpace <= count) { -// index = nOfSpace - 1; +// if(nOfSpace == -2) { +// s.replace(0,s.length(),originalText); +// originalText = null; +// return; +// } +// +// if(nOfSpace > 0 && s.length() > 0 && call) { +// if(nOfSpace == 1) { +// call = false; +// s.replace(s.length() - 1, s.length(), Tuils.EMPTYSTRING); +// call = true; // } -// else { -// index = nOfSpace % (count + 1) - 1; +// +// navigatingWithSpace = true; +// +// call = false; +// s.replace(s.length() - 1, s.length(), Tuils.EMPTYSTRING); +// call = true; +// +//// int count = suggestionsView.getChildCount(); +// int index = nOfSpace - 1; +//// if(nOfSpace <= count) { +//// index = nOfSpace - 1; +//// } +//// else { +//// index = nOfSpace % (count + 1) - 1; +//// } +// +// call = false; +// if(index != -1) { +// View view = suggestionsView.getChildAt(index); +// SuggestionsManager.Suggestion suggestion = (SuggestionsManager.Suggestion) view.getTag(R.id.suggestion_id); +// +// String text = suggestion.getText() + Tuils.SPACE; +// +// if(originalText.length() < s.length() && suggestion.type == SuggestionsManager.Suggestion.TYPE_PERMANENT) { +// s.replace(originalText.length(), s.length(), text); +// } else { +// s.replace(0, s.length(), text); +// } +// } else { +// Log.e("andre", "4"); +// s.replace(0, s.length(), originalText); +// navigatingWithSpace = false; // } - - call = false; - if(index != -1) { - View view = suggestionsView.getChildAt(index); - SuggestionsManager.Suggestion suggestion = (SuggestionsManager.Suggestion) view.getTag(R.id.suggestion_id); - - String text = suggestion.getText() + Tuils.SPACE; - - if(originalText.length() < s.length() && suggestion.type == SuggestionsManager.Suggestion.TYPE_PERMANENT) { - s.replace(originalText.length(), s.length(), text); - } else { - s.replace(0, s.length(), text); - } - } else { - s.replace(0, s.length(), originalText); - navigatingWithSpace = false; - } - call = true; - } +// call = true; +// } } }; @@ -518,12 +518,12 @@ public class UIManager implements OnTouchListener { mTerminalAdapter.setDefaultHint(); } - public void setOutput(String string) { - mTerminalAdapter.setOutput(string); + public void setOutput(String string, boolean fromUser) { + mTerminalAdapter.setOutput(string, fromUser); } - public void setOutput(String s, int color) { - mTerminalAdapter.setOutput(s, color); + public void setOutput(String s, int color, boolean fromUser) { + mTerminalAdapter.setOutput(s, color, fromUser); } public void disableSuggestions() { diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java index ab5acc6..881f48c 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java @@ -1,6 +1,7 @@ package ohi.andre.consolelauncher.commands; import android.content.res.Resources; +import android.util.Log; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.specific.ParamCommand; @@ -17,6 +18,9 @@ public class Command { public String exec(Resources resources, ExecutePack info) throws Exception { info.set(mArgs); + if(cmd instanceof ParamCommand && mArgs != null && (mArgs.length == 0 || ((ParamCommand) cmd).argsForParam((String) mArgs[0]) == null)) { + return info.context.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0]; + } if (indexNotFound != -1) { return cmd.onArgNotFound(info, indexNotFound); } @@ -25,9 +29,6 @@ public class Command { ((ParamCommand) cmd).argsForParam((String) mArgs[0]).length + 1 > nArgs)) { return cmd.onNotArgEnough(info, nArgs); } - if(cmd instanceof ParamCommand && ((ParamCommand) cmd).argsForParam((String) mArgs[0]) == null) { - return info.context.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0]; - } if (cmd.maxArgs() != CommandAbstraction.UNDEFINIED && nArgs > cmd.maxArgs()) { return resources.getString(R.string.output_toomanyargs); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java index 18a2fbd..fc9b31f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java @@ -2,7 +2,6 @@ package ohi.andre.consolelauncher.commands; import android.annotation.SuppressLint; import android.graphics.Color; -import android.util.Log; import java.io.File; import java.util.ArrayList; @@ -217,32 +216,10 @@ public class CommandTuils { return null; } - List<String> strings = new ArrayList<>(); - - char[] chars = input.toCharArray(); - String arg = ""; - int index; - - for (index = 0; index < chars.length; index++) { - char c = chars[index]; - if (c == ' ') { - if (arg.length() > 0) { - strings.add(arg); - arg = ""; - continue; - } else { -// prevent double space - continue; - } - } - - arg = arg.concat(c + Tuils.EMPTYSTRING); - } - - if (arg.length() > 0) - strings.add(arg); + String[] strings = input.split(Tuils.SPACE + "+"); + List<String> arg = new ArrayList<>(Arrays.asList(strings)); - return new ArgInfo(strings, input.substring(index), true, strings.size()); + return new ArgInfo(arg, null, true, arg.size()); } private static ArgInfo command(String string, CommandGroup active) { @@ -267,7 +244,7 @@ public class CommandTuils { while (count-- >= 0) strings.remove(0); - String residual = Tuils.toPlanString(strings, " "); + String residual = Tuils.toPlanString(strings, Tuils.SPACE); return new ArgInfo(info.file, residual, true, 1); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java index db4e64e..86eb97a 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java @@ -1,22 +1,116 @@ package ohi.andre.consolelauncher.commands.main.raw; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; import ohi.andre.consolelauncher.commands.main.MainPack; +import ohi.andre.consolelauncher.commands.specific.ParamCommand; +import ohi.andre.consolelauncher.managers.AliasManager; +import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.tuils.Tuils; /** * Created by andre on 15/11/15. */ -public class alias implements CommandAbstraction { +public class alias extends ParamCommand { + + private enum Param implements ohi.andre.consolelauncher.commands.main.Param { + + add { + @Override + public String exec(ExecutePack pack) { + ArrayList<String> args = pack.get(ArrayList.class, 1); + if(args.size() < 2) return pack.context.getString(R.string.output_lessarg); + return ((MainPack) pack).aliasManager.add(args.remove(0), Tuils.toPlanString(args, Tuils.SPACE)); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.TEXTLIST}; + } + }, + remove { + @Override + public String exec(ExecutePack pack) { + ArrayList<String> args = pack.get(ArrayList.class, 1); + if(args.size() < 1) return pack.context.getString(R.string.output_lessarg); + if(((MainPack) pack).aliasManager.remove(args.get(0))) return null; + else return pack.context.getString(R.string.output_aliasnotfound) + Tuils.SPACE + args.get(0); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.TEXTLIST}; + } + }, + file { + @Override + public String exec(ExecutePack pack) { + pack.context.startActivity(Tuils.openFile(new File(Tuils.getFolder(), AliasManager.PATH))); + return null; + } + + @Override + public int[] args() { + return new int[0]; + } + }, + ls { + @Override + public String exec(ExecutePack pack) { + return ((MainPack) pack).aliasManager.printAliases(); + } + + @Override + public int[] args() { + return new int[0]; + } + }; + + static Param get(String p) { + p = p.toLowerCase(); + Param[] ps = values(); + for (Param p1 : ps) + if (p.endsWith(p1.label())) + return p1; + return null; + } + + static String[] labels() { + Param[] ps = values(); + String[] ss = new String[ps.length]; + + for (int count = 0; count < ps.length; count++) { + ss[count] = ps[count].label(); + } + + return ss; + } + + @Override + public String label() { + return Tuils.MINUS + name(); + } + } + + + @Override + public String[] params() { + return Param.labels(); + } + + @Override + protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + return Param.get(param); + } @Override - public String exec(ExecutePack pack) { - MainPack info = (MainPack) pack; - if (info.aliasManager.getNum() > 0) - return info.aliasManager.printAliases(); - else - return info.res.getString(helpRes()); + protected String doThings(ExecutePack pack) { + return null; } @Override @@ -26,17 +120,12 @@ public class alias implements CommandAbstraction { @Override public int minArgs() { - return 0; + return 1; } @Override public int maxArgs() { - return 0; - } - - @Override - public int[] argType() { - return new int[0]; + return CommandAbstraction.UNDEFINIED; } @Override @@ -46,7 +135,7 @@ public class alias implements CommandAbstraction { @Override public String onNotArgEnough(ExecutePack info, int nArgs) { - return null; + return ((MainPack) info).aliasManager.printAliases(); } @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java index 91e62f6..e35ceba 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java @@ -4,6 +4,8 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; +import java.io.File; + import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; @@ -87,6 +89,18 @@ public class apps extends ParamCommand { Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(String.class, 1)); pack.context.startActivity(intent); + return null; + } + }, + file { + @Override + public int[] args() { + return new int[0]; + } + + @Override + public String exec(ExecutePack pack) { + pack.context.startActivity(Tuils.openFile(new File(Tuils.getFolder(), AppsManager.PATH))); return null; } }; diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java index 7250689..412930f 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java @@ -1,11 +1,13 @@ package ohi.andre.consolelauncher.commands.main.raw; +import android.util.Log; + import java.io.File; +import java.util.Arrays; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; -import ohi.andre.consolelauncher.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -39,8 +41,8 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - File file = pack.get(File.class, 1); - Tuils.openFile(file); + File file = new File(Tuils.getFolder(), pack.get(String.class, 1)); + pack.context.startActivity(Tuils.openFile(file)); return null; } }; @@ -48,9 +50,7 @@ public class config extends ParamCommand { static Param get(String p) { p = p.toLowerCase(); Param[] ps = values(); - for (Param p1 : ps) - if (p.endsWith(p1.label())) - return p1; + for (Param p1 : ps) if (p.endsWith(p1.label())) return p1; return null; } @@ -108,7 +108,6 @@ public class config extends ParamCommand { @Override public String onArgNotFound(ExecutePack pack, int indexNotFound) { - if(indexNotFound == 0) return pack.context.getString(R.string.output_invalid_param); return pack.context.getString(R.string.output_invalidarg); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/hideapp.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/hideapp.java deleted file mode 100644 index b599a14..0000000 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/hideapp.java +++ /dev/null @@ -1,71 +0,0 @@ -package ohi.andre.consolelauncher.commands.main.raw; - -import android.app.Activity; -import android.content.SharedPreferences; - -import ohi.andre.consolelauncher.R; -import ohi.andre.consolelauncher.commands.CommandAbstraction; -import ohi.andre.consolelauncher.commands.ExecutePack; -import ohi.andre.consolelauncher.commands.main.MainPack; -import ohi.andre.consolelauncher.tuils.Tuils; - -/** - * Created by francescoandreuzzi on 04/03/2017. - */ - -public class hideapp implements CommandAbstraction { - - @Override - public String exec(ExecutePack pack) throws Exception { - String app = pack.get(String.class, 0); - hideApp((MainPack) pack, app); - return null; - } - - @Override - public int minArgs() { - return 1; - } - - @Override - public int maxArgs() { - return 1; - } - - @Override - public int[] argType() { - return new int[] {CommandAbstraction.VISIBLE_PACKAGE}; - } - - @Override - public int priority() { - return 2; - } - - @Override - public int helpRes() { - return R.string.help_appshide; - } - - @Override - public String onArgNotFound(ExecutePack pack, int index) { - MainPack info = (MainPack) pack; - return info.res.getString(R.string.output_appnotfound); - } - - @Override - public String onNotArgEnough(ExecutePack pack, int nArgs) { - MainPack info = (MainPack) pack; - return info.res.getString(helpRes()); - } - - private String hideApp(MainPack info, String app) { - SharedPreferences.Editor editor = ((Activity) info.context).getPreferences(0).edit(); - String result = info.appsManager.hideApp(app); - if (result != null) { - editor.commit(); - return result + Tuils.SPACE + info.res.getString(R.string.output_hideapp); - } else - return info.res.getString(R.string.output_appnotfound); - } -} diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java index 6aa0cbf..1fa59c3 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java @@ -1,6 +1,9 @@ package ohi.andre.consolelauncher.commands.main.raw; +import java.io.File; + import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.commands.Command; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; import ohi.andre.consolelauncher.commands.main.MainPack; @@ -15,10 +18,6 @@ import ohi.andre.consolelauncher.tuils.Tuils; public class notifications extends ParamCommand { - private final String INCLUDE_PARAM = "-inc"; - private final String EXCLUDE_PARAM = "-exc"; - private final String COLOR_PARAM = "-clr"; - private enum Param implements ohi.andre.consolelauncher.commands.main.Param { inc { @@ -33,7 +32,7 @@ public class notifications extends ParamCommand { return new int[] {CommandAbstraction.VISIBLE_PACKAGE}; } }, - exc{ + exc { @Override public String exec(ExecutePack pack) { NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 1), -1, false)); @@ -45,7 +44,7 @@ public class notifications extends ParamCommand { return new int[] {CommandAbstraction.VISIBLE_PACKAGE}; } }, - clr{ + clr { @Override public String exec(ExecutePack pack) { if(pack.args.length < 3) return ((MainPack) pack).context.getString(R.string.help_notifications); @@ -59,6 +58,42 @@ public class notifications extends ParamCommand { public int[] args() { return new int[] {CommandAbstraction.COLOR, CommandAbstraction.VISIBLE_PACKAGE}; } + }, + title_regex { + @Override + public String exec(ExecutePack pack) { + NotificationManager.excludeRegex(pack.get(String.class, 1), "title"); + return null; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.PLAIN_TEXT}; + } + }, + text_regex { + @Override + public String exec(ExecutePack pack) { + NotificationManager.excludeRegex(pack.get(String.class, 1), "text"); + return null; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.PLAIN_TEXT}; + } + }, + file { + @Override + public int[] args() { + return new int[0]; + } + + @Override + public String exec(ExecutePack pack) { + pack.context.startActivity(Tuils.openFile(new File(Tuils.getFolder(), NotificationManager.PATH))); + return null; + } }; static Param get(String p) { @@ -104,7 +139,7 @@ public class notifications extends ParamCommand { @Override public int minArgs() { - return 2; + return 0; } @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/unhideapp.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/unhideapp.java deleted file mode 100644 index b82ec5a..0000000 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/unhideapp.java +++ /dev/null @@ -1,70 +0,0 @@ -package ohi.andre.consolelauncher.commands.main.raw; - -import android.app.Activity; -import android.content.SharedPreferences; - -import ohi.andre.consolelauncher.R; -import ohi.andre.consolelauncher.commands.CommandAbstraction; -import ohi.andre.consolelauncher.commands.ExecutePack; -import ohi.andre.consolelauncher.commands.main.MainPack; -import ohi.andre.consolelauncher.tuils.Tuils; - -/** - * Created by francescoandreuzzi on 04/03/2017. - */ - -public class unhideapp implements CommandAbstraction { - @Override - public String exec(ExecutePack pack) throws Exception { - String app = pack.get(String.class, 0); - unHideApp((MainPack) pack, app); - return null; - } - - @Override - public int minArgs() { - return 1; - } - - @Override - public int maxArgs() { - return 1; - } - - @Override - public int[] argType() { - return new int[] {CommandAbstraction.HIDDEN_PACKAGE}; - } - - @Override - public int priority() { - return 2; - } - - @Override - public int helpRes() { - return R.string.help_appsunhide; - } - - @Override - public String onArgNotFound(ExecutePack pack, int index) { - MainPack info = (MainPack) pack; - return info.res.getString(R.string.output_appnotfound); - } - - @Override - public String onNotArgEnough(ExecutePack pack, int nArgs) { - MainPack info = (MainPack) pack; - return info.res.getString(helpRes()); - } - - private String unHideApp(MainPack info, String app) { - SharedPreferences.Editor editor = ((Activity) info.context).getPreferences(0).edit(); - String result = info.appsManager.unhideApp(app); - if (result != null) { - editor.commit(); - return result + Tuils.SPACE + info.res.getString(R.string.output_unhideapp); - } else - return info.res.getString(R.string.output_appnotfound); - } -} diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java index 833ee60..328c89c 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java @@ -6,6 +6,7 @@ import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; import ohi.andre.consolelauncher.commands.main.Param; +import ohi.andre.consolelauncher.tuils.Tuils; /** * Created by francescoandreuzzi on 01/05/2017. @@ -23,11 +24,11 @@ public abstract class ParamCommand implements CommandAbstraction { String o = doThings(pack); if(o != null) return o; - try { - return paramForString(pack.get(String.class, 0)).exec(pack); - } catch (NullPointerException e) { - return pack.context.getString(R.string.output_invalid_param); + Param param = paramForString(pack.get(String.class, 0)); + if(param == null) { + return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + pack.get(String.class, 0); } + return param.exec(pack); } public final int[] argsForParam(String param) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java index dc125a2..876722f 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java @@ -10,6 +10,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.text.InputType; import android.text.method.ScrollingMovementMethod; +import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -61,6 +62,8 @@ public class TuixtActivity extends Activity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.e("andre", "0"); + final Typeface lucidaConsole = Typeface.createFromAsset(getAssets(), "lucida_console.ttf"); final LinearLayout rootView = new LinearLayout(this); @@ -73,6 +76,7 @@ public class TuixtActivity extends Activity { path = file.getAbsolutePath(); } + Log.e("andre", "1"); final File file = new File(path); CommandGroup group = new CommandGroup(this, "ohi.andre.consolelauncher.commands.tuixt.raw"); @@ -87,6 +91,8 @@ public class TuixtActivity extends Activity { } } + Log.e("andre", "2"); + if (!skinManager.useSystemWp) { rootView.setBackgroundColor(skinManager.bgColor); } else { @@ -106,6 +112,8 @@ public class TuixtActivity extends Activity { TextView prefixView = (TextView) inputOutputView.findViewById(R.id.prefix_view); + Log.e("andre", "3"); + ImageButton submitView = (ImageButton) inputOutputView.findViewById(R.id.submit_tv); boolean showSubmit = skinManager.showSubmit; if (!showSubmit) { @@ -124,6 +132,7 @@ public class TuixtActivity extends Activity { prefixView.setTextSize(skinManager.getTextSize()); prefixView.setText(prefix); + Log.e("andre", "4"); if (submitView != null) { submitView.setColorFilter(skinManager.inputColor); @@ -150,6 +159,8 @@ public class TuixtActivity extends Activity { } }); + Log.e("andre", "5"); + outputView.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); outputView.setTextSize(skinManager.getTextSize()); outputView.setTextColor(skinManager.outputColor); @@ -187,6 +198,8 @@ public class TuixtActivity extends Activity { setContentView(rootView); + Log.e("andre", "6"); + // // // end setup part, now start @@ -220,6 +233,7 @@ public class TuixtActivity extends Activity { } }); } catch (Exception e) { + Log.e("andre", "", e); intent.putExtra(ERROR_KEY, e.toString()); setResult(1, intent); finish(); @@ -237,6 +251,8 @@ public class TuixtActivity extends Activity { inputView.setText("help"); inputView.setSelection(inputView.getText().length()); } + + Log.e("andre", "7"); } @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java index 9dbb311..6fe05f5 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java @@ -6,6 +6,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; +import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; @@ -16,11 +17,12 @@ import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.Reloadable; import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile; +import static ohi.andre.consolelauncher.managers.XMLPrefsManager.set; public class AliasManager implements Reloadable { - private final String NAME = "ALIAS"; - private final String PATH = "alias.xml"; + public static final String NAME = "ALIAS"; + public static final String PATH = "alias.xml"; private final String VALUE_ATTRIBUTE = "value"; @@ -41,10 +43,6 @@ public class AliasManager implements Reloadable { return output.trim(); } - public int getNum() { - return alias.size(); - } - public String getAlias(String s) { XMLPrefsManager.XMLPrefsEntry entry = alias.get(s); if(entry != null) return entry.value; @@ -98,4 +96,20 @@ public class AliasManager implements Reloadable { alias.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); } } + + public String add(String name, String value) { + return set(new File(Tuils.getFolder(), PATH), NAME, name, new String[] {VALUE_ATTRIBUTE}, new String[] {value}); + } + + public boolean remove(String name) { + return XMLPrefsManager.removeNode(new File(Tuils.getFolder(), PATH), NAME, name); + } + + public List<String> getAliases() { + List<String> labels = new ArrayList<>(); + if(alias == null) return labels; + + for(int count = 0; count < alias.size(); count++) labels.add(alias.at(count).key); + return labels; + } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java index c3bbd95..2fa92cb 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java @@ -66,6 +66,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private SharedPreferences preferences; private SharedPreferences.Editor editor; + private static XMLPrefsManager.XmlPrefsElement instance = null; + public enum Options implements XMLPrefsManager.XMLPrefsSave { default_app_n1 { @@ -108,8 +110,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } @Override - public XMLPrefsManager.XMLPrefsRoot parent() { - return null; + public XMLPrefsManager.XmlPrefsElement parent() { + return instance; } @Override @@ -141,6 +143,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { }; public AppsManager(Context context, Outputable outputable) { + instance = this; + this.context = context; this.outputable = outputable; diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java index 0778589..15406c9 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java @@ -242,52 +242,30 @@ public class TerminalManager { return true; } - public void setOutput(String output) { - if (output == null) { - return; - } - - output = output.trim(); - if(output.equals(Tuils.EMPTYSTRING)) { - return; - } - - if(output.equals(clear.CLEAR)) { - clear(); - return; - } - - writeToView(output, OUTPUT); + public void setOutput(String output, boolean fromUser) { + setOutput(output, -1, OUTPUT, fromUser); + } - for(Messager messager : messagers) { - if(cmds != 0 && cmds % messager.n == 0) { - writeToView(messager.message, OUTPUT); - } - } + public void setOutput(String output, int color, boolean fromUser) { + setOutput(output, color, -1, fromUser); } - public void setOutput(String output, int color) { - if (output == null) { - return; - } + public void setOutput(String output, int color, int type, boolean fromUser) { + if (output == null) return; output = output.trim(); - if(output.equals(Tuils.EMPTYSTRING)) { - return; - } + if(output.equals(Tuils.EMPTYSTRING)) return; if(output.equals(clear.CLEAR)) { clear(); return; } - writeToView(color, output); + if(color == -1) writeToView(output, type); + else writeToView(color, output); - for(Messager messager : messagers) { - if(cmds != 0 && cmds % messager.n == 0) { - writeToView(messager.message, OUTPUT); - } - } + if(fromUser) + for (Messager messager : messagers) if (cmds != 0 && cmds % messager.n == 0) writeToView(messager.message, OUTPUT); } public void onBackPressed() { diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java index ed5f731..1c38561 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java @@ -395,7 +395,7 @@ public class XMLPrefsManager { show_alias_content { @Override public String defaultValue() { - return "true"; + return "false"; } }, show_launch_history { @@ -465,8 +465,6 @@ public class XMLPrefsManager { public List<XMLPrefsSave> copy; XMLPrefsRoot(String path, XMLPrefsSave[] en) { - Log.e("andre", Arrays.toString(en)); - this.path = path; this.values = new XMLPrefsList(); @@ -520,10 +518,16 @@ public class XMLPrefsManager { } public XMLPrefsEntry get(Object o) { + if(o instanceof Integer) return at((Integer) o); + for(XMLPrefsEntry e : list) if(e.equals(o)) return e; return null; } + public XMLPrefsEntry at(int index) { + return list.get(index); + } + public int size() { return list.size(); } @@ -655,14 +659,14 @@ public class XMLPrefsManager { } catch (Exception e) {} } - public static void set(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) { + public static String set(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) { String[][] values = new String[1][attributeValues.length]; values[0] = attributeValues; - setMany(file, rootName, new String[] {elementName}, attributeNames, values); + return setMany(file, rootName, new String[] {elementName}, attributeNames, values); } - public static void setMany(File file, String rootName, String elementNames[], String[] attributeNames, String[][] attributeValues) { + public static String setMany(File file, String rootName, String elementNames[], String[] attributeNames, String[][] attributeValues) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -671,7 +675,7 @@ public class XMLPrefsManager { try { d = builder.parse(file); } catch (Exception e) { - return; + return e.toString(); } Element root = (Element) d.getElementsByTagName(rootName).item(0); @@ -687,7 +691,7 @@ public class XMLPrefsManager { for(int c = 0; c < attributeNames.length; c++) e.setAttribute(attributeNames[c], attributeValues[index][c]); writeTo(d, file); - return; + return null; } } @@ -699,10 +703,42 @@ public class XMLPrefsManager { } writeTo(d, file); + } catch (Exception e) { + return e.toString(); + } + return null; + } + + public static boolean removeNode(File file, String rootName, String nodeName) { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + + Document d; + try { + d = builder.parse(file); + } catch (Exception e) { + return false; + } + + Element root = (Element) d.getElementsByTagName(rootName).item(0); + NodeList nodes = root.getElementsByTagName("*"); + + for(int count = 0; count < nodes.getLength(); count++) { + Node node = nodes.item(count); + + if(node.getNodeName().equalsIgnoreCase(nodeName)) { + root.removeChild(node); + writeTo(d, file); + return true; + } + } } catch (Exception e) {} + + return false; } - public static String[] getAttrValues(File file, String rootName, String elementName, String[] attrNames) { + public static String[] getAttrValues(File file, String rootName, String nodeName, String[] attrNames) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -720,7 +756,7 @@ public class XMLPrefsManager { for(int count = 0; count < nodes.getLength(); count++) { Node node = nodes.item(count); - if(node.getNodeName().equals(elementName)) { + if(node.getNodeName().equals(nodeName)) { Element e = (Element) node; String[] values = new String[attrNames.length]; diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java index 3e14721..ff9293d 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java @@ -3,6 +3,7 @@ package ohi.andre.consolelauncher.managers.notifications; import android.annotation.TargetApi; import android.graphics.Color; import android.os.Build; +import android.util.Log; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -17,6 +18,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -41,10 +44,17 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { private static final String COLOR_ATTRIBUTE = "color"; private static final String ENABLED_ATTRIBUTE = "enabled"; + private static final String ON_ATTRIBUTE = "on"; + + private static final String REGEX_NODE = "regex"; public static final String PATH = "notifications.xml"; private static final String NAME = "NOTIFICATIONS"; + private static XMLPrefsManager.XmlPrefsElement instance = null; + + public static boolean default_app_state; + public enum Options implements XMLPrefsManager.XMLPrefsSave { enabled { @@ -53,6 +63,12 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { return "true"; } }, + default_app_state { + @Override + public String defaultValue() { + return "true"; + } + }, default_color { @Override public String defaultValue() { @@ -61,8 +77,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { }; @Override - public XMLPrefsManager.XMLPrefsRoot parent() { - return null; + public XMLPrefsManager.XmlPrefsElement parent() { + return instance; } @Override @@ -86,27 +102,32 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { set(new File(Tuils.getFolder(), PATH), NAME, save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value}); } - private static File folder; private static XMLPrefsManager.XMLPrefsList values; - private static Map<String, Integer> colors; + private static List<NotificatedApp> apps; + private static List<Pattern> titleRegexs; + private static List<Pattern> textRegexs; private static boolean created = false; private NotificationManager() {} public static void create() { + instance = new NotificationManager(); + + default_app_state = XMLPrefsManager.get(boolean.class, Options.default_app_state); + if(created) return; created = true; - folder = Tuils.getFolder(); - - colors = new HashMap<>(); + apps = new ArrayList<>(); + textRegexs = new ArrayList<>(); + titleRegexs = new ArrayList<>(); values = new XMLPrefsManager.XMLPrefsList(); try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); - File file = new File(folder, PATH); + File file = new File(Tuils.getFolder(), PATH); if(!file.exists() && !file.createNewFile()) return; Document d; @@ -141,19 +162,33 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { break; } } + } else if(nn.equals(REGEX_NODE)) { + if(node.getNodeType() == Node.ELEMENT_NODE) { + Element e = (Element) node; + String regex = e.hasAttribute(REGEX_NODE) ? e.getAttribute(REGEX_NODE) : null; + if(regex == null) continue; + String on = e.hasAttribute(ON_ATTRIBUTE) ? e.getAttribute(ON_ATTRIBUTE) : null; + if(on == null || on.equals("text") || !on.equals("title")) textRegexs.add(Pattern.compile(regex)); + else titleRegexs.add(Pattern.compile(regex)); + } } else { if(node.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) node; + NotificatedApp app; + boolean enabled = !e.hasAttribute(ENABLED_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(ENABLED_ATTRIBUTE)); - if(enabled) { - int color = e.hasAttribute(COLOR_ATTRIBUTE) ? Color.parseColor(e.getAttribute(COLOR_ATTRIBUTE)) : getColor(Options.default_color); - colors.put(nn, color); - } + + int color = -1; + if(enabled) + color = e.hasAttribute(COLOR_ATTRIBUTE) ? Color.parseColor(e.getAttribute(COLOR_ATTRIBUTE)) : XMLPrefsManager.getColor(Options.default_color); + app = new NotificatedApp(nn, color, enabled); + apps.add(app); } } } + if(enums.size() == 0) return; for(XMLPrefsManager.XMLPrefsSave s : enums) { @@ -172,6 +207,18 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { notificationsChangeFor(new ArrayList<>(Collections.singletonList(app))); } + public static boolean textMatches(String text) { + if(text == null || text.length() == 0) return false; + for(Pattern p : textRegexs) if (p.matcher(text).matches()) return true; + return false; + } + + public static boolean titleMatches(String text) { + if(text == null || text.length() == 0) return false; + for(Pattern p : titleRegexs) if (p.matcher(text).matches()) return true; + return false; + } + public static void notificationsChangeFor(List<NotificatedApp> apps) { String[] names = new String[apps.size()]; final String[] attrNames = {ENABLED_ATTRIBUTE, COLOR_ATTRIBUTE}; @@ -184,78 +231,21 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { values[count][1] = app.color + Tuils.EMPTYSTRING; } - setMany(new File(folder, PATH), NAME, names, attrNames, values); + setMany(new File(Tuils.getFolder(), PATH), NAME, names, attrNames, values); } - public static NotificatedApp getAppState(String pkg) { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - - File file = new File(folder, PATH); - - Document d; - try { - d = builder.parse(file); - } catch (Exception e) { - FileOutputStream stream = new FileOutputStream(file); - stream.write(XML_DEFAULT.getBytes()); - stream.flush(); - stream.close(); - - d = builder.parse(file); - } - - Element root = (Element) d.getElementsByTagName(NAME).item(0); - NodeList nodes = root.getElementsByTagName("*"); - - for (int count = 0; count < nodes.getLength(); count++) { - Node node = nodes.item(count); - - if(!pkg.equals(node.getNodeName())) continue; - - Element e = (Element) node; - boolean enabled = !e.hasAttribute(ENABLED_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(ENABLED_ATTRIBUTE)); - int color = e.hasAttribute(COLOR_ATTRIBUTE) ? Color.parseColor(e.getAttribute(COLOR_ATTRIBUTE)) : getColor(Options.default_color); - - return new NotificatedApp(pkg, color, enabled); - } - } catch (Exception e) { - return null; - } - -// default!!! - return new NotificatedApp(pkg, getColor(Options.default_color), true); - } - - public static <T> T get(Class<T> c, XMLPrefsManager.XMLPrefsSave prefsSave) { - if(prefsSave != null) { - try { - return (T) transform(values.get(prefsSave).value, c); - } catch (Exception e) { - return (T) transform(prefsSave.defaultValue(), c); - } - } - return null; + public static void excludeRegex(String regex, String on) { + XMLPrefsManager.set(new File(Tuils.getFolder(), PATH), NAME, REGEX_NODE, new String[] {ON_ATTRIBUTE, VALUE_ATTRIBUTE}, new String[] {on, regex}); } - public static int getColor(XMLPrefsManager.XMLPrefsSave prefsSave) { - if(prefsSave != null) { - try { - return (int) transform(values.get(prefsSave).value, Color.class); - } catch (Exception e) { - String def = prefsSave.defaultValue(); - if(def == null || def.length() == 0) { - return -1; - } - return (int) transform(def, Color.class); - } - } - return 0; + public static int apps() { + return apps.size(); } - public static int colorsLength() { - return colors.size(); + public static NotificatedApp getAppState(String pkg) { + int index = apps.indexOf(pkg); + if(index == -1) return null; + return apps.get(index); } public static class NotificatedApp { @@ -276,6 +266,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { @Override public boolean equals(Object obj) { if(obj instanceof NotificatedApp) return pkg.equals(((NotificatedApp) obj).pkg); + if(obj instanceof String) return pkg.equals(obj); return this == obj; } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java index 7a0bb59..c20a29e 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java @@ -48,7 +48,7 @@ public class NotificationService extends NotificationListenerService { NotificationManager.create(); - if(NotificationManager.colorsLength() == 0) { + if(NotificationManager.apps() == 0) { // some nice apps NotificationManager.notificationsChangeFor(new ArrayList<>(Arrays.asList( new NotificatedApp("com.whatsapp", Color.parseColor("#25D366"), true), @@ -94,8 +94,12 @@ public class NotificationService extends NotificationListenerService { } String pack = sbn.getPackageName(); + NotificatedApp nApp = NotificationManager.getAppState(pack); - if(nApp == null || !nApp.enabled) { + if( (nApp != null && !nApp.enabled)) { + return; + } + if(nApp == null && !NotificationManager.default_app_state) { return; } @@ -117,6 +121,8 @@ public class NotificationService extends NotificationListenerService { title = titleSequence.toString(); } + if(NotificationManager.textMatches(text) || NotificationManager.titleMatches(title)) return; + Intent msgrcv = new Intent("Msg"); msgrcv.putExtra("package", pack); msgrcv.putExtra("title", title); diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java index 6500560..e720d56 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java @@ -15,6 +15,7 @@ import ohi.andre.consolelauncher.commands.CommandTuils; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.commands.specific.PermanentSuggestionCommand; import ohi.andre.consolelauncher.commands.main.MainPack; +import ohi.andre.consolelauncher.managers.AliasManager; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.managers.ContactManager; import ohi.andre.consolelauncher.managers.FileManager; @@ -67,11 +68,13 @@ public class SuggestionsManager { float rate = 1f / shift; suggestionList.add(new Suggestion(before, apps[count], true, (int) Math.ceil(rate), Suggestion.TYPE_APP)); } - - return suggestionList.toArray(new Suggestion[suggestionList.size()]); } + + suggestAlias(info.aliasManager, suggestionList, lastWord); + + return suggestionList.toArray(new Suggestion[suggestionList.size()]); } -// lastword = 0 && before > 0 +// lastword == 0 && before > 0 else { // check if this is a command Command cmd = null; @@ -98,7 +101,7 @@ public class SuggestionsManager { // suggestArgs(info, cmd.cmd instanceof ParamCommand ? ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0])[cmd.nArgs - 1] : cmd.cmd.argType()[cmd.nArgs], suggestionList, lastWord, before); // } - if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) suggestParams(suggestionList, (ParamCommand) cmd.cmd, before); + if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) suggestParams(suggestionList, (ParamCommand) cmd.cmd, before, null); else suggestArgs(info, cmd.nextArg(), suggestionList, before); } else { @@ -129,7 +132,9 @@ public class SuggestionsManager { lastWord = before.substring(index) + lastWord; } - suggestArgs(info, cmd.nextArg(), suggestionList, lastWord, before); + if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) { + suggestParams(suggestionList, (ParamCommand) cmd.cmd, before, lastWord); + } else suggestArgs(info, cmd.nextArg(), suggestionList, lastWord, before); } else { // not a command // ==> app @@ -138,6 +143,7 @@ public class SuggestionsManager { } else { // lastword > 0 && before = 0 suggestCommand(info, suggestionList, lastWord); + suggestAlias(info.aliasManager, suggestionList, lastWord); suggestApp(info, suggestionList, lastWord, Tuils.EMPTYSTRING); } } @@ -154,16 +160,20 @@ public class SuggestionsManager { } } - private void suggestParams(List<Suggestion> suggestions, ParamCommand cmd, String before) { + private void suggestAlias(AliasManager aliasManager, List<Suggestion> suggestions, String lastWord) { + if(lastWord.length() == 0) for(String s : aliasManager.getAliases()) suggestions.add(new Suggestion(Tuils.EMPTYSTRING, s, true, NO_RATE, Suggestion.TYPE_ALIAS)); + else for(String s : aliasManager.getAliases()) if(s.startsWith(lastWord)) suggestions.add(new Suggestion(Tuils.EMPTYSTRING, s, true, NO_RATE, Suggestion.TYPE_ALIAS)); + } + + private void suggestParams(List<Suggestion> suggestions, ParamCommand cmd, String before, String lastWord) { String[] params = cmd.params(); if (params == null) { return; } boolean exec = false; - for (String s : cmd.params()) { - suggestions.add(new Suggestion(before, s, exec, NO_RATE, 0)); - } + if(lastWord == null || lastWord.length() == 0) for (String s : cmd.params()) suggestions.add(new Suggestion(before, s, exec, NO_RATE, 0)); + else for (String s : cmd.params()) if (s.startsWith(lastWord)) suggestions.add(new Suggestion(before, s, exec, NO_RATE, 0)); } private void suggestArgs(MainPack info, int type, List<Suggestion> suggestions, String prev, String before) { @@ -198,6 +208,7 @@ public class SuggestionsManager { break; case CommandAbstraction.CONFIG_FILE: suggestConfigFile(suggestions, prev, before); + break; } } @@ -453,7 +464,6 @@ public class SuggestionsManager { xmlPrefsFiles.add(AppsManager.PATH); xmlPrefsFiles.add(NotificationManager.PATH); } - Log.e("andre", xmlPrefsFiles.toString()); if(prev == null || prev.length() == 0) { for(String s : xmlPrefsFiles) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/ShellUtils.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/ShellUtils.java index d56baac..89b9b7f 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/ShellUtils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/ShellUtils.java @@ -6,6 +6,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.io.InterruptedIOException; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; @@ -63,91 +64,64 @@ public class ShellUtils { // return new CommandResult(0, e.toString()); // } - if(cmds.length > 1) return null; + if(cmds.length > 1 || cmds.length == 0) return null; int result = -1; - if (cmds == null || cmds.length == 0) { - return null; - } BufferedReader errorResult = null; StringBuilder errorMsg = null; final StringBuilder output = new StringBuilder(); -// DataOutputStream os = null; try { -// process = Runtime.getRuntime().exec(root ? "su" : "sh"); -// os = new DataOutputStream(process.getOutputStream()); -// -// if (path != null) { -// String cdCommand = "cd " + path; -// os.write(cdCommand.getBytes()); -// os.writeBytes(Tuils.NEWLINE); -// os.flush(); -// } - -// for (String command : cmds) { -// if (command == null) { -// continue; -// } -// -// os.write(command.getBytes()); -// os.writeBytes(Tuils.NEWLINE); -// } -// os.flush(); final Process process = Runtime.getRuntime().exec((root ? "su -c " : "") + cmds[0], null, path != null ? new File(path) : null); final Thread externalThread = Thread.currentThread(); - Thread thread = new StoppableThread() { + Thread readerThread = new StoppableThread() { @Override public void run() { super.run(); - if(Thread.interrupted() || externalThread.isInterrupted()) return; + if (Thread.interrupted() || externalThread.isInterrupted()) return; BufferedReader successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); String s; try { while ((s = successResult.readLine()) != null) { - if(Thread.currentThread().isInterrupted() || externalThread.isInterrupted()) return; + if (Thread.currentThread().isInterrupted() || externalThread.isInterrupted()) + return; + + if (outputable != null) outputable.onOutput(Tuils.NEWLINE + s); + else { + output.append(Tuils.NEWLINE); + output.append(s); + } + } - if(outputable != null) outputable.onOutput(Tuils.NEWLINE + s); + sleep(25); + } catch (StackOverflowError | Exception e) { + if(outputable != null && ! (e instanceof InterruptedException)) outputable.onOutput(e.toString()); - output.append(Tuils.NEWLINE); - output.append(s); - } - } catch (IOException e) { - Log.e("andre", "", e); - } + try { + successResult.close(); + } catch (IOException e1) {} - try { - sleep(50); - } catch (InterruptedException e) { - Log.e("andre", "", e); return; } - - run(); } }; - thread.start(); + readerThread.start(); result = process.waitFor(); - thread.interrupt(); + readerThread.interrupt(); if(output.length() == 0) { errorMsg = new StringBuilder(); -// successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); String s; -// while ((s = successResult.readLine()) != null) { -// successMsg.append(Tuils.NEWLINE); -// successMsg.append(s); -// } while ((s = errorResult.readLine()) != null) { if(errorMsg.length() > 0) errorMsg.append(Tuils.NEWLINE); errorMsg.append(s); @@ -159,18 +133,10 @@ public class ShellUtils { catch (Exception e) {} finally { try { -// if (os != null) { -// os.close(); -// } -// if (successResult != null) { -// successResult.close(); -// } if (errorResult != null) { errorResult.close(); } - } catch (IOException e) { - Log.e("andre", "", e); - } + } catch (IOException e) {} } if(output.length() > 0) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/StoppableThread.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/StoppableThread.java index 4772add..f98c1ec 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/StoppableThread.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/StoppableThread.java @@ -1,5 +1,7 @@ package ohi.andre.consolelauncher.tuils; +import android.util.Log; + /** * Created by francescoandreuzzi on 27/04/2017. */ @@ -12,11 +14,17 @@ public class StoppableThread extends Thread { public void interrupt() { super.interrupt(); - stopped = true; + synchronized (this) { + stopped = true; + } } @Override public boolean isInterrupted() { - return stopped || super.isInterrupted(); + boolean b; + synchronized (this) { + b = stopped; + } + return b || super.isInterrupted(); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fc38f9f..6988021 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,7 +14,7 @@ <!-- busy --> <string name="busy">T-UI is busy, wait until the execution finishes or use the command \"ctrlc\"</string> - <string name="busy_hint">type "ctrlc" to stop</string> + <string name="busy_hint">type \"ctrlc\" to stop</string> <string name="rate_donate_text">\nDo you like my work? Rate on Play Store (command: >>rate) or offer me a coffee (command: >>donate). Thank you for using T-UI.\n\nYou can disable this message in >>tuisettings</string> @@ -39,6 +39,8 @@ <string name="output_problemcamera">There was a problem while connecting to your device camera</string> <string name="output_numberformat">Wrong number format</string> <string name="output_invalidarg">Invalid argument</string> + <string name="output_lessarg">Less arguments than expected</string> + <string name="output_aliasnotfound">Alias not found:</string> <!-- tuixt --> <string name="help_tuixt_help">Print the list of commands, or info about a command @@ -116,8 +118,15 @@ <string name="help_airplane">Toggle Airplane Mode</string> - <string name="help_aliases">Print alias that are currently saved in \"sdcard\"/t-ui/alias.txt</string> - <string name="help_aliasfile">Open alias.txt</string> + <string name="help_aliases">Manager your aliases + \n\nUsage: + \n-add -> add a new alias + \n-rm -> remove an existing alias + \n-ls -> list your aliases + \n-file -> open alias.xml + \n\nExample: + \n>>alias -add bip echo beeeeeep + \n>>alias -rm bip</string> <string name="help_apps">Manage your apps \n\nUsage: \n>>apps [option] [app name] @@ -127,20 +136,11 @@ \n-ps -> show Google Play Store page for this app \n-st -> show Settings details for this app \n-frc -> force t-ui to open this app + \n-file -> open apps.xml \nno option -> list your apps \n\nExample: \n>>apps -st T-UI </string> - <string name="help_appshide">Hide an app - \n\nUsage: - \n>>apps_hide [app] - \n\nExample: - \n>>apps_hide Settings</string> - <string name="help_appsunhide">Unhide an hidden app - \n\nUsage: - \n>>apps_unhide [app] - \n\nExample: - \n>>apps_unhide Settings</string> <string name="help_bluetooth">Toggle Bluetooth</string> <string name="help_clear">Clear the screen</string> <string name="help_calc" formatted="false">Perform basic operations (+ - * / % ^ sqrt) @@ -262,6 +262,7 @@ \n\n-inc -> include an application \n-exc -> exclude an appliation \n-clr -> set the color to be used for the application + \n-file -> open notifications.xml \n\nExample: \n\nnotifications -inc Clock \nnotifications -clr Settings #FF0000</string> -- GitLab