diff --git a/app/build.gradle b/app/build.gradle index 4198e72e17d3b1c0c2d15e3addc3d44656741e87..3c3f43a1553b3f33979f663a23c044d5b199ab16 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 8 targetSdkVersion 23 - versionCode 104 - versionName "6.0b" + versionCode 108 + versionName "6.0d" } buildTypes { @@ -21,6 +21,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' zipAlignEnabled true } + debug { + minifyEnabled false + shrinkResources false + zipAlignEnabled true + } } compileOptions { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 0f65de5ee6d73bdbd805a2062f4e4e67530d5c2d..414c980e5d8c251f319f13848beb6a0917ede715 100755 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -2,11 +2,10 @@ -keep public abstract class ohi.andre.consolelauncher.commands.main.generals.* { public *; } -keep public class ohi.andre.consolelauncher.commands.tuixt.raw.* { public *; } --dontwarn ohi.andre.consolelauncher.commands.main.raw.** +-keep public class ohi.andre.consolelauncher.managers.notifications.NotificationService +-keep public class ohi.andre.consolelauncher.tuils.KeeperService --keepclassmembers class * extends com.stephentuso.welcome.WelcomeActivity { - public static java.lang.String welcomeKey(); -} +-dontwarn ohi.andre.consolelauncher.commands.main.raw.** -dontwarn javax.annotation.** -dontwarn javax.inject.** diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a95b27fc49e2e88212bc05a16dad22ba6b4bde00..caefc4f77430f1e641ae43c47a422ba334241191 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,8 +29,9 @@ <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.READ_PHONE_STATE" /> - + <permission android:name="android.permission.MEDIA_CONTENT_CONTROL" /> <permission android:name="android.permission.FLASHLIGHT" android:description="@string/help_flash" @@ -71,7 +72,7 @@ android:name=".LauncherActivity" android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation" - android:launchMode="singleInstance" + android:launchMode="singleTask" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:resumeWhilePausing="true" @@ -175,6 +176,14 @@ android:host="*" android:pathPattern=".*\\.cfg" android:scheme="file" /> + <data + android:host="*" + android:pathPattern=".*\\.txt" + android:scheme="file" /> + <data + android:host="*" + android:pathPattern=".*\\.xml" + android:scheme="file" /> </intent-filter> </activity> diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java index 90e91360e0ef12a6dfa21ffccefad9872706e0cf..83208301da35d7af1b2603e707cfdf970b908b10 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java @@ -1,9 +1,7 @@ package ohi.andre.consolelauncher; import android.Manifest; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -18,7 +16,6 @@ import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.MenuItem; @@ -30,7 +27,6 @@ import android.widget.Toast; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.IOException; import java.io.PrintStream; import ohi.andre.consolelauncher.commands.main.MainPack; @@ -43,13 +39,13 @@ import ohi.andre.consolelauncher.managers.notifications.NotificationService; import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager; import ohi.andre.consolelauncher.tuils.Assist; import ohi.andre.consolelauncher.tuils.KeeperService; -import ohi.andre.consolelauncher.tuils.StoppableThread; +import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter; import ohi.andre.consolelauncher.tuils.interfaces.Inputable; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; import ohi.andre.consolelauncher.tuils.interfaces.Reloadable; -import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver; +import ohi.andre.consolelauncher.tuils.interfaces.Suggester; public class LauncherActivity extends AppCompatActivity implements Reloadable { @@ -70,11 +66,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public String exec(String input, String alias) { - try { - main.onCommand(input, alias); - } catch (NullPointerException e) { - e.printStackTrace(); - } + if(main != null) main.onCommand(input, alias); return null; } }; @@ -83,11 +75,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public void in(String s) { - try { - ui.setInput(s); - } catch (NullPointerException e) { - e.printStackTrace(); - } + if(ui != null) ui.setInput(s); } @Override @@ -114,16 +102,24 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { private Outputable out = new Outputable() { @Override - public void onOutput(String output) { - try { - ui.setOutput(output, TerminalManager.CATEGORY_OUTPUT); - } catch (NullPointerException e) { - e.printStackTrace(); - } + public void onOutput(CharSequence output) { + if(ui != null) ui.setOutput(output, TerminalManager.CATEGORY_OUTPUT); + } + + @Override + public void onOutput(CharSequence output, int category) { + if(ui != null) ui.setOutput(output, category); + } + }; + + private Suggester sugg = new Suggester() { + @Override + public void requestUpdate() { + if(ui != null) ui.requestSuggestion(Tuils.EMPTYSTRING); } }; - static final boolean DEBUG = false; + static final boolean DEBUG = BuildConfig.BUILD_TYPE.startsWith("debug"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -149,61 +145,26 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { private void finishOnCreate() { - Thread logger = null; - if(DEBUG) { - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - try { - e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true))); - } catch (FileNotFoundException e1) {} - } - }); - - final Thread c = Thread.currentThread(); - logger = new StoppableThread() { - - FileOutputStream stream; - final String newline = "###" + Tuils.NEWLINE; - - @Override - public void run() { - - if(stream == null) { - try { - stream = new FileOutputStream(new File(Tuils.getFolder(), "hang.txt")); - } catch (FileNotFoundException e) { - return; - } - } - - if(Thread.currentThread().isInterrupted()) return; - - StackTraceElement[] stack = c.getStackTrace(); - for(StackTraceElement s : stack) { - if(s.getClassName().startsWith("ohi.andre.consolelauncher")) - try { - stream.write( (s.getClassName() + " -> " + s.getMethodName() + ": " + s.getLineNumber() + Tuils.NEWLINE).getBytes()); - } catch (IOException e) {} - } - try { - stream.write(newline.getBytes()); - } catch (IOException e) {} - - if(Thread.currentThread().isInterrupted()) return; - - run(); - } - }; - logger.start(); - } + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + Tuils.log(e); + try { + e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true))); + } catch (FileNotFoundException e1) {} + } + }); try { XMLPrefsManager.create(); + TimeManager.create(); } catch (Exception e) { - Log.e("andre", "", e); -// this.startActivity(new Intent(this, LauncherActivity.class)); -// this.finish(); + Tuils.log(Tuils.getStackTrace(e)); + + try { + e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true))); + } catch (FileNotFoundException e1) {} + return; } @@ -215,9 +176,6 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { stopService(keeperIntent); } - DevicePolicyManager policy = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); - ComponentName component = new ComponentName(this, PolicyReceiver.class); - fullscreen = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.fullscreen); boolean useSystemWP = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper); @@ -252,8 +210,8 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { setContentView(R.layout.base_view); ViewGroup mainView = (ViewGroup) findViewById(R.id.mainview); - main = new MainManager(this, in, out, policy, component); - ui = new UIManager(main.getMainPack(), this, mainView, ex, policy, component, main.getMainPack()); + main = new MainManager(this, in, out, sugg); + ui = new UIManager(main.getMainPack(), this, mainView, ex, main.getMainPack()); main.setRedirectionListener(ui.buildRedirectionListener()); in.in(Tuils.EMPTYSTRING); @@ -273,20 +231,20 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { } System.gc(); - - if(logger != null) { - logger.interrupt(); - logger = null; - } } @Override protected void onStart() { super.onStart(); - if (ui != null) { - ui.onStart(openKeyboardOnStart); - } + if (ui != null) ui.onStart(openKeyboardOnStart); + } + + @Override + protected void onRestart() { + super.onRestart(); + + sugg.requestUpdate(); } @Override @@ -303,8 +261,10 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { protected void onDestroy() { super.onDestroy(); - stopService(new Intent(this, KeeperService.class)); - stopService(new Intent(this, NotificationService.class)); + try { + stopService(new Intent(this, KeeperService.class)); + stopService(new Intent(this, NotificationService.class)); + } catch (NoClassDefFoundError e) {} LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice); overridePendingTransition(0,0); diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java index f8a6bfae005036d666ec42bce281e8eae94351e7..1a69a4d007e759eb6c486f83bf2d5d919de5efa0 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java @@ -1,13 +1,14 @@ package ohi.andre.consolelauncher; -import android.app.admin.DevicePolicyManager; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.os.Handler; -import android.os.Looper; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; import android.util.Log; +import java.util.regex.Pattern; + import ohi.andre.consolelauncher.commands.Command; import ohi.andre.consolelauncher.commands.CommandGroup; import ohi.andre.consolelauncher.commands.CommandTuils; @@ -17,16 +18,19 @@ import ohi.andre.consolelauncher.commands.specific.RedirectCommand; import ohi.andre.consolelauncher.managers.AliasManager; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.managers.ContactManager; -import ohi.andre.consolelauncher.managers.MusicManager; +import ohi.andre.consolelauncher.managers.ShellManager; +import ohi.andre.consolelauncher.managers.TerminalManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; -import ohi.andre.consolelauncher.tuils.ShellUtils; +import ohi.andre.consolelauncher.managers.music.MusicManager; import ohi.andre.consolelauncher.tuils.StoppableThread; +import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter; import ohi.andre.consolelauncher.tuils.interfaces.Inputable; import ohi.andre.consolelauncher.tuils.interfaces.OnRedirectionListener; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; import ohi.andre.consolelauncher.tuils.interfaces.Redirectator; +import ohi.andre.consolelauncher.tuils.interfaces.Suggester; /*Copyright Francesco Andreuzzi @@ -84,6 +88,7 @@ public class MainManager { new SystemCommandTrigger() }; private MainPack mainPack; + private ShellManager shell; private Context mContext; @@ -93,28 +98,7 @@ public class MainManager { private boolean showAliasValue; private boolean showAppHistory; - private Handler handler = new Handler(); - - private Thread thread; - private boolean busy = false; - private boolean ctrlced = false; - private void busy() { - busy = true; - -// i do this because i don't want to change the hint every single time (users would complain) - handler.postDelayed(new Runnable() { - @Override - public void run() { - if(busy) in.changeHint(mContext.getString(R.string.busy_hint)); - } - }, 650); - } - private void notBusy() { - busy = false; - in.resetHint(); - } - - protected MainManager(LauncherActivity c, Inputable i, Outputable o, DevicePolicyManager devicePolicyManager, ComponentName componentName) { + protected MainManager(LauncherActivity c, Inputable i, Outputable o, Suggester sugg) { mContext = c; in = i; @@ -140,27 +124,16 @@ public class MainManager { MusicManager music = new MusicManager(mContext, out); - AppsManager appsMgr = new AppsManager(c, out); + AppsManager appsMgr = new AppsManager(c, out, sugg); AliasManager aliasManager = new AliasManager(); - mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, devicePolicyManager, componentName, c, executer, out, redirectator); + shell = new ShellManager(out); + + mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, c, executer, out, redirectator, shell); } // command manager public void onCommand(String input, String alias) { - if(busy) { - if(input.equalsIgnoreCase("ctrlc")) { - thread.interrupt(); - - ctrlced = true; - - notBusy(); - return; - } - - out.onOutput(mContext.getString(R.string.busy)); - return; - } input = Tuils.removeUnncesarySpaces(input); @@ -200,7 +173,6 @@ public class MainManager { redirectator.cleanup(); } - // dispose public void dispose() { mainPack.dispose(); } @@ -231,52 +203,17 @@ public class MainManager { } } - // this must be the last trigger private class SystemCommandTrigger implements CmdTrigger { - final int COMMAND_NOTFOUND = 127; - @Override public boolean trigger(final ExecutePack info, final String input) throws Exception { - -// this is the last trigger, it has to say "command not found" - - final String cmd = input; - final boolean useSU = false; - - thread = new StoppableThread() { + new Thread() { @Override public void run() { - super.run(); - - busy(); - - if(Thread.interrupted()) return; - 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 && result.result > 0) { - output = mainPack.res.getString(R.string.output_commandexitvalue) + Tuils.SPACE + result.result; - } - } - out.onOutput(output); - } - - notBusy(); - } - }; - thread.start(); + shell.cmd(input, true); + ((MainPack) info).currentDirectory = shell.currentDir(); + }; + }.start(); return true; } @@ -284,24 +221,48 @@ public class MainManager { private class AppTrigger implements CmdTrigger { + String appFormat; + int timeColor; + int outputColor; + + Pattern pa = Pattern.compile("%a", Pattern.CASE_INSENSITIVE); + Pattern pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE); + Pattern pl = Pattern.compile("%l", Pattern.CASE_INSENSITIVE); + Pattern pn = Pattern.compile("%n", Pattern.CASE_INSENSITIVE); + @Override public boolean trigger(ExecutePack info, String input) { - String packageName = mainPack.appsManager.findPackage(input, AppsManager.SHOWN_APPS); - if (packageName == null) { + AppsManager.LaunchInfo i = mainPack.appsManager.findLaunchInfoWithLabel(input, AppsManager.SHOWN_APPS); + if (i == null) { return false; } - Intent intent = mainPack.appsManager.getIntent(packageName); + Intent intent = mainPack.appsManager.getIntent(i); if (intent == null) { return false; } - if(showAppHistory) out.onOutput("-->" + Tuils.SPACE + intent.getComponent().getClassName()); + if(showAppHistory) { + if(appFormat == null) { + appFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.app_launch_format); + timeColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color); + outputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color); + } + + String a = new String(appFormat); + a = pa.matcher(a).replaceAll(intent.getComponent().getClassName()); + a = pp.matcher(a).replaceAll(intent.getComponent().getPackageName()); + a = pl.matcher(a).replaceAll(i.publicLabel); + a = pn.matcher(a).replaceAll(Tuils.NEWLINE); -// if(intent.getBooleanExtra("forResult", false)) ((Activity) mContext).startActivityForResult(intent, 0); -// else - mContext.startActivity(intent); + SpannableString text = new SpannableString(a); + text.setSpan(new ForegroundColorSpan(outputColor), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + CharSequence s = TimeManager.replace(text, timeColor); + + out.onOutput(s, TerminalManager.CATEGORY_GENERAL); + } + mContext.startActivity(intent); return true; } } @@ -312,15 +273,12 @@ public class MainManager { public boolean trigger(final ExecutePack info, final String input) throws Exception { final boolean[] returnValue = new boolean[1]; - thread = new StoppableThread() { + + new StoppableThread() { @Override public void run() { super.run(); - busy(); - - Looper.prepare(); - mainPack.lastCommand = input; try { @@ -331,12 +289,10 @@ public class MainManager { returnValue.notify(); } - if (returnValue[0]) { - if(Thread.interrupted()) return; + if (command != null) { String output = command.exec(mContext.getResources(), info); - if(Thread.interrupted()) return; - if(output != null && !ctrlced) { + if(output != null) { out.onOutput(output); } } @@ -344,12 +300,8 @@ public class MainManager { out.onOutput(e.toString()); Log.e("andre", "", e); } - - notBusy(); } - }; - - thread.start(); + }.start(); synchronized (returnValue) { returnValue.wait(); diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java index 38d3974e04ac997be1cf62fdef06639fe2d9b919..e231bdda47ae84a9ab7841601dbaa8d46c87ec8d 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java @@ -5,11 +5,11 @@ import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.graphics.Typeface; import android.os.Handler; import android.text.Editable; import android.text.TextWatcher; -import android.text.format.Time; import android.view.GestureDetector; import android.view.GestureDetector.OnDoubleTapListener; import android.view.Gravity; @@ -41,17 +41,18 @@ import ohi.andre.consolelauncher.managers.suggestions.SuggestionRunnable; import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager; import ohi.andre.consolelauncher.tuils.Sequence; import ohi.andre.consolelauncher.tuils.StoppableThread; +import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter; import ohi.andre.consolelauncher.tuils.interfaces.OnRedirectionListener; import ohi.andre.consolelauncher.tuils.interfaces.SuggestionViewDecorer; +import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver; import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces; public class UIManager implements OnTouchListener { private final int RAM_DELAY = 3000; private final int BATTERY_DELAY = 20 * 1000; -// private final int BATTERY_CHARGING_DELAY = 300; private final int TIME_DELAY = 1000; private final int STORAGE_DELAY = 60 * 1000; @@ -100,27 +101,6 @@ public class UIManager implements OnTouchListener { } }; -// private Runnable batteryChargingRunnable = new Runnable() { -// -// int[] colors; -// int index = 0; -// -// @Override -// public void run() { -// if(colors == null) { -// colors = new int[3]; -// colors[0] = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_high); -// colors[1] = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_medium); -// colors[2] = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_low); -// } -// -// battery.setTextColor(colors[index++]); -// if(index >= colors.length) index = 0; -// -// battery.postDelayed(this, BATTERY_CHARGING_DELAY); -// } -// }; - private final String INT_AV = "%iav"; private final String INT_TOT = "%itot"; private final String EXT_AV = "%eav"; @@ -163,6 +143,11 @@ public class UIManager implements OnTouchListener { storagePatterns.add(Pattern.compile(EXT_TOT + "b", Pattern.CASE_INSENSITIVE)); storagePatterns.add(Pattern.compile("%n", Pattern.CASE_INSENSITIVE)); + + storagePatterns.add(Pattern.compile(INT_AV, Pattern.CASE_INSENSITIVE)); + storagePatterns.add(Pattern.compile(INT_TOT, Pattern.CASE_INSENSITIVE)); + storagePatterns.add(Pattern.compile(EXT_AV, Pattern.CASE_INSENSITIVE)); + storagePatterns.add(Pattern.compile(EXT_TOT, Pattern.CASE_INSENSITIVE)); } double iav = Tuils.getAvailableInternalMemorySize(Tuils.BYTE); @@ -200,19 +185,20 @@ public class UIManager implements OnTouchListener { copy = storagePatterns.get(22).matcher(copy).replaceAll(Tuils.NEWLINE); + copy = storagePatterns.get(23).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) iav, Tuils.GIGA))); + copy = storagePatterns.get(24).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) itot, Tuils.GIGA))); + copy = storagePatterns.get(25).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) eav, Tuils.GIGA))); + copy = storagePatterns.get(26).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) etot, Tuils.GIGA))); + storage.setText(copy); storage.postDelayed(this, STORAGE_DELAY); } }; - private String timeFormat; private Runnable timeRunnable = new Runnable() { @Override public void run() { - Time t = new Time(); - t.setToNow(); - - time.setText(t.format(timeFormat)); + time.setText(TimeManager.replace("%t0")); time.postDelayed(this, TIME_DELAY); } }; @@ -297,113 +283,17 @@ public class UIManager implements OnTouchListener { protected TextWatcher textWatcher = new TextWatcher() { -// int nOfSpace = -1; -// String originalText; - - boolean call = true; - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int st, int b, int c) { - if (suggestionsView == null || suggestionsManager == null || !showSuggestions || !call) { - 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); - - String lastWord = text.substring(lastSpace != -1 ? lastSpace + 1 : 0); - String before = text.substring(0, lastSpace != -1 ? lastSpace + 1 : 0); - - requestSuggestion(before, lastWord); + requestSuggestion(s.toString()); } @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; -//// } -//// 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 = true; -// } - } + public void afterTextChanged(Editable s) {} }; private View.OnClickListener clickListener = new View.OnClickListener() { @@ -427,6 +317,19 @@ public class UIManager implements OnTouchListener { } }; + public void requestSuggestion(String text) { + if (suggestionsView == null || suggestionsManager == null || !showSuggestions) { + return; + } + + int lastSpace = text.lastIndexOf(Tuils.SPACE); + + String lastWord = text.substring(lastSpace != -1 ? lastSpace + 1 : 0); + String before = text.substring(0, lastSpace != -1 ? lastSpace + 1 : 0); + + requestSuggestion(before, lastWord); + } + private void requestSuggestion(final String before, final String lastWord) { if (suggestionViewParams == null) { @@ -435,7 +338,6 @@ public class UIManager implements OnTouchListener { suggestionViewParams.gravity = Gravity.CENTER_VERTICAL; } - if(suggestionRunnable == null) { suggestionRunnable = new SuggestionRunnable(skinManager, suggestionsView, suggestionViewParams, (HorizontalScrollView) suggestionsView.getParent()); } @@ -520,13 +422,10 @@ public class UIManager implements OnTouchListener { lastSuggestionThread.start(); } - protected UIManager(ExecutePack info, final Context context, final ViewGroup rootView, final CommandExecuter tri, DevicePolicyManager mgr, ComponentName name, - MainPack mainPack) { - - rootView.setOnTouchListener(this); + protected UIManager(ExecutePack info, final Context context, final ViewGroup rootView, final CommandExecuter tri, MainPack mainPack) { - policy = mgr; - component = name; + policy = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); + component = new ComponentName(context, PolicyReceiver.class); mContext = context; this.info = (MainPack) info; @@ -633,8 +532,8 @@ public class UIManager implements OnTouchListener { String deviceFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.device_format); - deviceFormat = USERNAME.matcher(deviceFormat).replaceAll(skinManager.username); - deviceFormat = DV.matcher(deviceFormat).replaceAll(skinManager.deviceName); + deviceFormat = USERNAME.matcher(deviceFormat).replaceAll(skinManager.username != null ? skinManager.username : "null"); + deviceFormat = DV.matcher(deviceFormat).replaceAll(skinManager.deviceName != null ? skinManager.deviceName : "null"); deviceFormat = NEWLINE.matcher(deviceFormat).replaceAll(Tuils.NEWLINE); device.setText(deviceFormat); @@ -647,8 +546,6 @@ public class UIManager implements OnTouchListener { boolean showTime = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_time); if(showTime) { - timeFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format); - time.setTextColor(skinManager.time_color); time.setTextSize(skinManager.getTextSize()); time.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); @@ -663,15 +560,6 @@ public class UIManager implements OnTouchListener { mediumPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_medium); lowPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_low); -// batteryCharging = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.battery_charging_animation); -// if(batteryCharging) { -// IntentFilter filter = new IntentFilter(); -// filter.addAction(Intent.ACTION_POWER_CONNECTED); -// filter.addAction(Intent.ACTION_POWER_DISCONNECTED); -// -// LocalBroadcastManager.getInstance(context).registerReceiver(new PowerConnectionReceiver(), filter); -// } - if(mediumPercentage < lowPercentage) skinManager.manyColorsBattery = false; battery.setTextSize(skinManager.getTextSize()); @@ -691,7 +579,7 @@ public class UIManager implements OnTouchListener { terminalView = (TextView) inputOutputView.findViewById(R.id.terminal_view); terminalView.setOnTouchListener(this); - ((View) terminalView.getParent()).setOnTouchListener(this); + ((View) terminalView.getParent().getParent()).setOnTouchListener(this); final EditText inputView = (EditText) inputOutputView.findViewById(R.id.input_view); inputView.setOnTouchListener(this); @@ -865,7 +753,7 @@ public class UIManager implements OnTouchListener { @Override public boolean onDoubleTapEvent(MotionEvent e) { - return false; + return true; } @Override @@ -881,7 +769,8 @@ public class UIManager implements OnTouchListener { boolean admin = policy.isAdminActive(component); if (!admin) { - Tuils.requestAdmin((Activity) mContext, component, mContext.getString(R.string.adminrequest_label)); + Intent i = Tuils.requestAdmin(component); + mContext.startActivity(i); } else { policy.lockNow(); } @@ -893,7 +782,8 @@ public class UIManager implements OnTouchListener { } protected boolean verifyDoubleTap(MotionEvent event) { - return det != null && det.onTouchEvent(event); + boolean b = det.onTouchEvent(event); + return det != null && b; } // on pause @@ -903,8 +793,9 @@ public class UIManager implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { - if (verifyDoubleTap(event)) + if (verifyDoubleTap(event)) { return true; + } if (event.getAction() != MotionEvent.ACTION_DOWN) return v.onTouchEvent(event); 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 881f48ca34a30b7582171581644c223f4bf3666c..977ed0376be9944af6b38795a2b13563c58c45df 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java @@ -1,9 +1,9 @@ package ohi.andre.consolelauncher.commands; import android.content.res.Resources; -import android.util.Log; import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.tuils.Tuils; @@ -18,17 +18,33 @@ 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); } - if (nArgs < cmd.minArgs() || (mArgs == null && cmd.minArgs() > 0) || - (cmd instanceof ParamCommand && mArgs != null && mArgs.length > 0 && ((ParamCommand) cmd).argsForParam((String) mArgs[0]) != null && - ((ParamCommand) cmd).argsForParam((String) mArgs[0]).length + 1 > nArgs)) { + + if(cmd instanceof ParamCommand) { + ParamCommand pCmd = (ParamCommand) cmd; + + if(mArgs == null || mArgs.length == 0) { + return cmd.onNotArgEnough(info, 0); + } + + int[] args = info.get(Param.class, 0).args(); + if(args == null) return resources.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0]; + + if(pCmd.supportDefaultParam()) { + if(args.length + 1 > nArgs + 1) { + return cmd.onNotArgEnough(info, nArgs); + } + } else { + if(args.length + 1 > nArgs) { + return cmd.onNotArgEnough(info, nArgs); + } + } + } else if (nArgs < cmd.minArgs() || (mArgs == null && cmd.minArgs() > 0)) { return cmd.onNotArgEnough(info, nArgs); } + if (cmd.maxArgs() != CommandAbstraction.UNDEFINIED && nArgs > cmd.maxArgs()) { return resources.getString(R.string.output_toomanyargs); } @@ -45,12 +61,12 @@ public class Command { int[] args; if (useParamArgs) { - args = ((ParamCommand) cmd).argsForParam((String) mArgs[0]); + args = ((Param) mArgs[0]).args(); } else { args = cmd.argType(); } - if (args == null) { + if (args == null || args.length == 0) { return 0; } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java index 6474c0cce6131c3c92c49266abf2c12451eb1cdd..69dfc94edd0539251f0e988deabcff97e212b5a1 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java @@ -21,7 +21,7 @@ public interface CommandAbstraction { int CONFIG_FILE = 22; int CONFIG_ENTRY = 23; int INT = 24; - int REGEX = 25; + int DEFAULT_APP = 25; String exec(ExecutePack pack) throws Exception; 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 9e19bf9b26bb5d4c8ab4e623ed395ca635f31adf..afabfdb364ce5864809c78948c46fbc17bc054b9 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java @@ -9,14 +9,16 @@ import java.util.Arrays; import java.util.List; import ohi.andre.consolelauncher.commands.main.MainPack; +import ohi.andre.consolelauncher.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.managers.ContactManager; import ohi.andre.consolelauncher.managers.FileManager; import ohi.andre.consolelauncher.managers.FileManager.DirInfo; -import ohi.andre.consolelauncher.managers.MusicManager; +import ohi.andre.consolelauncher.managers.music.MusicManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; +import ohi.andre.consolelauncher.tuils.SimpleMutableEntry; import ohi.andre.consolelauncher.tuils.Tuils; @SuppressLint("DefaultLocale") @@ -64,17 +66,17 @@ public class CommandTuils { try { if(cmd instanceof ParamCommand) { - ArgInfo arg = param(input); + ArgInfo arg = param((MainPack) info, (ParamCommand) cmd, input); if(arg == null || !arg.found) { return command; } input = arg.residualString; - String param = (String) arg.arg; - types = ((ParamCommand) cmd).argsForParam(param); + Param p = (Param) arg.arg; + types = p.args(); nArgs++; - args.add(param); + args.add(p); } else { types = cmd.argType(); } @@ -130,39 +132,31 @@ public class CommandTuils { if (type == CommandAbstraction.FILE && info instanceof MainPack) { MainPack pack = (MainPack) info; return file(input, pack.currentDirectory); - } - else if (type == CommandAbstraction.CONTACTNUMBER && info instanceof MainPack) { + } else if (type == CommandAbstraction.CONTACTNUMBER && info instanceof MainPack) { MainPack pack = (MainPack) info; return contactNumber(input, pack.contacts); - } - else if (type == CommandAbstraction.PLAIN_TEXT) { + } else if (type == CommandAbstraction.PLAIN_TEXT) { return plainText(input); - } - else if (type == CommandAbstraction.VISIBLE_PACKAGE && info instanceof MainPack) { + } else if (type == CommandAbstraction.VISIBLE_PACKAGE && info instanceof MainPack) { MainPack pack = (MainPack) info; - return packageName(input, pack.appsManager); + return activityName(input, pack.appsManager); } else if (type == CommandAbstraction.HIDDEN_PACKAGE && info instanceof MainPack) { MainPack pack = (MainPack) info; return hiddenPackage(input, pack.appsManager); - } - else if (type == CommandAbstraction.TEXTLIST) { + } else if (type == CommandAbstraction.TEXTLIST) { return textList(input); - } - else if (type == CommandAbstraction.SONG && info instanceof MainPack) { + } else if (type == CommandAbstraction.SONG && info instanceof MainPack) { MainPack pack = (MainPack) info; return song(input, pack.player); - } - else if (type == CommandAbstraction.FILE_LIST && info instanceof MainPack) { + } else if (type == CommandAbstraction.FILE_LIST && info instanceof MainPack) { MainPack pack = (MainPack) info; if (suggestion) return file(input, pack.currentDirectory); else return fileList(input, pack.currentDirectory); - } else if (type == CommandAbstraction.COMMAND) + } else if (type == CommandAbstraction.COMMAND) { return command(input, info.commandGroup); - else if (type == CommandAbstraction.PARAM) { - return param(input); } else if(type == CommandAbstraction.BOOLEAN) { return bln(input); } else if(type == CommandAbstraction.COLOR) { @@ -173,6 +167,8 @@ public class CommandTuils { return configFile(input); } else if(type == CommandAbstraction.INT) { return integer(input); + } else if(type == CommandAbstraction.DEFAULT_APP) { + return defaultApp(input, ((MainPack) info).appsManager); } return null; @@ -330,7 +326,9 @@ public class CommandTuils { } } - private static ArgInfo param(String input) { + private static ArgInfo param(MainPack pack, ParamCommand cmd, String input) { + if(input == null || input.trim().length() == 0) return null; + int indexOfFirstSpace = input.indexOf(Tuils.SPACE); if (indexOfFirstSpace == -1) { indexOfFirstSpace = input.length(); @@ -339,17 +337,30 @@ public class CommandTuils { String param = input.substring(0, indexOfFirstSpace).trim(); if(param.length() > 0 && !param.startsWith("-")) param = "-".concat(param); - return new ArgInfo(param.length() > 0 ? param : null, input.substring(indexOfFirstSpace), param.length() > 0, param.length() > 0 ? 1 : 0); + SimpleMutableEntry<Boolean, Param> sm = cmd.getParam(pack, param); + Param p = sm.getValue(); + boolean df = sm.getKey(); + + return new ArgInfo(p, df ? input : input.substring(indexOfFirstSpace), p != null, p != null ? 1 : 0); } - private static ArgInfo packageName(String input, AppsManager apps) { - String packageName = apps.findPackage(input, AppsManager.SHOWN_APPS); - return new ArgInfo(packageName, null, packageName != null, 1); + private static ArgInfo activityName(String input, AppsManager apps) { + AppsManager.LaunchInfo info = apps.findLaunchInfoWithLabel(input, AppsManager.SHOWN_APPS); + return new ArgInfo(info, null, info != null, info != null ? 1 : 0); } private static ArgInfo hiddenPackage(String input, AppsManager apps) { - String packageName = apps.findPackage(input, AppsManager.HIDDEN_APPS); - return new ArgInfo(packageName, null, packageName != null, 1); + AppsManager.LaunchInfo info = apps.findLaunchInfoWithLabel(input, AppsManager.HIDDEN_APPS); + return new ArgInfo(info, null, info != null, info != null ? 1 : 0); + } + + private static ArgInfo defaultApp(String input, AppsManager apps) { + AppsManager.LaunchInfo info = apps.findLaunchInfoWithLabel(input, AppsManager.SHOWN_APPS); + if(info == null) { + return new ArgInfo(input, null, true, 1); + } else { + return new ArgInfo(info, null, true, 1); + } } private static ArgInfo contactNumber(String input, ContactManager contacts) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java b/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java index ba92eae11524e7143528ae78acb018e5fcdfe357..da4db50bcbf7732be7fb461a282436f3870a7546 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java @@ -6,21 +6,18 @@ import android.content.Context; public abstract class ExecutePack { public Object[] args; - public Context context; - public CommandGroup commandGroup; - public ExecutePack(CommandGroup group) { this.commandGroup = group; } - @SuppressWarnings("unchecked") public <T> T get(Class<T> c, int index) { - if (index >= this.args.length) + if (index >= this.args.length) { return null; + } return (T) (this.args[index]); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java index 496ef0bd836828e8d1b01d077e00903a8a91cda2..f89f0aac194f39c4a5f9bbc4eaf1c2808b0b7c45 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java @@ -1,7 +1,5 @@ package ohi.andre.consolelauncher.commands.main; -import android.app.admin.DevicePolicyManager; -import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -22,10 +20,10 @@ import ohi.andre.consolelauncher.commands.main.raw.flash; import ohi.andre.consolelauncher.managers.AliasManager; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.managers.ContactManager; -import ohi.andre.consolelauncher.managers.MusicManager; +import ohi.andre.consolelauncher.managers.ShellManager; import ohi.andre.consolelauncher.managers.SkinManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; -import ohi.andre.consolelauncher.tuils.Tuils; +import ohi.andre.consolelauncher.managers.music.MusicManager; import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; import ohi.andre.consolelauncher.tuils.interfaces.Redirectator; @@ -42,6 +40,8 @@ public class MainPack extends ExecutePack { // current directory public File currentDirectory; + public ShellManager shellManager; + public SkinManager skinManager; // resources references @@ -73,10 +73,6 @@ public class MainPack extends ExecutePack { public AliasManager aliasManager; public AppsManager appsManager; - // admin - public DevicePolicyManager policy; - public ComponentName component; - // reload field public Reloadable reloadable; @@ -94,10 +90,12 @@ public class MainPack extends ExecutePack { public Redirectator redirectator; public MainPack(Context context, CommandGroup commandGroup, AliasManager alMgr, AppsManager appmgr, MusicManager p, - ContactManager c, DevicePolicyManager devicePolicyManager, ComponentName componentName, - Reloadable r, CommandExecuter executeCommand, Outputable outputable, Redirectator redirectator) { + ContactManager c, Reloadable r, CommandExecuter executeCommand, Outputable outputable, Redirectator redirectator, ShellManager shellManager) { super(commandGroup); + this.shellManager = shellManager; + this.currentDirectory = shellManager.currentDir(); + this.outputable = outputable; this.res = context.getResources(); @@ -106,7 +104,6 @@ public class MainPack extends ExecutePack { this.context = context; - this.currentDirectory = new File(Tuils.getInternalDirectoryPath()); this.aliasManager = alMgr; this.appsManager = appmgr; @@ -117,9 +114,6 @@ public class MainPack extends ExecutePack { this.player = p; this.contacts = c; - this.policy = devicePolicyManager; - this.component = componentName; - this.reloadable = r; this.redirectator = redirectator; @@ -166,11 +160,13 @@ public class MainPack extends ExecutePack { public void destroy() { player.destroy(this.context); appsManager.onDestroy(); + shellManager.destroy(); } @Override public void clear() { super.clear(); + setSu(false); } } 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 69ad88d7c3eb40a1578a1cffa9f2e35810093a6f..a3855aa982722643e0c4bc09f8cda94526a69233 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 @@ -2,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; /** @@ -109,7 +107,7 @@ public class alias extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } 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 153d06cb95235a54b8668ce80ddaca13c38897c1..7eb3ad7cce7d5c59a4d31507c2e1c1f30fa7404f 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 @@ -14,6 +14,7 @@ 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.AppsManager; +import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.Tuils; public class apps extends ParamCommand { @@ -39,7 +40,8 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - ((MainPack) pack).appsManager.unhideApp(pack.get(String.class, 1)); + AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1); + ((MainPack) pack).appsManager.showActivity(i); return null; } }, @@ -51,7 +53,8 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - ((MainPack) pack).appsManager.hideApp(pack.get(String.class, 1)); + AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1); + ((MainPack) pack).appsManager.hideActivity(i); return null; } }, @@ -64,8 +67,9 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { try { - PackageInfo info = pack.context.getPackageManager().getPackageInfo(pack.get(String.class, 1), PackageManager.GET_PERMISSIONS | PackageManager.GET_ACTIVITIES | - PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS); + AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1); + + PackageInfo info = pack.context.getPackageManager().getPackageInfo(i.componentName.getPackageName(), PackageManager.GET_PERMISSIONS | PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS); return AppsManager.AppUtils.format(info); } catch (PackageManager.NameNotFoundException e) { return e.toString(); @@ -80,10 +84,39 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - openPlaystore(pack.context, pack.get(String.class, 1)); + openPlaystore(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName()); return null; } }, + default_app { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.DEFAULT_APP}; + } + + @Override + public String exec(ExecutePack pack) { + int index = pack.get(int.class, 1); + + Object o = pack.get(Object.class, 2); + + String marker; + if(o instanceof AppsManager.LaunchInfo) { + AppsManager.LaunchInfo i = (AppsManager.LaunchInfo) o; + marker = i.componentName.getPackageName() + "-" + i.componentName.getClassName(); + } else { + marker = (String) o; + } + + try { + XMLPrefsManager.XMLPrefsSave save = AppsManager.Options.valueOf("default_app_n" + index); + save.parent().write(save, marker); + return null; + } catch (Exception e) { + return pack.context.getString(R.string.invalid_integer); + } + } + }, st { @Override public int[] args() { @@ -92,7 +125,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - openSettings(pack.context, pack.get(String.class, 1)); + openSettings(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName()); return null; } }, @@ -104,7 +137,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(String.class, 1)); + Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(AppsManager.LaunchInfo.class, 1)); pack.context.startActivity(intent); return null; @@ -150,7 +183,7 @@ public class apps extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } @@ -183,7 +216,7 @@ public class apps extends ParamCommand { @Override public int maxArgs() { - return 2; + return 3; } @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cd.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cd.java deleted file mode 100755 index 3c9a9442bf8f5ad0141bfb82a8612a7c16f33ae9..0000000000000000000000000000000000000000 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cd.java +++ /dev/null @@ -1,65 +0,0 @@ -package ohi.andre.consolelauncher.commands.main.raw; - -import java.io.File; - -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; - -public class cd implements CommandAbstraction { - - @Override - public String exec(ExecutePack pack) { - MainPack info = (MainPack) pack; - File folder = info.get(File.class, 0); - if (!folder.isDirectory()) { - if (!folder.isFile()) - return info.res.getString(R.string.output_filenotfound); - return info.res.getString(R.string.output_isfile); - } - - info.currentDirectory = folder; - - return Tuils.EMPTYSTRING; - } - - @Override - public int helpRes() { - return R.string.help_cd; - } - - @Override - public int minArgs() { - return 1; - } - - @Override - public int maxArgs() { - return 1; - } - - @Override - public int[] argType() { - return new int[]{CommandAbstraction.FILE}; - } - - @Override - public int priority() { - return 4; - } - - @Override - public String onNotArgEnough(ExecutePack info, int nArgs) { - MainPack pack = (MainPack) info; - return pack.res.getString(helpRes()); - } - - @Override - public String onArgNotFound(ExecutePack pack, int index) { - MainPack info = (MainPack) pack; - return info.res.getString(R.string.output_filenotfound); - } - -} diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java index 37ab53247e3d9213535d11d93009863929a13cc7..13d53559fa81b389272a12c01651696bbd07a627 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java @@ -134,7 +134,7 @@ public class cntcts extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } 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 d17e6a6eb659f972d47e593b53311e7b903b6098..47a7e690f851266050020f42af783eeaf1117224 100755 --- 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 @@ -5,6 +5,7 @@ import java.io.File; 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.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -27,6 +28,10 @@ public class config extends ParamCommand { public String exec(ExecutePack pack) { XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1); save.parent().write(save, pack.get(String.class, 2)); + + if(save.label().startsWith("default_app_n")) { + return pack.context.getString(R.string.output_usedefapp); + } return null; } }, @@ -86,7 +91,7 @@ public class config extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/ctrlc.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/ctrlc.java new file mode 100644 index 0000000000000000000000000000000000000000..f8bd9ac29ce139a457bf0d1c316ba9f643c6a31d --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/ctrlc.java @@ -0,0 +1,54 @@ +package ohi.andre.consolelauncher.commands.main.raw; + +import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.commands.CommandAbstraction; +import ohi.andre.consolelauncher.commands.ExecutePack; +import ohi.andre.consolelauncher.commands.main.MainPack; + +/** + * Created by francescoandreuzzi on 26/07/2017. + */ + +public class ctrlc implements CommandAbstraction { + + @Override + public String exec(ExecutePack pack) throws Exception { + ((MainPack) pack).shellManager.reset(); + return null; + } + + @Override + public int minArgs() { + return 0; + } + + @Override + public int maxArgs() { + return 0; + } + + @Override + public int[] argType() { + return new int[0]; + } + + @Override + public int priority() { + return 3; + } + + @Override + public int helpRes() { + return R.string.help_ctrlc; + } + + @Override + public String onArgNotFound(ExecutePack pack, int indexNotFound) { + return null; + } + + @Override + public String onNotArgEnough(ExecutePack pack, int nArgs) { + return null; + } +} 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 a9058c6a668d162d6633f9f8cdf0ae57d3c0b74e..39ee7fa1868867588f251118dc7a95027445de7a 100755 --- 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 @@ -11,6 +11,7 @@ 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.AppsManager; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -25,7 +26,7 @@ public class notifications extends ParamCommand { inc { @Override public String exec(ExecutePack pack) { - NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 1), null, true)); + NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, true)); return null; } @@ -37,7 +38,7 @@ public class notifications extends ParamCommand { exc { @Override public String exec(ExecutePack pack) { - NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 1), null, false)); + NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, false)); return null; } @@ -51,7 +52,7 @@ public class notifications extends ParamCommand { public String exec(ExecutePack pack) { if(pack.args.length < 3) return ((MainPack) pack).context.getString(R.string.help_notifications); try { - NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 2), pack.get(String.class, 1), true)); + NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName(), pack.get(String.class, 1), true)); } catch (Exception e) {} return null; } @@ -74,7 +75,7 @@ public class notifications extends ParamCommand { return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; } }, - text_filer { + text_filter { @Override public String exec(ExecutePack pack) { int id = pack.get(int.class, 1); @@ -96,7 +97,7 @@ public class notifications extends ParamCommand { @Override public String exec(ExecutePack pack) { int id = pack.get(int.class, 1); - NotificationManager.applyFilter(id, pack.get(String.class, 2)); + NotificationManager.applyFilter(id, pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName()); return null; } }, @@ -120,7 +121,11 @@ public class notifications extends ParamCommand { @Override public String exec(ExecutePack pack) { - pack.context.startActivity(new Intent(Build.VERSION.SDK_INT >= 22 ? Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS : "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")); + try { + pack.context.startActivity(new Intent(Build.VERSION.SDK_INT >= 22 ? Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS : "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")); + } catch (Exception e) { + return pack.context.getString(R.string.activity_not_found); + } return null; } }; @@ -152,7 +157,7 @@ public class notifications extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } @@ -189,7 +194,7 @@ public class notifications extends ParamCommand { @Override public String onArgNotFound(ExecutePack pack, int index) { String arg = pack.get(String.class, 0).toLowerCase(); - if(index == 1 && (arg.equals(Param.title_filter.label()) || arg.equals(Param.text_filer.label()) || arg.equals(Param.apply_filter.label()))) { + if(index == 1 && (arg.equals(Param.title_filter.label()) || arg.equals(Param.text_filter.label()) || arg.equals(Param.apply_filter.label()))) { return ((MainPack) pack).context.getString(R.string.invalid_integer); } return ((MainPack) pack).context.getString(R.string.output_appnotfound); diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java index 9971ee260e6a4daa7a31a762f73ffb7fcd4d3a20..39333e5c7b2cbd6f6ab00ebd849427a9e6bb89fa 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java @@ -12,7 +12,6 @@ public class refresh implements CommandAbstraction { public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; info.appsManager.fill(); -// info.preferencesManager.refresh(XMLPrefsManager.ALIAS); info.aliasManager.reload(); info.player.refresh(info.context); ContactManager.refreshContacts(info.contacts, info.context); diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java index 996115af9051033de4ed29d4d7bb387d1beabbb6..556b86344a9515b66d64b39956a54a30c7dd0dce 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java @@ -7,16 +7,13 @@ import android.net.Uri; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import ohi.andre.comparestring.Compare; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; -import ohi.andre.consolelauncher.commands.CommandsPreferences; import ohi.andre.consolelauncher.commands.ExecutePack; import ohi.andre.consolelauncher.commands.main.MainPack; -import ohi.andre.consolelauncher.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.FileManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -110,10 +107,15 @@ public class search extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } + @Override + public boolean supportDefaultParam() { + return true; + } + @Override protected String doThings(ExecutePack pack) { return null; @@ -230,7 +232,7 @@ public class search extends ParamCommand { @Override public int minArgs() { - return 1; + return 0; } @Override @@ -245,21 +247,12 @@ public class search extends ParamCommand { @Override public String onNotArgEnough(ExecutePack pack, int nArgs) { - MainPack info = (MainPack) pack; - return info.res.getString(R.string.output_nothing_found); + return pack.context.getString(helpRes()); } @Override public String onArgNotFound(ExecutePack pack, int index) { // use default param - - MainPack info = (MainPack) pack; - List<String> toSearch = Arrays.asList((String[]) info.args); - String param = info.cmdPrefs.forCommand(getClass().getSimpleName()).get(CommandsPreferences.DEFAULT_PARAM); - Param p = Param.get(param); - if(p != null) { - return p.exec(pack); - } return pack.context.getString(helpRes()); } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java index 06640bd6a9bf146a38b289f262fa8f598f82256b..13a51a9ffb92473b6b4549865574de0ba5fc7865 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java @@ -98,9 +98,13 @@ public class sms extends RedirectCommand { SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(number, null, message, null, null); + cleanup(); + return info.res.getString(R.string.output_smssent); } catch (Exception ex) { - return info.res.getString(R.string.output_error); + cleanup(); + + return ex.toString(); } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java index 45eff343f4e10e176b695237f652903a1fadd6f9..c9ab9552aacbb6916f01d9a43e2b510d6e327124 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java @@ -1,11 +1,9 @@ package ohi.andre.consolelauncher.commands.main.raw; -import android.text.format.Time; - import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.tuils.TimeManager; /** * Created by andre on 03/12/15. @@ -13,29 +11,28 @@ import ohi.andre.consolelauncher.managers.XMLPrefsManager; public class time implements CommandAbstraction { @Override public String exec(ExecutePack pack) { - Time time = new Time(); - time.setToNow(); - return time.format(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format)); + int index = pack.get(int.class, 0); + return TimeManager.replace("%t" + index).toString(); } @Override public int minArgs() { - return 0; + return 1; } @Override public int maxArgs() { - return 0; + return 1; } @Override public int priority() { - return 1; + return 4; } @Override public int[] argType() { - return new int[0]; + return new int[] {CommandAbstraction.INT}; } @Override @@ -45,11 +42,11 @@ public class time implements CommandAbstraction { @Override public String onArgNotFound(ExecutePack info, int index) { - return null; + return info.context.getString(R.string.invalid_integer); } @Override public String onNotArgEnough(ExecutePack info, int nArgs) { - return null; + return TimeManager.replace("%t0").toString(); } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java index 9d009cdfb2980ace035c6e77ab243df7a5ce1830..e572ae0bc93afb91433ad2436c7018e5383f048a 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java @@ -1,5 +1,8 @@ package ohi.andre.consolelauncher.commands.main.raw; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -10,6 +13,7 @@ import ohi.andre.consolelauncher.commands.main.MainPack; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.FileManager; import ohi.andre.consolelauncher.tuils.Tuils; +import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver; /** * Created by francescoandreuzzi on 10/06/2017. @@ -23,7 +27,10 @@ public class tui extends ParamCommand { @Override public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; - info.policy.removeActiveAdmin(info.component); + + DevicePolicyManager policy = (DevicePolicyManager) info.context.getSystemService(Context.DEVICE_POLICY_SERVICE); + ComponentName name = new ComponentName(info.context, PolicyReceiver.class); + policy.removeActiveAdmin(name); Uri packageURI = Uri.parse("package:" + BuildConfig.APPLICATION_ID); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); @@ -104,7 +111,7 @@ public class tui extends ParamCommand { } @Override - protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) { + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { return Param.get(param); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java index a22bc473790deaf8753f0dc89eb8fac622318e1e..881377f4d6b583dcd3dd9ca745c686c0d4a2f6de 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java @@ -7,6 +7,7 @@ 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.managers.AppsManager; import ohi.andre.consolelauncher.tuils.ShellUtils; import ohi.andre.consolelauncher.tuils.Tuils; @@ -15,12 +16,12 @@ public class uninstall implements CommandAbstraction { @Override public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; - String packageName = info.get(String.class, 0); + + String packageName = info.get(AppsManager.LaunchInfo.class, 0).componentName.getPackageName(); if (info.getSu()) { try { return ShellUtils.execCommand("su pm uninstall " + packageName, true, null).toString(); - } catch (Exception e) { - } + } catch (Exception e) {} } Uri packageURI = Uri.parse("package:" + packageName); 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 c28e051528efe8a405bc3a0342ea3c3da7dca397..c87cc1ab070ac384f184ff85be6f68d80368e77b 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java @@ -2,8 +2,11 @@ package ohi.andre.consolelauncher.commands.specific; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; +import ohi.andre.consolelauncher.commands.CommandsPreferences; import ohi.andre.consolelauncher.commands.ExecutePack; +import ohi.andre.consolelauncher.commands.main.MainPack; import ohi.andre.consolelauncher.commands.main.Param; +import ohi.andre.consolelauncher.tuils.SimpleMutableEntry; import ohi.andre.consolelauncher.tuils.Tuils; /** @@ -22,22 +25,29 @@ public abstract class ParamCommand implements CommandAbstraction { String o = doThings(pack); if(o != null) return o; - 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); - } + Param param = pack.get(Param.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) { - try { - return paramForString(param).args(); - } catch (NullPointerException e) { - return null; + public SimpleMutableEntry<Boolean, Param> getParam(MainPack pack, String param) { + Param p = paramForString(pack, param); + if(p == null && supportDefaultParam()) { + return new SimpleMutableEntry<>(true, paramForString(pack, defaultParam(pack))); } + return new SimpleMutableEntry<>(false, p); + } + + public String defaultParam(MainPack pack) { + String def = pack.cmdPrefs.forCommand(getClass().getSimpleName()).get(CommandsPreferences.DEFAULT_PARAM); + if(!def.startsWith("-")) def = "-" + def; + return def; } public abstract String[] params(); - protected abstract Param paramForString(String param); + protected abstract Param paramForString(MainPack pack, String param); protected abstract String doThings(ExecutePack pack); + public boolean supportDefaultParam() { + return false; + } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/RedirectCommand.java b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/RedirectCommand.java old mode 100755 new mode 100644 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 4ddea527b023da3641cb00dba717d04d33bac643..7a8280bdb7ec79c214ff8476e4b87a2dc0662885 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java @@ -1,21 +1,20 @@ package ohi.andre.consolelauncher.managers; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.os.AsyncTask; import android.os.Build; -import android.os.Handler; import android.support.annotation.NonNull; -import android.text.format.Time; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -31,14 +30,17 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import ohi.andre.comparestring.Compare; import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; +import ohi.andre.consolelauncher.tuils.interfaces.Suggester; import static ohi.andre.consolelauncher.managers.XMLPrefsManager.VALUE_ATTRIBUTE; import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile; @@ -58,6 +60,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private final String SHOW_ATTRIBUTE = "show"; private Context context; + private PackageManager pkgManager; private File folder; private AppsHolder appsHolder; @@ -71,6 +74,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private static XMLPrefsManager.XmlPrefsElement instance = null; + private XMLPrefsManager.XMLPrefsList defaultApps; + public enum Options implements XMLPrefsManager.XMLPrefsSave { default_app_n1 { @@ -104,8 +109,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } }; - static final String MOST_USED = "most_used"; - static final String NULL = "null"; + public static final String MOST_USED = "most_used"; + public static final String NULL = "null"; @Override public String label() { @@ -140,7 +145,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { @Override public XMLPrefsManager.XMLPrefsList getValues() { - return null; + return defaultApps; } private BroadcastReceiver appsBroadcast = new BroadcastReceiver() { @@ -148,27 +153,41 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String data = intent.getData().getSchemeSpecificPart(); - if (action.equals(Intent.ACTION_PACKAGE_ADDED)) - add(data); - else - remove(data); + if (action.equals(Intent.ACTION_PACKAGE_ADDED)) { + appInstalled(data); + } + else { + appUninstalled(data); + } } }; - public AppsManager(Context context, Outputable outputable) { + public AppsManager(Context context, Outputable outputable, final Suggester s) { instance = this; this.context = context; + this.pkgManager = context.getPackageManager(); + this.outputable = outputable; this.preferences = context.getSharedPreferences(PREFS, 0); this.editor = preferences.edit(); this.folder = Tuils.getFolder(); + initAppListener(context); - fill(); + new AsyncTask<Void,Void,Void>() { + @Override + protected Void doInBackground(Void... params) { + fill(); + return null; + } - initAppListener(context); + @Override + protected void onPostExecute(Void aVoid) { + s.requestUpdate(); + } + }.execute(); } private void initAppListener(Context c) { @@ -181,18 +200,17 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } public void fill() { - Map<String, LaunchInfo> map = createAppMap(context.getPackageManager()); - List<LaunchInfo> shownApps = new ArrayList<>(); + List<LaunchInfo> allApps = createAppMap(context.getPackageManager()); hiddenApps = new ArrayList<>(); - XMLPrefsManager.XMLPrefsList values = new XMLPrefsManager.XMLPrefsList(); - Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>(); for(XMLPrefsManager.XMLPrefsSave s : Options.values()) { String r = s.hasReplaced(); if(r != null) replacedValues.put(r, s); } + defaultApps = new XMLPrefsManager.XMLPrefsList(); + try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -225,7 +243,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { String nn = node.getNodeName(); int nodeIndex = Tuils.find(nn, (List) enums); if(nodeIndex != -1) { - values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); + defaultApps.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); for(int en = 0; en < enums.size(); en++) { if(enums.get(en).label().equals(nn)) { @@ -249,7 +267,30 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { boolean shown = !e.hasAttribute(SHOW_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(SHOW_ATTRIBUTE)); if(!shown) { - hiddenApps.add(map.remove(nn)); + ComponentName name = null; + + String[] split = nn.split("-"); + if(split.length >= 2) { + name = new ComponentName(split[0], split[1]); + } else if(split.length == 1) { + if(split[0].contains("Activity")) { + for(LaunchInfo i : allApps) { + if(i.componentName.getClassName().equals(split[0])) name = i.componentName; + } + } else { + for(LaunchInfo i : allApps) { + if(i.componentName.getPackageName().equals(split[0])) name = i.componentName; + } + } + } + + if(name == null) continue; + + LaunchInfo removed = AppUtils.findLaunchInfoWithComponent(allApps, name); + if(removed != null) { + allApps.remove(removed); + hiddenApps.add(removed); + } } } } @@ -268,75 +309,87 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { em.setAttribute(VALUE_ATTRIBUTE, value); root.appendChild(em); - values.add(s.label(), value); + defaultApps.add(s.label(), value); } writeTo(d, file); } - } catch (Exception e) {} + } catch (Exception e) { + Tuils.write(Tuils.getStackTrace(e)); + } for(Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) { - if (entry.getValue() instanceof Integer) { - LaunchInfo info = map.get(entry.getKey()); - if(info != null) info.launchedTimes = (Integer) entry.getValue(); - } - } + Object value = entry.getValue(); + if (value instanceof Integer) { + ComponentName name = null; + + String[] split = entry.getKey().split("-"); + if(split.length >= 2) { + name = new ComponentName(split[0], split[1]); + } else if(split.length == 1) { + if(split[0].contains("Activity")) { + for(LaunchInfo i : allApps) { + if(i.componentName.getClassName().equals(split[0])) name = i.componentName; + } + } else { + for(LaunchInfo i : allApps) { + if(i.componentName.getPackageName().equals(split[0])) name = i.componentName; + } + } + } - for (Map.Entry<String, LaunchInfo> stringLaunchInfoEntry : map.entrySet()) { - LaunchInfo app = stringLaunchInfoEntry.getValue(); - shownApps.add(app); + if(name == null) continue; + + LaunchInfo info = AppUtils.findLaunchInfoWithComponent(allApps, name); + if(info != null) info.launchedTimes = (Integer) value; + } } - appsHolder = new AppsHolder(shownApps, values); + appsHolder = new AppsHolder(allApps, defaultApps); AppUtils.checkEquality(hiddenApps); } - private Map<String, LaunchInfo> createAppMap(PackageManager mgr) { - Map<String, LaunchInfo> map = new HashMap<>(); + private List<LaunchInfo> createAppMap(PackageManager mgr) { + List<LaunchInfo> infos = new ArrayList<>(); - Intent i = new Intent(Intent.ACTION_MAIN, null); + Intent i = new Intent(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); - List<ResolveInfo> infos = mgr.queryIntentActivities(i, 0); - for (ResolveInfo info : infos) { - LaunchInfo app = new LaunchInfo(info.activityInfo.packageName, info.loadLabel(mgr).toString()); - map.put(info.activityInfo.packageName, app); + List<ResolveInfo> main; + try { + main = mgr.queryIntentActivities(i, 0); + } catch (Exception e) { + return infos; } -// Intent dialerIntent = new Intent(Intent.ACTION_DIAL); -// ComponentName dialer = dialerIntent.resolveActivity(mgr); -// -// Intent contactsIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); -// ComponentName contacts = contactsIntent.resolveActivity(mgr); -// -// if(dialer != null && contacts != null && dialer.getPackageName().equals(contacts.getPackageName())) { -// map.remove(dialer.getPackageName()); -// -// map.put(dialer.getPackageName() + ".1", new LaunchInfo(dialer.getPackageName(), dialer.getClassName(), "Dialer")); -// map.put(contacts.getPackageName() + ".2", new LaunchInfo(contacts.getPackageName(), contacts.getClassName(), "Contacts")); -// } + for (ResolveInfo ri : main) infos.add(new LaunchInfo(ri.activityInfo.packageName, ri.activityInfo.name, ri.loadLabel(mgr).toString())); - return map; + return infos; } - private void add(String packageName) { + private void appInstalled(String packageName) { try { PackageManager manager = context.getPackageManager(); - ApplicationInfo info = manager.getApplicationInfo(packageName, 0); - LaunchInfo app = new LaunchInfo(packageName, info.loadLabel(manager).toString(), 0); + + Intent i = manager.getLaunchIntentForPackage(packageName); + if(i == null) return; + + ComponentName name = i.getComponent(); + String activity = name.getClassName(); + String label = manager.getActivityInfo(name, 0).loadLabel(manager).toString(); + + LaunchInfo app = new LaunchInfo(packageName, activity, label); appsHolder.add(app); + outputable.onOutput(context.getString(R.string.app_installed) + Tuils.SPACE + packageName); } catch (NameNotFoundException e) {} } - private void remove(String packageName) { - LaunchInfo info = AppUtils.findLaunchInfo(packageName, appsHolder.getApps()); - if(info != null) { - appsHolder.remove(info); - appsHolder.update(true); - } + private void appUninstalled(String packageName) { + List<LaunchInfo> infos = AppUtils.findLaunchInfosWithPackage(packageName, appsHolder.getApps()); + for(LaunchInfo i : infos) appsHolder.remove(i); } - public String findPackage(String name, int type) { + public LaunchInfo findLaunchInfoWithLabel(String label, int type) { List<LaunchInfo> appList; if(type == SHOWN_APPS) { appList = appsHolder.getApps(); @@ -344,60 +397,29 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { appList = hiddenApps; } - return findPackage(appList, name); + return AppUtils.findLaunchInfoWithLabel(appList, label); } - public String findPackage(List<LaunchInfo> appList, String name) { - name = Compare.removeSpaces(name); - for(LaunchInfo info : appList) { - if(name.equalsIgnoreCase(Compare.removeSpaces(info.publicLabel))) { - return info.packageName; - } - } - - return null; - } - - public Intent getIntent(String packageName) { - LaunchInfo info = AppUtils.findLaunchInfo(packageName, appsHolder.getApps()); - if(info == null) { - return null; - } - + public Intent getIntent(LaunchInfo info) { info.launchedTimes++; appsHolder.requestSuggestionUpdate(info); - editor.putInt(packageName, info.launchedTimes); + editor.putInt(info.componentName.getPackageName() + "-" + info.componentName.getClassName(), info.launchedTimes); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { editor.apply(); } else { editor.commit(); } -// if(info.activityName == null) - return context.getPackageManager().getLaunchIntentForPackage(packageName); -// else { -// Intent i = new Intent(); -// i.setClassName(info.packageName, info.activityName); -// i.putExtra("forResult", true); -// return i; -// } - } + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setComponent(info.componentName); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - public String getAppName(String packageName) { - for(LaunchInfo info : appsHolder.getApps()) { - if(info.packageName.equals(packageName)) return info.publicLabel; - } - return "null"; + return intent; } - public String hideApp(String packageName) { - LaunchInfo info = AppUtils.findLaunchInfo(packageName, appsHolder.getApps()); - if(info == null) { - return null; - } - - set(new File(folder, PATH), NAME, info.packageName, new String[] {SHOW_ATTRIBUTE}, new String[] {false + Tuils.EMPTYSTRING}); + public String hideActivity(LaunchInfo info) { + set(new File(folder, PATH), NAME, info.componentName.getPackageName() + "-" + info.componentName.getClassName(), new String[] {SHOW_ATTRIBUTE}, new String[] {false + Tuils.EMPTYSTRING}); appsHolder.remove(info); appsHolder.update(true); @@ -407,13 +429,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { return info.publicLabel; } - public String unhideApp(String packageName) { - LaunchInfo info = AppUtils.findLaunchInfo(packageName, hiddenApps); - if(info == null) { - return null; - } - - set(new File(folder, PATH), NAME, info.packageName, new String[] {SHOW_ATTRIBUTE}, new String[] {true + Tuils.EMPTYSTRING}); + public String showActivity(LaunchInfo info) { + set(new File(folder, PATH), NAME, info.componentName.getPackageName() + "-" + info.componentName.getClassName(), new String[] {SHOW_ATTRIBUTE}, new String[] {true + Tuils.EMPTYSTRING}); hiddenApps.remove(info); appsHolder.add(info); @@ -423,11 +440,13 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } public List<String> getAppLabels() { - return appsHolder.getAppLabels(); + if(appsHolder != null) { + return appsHolder.getAppLabels(); + } return new ArrayList<>(); } public List<String> getHiddenAppsLabels() { - return AppUtils.labelList(hiddenApps); + return AppUtils.labelList(hiddenApps, true); } public String[] getSuggestedApps() { @@ -436,7 +455,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } public String printApps(int type) { - List<String> labels = type == SHOWN_APPS ? appsHolder.appLabels : AppUtils.labelList(hiddenApps); + List<String> labels = type == SHOWN_APPS ? appsHolder.appLabels : AppUtils.labelList(hiddenApps, true); return AppUtils.printApps(labels); } @@ -450,25 +469,15 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { public static class LaunchInfo { - public String packageName; - public String activityName; - public String publicLabel; - public int launchedTimes; + public ComponentName componentName; - public LaunchInfo(String packageName, String publicLabel, int launchedTimes) { - this.packageName = packageName; - this.publicLabel = publicLabel; - this.launchedTimes = launchedTimes; - } + public String publicLabel; + public int launchedTimes = 0; - public LaunchInfo(String packageName, String publicLabel) { - this.packageName = packageName; - this.publicLabel = publicLabel; - } + public LaunchInfo(String packageName, String activityName, String label) { + this.componentName = new ComponentName(packageName, activityName); - public LaunchInfo(String packageName, String activityName, String publicLabel) { - this(packageName, publicLabel); - this.activityName = activityName; + this.publicLabel = label; } @Override @@ -479,19 +488,25 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { if(o instanceof LaunchInfo) { LaunchInfo i = (LaunchInfo) o; - return (this.packageName == null && i.packageName == null) || (this.packageName != null && i.packageName != null && this.packageName.equals(i.packageName)); - } else if(o instanceof String) return this.packageName != null && this.packageName.equals(o); + try { + return this.componentName.equals(i.componentName); + } catch (Exception e) { + return false; + } + } + else if(o instanceof ComponentName) { + return this.componentName.equals(o); + } + else if(o instanceof String) { + return this.componentName.getClassName().equals(o); + } + return false; } @Override public String toString() { - return packageName + " - " + publicLabel + ", n=" + launchedTimes; - } - - @Override - public int hashCode() { - return packageName.hashCode(); + return componentName.getPackageName() + " - " + componentName.getClassName() + " --> " + publicLabel + ", n=" + launchedTimes; } } @@ -509,7 +524,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private List<SuggestedApp> suggested; private int lastWriteable = -1; - public SuggestedAppMgr(XMLPrefsManager.XMLPrefsList values) { + public SuggestedAppMgr(XMLPrefsManager.XMLPrefsList values, List<LaunchInfo> apps) { suggested = new ArrayList<>(); final String PREFIX = "default_app_n"; @@ -517,17 +532,36 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { String vl = values.get(Options.valueOf(PREFIX + (count + 1))).value; if(vl.equals(Options.NULL)) continue; - if(vl.equals(Options.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED)); + if(vl.equals(Options.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED, count + 1)); else { - LaunchInfo info = AppUtils.findLaunchInfo(vl, infos); + ComponentName name = null; + + String[] split = vl.split("-"); + if(split.length >= 2) { + name = new ComponentName(split[0], split[1]); + } else if(split.length == 1) { + if(split[0].contains("Activity")) { + for(LaunchInfo i : apps) { + if(i.componentName.getClassName().equals(split[0])) name = i.componentName; + } + } else { + for(LaunchInfo i : apps) { + if(i.componentName.getPackageName().equals(split[0])) name = i.componentName; + } + } + } + + if(name == null) continue; + + LaunchInfo info = AppUtils.findLaunchInfoWithComponent(infos, name); if(info == null) continue; - suggested.add(new SuggestedApp(info, USER_DEFINIED)); + suggested.add(new SuggestedApp(info, USER_DEFINIED, count + 1)); } } sort(); - handler.postDelayed(runnable, 1000 * 60 * 5); +// handler.postDelayed(runnable, 1000 * 60 * 5); } public int size() { @@ -553,123 +587,83 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { suggested.get(index).change(info); } - public int indexOf(LaunchInfo info) { - return suggested.indexOf(info); - } - public void attemptInsertSuggestion(LaunchInfo info) { -// Log.e("andre", "attempt: " + info.toString()); - if (info.launchedTimes == 0 || lastWriteable == -1) { return; } -// Log.e("andre", String.valueOf(lastWriteable)); - - int i = Tuils.find(info, suggested); - if(i == -1) { - int index = indexOf(info); - if (index == -1) { - for (int count = 0; count <= lastWriteable; count++) { -// Log.e("andre", "loop: " + count); - - SuggestedApp app = get(count); -// Log.e("andre", app.toString()); - - if (app.app == null || info.launchedTimes > app.app.launchedTimes) { -// Log.e("andre", "yes"); - SuggestedApp s = suggested.get(count); + int index = Tuils.find(info, suggested); + if (index == -1) { + for (int count = 0; count <= lastWriteable; count++) { + SuggestedApp app = get(count); -// Log.e("andre", "before it was: " + s.toString()); -// Log.e("andre", suggested.toString()); + if (app.app == null || info.launchedTimes > app.app.launchedTimes) { + SuggestedApp s = suggested.get(count); - LaunchInfo before = s.app; - s.change(info); + LaunchInfo before = s.app; + s.change(info); -// Log.e("andre", suggested.toString()); - - if(before != null) { -// Log.e("andre", "rec"); - attemptInsertSuggestion(before); - } - - break; + if(before != null) { + attemptInsertSuggestion(before); } + + break; } } } -// else { -// Log.e("andre", "index == -1"); -// Log.e("andre", suggested.toString()); -// } sort(); -// Log.e("andre", suggested.toString()); } -// public void updateSuggestion(LaunchInfo info) { -// int index = indexOf(info); -// -// if(index == -1) { -// attemptInsertSuggestion(info); -// } else if(index == 0) { -// return; -// } else { -// for(int count = 0; count < index; count++) { -// if(get(count).type == NULL ) { -// if(count == lastNull()) { -// suggestedApps[count] = info; -// return; -// } -// } else if(suggestedApps[count].launchedTimes < info.launchedTimes) { -// -// System.arraycopy(suggestedApps, count, suggestedApps, count + 1, index - count); -// suggestedApps[count] = info; -// -// return; -// } -// } -// } -// } - public List<String> labels() { List<LaunchInfo> list = new ArrayList<>(); - for(int count = 0; count < suggested.size(); count++) { - SuggestedApp app = suggested.get(count); - if(app.type != NULL && app.app != null) list.add(app.app); - } - return AppUtils.labelList(list); - } - private Handler handler = new Handler(); - private Runnable runnable = new Runnable() { - @Override - public void run() { - if(duplicates()) { - fillSuggestions(); + List<SuggestedApp> cp = new ArrayList<>(suggested); + Collections.sort(cp, new Comparator<SuggestedApp>() { + @Override + public int compare(SuggestedApp o1, SuggestedApp o2) { + return o1.index - o2.index; } - handler.postDelayed(runnable, 1000 * 60 * 2); - } + }); - private boolean duplicates() { - for (int count =0; count < size(); count++) - for (int count2 = count+1 ; count2 < size(); count2++) - if (count != count2 && get(count) == get(count2)) - return true; - return false; + for(int count = 0; count < cp.size(); count++) { + SuggestedApp app = cp.get(count); + if(app.type != NULL && app.app != null) list.add(app.app); } - }; + return AppUtils.labelList(list, false); + } + +// private Handler handler = new Handler(); +// private Runnable runnable = new Runnable() { +// @Override +// public void run() { +// if(duplicates()) { +// fillSuggestions(); +// } +// handler.postDelayed(runnable, 1000 * 60 * 2); +// } +// +// private boolean duplicates() { +// for (int count =0; count < size(); count++) +// for (int count2 = count+1 ; count2 < size(); count2++) +// if (count != count2 && get(count) == get(count2)) +// return true; +// return false; +// } +// }; private class SuggestedApp implements Comparable { int type; LaunchInfo app; + int index; - public SuggestedApp(int type) { - this(null, type); + public SuggestedApp(int type, int index) { + this(null, type, index); } - public SuggestedApp(LaunchInfo info, int type) { + public SuggestedApp(LaunchInfo info, int type, int index) { this.app = info; this.type = type; + this.index = index; } public SuggestedApp change(LaunchInfo info) { @@ -710,20 +704,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } return this.app.launchedTimes - other.app.launchedTimes; } - - @Override - public String toString() { - switch (type) { - case USER_DEFINIED: - return "userdef " + (app != null ? app.packageName : ""); - case MOST_USED: - return "most used " + (app != null ? app.packageName : ""); - case NULL: - return "null"; - } - - return null; - } } } @@ -741,7 +721,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } public void add(LaunchInfo info) { - if(! infos.contains(info) ) { + if(!infos.contains(info) ) { infos.add(info); update(false); } @@ -759,11 +739,11 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } private void fillLabels() { - appLabels = AppUtils.labelList(infos); + appLabels = AppUtils.labelList(infos, true); } private void fillSuggestions() { - suggestedAppMgr = new SuggestedAppMgr(values); + suggestedAppMgr = new SuggestedAppMgr(values, getApps()); for(LaunchInfo info : infos) { suggestedAppMgr.attemptInsertSuggestion(info); } @@ -773,15 +753,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { suggestedAppMgr.attemptInsertSuggestion(info); } -// private int lastNull() { -// for(int count = suggestedApps.length - 1; count >= 0; count--) { -// if(suggestedApps[count] == null) { -// return count; -// } -// } -// return -1; -// } - private void update(boolean refreshSuggestions) { AppUtils.checkEquality(infos); sort(); @@ -807,6 +778,28 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { public static class AppUtils { + public static LaunchInfo findLaunchInfoWithComponent(List<LaunchInfo> appList, ComponentName name) { + if(name == null) return null; + + for(LaunchInfo i : appList) { + if(i.equals(name)) return i; + } + + return null; + } + + public static LaunchInfo findLaunchInfoWithLabel(List<LaunchInfo> appList, String label) { + for(LaunchInfo i : appList) if(i.publicLabel.equalsIgnoreCase(label.trim())) return i; + return null; + } + + private static List<LaunchInfo> findLaunchInfosWithPackage(String packageName, List<LaunchInfo> infos) { + List<LaunchInfo> result = new ArrayList<>(); + for(LaunchInfo info : infos) if (info.componentName.getPackageName().equals(packageName)) result.add(info); + + return result; + } + public static void checkEquality(List<LaunchInfo> list) { for (LaunchInfo info : list) { @@ -827,12 +820,35 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } if (info.publicLabel.toLowerCase().replace(Tuils.SPACE, Tuils.EMPTYSTRING).equals(info2.publicLabel.toLowerCase().replace(Tuils.SPACE, Tuils.EMPTYSTRING))) { - list.set(count, new LaunchInfo(info2.packageName, getNewLabel(info2.publicLabel, info2.packageName), info2.launchedTimes)); +// there are two activities in the same app loadlabel gives the same result + if(info.componentName.getPackageName().equals(info2.componentName.getPackageName())) { + info.publicLabel = insertActivityName(info.publicLabel, info.componentName.getClassName()); + info2.publicLabel = insertActivityName(info2.publicLabel, info2.componentName.getClassName()); + } + else { + info2.publicLabel = getNewLabel(info2.publicLabel, info2.componentName.getClassName()); + } } } } } + static Pattern activityPattern = Pattern.compile("activity", Pattern.CASE_INSENSITIVE); + public static String insertActivityName(String oldLabel, String activityName) { + String name; + + int lastDot = activityName.lastIndexOf("."); + if(lastDot == -1) { + name = activityName; + } else { + name = activityName.substring(lastDot + 1); + } + + name = activityPattern.matcher(name).replaceAll(Tuils.EMPTYSTRING); + name = name.substring(0,1).toUpperCase() + name.substring(1); + return oldLabel + Tuils.SPACE + "-" + Tuils.SPACE + name; + } + public static String getNewLabel(String oldLabel, String packageName) { try { @@ -872,9 +888,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { builder.append("vrs: ").append(info.versionCode).append(" - ").append(info.versionName).append(Tuils.NEWLINE).append(Tuils.NEWLINE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { - Time time = new Time(); - time.set(info.firstInstallTime); - builder.append("Install: ").append(time.format(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format))).append(Tuils.NEWLINE).append(Tuils.NEWLINE); + builder.append("Install: ").append(TimeManager.replace("%t0", info.firstInstallTime, SkinManager.COLOR_NOT_SET)).append(Tuils.NEWLINE).append(Tuils.NEWLINE); } ActivityInfo[] a = info.activities; @@ -908,15 +922,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { return builder.toString(); } - protected static LaunchInfo findLaunchInfo(String packageName, List<LaunchInfo> infos) { - for(LaunchInfo info : infos) { - if(info.packageName.equals(packageName)) { - return info; - } - } - return null; - } - public static String printApps(List<String> apps) { if(apps.size() == 0) { return apps.toString(); @@ -936,12 +941,12 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { return Tuils.toPlanString(list); } - public static List<String> labelList(List<LaunchInfo> infos) { + public static List<String> labelList(List<LaunchInfo> infos, boolean sort) { List<String> labels = new ArrayList<>(); for (LaunchInfo info : infos) { labels.add(info.publicLabel); } - Collections.sort(labels); + if(sort) Collections.sort(labels); return labels; } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java index 73455dd9907f7d904780b018e239765dd1550fad..978deb1e361b2d62e6c1d99602925bd156a06dba 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java @@ -28,8 +28,6 @@ public class ContactManager { public ContactManager(Context context) { this.context = context; - - refreshContacts(this, context); } public static void refreshContacts(ContactManager mgr, Context context) { @@ -37,6 +35,7 @@ public class ContactManager { if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS}, LauncherActivity.COMMAND_SUGGESTION_REQUEST_PERMISSION); + mgr.contacts = contacts; return; } @@ -103,16 +102,22 @@ public class ContactManager { } public List<String> listNames() { + if(contacts == null || contacts.size() == 0) refreshContacts(this, context); + List<String> names = new ArrayList<>(); for(Contact c : contacts) names.add(c.name); return names; } public List<Contact> getContacts() { + if(contacts == null || contacts.size() == 0) refreshContacts(this, context); + return contacts; } public List<String> listNamesAndNumbers() { + if(contacts == null || contacts.size() == 0) refreshContacts(this, context); + List<String> c = new ArrayList<>(); for(int count = 0; count < contacts.size(); count++) { @@ -209,6 +214,8 @@ public class ContactManager { } public String findNumber(String name, int minRate) { + if(contacts == null) refreshContacts(this, context); + String mostSuitable = Compare.similarString(listNames(), name, minRate, USE_SCROLL_COMPARE); if(mostSuitable == null) return null; diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ShellManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ShellManager.java new file mode 100644 index 0000000000000000000000000000000000000000..2636bc14ed0ee8894212d5c4511e7ca5dfe16281 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ShellManager.java @@ -0,0 +1,259 @@ +package ohi.andre.consolelauncher.managers; + +import android.os.Environment; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import ohi.andre.consolelauncher.tuils.StoppableThread; +import ohi.andre.consolelauncher.tuils.Tuils; +import ohi.andre.consolelauncher.tuils.interfaces.Outputable; + +/** + * Created by francescoandreuzzi on 25/07/2017. + */ + +public class ShellManager { + + Process p; + Thread t; + + File file; + + InputStream output; + InputStream error; + OutputStream cmdStream; + + Outputable outputable; + + public ShellManager(Outputable outputable) { + this.outputable = outputable; + + init(Environment.getExternalStorageDirectory()); + } + + private void init(File f) { + try { + p = Runtime.getRuntime().exec("/system/bin/sh"); + } catch (IOException e) { + p = null; + return; + } + + this.file = f; + + output = p.getInputStream(); + error = p.getErrorStream(); + cmdStream = p.getOutputStream(); + + new Thread() { + @Override + public void run() { + super.run(); + + cd(file); + } + }.start(); + } + + public String cmd(final String cmd, final boolean write) { + + if(t != null && t.isAlive()) { + try { + synchronized (t) { + t.wait(); + } + } catch (InterruptedException e) {} + } + + try { + cmdStream.write((cmd + Tuils.NEWLINE).getBytes()); + cmdStream.write(("echo EOF" + Tuils.NEWLINE).getBytes()); + } catch (IOException e) { + return null; + } + + final String[] outputMsg = {Tuils.EMPTYSTRING}; + + t = new StoppableThread() { + String line = Tuils.EMPTYSTRING; + String errorMsg = Tuils.EMPTYSTRING; + + @Override + public void run() { + super.run(); + + do { + if(Thread.currentThread().isInterrupted()) return; + + int n = 0; + try { + n = output.read(); + } catch (IOException e) {} + + if(n == -1) continue; + + char c = (char) n; + if(c == '\n') { + if(line.equals("EOF")) break; + else { + if(write) outputable.onOutput(line); + outputMsg[0] = outputMsg[0] + Tuils.EMPTYSTRING + line; + line = Tuils.EMPTYSTRING; + } + } else { + line = line + c; + } + } while (true); + + if(write) { + try { + int available = error.available(); + for (int i = 0; i < available; i++) errorMsg = errorMsg + (char) error.read(); + } catch (IOException e) {} + + if(Thread.currentThread().isInterrupted()) return; + + outputable.onOutput(errorMsg); + } + + + if(cmd.startsWith("cd ")) { + line = Tuils.EMPTYSTRING; + +// update the current dir + try { + cmdStream.write(("pwd" + Tuils.NEWLINE).getBytes()); + } catch (IOException e) {} + + do { + int n = 0; + try { + n = output.read(); + } catch (IOException e) {} + + if(n == -1) continue; + char c = (char) n; + + if(c == '\n') { + file = new File(line); + break; + } else { + line = line + c; + } + } while (true); + } + + synchronized (outputMsg) { + outputMsg.notify(); + } + + synchronized (this) { + this.notify(); + } + } + }; + + t.start(); + + try { + synchronized (outputMsg) { + outputMsg.wait(); + } + } catch (InterruptedException e) {} + + return outputMsg[0]; + } + + public void cd(File file) { + cmd("cd" + Tuils.SPACE + file.getAbsolutePath(), false); + } + + public File currentDir() { + return file == null ? Environment.getExternalStorageDirectory() : file; + } + + public void reset() { + + if(this.p != null) { + p.destroy(); + p = null; + + try { + output.close(); + error.close(); + cmdStream.close(); + } catch (IOException e) {} + + output = null; + error = null; + cmdStream = null; + } + + if(this.t != null) { + t.interrupt(); + t = null; + } + + init(this.file); + } + + public void destroy() { + if(t != null) t.interrupt(); + if(p != null) { + p.destroy(); + + try { + output.close(); + error.close(); + cmdStream.close(); + } catch (IOException e) {} + } + } + +// public boolean sendSigint() { +// +// if(t != null) { +// t.interrupt(); +// +// int pid = getPid(); +// if(pid != 0) { +// +// try { +// p.destroy(); +// Runtime.getRuntime().exec("kill -SIGINT" + Tuils.SPACE + pid); +// } catch (IOException e) {} +// } +// +// try { +// int av = output.available(); +// for(int i = 0; i < av; i++) { +// output.read(); +// } +// } catch (IOException e) {} +// +// try { +// int av = error.available(); +// for(int i = 0; i < av; i++) { +// error.read(); +// } +// } catch (IOException e) {} +// +// return true; +// } +// return false; +// } +// +// public int getPid() { +// String s = p.toString(); +// String sPid = s.replaceAll("Process", Tuils.EMPTYSTRING).replace("[", Tuils.EMPTYSTRING).replace("]", Tuils.EMPTYSTRING).replaceAll("pid=", Tuils.EMPTYSTRING); +// +// try { +// return Integer.parseInt(sPid); +// } catch (Exception e) { +// return 0; +// } +// } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java index d1c65d6df402b7f04bcdf1ca1f4c3702d4e11169..153aeffecfa94d9a7475172aba926f3bef385905 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java @@ -30,8 +30,7 @@ public class SkinManager implements Parcelable { public boolean useSystemWp, showSuggestions, systemFont, inputBottom, showSubmit, manyColorsBattery; - public String username = null, prefix; - public boolean showUsernameAndDeviceWhenEmpty = true, showUsername = false, showDeviceInSessionInfo = false, showPath = true; + public String username = null, prefix = null, ssnInfoFormat = null; private int suggDefaultText, suggDefaultBg, suggAliasText, suggAliasBg, suggSongText, suggSongBg, suggContactText, suggContactBg, suggAppText, suggAppBg, suggCmdText, suggCmdBg, suggFileText, suggFileBg; private boolean transparentSuggestions; @@ -75,13 +74,8 @@ public class SkinManager implements Parcelable { } username = XMLPrefsManager.get(String.class, XMLPrefsManager.Ui.username); - showUsernameAndDeviceWhenEmpty = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_ssninfo); - if(showUsernameAndDeviceWhenEmpty) { - showUsername = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_username_ssninfo); - showDeviceInSessionInfo = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_devicename_ssninfo); - showPath = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_path_ssninfo); - } + ssnInfoFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.session_info_format); showSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.show_suggestions); if (showSuggestions) { @@ -137,10 +131,7 @@ public class SkinManager implements Parcelable { showSubmit = in.readByte() != 0; manyColorsBattery = in.readByte() != 0; username = in.readString(); - showUsernameAndDeviceWhenEmpty = in.readByte() != 0; - showUsername = in.readByte() != 0; - showDeviceInSessionInfo = in.readByte() != 0; - showPath = in.readByte() != 0; + ssnInfoFormat = in.readString(); suggDefaultText = in.readInt(); suggDefaultBg = in.readInt(); suggAliasText = in.readInt(); @@ -262,10 +253,7 @@ public class SkinManager implements Parcelable { dest.writeByte((byte) (showSubmit ? 1 : 0)); dest.writeByte((byte) (manyColorsBattery ? 1 : 0)); dest.writeString(username); - dest.writeByte((byte) (showUsernameAndDeviceWhenEmpty ? 1 : 0)); - dest.writeByte((byte) (showUsername ? 1 : 0)); - dest.writeByte((byte) (showDeviceInSessionInfo ? 1 : 0)); - dest.writeByte((byte) (showPath ? 1 : 0)); + dest.writeString(ssnInfoFormat); dest.writeInt(suggDefaultText); dest.writeInt(suggDefaultBg); dest.writeInt(suggAliasText); 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 af1a5231f87742bce7f44e4c1eb6de97a1059907..80bf0b843dd4ad02dcbdfb361cfe6a39c683f254 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java @@ -8,10 +8,8 @@ import android.text.Layout; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; -import android.text.format.Time; import android.text.method.ScrollingMovementMethod; import android.text.style.ForegroundColorSpan; -import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; @@ -27,6 +25,7 @@ import java.util.List; import ohi.andre.consolelauncher.UIManager; import ohi.andre.consolelauncher.commands.main.MainPack; import ohi.andre.consolelauncher.commands.main.raw.clear; +import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; /*Copyright Francesco Andreuzzi @@ -51,6 +50,7 @@ public class TerminalManager { public static final int CATEGORY_INPUT = 10; public static final int CATEGORY_OUTPUT = 11; public static final int CATEGORY_NOTIFICATION = 12; + public static final int CATEGORY_GENERAL = 13; private long lastEnter; @@ -95,9 +95,6 @@ public class TerminalManager { } }; - private String timeFormat; - private Time time; - private String inputFormat; private String outputFormat; @@ -115,9 +112,6 @@ public class TerminalManager { this.clearAfterCmds = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.clear_after_cmds); this.maxLines = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.max_lines); - timeFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format); - time = new Time(); - inputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.input_format); outputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.output_format); @@ -270,7 +264,7 @@ public class TerminalManager { private void setupNewInput() { mInputView.setText(Tuils.EMPTYSTRING); - if(defaultHint && mSkinManager.showPath) { + if(defaultHint) { mInputView.setHint(Tuils.getHint(mSkinManager, mainPack.currentDirectory.getAbsolutePath())); } @@ -354,7 +348,6 @@ public class TerminalManager { final String FORMAT_INPUT = "%i"; final String FORMAT_OUTPUT = "%o"; final String FORMAT_PREFIX = "%p"; - final String FORMAT_TIME = "%t"; final String FORMAT_NEWLINE = "%n"; private void writeToView(final CharSequence text, final int type) { @@ -362,16 +355,14 @@ public class TerminalManager { @Override public void run() { - mTerminalView.append(TextUtils.concat(Tuils.NEWLINE, getFinalText(text, type))); + CharSequence s = getFinalText(text, type); + mTerminalView.append(TextUtils.concat(Tuils.NEWLINE, s)); scrollToEnd(); } }); } + private CharSequence getFinalText(CharSequence t, int type) { - time.setToNow(); - String tm = time.format(timeFormat); - SpannableString st = new SpannableString(tm); - st.setSpan(new ForegroundColorSpan(mSkinManager.time_color), 0, tm.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); CharSequence s; switch (type) { @@ -383,10 +374,11 @@ public class TerminalManager { SpannableString si = new SpannableString(inputFormat); si.setSpan(new ForegroundColorSpan(mSkinManager.inputColor), 0, inputFormat.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - s = TextUtils.replace(si, - new String[] {FORMAT_INPUT, FORMAT_PREFIX, FORMAT_TIME, FORMAT_NEWLINE, - FORMAT_INPUT.toUpperCase(), FORMAT_PREFIX.toUpperCase(), FORMAT_TIME.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, - new CharSequence[] {t, su ? suPrefix : prefix, st, Tuils.NEWLINE, t, su ? suPrefix : prefix, st, Tuils.NEWLINE}); + s = TimeManager.replace(si, mSkinManager.time_color); + s = TextUtils.replace(s, + new String[] {FORMAT_INPUT, FORMAT_PREFIX, FORMAT_NEWLINE, + FORMAT_INPUT.toUpperCase(), FORMAT_PREFIX.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, + new CharSequence[] {t, su ? suPrefix : prefix, Tuils.NEWLINE, t, su ? suPrefix : prefix, Tuils.NEWLINE}); break; case CATEGORY_OUTPUT: @@ -396,11 +388,11 @@ public class TerminalManager { so.setSpan(new ForegroundColorSpan(mSkinManager.outputColor), 0, outputFormat.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); s = TextUtils.replace(so, - new String[] {FORMAT_OUTPUT, FORMAT_TIME, FORMAT_NEWLINE, FORMAT_OUTPUT.toUpperCase(), FORMAT_TIME.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, - new CharSequence[] {t, st, Tuils.NEWLINE, t, st, Tuils.NEWLINE}); + new String[] {FORMAT_OUTPUT, FORMAT_NEWLINE, FORMAT_OUTPUT.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, + new CharSequence[] {t, Tuils.NEWLINE, t, Tuils.NEWLINE}); break; - case CATEGORY_NOTIFICATION: + case CATEGORY_NOTIFICATION: case CATEGORY_GENERAL: s = t; break; default: 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 d944a1401a79bf20d13b8b866f2c0fb36c2e8cde..ce03da4b451f9cfcf0902908977650ec3e41110f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java @@ -1,17 +1,15 @@ package ohi.andre.consolelauncher.managers; import android.graphics.Color; +import android.util.Log; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; @@ -29,7 +27,6 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; -import ohi.andre.consolelauncher.tuils.SimpleMutableEntry; import ohi.andre.consolelauncher.tuils.Tuils; public class XMLPrefsManager { @@ -156,30 +153,6 @@ public class XMLPrefsManager { public enum Ui implements XMLPrefsSave { - show_username_ssninfo { - @Override - public String defaultValue() { - return "true"; - } - }, - show_ssninfo { - @Override - public String defaultValue() { - return "true"; - } - }, - show_path_ssninfo { - @Override - public String defaultValue() { - return "true"; - } - }, - show_devicename_ssninfo { - @Override - public String defaultValue() { - return "true"; - } - }, show_enter_button { @Override public String defaultValue() { @@ -551,7 +524,7 @@ public class XMLPrefsManager { return "true"; } }, - show_alias_suggestions { + suggest_alias_default { @Override public String defaultValue() { return "true"; @@ -614,7 +587,7 @@ public class XMLPrefsManager { storage_format { @Override public String defaultValue() { - return "Internal Storage: %iavmb MB of %itotmb MB (%iav%%)"; + return "Internal Storage: %iavgb GB / %itotgb GB (%iav%%)"; } }, input_format { @@ -628,6 +601,30 @@ public class XMLPrefsManager { public String defaultValue() { return "%o"; } + }, + session_info_format { + @Override + public String defaultValue() { + return "%u@%d:%p"; + } + }, + enable_app_launch { + @Override + public String defaultValue() { + return "true"; + } + }, + app_launch_format { + @Override + public String defaultValue() { + return "--> %a"; + } + }, + time_format_separator { + @Override + public String defaultValue() { + return "@"; + } }; @Override @@ -704,7 +701,7 @@ public class XMLPrefsManager { UI("ui.xml", Ui.values()) { @Override public String[] deleted() { - return new String[] {"show_timestamp_before_cmd", "linux_like"}; + return new String[] {"show_timestamp_before_cmd", "linux_like", "show_username_ssninfo", "show_ssninfo", "show_path_ssninfo", "show_devicename_ssninfo", "show_alias_suggestions"}; } }, BEHAVIOR("behavior.xml", Behavior.values()) { @@ -818,14 +815,14 @@ public class XMLPrefsManager { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); - BufferedReader oldStream = null; - HashMap<XMLPrefsSave, String> oldValues = null; - - File old = new File(folder, "settings.txt"); - if(old.exists()) { - oldStream = new BufferedReader(new FileReader(old)); - oldValues = getOld(oldStream); - } +// BufferedReader oldStream = null; +// HashMap<XMLPrefsSave, String> oldValues = null; +// +// File old = new File(folder, "settings.txt"); +// if(old.exists()) { +// oldStream = new BufferedReader(new FileReader(old)); +// oldValues = getOld(oldStream); +// } for(XMLPrefsRoot element : XMLPrefsRoot.values()) { File file = new File(folder, element.path); @@ -899,18 +896,18 @@ public class XMLPrefsManager { } if(value == null) { - if(oldValues != null) { - for(Map.Entry<XMLPrefsSave, String> sm : oldValues.entrySet()) { - if(sm.getKey().equals(s)) { - value = sm.getValue(); - } - } - } +// if(oldValues != null) { +// for(Map.Entry<XMLPrefsSave, String> sm : oldValues.entrySet()) { +// if(sm.getKey().equals(s)) { +// value = sm.getValue(); +// } +// } +// } - if(value == null) value = s.defaultValue(); +// if(value == null) + value = s.defaultValue(); } - Element em = d.createElement(s.label()); em.setAttribute(VALUE_ATTRIBUTE, value); root.appendChild(em); @@ -921,7 +918,7 @@ public class XMLPrefsManager { writeTo(d, file); } - if(old.exists()) old.delete(); +// if(old.exists()) old.delete(); } public static Object transform(String s, Class<?> c) { @@ -1052,6 +1049,7 @@ public class XMLPrefsManager { writeTo(d, file); } catch (Exception e) { + Log.e("andre", "", e); return e.toString(); } return null; @@ -1155,82 +1153,78 @@ public class XMLPrefsManager { } } - private static HashMap<XMLPrefsSave, String> getOld(BufferedReader reader) { - HashMap<XMLPrefsSave, String> map = new HashMap<>(); - - String line; - try { - while((line = reader.readLine()) != null) { - String[] split = line.split("="); - if(split.length != 2) continue; - - String name = split[0].trim(); - String value = split[1]; - - XMLPrefsSave s = getCorresponding(name); - if(s == null) continue; - - map.put(s, value); - } - } catch (IOException e) { - return null; - } - - return map; - } - - static final SimpleMutableEntry[] OLD = { - new SimpleMutableEntry("deviceColor", Theme.device_color), - new SimpleMutableEntry("inputColor", Theme.input_color), - new SimpleMutableEntry("outputColor", Theme.output_color), - new SimpleMutableEntry("backgroundColor", Theme.bg_color), - new SimpleMutableEntry("useSystemFont", Ui.system_font), - new SimpleMutableEntry("fontSize", Ui.font_size), - new SimpleMutableEntry("ramColor", Theme.ram_color), - new SimpleMutableEntry("inputFieldBottom", Ui.input_bottom), - new SimpleMutableEntry("username", Ui.username), - new SimpleMutableEntry("showUsername", Ui.show_username_ssninfo), - new SimpleMutableEntry("showSubmit", Ui.show_enter_button), - new SimpleMutableEntry("deviceName", Ui.deviceName), - new SimpleMutableEntry("showRam", Ui.show_ram), - new SimpleMutableEntry("showDevice", Ui.show_device_name), - new SimpleMutableEntry("showToolbar", Toolbar.show_toolbar), - new SimpleMutableEntry("showSessionInfoWhenInputEmpty", Ui.show_ssninfo), - new SimpleMutableEntry("showPathInSessionInfo", Ui.show_path_ssninfo), - new SimpleMutableEntry("showDeviceNameInSessionInfo", Ui.show_devicename_ssninfo), - - new SimpleMutableEntry("suggestionTextColor", Suggestions.default_text_color), - new SimpleMutableEntry("transparentSuggestions", Suggestions.transparent), - new SimpleMutableEntry("aliasSuggestionBg", Suggestions.alias_bg_color), - new SimpleMutableEntry("appSuggestionBg", Suggestions.apps_bg_color), - new SimpleMutableEntry("commandSuggestionsBg", Suggestions.cmd_bg_color), - new SimpleMutableEntry("songSuggestionBg", Suggestions.song_bg_color), - new SimpleMutableEntry("contactSuggestionBg", Suggestions.contact_bg_color), - new SimpleMutableEntry("fileSuggestionBg", Suggestions.file_bg_color), - new SimpleMutableEntry("defaultSuggestionBg", Suggestions.default_bg_color), - - new SimpleMutableEntry("useSystemWallpaper", Ui.system_wallpaper), - new SimpleMutableEntry("fullscreen", Ui.fullscreen), - new SimpleMutableEntry("keepAliveWithNotification", Behavior.tui_notification), - new SimpleMutableEntry("openKeyboardOnStart", Behavior.auto_show_keyboard), - - new SimpleMutableEntry("fromMediastore", Behavior.songs_from_mediastore), - new SimpleMutableEntry("playRandom", Behavior.random_play), - new SimpleMutableEntry("songsFolder", Behavior.songs_folder), - - new SimpleMutableEntry("closeOnDbTap", Behavior.double_tap_closes), - new SimpleMutableEntry("showSuggestions", Suggestions.show_suggestions), - new SimpleMutableEntry("showDonationMessage", Behavior.donation_message), - new SimpleMutableEntry("showAliasValue", Behavior.show_alias_content), - new SimpleMutableEntry("showAppsHistory", Behavior.show_launch_history), - - new SimpleMutableEntry("defaultSearch", Cmd.default_search) - }; - - private static XMLPrefsSave getCorresponding(String old) { - for(SimpleMutableEntry<String, XMLPrefsSave> s : OLD) { - if(old.equals(s.getKey())) return s.getValue(); - } - return null; - } +// private static HashMap<XMLPrefsSave, String> getOld(BufferedReader reader) { +// HashMap<XMLPrefsSave, String> map = new HashMap<>(); +// +// String line; +// try { +// while((line = reader.readLine()) != null) { +// String[] split = line.split("="); +// if(split.length != 2) continue; +// +// String name = split[0].trim(); +// String value = split[1]; +// +// XMLPrefsSave s = getCorresponding(name); +// if(s == null) continue; +// +// map.put(s, value); +// } +// } catch (IOException e) { +// return null; +// } +// +// return map; +// } + +// static final SimpleMutableEntry[] OLD = { +// new SimpleMutableEntry("deviceColor", Theme.device_color), +// new SimpleMutableEntry("inputColor", Theme.input_color), +// new SimpleMutableEntry("outputColor", Theme.output_color), +// new SimpleMutableEntry("backgroundColor", Theme.bg_color), +// new SimpleMutableEntry("useSystemFont", Ui.system_font), +// new SimpleMutableEntry("fontSize", Ui.font_size), +// new SimpleMutableEntry("ramColor", Theme.ram_color), +// new SimpleMutableEntry("inputFieldBottom", Ui.input_bottom), +// new SimpleMutableEntry("username", Ui.username), +// new SimpleMutableEntry("showSubmit", Ui.show_enter_button), +// new SimpleMutableEntry("deviceName", Ui.deviceName), +// new SimpleMutableEntry("showRam", Ui.show_ram), +// new SimpleMutableEntry("showDevice", Ui.show_device_name), +// new SimpleMutableEntry("showToolbar", Toolbar.show_toolbar), +// +// new SimpleMutableEntry("suggestionTextColor", Suggestions.default_text_color), +// new SimpleMutableEntry("transparentSuggestions", Suggestions.transparent), +// new SimpleMutableEntry("aliasSuggestionBg", Suggestions.alias_bg_color), +// new SimpleMutableEntry("appSuggestionBg", Suggestions.apps_bg_color), +// new SimpleMutableEntry("commandSuggestionsBg", Suggestions.cmd_bg_color), +// new SimpleMutableEntry("songSuggestionBg", Suggestions.song_bg_color), +// new SimpleMutableEntry("contactSuggestionBg", Suggestions.contact_bg_color), +// new SimpleMutableEntry("fileSuggestionBg", Suggestions.file_bg_color), +// new SimpleMutableEntry("defaultSuggestionBg", Suggestions.default_bg_color), +// +// new SimpleMutableEntry("useSystemWallpaper", Ui.system_wallpaper), +// new SimpleMutableEntry("fullscreen", Ui.fullscreen), +// new SimpleMutableEntry("keepAliveWithNotification", Behavior.tui_notification), +// new SimpleMutableEntry("openKeyboardOnStart", Behavior.auto_show_keyboard), +// +// new SimpleMutableEntry("fromMediastore", Behavior.songs_from_mediastore), +// new SimpleMutableEntry("playRandom", Behavior.random_play), +// new SimpleMutableEntry("songsFolder", Behavior.songs_folder), +// +// new SimpleMutableEntry("closeOnDbTap", Behavior.double_tap_closes), +// new SimpleMutableEntry("showSuggestions", Suggestions.show_suggestions), +// new SimpleMutableEntry("showDonationMessage", Behavior.donation_message), +// new SimpleMutableEntry("showAliasValue", Behavior.show_alias_content), +// new SimpleMutableEntry("showAppsHistory", Behavior.show_launch_history), +// +// new SimpleMutableEntry("defaultSearch", Cmd.default_search) +// }; +// +// private static XMLPrefsSave getCorresponding(String old) { +// for(SimpleMutableEntry<String, XMLPrefsSave> s : OLD) { +// if(old.equals(s.getKey())) return s.getValue(); +// } +// return null; +// } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/MusicManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java similarity index 98% rename from app/src/main/java/ohi/andre/consolelauncher/managers/MusicManager.java rename to app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java index 17397176686b5de6c3eb6bfa319f802fabe40a14..316e0a8f678c85f7e2a906c449d33ebb29e7e94f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/MusicManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java @@ -1,4 +1,4 @@ -package ohi.andre.consolelauncher.managers; +package ohi.andre.consolelauncher.managers.music; import android.content.BroadcastReceiver; import android.content.Context; @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.List; import ohi.andre.comparestring.Compare; +import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.broadcast.HeadsetBroadcast; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; 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 d3d0f85af139a80c6104d745d369101f9078d1fe..077a74d1b752063e5343c9886e308603885d432f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java @@ -10,6 +10,9 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -313,7 +316,16 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { } public static String getFormat() { - return values.get(Options.notification_format).value; + try { + return values.get(Options.notification_format).value; + } catch (Exception e) { + + try { + e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true))); + } catch (FileNotFoundException e1) {} + + return Options.notification_format.defaultValue(); + } } public static void notificationsChangeFor(List<NotificatedApp> apps) { 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 f41300ad89fe4f14429b244dae22c68566e8fa29..cc5ef5c3adcee671aac1dd62cd5688241935c43e 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java @@ -17,9 +17,7 @@ import android.support.v4.content.LocalBroadcastManager; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; -import android.text.format.Time; import android.text.style.ForegroundColorSpan; -import android.util.Log; import java.util.ArrayList; import java.util.Arrays; @@ -27,6 +25,7 @@ import java.util.HashMap; import java.util.Map; import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import static ohi.andre.consolelauncher.managers.notifications.NotificationManager.NotificatedApp; @@ -45,8 +44,6 @@ public class NotificationService extends NotificationListenerService { public void onCreate() { super.onCreate(); - Log.e("andre", "hello"); - NotificationManager.create(); if(NotificationManager.apps() == 0) { @@ -85,17 +82,12 @@ public class NotificationService extends NotificationListenerService { @Override public void onDestroy() { super.onDestroy(); - - Log.e("andre", "destroying notif"); } - Time time; - String timeFormat; String format; int timeColor; final String FORMAT_PKG = "%pkg"; - final String FORMAT_DATE = "%t"; final String FORMAT_TEXT = "%txt"; final String FORMAT_TITLE = "%ttl"; final String FORMAT_APPNAME = "%app"; @@ -114,9 +106,7 @@ public class NotificationService extends NotificationListenerService { return; } - if(time == null) { - time = new Time(); - timeFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format); + if(format == null) { manager = getPackageManager(); format = NotificationManager.getFormat(); timeColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color); @@ -173,20 +163,17 @@ public class NotificationService extends NotificationListenerService { SpannableString spanned = new SpannableString(format); spanned.setSpan(new ForegroundColorSpan(color), 0, format.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - time.setToNow(); - String t = this.time.format(timeFormat); - SpannableString spannedTime = new SpannableString(t); - spannedTime.setSpan(new ForegroundColorSpan(timeColor), 0, t.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - CharSequence s; try { s = TextUtils.replace(spanned, - new String[] {FORMAT_PKG, FORMAT_APPNAME, FORMAT_DATE, FORMAT_TEXT, FORMAT_TITLE, FORMAT_NEWLINE, - FORMAT_PKG.toUpperCase(), FORMAT_APPNAME.toUpperCase(), FORMAT_DATE.toUpperCase(), FORMAT_TEXT.toUpperCase(), FORMAT_TITLE.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, + new String[] {FORMAT_PKG, FORMAT_APPNAME, FORMAT_TEXT, FORMAT_TITLE, FORMAT_NEWLINE, + FORMAT_PKG.toUpperCase(), FORMAT_APPNAME.toUpperCase(), FORMAT_TEXT.toUpperCase(), FORMAT_TITLE.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, new CharSequence[] { - pack, appName, spannedTime, text, title, Tuils.NEWLINE, pack, appName, spannedTime, text, title, Tuils.NEWLINE + pack, appName, text, title, Tuils.NEWLINE, pack, appName, text, title, Tuils.NEWLINE } ); + + s = TimeManager.replace(s, timeColor); } catch (Exception e) { return; } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java index 25e715115c8593a3461a1d07356e97f6ff515882..b12ecdd5748412b98ad3cf82d8be70b45ac139d2 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java @@ -124,7 +124,8 @@ public class SuggestionRunnable implements Runnable { ((Activity) toAdd[space].getContext()).unregisterForContextMenu(toAdd[space]); } } else { - throw new UnsupportedOperationException("no views enough"); +// throw new UnsupportedOperationException("no views enough"); + break; } } } 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 6fcc3252ce6a0592254c71e4fc427785c78901cc..9b740f438a9b0baae14fa495260f89b2f96315e2 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java @@ -11,13 +11,14 @@ import ohi.andre.consolelauncher.commands.Command; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.CommandTuils; import ohi.andre.consolelauncher.commands.main.MainPack; +import ohi.andre.consolelauncher.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.commands.specific.PermanentSuggestionCommand; import ohi.andre.consolelauncher.managers.AliasManager; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.managers.ContactManager; import ohi.andre.consolelauncher.managers.FileManager; -import ohi.andre.consolelauncher.managers.MusicManager; +import ohi.andre.consolelauncher.managers.music.MusicManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -44,12 +45,12 @@ public class SuggestionsManager { private final int FIRST_INTERVAL = 7; - private boolean showAlias, showAliasWasSet = false; + private boolean showAliasDefault, showAliasWasSet = false; public Suggestion[] getSuggestions(MainPack info, String before, String lastWord) { if(!showAliasWasSet) { - showAlias = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_alias_suggestions); + showAliasDefault = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.suggest_alias_default); showAliasWasSet = true; } @@ -75,7 +76,7 @@ public class SuggestionsManager { } } - if(showAlias) suggestAlias(info.aliasManager, suggestionList, lastWord); + if(showAliasDefault) suggestAlias(info.aliasManager, suggestionList, lastWord); return suggestionList.toArray(new Suggestion[suggestionList.size()]); } @@ -93,9 +94,7 @@ public class SuggestionsManager { suggestPermanentSuggestions(suggestionList, (PermanentSuggestionCommand) cmd.cmd); } - if (cmd.nArgs == cmd.cmd.maxArgs() || - (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && - ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0]) != null && ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0]).length + 1 == cmd.nArgs)) { + if (cmd.nArgs == cmd.cmd.maxArgs() || (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && ((Param) cmd.mArgs[0]).args().length + 1 == cmd.nArgs)) { return new Suggestion[0]; } @@ -106,7 +105,9 @@ 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, null); + if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) { + suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, null); + } else suggestArgs(info, cmd.nextArg(), suggestionList, before); } else { @@ -138,7 +139,7 @@ public class SuggestionsManager { } if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) { - suggestParams(suggestionList, (ParamCommand) cmd.cmd, before, lastWord); + suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, lastWord); } else suggestArgs(info, cmd.nextArg(), suggestionList, lastWord, before); } else { // not a command @@ -148,7 +149,7 @@ public class SuggestionsManager { } else { // lastword > 0 && before = 0 suggestCommand(info, suggestionList, lastWord, before); - if(showAlias) suggestAlias(info.aliasManager, suggestionList, lastWord); + suggestAlias(info.aliasManager, suggestionList, lastWord); suggestApp(info, suggestionList, lastWord, Tuils.EMPTYSTRING); } } @@ -170,7 +171,7 @@ public class SuggestionsManager { 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) { + private void suggestParams(MainPack pack, List<Suggestion> suggestions, ParamCommand cmd, String before, String lastWord) { String[] params = cmd.params(); if (params == null) { return; @@ -178,14 +179,20 @@ public class SuggestionsManager { if(lastWord == null || lastWord.length() == 0) { for (String s : cmd.params()) { - int[] args = cmd.argsForParam(s); - suggestions.add(new Suggestion(before, s, args == null || args.length == 0, NO_RATE, 0)); + Param p = cmd.getParam(pack, s).getValue(); + if(p == null) continue; + + suggestions.add(new Suggestion(before, s, p.args().length == 0, NO_RATE, 0)); } } else { for (String s : cmd.params()) { - int[] args = cmd.argsForParam(s); - if (s.startsWith(lastWord) || s.replace("-", Tuils.EMPTYSTRING).startsWith(lastWord)) suggestions.add(new Suggestion(before, s, args == null || args.length == 0, NO_RATE, 0)); + Param p = cmd.getParam(pack, s).getValue(); + if(p == null) continue; + + if (s.startsWith(lastWord) || s.replace("-", Tuils.EMPTYSTRING).startsWith(lastWord)) { + suggestions.add(new Suggestion(before, s, p.args().length == 0, NO_RATE, 0)); + } } } } @@ -223,6 +230,8 @@ public class SuggestionsManager { case CommandAbstraction.CONFIG_FILE: suggestConfigFile(suggestions, prev, before); break; + case CommandAbstraction.DEFAULT_APP: + suggestDefaultApp(info, suggestions, prev, before); } } @@ -443,6 +452,31 @@ public class SuggestionsManager { } } + private void suggestDefaultApp(MainPack info, List<Suggestion> suggestions, String prev, String before) { + suggestions.add(new Suggestion(before, "most_used", false, MAX_RATE, Suggestion.TYPE_PERMANENT)); + suggestions.add(new Suggestion(before, "null", false, MAX_RATE, Suggestion.TYPE_PERMANENT)); + + List<String> names = info.appsManager.getAppLabels(); + if (prev == null || prev.length() == 0) { + for (String s : names) { + suggestions.add(new Suggestion(before, s, true, NO_RATE, Suggestion.TYPE_APP)); + } + } else if(prev.length() <= FIRST_INTERVAL) { + prev = prev.trim().toLowerCase(); + for (String n : names) { + if(n.toLowerCase().trim().startsWith(prev)) { + suggestions.add(new Suggestion(before, n, true, MAX_RATE, Suggestion.TYPE_APP)); + } + } + } else { + List<Compare.CompareInfo> infos = Compare.compareInfo(names, prev, min_apps_rate, + AppsManager.USE_SCROLL_COMPARE); + for(Compare.CompareInfo i : infos) { + suggestions.add(new Suggestion(before, i.s, true, i.rate, Suggestion.TYPE_APP)); + } + } + } + private void suggestConfigEntry(List<Suggestion> suggestions, String prev, String before) { if(xmlPrefsEntrys == null) { xmlPrefsEntrys = new ArrayList<>(); diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/Compare.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/Compare.java new file mode 100644 index 0000000000000000000000000000000000000000..74e34dcc972ef05e3646ef5aa285c31792eb9931 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Compare.java @@ -0,0 +1,67 @@ +package ohi.andre.consolelauncher.tuils; + +import java.text.Normalizer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Created by francescoandreuzzi on 27/07/2017. + */ + +public class Compare { + + static final char[] allowed_separators = {' ', '-', '_'}; + + private static final String ACCENTS_PATTERN = "\\p{InCombiningDiacriticalMarks}+"; + public static String removeAccents(String s) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) { + Pattern pattern = Pattern.compile(ACCENTS_PATTERN); + String decomposed = Normalizer.normalize(s, Normalizer.Form.NFD); + return pattern.matcher(decomposed).replaceAll(Tuils.EMPTYSTRING); + } + + return s; + } + + public static boolean matches(String compared, String comparator, boolean allowSkip, int minRate) { + compared = removeAccents(compared); + comparator = removeAccents(comparator); + + List<String> s = new ArrayList<>(); + if(allowSkip) { + for(char sep : allowed_separators) { + String[] split = compared.split(String.valueOf(sep)); + s.addAll(Arrays.asList(split)); + } + } + s.add(compared); + + for(String st : s) { + int rate = 0; + for(int i = 0; i < st.length() && i < comparator.length(); i++) { + char c1 = st.charAt(i); + char c2 = comparator.charAt(i); + + if(c1 == c2) rate++; + } + + if(rate >= minRate) return true; + } + + return false; + } + + public static List<String> matches(List<String> compared, String comparator, boolean allowSkip, int minRate) { + List<String> ms = new ArrayList<>(); + + for(String s : compared) { + if(matches(s, comparator, allowSkip, minRate)) { + ms.add(s); + } + } + + return ms; + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java new file mode 100644 index 0000000000000000000000000000000000000000..32fe7620532f23b15a9c382f77c578ae40b8ccca --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java @@ -0,0 +1,93 @@ +package ohi.andre.consolelauncher.tuils; + +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.format.Time; +import android.text.style.ForegroundColorSpan; + +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import ohi.andre.consolelauncher.managers.SkinManager; +import ohi.andre.consolelauncher.managers.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 26/07/2017. + */ + +public class TimeManager { + + static String[] formats; + static Time time; + + static Pattern extractor = Pattern.compile("%t([0-9]+)", Pattern.CASE_INSENSITIVE); + + public static void create() { + String format = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format); + String separator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format_separator); + + time = new Time(); + + formats = format.split(separator); + if(formats.length == 0) formats = new String[] {Tuils.EMPTYSTRING}; + + Arrays.asList(formats); + } + + public static String get(int index) { + if(formats == null) return null; + + if(index < 0 || index >= formats.length) index = 0; + return formats[index]; + } + + public static CharSequence replace(CharSequence cs) { + return replace(cs, -1, SkinManager.COLOR_NOT_SET); + } + + public static CharSequence replace(CharSequence cs, int color) { + return replace(cs, -1, color); + } + + public static CharSequence replace(CharSequence cs, long tm, int color) { + if(tm == -1) { + time.setToNow(); + } else { + time.set(tm); + } + + Matcher matcher = extractor.matcher(cs.toString()); + if(matcher.find()) { + for(int count = 1; count <= matcher.groupCount(); count++) { + String t = get(Integer.parseInt(matcher.group(count))); + if(t == null) continue; + + String tf = time.format(t); + + SpannableString spannableString = null; + if(color != SkinManager.COLOR_NOT_SET) { + spannableString = new SpannableString(tf); + spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + } + + cs = TextUtils.replace(cs, new String[] {"%t" + matcher.group(count)}, new CharSequence[] {spannableString != null ? spannableString : tf}); + } + } + + String t = get(0); + if(t == null) return cs; + + String tf = time.format(t); + + SpannableString spannableString = null; + if(color != SkinManager.COLOR_NOT_SET) { + spannableString = new SpannableString(tf); + spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + } + cs = TextUtils.replace(cs, new String[] {"%t"}, new CharSequence[] {spannableString != null ? spannableString : tf}); + + return cs; + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java index 43bc6d551ff02e2f1fe0444b445a4b2613f25ca1..892ab32df68235fd2101b15855500e8ee6d5f8d5 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java @@ -1,11 +1,9 @@ package ohi.andre.consolelauncher.tuils; import android.annotation.TargetApi; -import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.admin.DevicePolicyManager; -import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ComponentName; @@ -25,12 +23,18 @@ import android.provider.MediaStore; import android.provider.Settings; import android.text.TextUtils; import android.util.DisplayMetrics; +import android.util.Log; import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.MimeTypeMap; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; @@ -41,10 +45,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; +import java.util.regex.Pattern; import dalvik.system.DexFile; import ohi.andre.consolelauncher.BuildConfig; -import ohi.andre.consolelauncher.managers.MusicManager; +import ohi.andre.consolelauncher.managers.music.MusicManager; import ohi.andre.consolelauncher.managers.SkinManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity; @@ -71,15 +76,19 @@ public class Tuils { public static int getBatteryPercentage(Context context) { - IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - Intent batteryStatus = context.registerReceiver(null, iFilter); + try { + IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + Intent batteryStatus = context.registerReceiver(null, iFilter); - int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; - int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; + int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; + int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; - float batteryPct = level / (float) scale; + float batteryPct = level / (float) scale; - return (int) (batteryPct * 100); + return (int) (batteryPct * 100); + } catch (Exception e) { + return -1; + } } public static boolean containsExtension(String[] array, String value) { @@ -163,11 +172,10 @@ public class Tuils { c.startActivity(intent); } - public static void requestAdmin(Activity a, ComponentName component, String label) { + public static Intent requestAdmin(ComponentName component) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, component); - intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, label); - a.startActivity(intent); + return intent; } public static Intent webPage(String url) { @@ -175,103 +183,43 @@ public class Tuils { } public static double getAvailableInternalMemorySize(int unit) { - File path = Environment.getDataDirectory(); - StatFs stat = new StatFs(path.getPath()); - - long blockSize; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - blockSize = stat.getBlockSizeLong(); - } else { - blockSize = stat.getBlockSize(); - } - - long availableBlocks = 0; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - availableBlocks = stat.getAvailableBlocksLong(); - } else { - availableBlocks = stat.getAvailableBlocks(); - } - - return formatSize(availableBlocks * blockSize, unit); + return getAvailableSpace(Environment.getDataDirectory(), unit); } public static double getTotalInternalMemorySize(int unit) { - File path = Environment.getDataDirectory(); - StatFs stat = new StatFs(path.getPath()); - - long blockSize; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - blockSize = stat.getBlockSizeLong(); - } else { - blockSize = stat.getBlockSize(); - } - - long totalBlocks = 0; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - totalBlocks = stat.getBlockCountLong(); - } else { - totalBlocks = stat.getBlockCount(); - } - - return formatSize(totalBlocks * blockSize, unit); + return getTotaleSpace(Environment.getDataDirectory(), unit); } public static double getAvailableExternalMemorySize(int unit) { - if (externalMemoryAvailable()) { - File path = Environment.getExternalStorageDirectory(); - StatFs stat = new StatFs(path.getPath()); - - long blockSize; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - blockSize = stat.getBlockSizeLong(); - } else { - blockSize = stat.getBlockSize(); - } - - long availableBlocks = 0; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - availableBlocks = stat.getAvailableBlocksLong(); - } else { - availableBlocks = stat.getAvailableBlocks(); - } - - return formatSize(availableBlocks * blockSize, unit); - } else { + try { + return getAvailableSpace(new File(System.getenv("SECONDARY_STORAGE")), unit); + } catch (Exception e) { return -1; } } public static double getTotalExternalMemorySize(int unit) { - if (externalMemoryAvailable()) { - File path = Environment.getExternalStorageDirectory(); - StatFs stat = new StatFs(path.getPath()); - - long blockSize; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - blockSize = stat.getBlockSizeLong(); - } else { - blockSize = stat.getBlockSize(); - } - - long totalBlocks = 0; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - totalBlocks = stat.getBlockCountLong(); - } else { - totalBlocks = stat.getBlockCount(); - } - - return formatSize(totalBlocks * blockSize, unit); - } else { + try { + return getTotaleSpace(new File(System.getenv("SECONDARY_STORAGE")), unit); + } catch (Exception e) { return -1; } } - public static double percentage(double part, double total) { - return round(part * 100 / total, 2); + public static double getAvailableSpace(File dir, int unit) { + StatFs statFs = new StatFs(dir.getAbsolutePath()); + long blocks = statFs.getAvailableBlocks(); + return formatSize(blocks * statFs.getBlockSize(), unit); + } + + public static double getTotaleSpace(File dir, int unit) { + StatFs statFs = new StatFs(dir.getAbsolutePath()); + long blocks = statFs.getBlockCount(); + return formatSize(blocks * statFs.getBlockSize(), unit); } - public static boolean externalMemoryAvailable() { - return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); + public static double percentage(double part, double total) { + return round(part * 100 / total, 2); } public static double formatSize(long bytes, int unit) { @@ -302,12 +250,16 @@ public class Tuils { return round(result, 2); } - public static int max(int... ints) { - int max = ints[0]; - for(int count = 1; count < ints.length; count++) { - max = Math.max(max, ints[count]); - } - return max; + public static void deepView(View v) { + Tuils.log(v.toString()); + + if(!(v instanceof ViewGroup)) return; + ViewGroup g = (ViewGroup) v; + + Tuils.log(g.getChildCount()); + for(int c = 0; c < g.getChildCount(); c++) deepView(g.getChildAt(c)); + + Tuils.log("end of parents of: " + v.toString()); } public static final int TERA = 0; @@ -371,7 +323,7 @@ public class Tuils { } private static String getNicePath(String filePath) { - String home = Tuils.getInternalDirectoryPath(); + String home = Environment.getExternalStorageDirectory().getAbsolutePath(); if(filePath.equals(home)) { return "~"; @@ -389,6 +341,9 @@ public class Tuils { public static int find(Object o, List list) { for(int count = 0; count < list.size(); count++) { Object x = list.get(count); + if(x == null) continue; + + if(o == x) return count; if (o instanceof XMLPrefsManager.XMLPrefsSave) { try { @@ -411,39 +366,18 @@ public class Tuils { return -1; } + static Pattern pd = Pattern.compile("%d", Pattern.CASE_INSENSITIVE); + static Pattern pu = Pattern.compile("%u", Pattern.CASE_INSENSITIVE); + static Pattern pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE); public static String getHint(SkinManager skinManager, String currentPath) { + String format = skinManager.ssnInfoFormat; + if(format.length() == 0) return null; - if(!skinManager.showUsernameAndDeviceWhenEmpty) { - return null; - } - - String username = Tuils.EMPTYSTRING; - if (skinManager.showUsername) { - username = skinManager.username; - if (username == null || username.length() == 0) { - username = Tuils.EMPTYSTRING; - } - } - - String deviceName = Tuils.EMPTYSTRING; - if(skinManager.showDeviceInSessionInfo) { - deviceName = skinManager.deviceName; - } - - String path = Tuils.EMPTYSTRING; - if(skinManager.showPath) { - path = ":" + getNicePath(currentPath); - } + format = pd.matcher(format).replaceAll(skinManager.deviceName); + format = pu.matcher(format).replaceAll(skinManager.username); + format = pp.matcher(format).replaceAll(Tuils.getNicePath(currentPath)); - if(username.equals(Tuils.EMPTYSTRING)) { - return deviceName + path; - } else { - if(deviceName.equals(Tuils.EMPTYSTRING)) { - return username + path; - } else { - return username + "@" + deviceName + path; - } - } + return format; } public static int findPrefix(List<String> list, String prefix) { @@ -524,6 +458,43 @@ public class Tuils { return Tuils.EMPTYSTRING; } + public static void log(Object o) { + if(o instanceof Throwable) { + Log.e("andre", "", (Throwable) o); + } else { + Log.e("andre", String.valueOf(o)); + } + } + + static FileOutputStream logStream = null; + public static void openLogStream(String name) { + closeStream(); + + try { + File file = new File(Tuils.getFolder(), name); + logStream = new FileOutputStream(file); + } catch (FileNotFoundException e) {} + } + + public static void write(Throwable t) { + write(Tuils.getStackTrace(t)); + } + + public static void write(String line) { + if(logStream != null) try { + logStream.write((line + Tuils.NEWLINE).getBytes()); + } catch (IOException e) {} + } + + public static void closeStream() { + if(logStream != null) { + try { + logStream.close(); + logStream = null; + } catch (IOException e) {} + } + } + public static String toPlanString(List<String> strings, String separator) { if(strings != null) { String[] object = new String[strings.size()]; @@ -609,70 +580,34 @@ public class Tuils { return true; } - public static String getFileType(File url) { - if (url.toString().contains(".doc") || url.toString().contains(".docx")) { - return "application/msword"; - } else if (url.toString().contains(".pdf")) { - return "application/pdf"; - } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) { - return "application/vnd.ms-powerpoint"; - } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) { - return "application/vnd.ms-excel"; - } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) { - return "application/x-wav"; - } else if (url.toString().contains(".rtf")) { - return "application/rtf"; - } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) { - return "audio/x-wav"; - } else if (url.toString().contains(".gif")) { - return "image/gif"; - } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { - return "image/jpeg"; - } else if (url.toString().contains(".txt")) { - return "text/plain"; - } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || - url.toString().contains(".avi")) { - return "video/*"; - } else { - return "*/*"; - } - } - public static Intent openFile(File url) { - try { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromFile(url), getFileType(url)); + Uri u = Uri.fromFile(url); + Intent intent = new Intent(android.content.Intent.ACTION_VIEW); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return intent; - } catch (ActivityNotFoundException e) { - return null; - } + String extension = MimeTypeMap.getFileExtensionFromUrl(u.toString()); + String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + + intent.setDataAndType(u,mimetype); + return intent; } public static Intent shareFile(File url) { Intent intent = new Intent(Intent.ACTION_SEND); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setDataAndType(Uri.fromFile(url), getFileType(url)); - intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(url)); + Uri u = Uri.fromFile(url); - return intent; - } + String extension = MimeTypeMap.getFileExtensionFromUrl(u.toString()); + String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - public static String getInternalDirectoryPath() { - File f = Environment.getExternalStorageDirectory(); - if(f != null) { - return f.getAbsolutePath(); - } - return null; + intent.setDataAndType(u,mimetype); + intent.putExtra(Intent.EXTRA_STREAM, u); + + return intent; } private static File getTuiFolder() { - String internalDir = Tuils.getInternalDirectoryPath(); - if(internalDir == null) { - return null; - } + File internalDir = Environment.getExternalStorageDirectory(); return new File(internalDir, TUI_FOLDER); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java index 940a5c173e740852cc5ee93c7e3dd5be72ee3f3a..bbefb557a069b9a697f956b59fb63860ced0146b 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java @@ -4,5 +4,6 @@ package ohi.andre.consolelauncher.tuils.interfaces; * Created by andre on 25/07/15. */ public interface Outputable { - void onOutput(String output); + void onOutput(CharSequence output, int category); + void onOutput(CharSequence output); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Redirectator.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Redirectator.java old mode 100755 new mode 100644 diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Suggester.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Suggester.java new file mode 100644 index 0000000000000000000000000000000000000000..a972758871535a497de7d93798656767e7dfabd5 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Suggester.java @@ -0,0 +1,10 @@ +package ohi.andre.consolelauncher.tuils.interfaces; + +/** + * Created by francescoandreuzzi on 24/07/2017. + */ + +public interface Suggester { + + void requestUpdate(); +} diff --git a/app/src/main/res/layout/input_down_layout.xml b/app/src/main/res/layout/input_down_layout.xml index dfabbfe911c5128675bdae26b096f810c106fd08..a885aa033199db03bb9e4165148a8a7ffbe9a6cc 100755 --- a/app/src/main/res/layout/input_down_layout.xml +++ b/app/src/main/res/layout/input_down_layout.xml @@ -116,7 +116,9 @@ android:layout_height="wrap_content" android:scrollHorizontally="false" - android:scrollbars="vertical"/> + android:scrollbars="vertical" + android:textIsSelectable="true" + android:gravity="bottom"/> </LinearLayout> diff --git a/app/src/main/res/layout/input_up_layout.xml b/app/src/main/res/layout/input_up_layout.xml index eebdc681fd66e725f0b973e14a26a04fd3f3503d..1980a2b6a19290fc8d430b2a98f480e1b0bf4abe 100755 --- a/app/src/main/res/layout/input_up_layout.xml +++ b/app/src/main/res/layout/input_up_layout.xml @@ -79,15 +79,23 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <TextView - android:id="@+id/terminal_view" + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="bottom" - android:scrollHorizontally="false" - android:scrollbars="vertical" - android:textIsSelectable="true"/> + android:orientation="vertical"> + + <TextView + android:id="@+id/terminal_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + + android:gravity="bottom" + android:scrollHorizontally="false" + android:scrollbars="vertical" + android:textIsSelectable="true"/> + + </LinearLayout> </ScrollView> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 38ef6789a645fb2cf2f4451d51ef965bb48b7927..4b15629d8ad084d7d476c0c1a4ef959b23a81a18 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,13 +12,14 @@ <string name="output_error">An unknown error has occurred</string> <string name="location_off">Turn on GPS or network location</string> <string name="invalid_integer">Invalid integer</string> + <string name="activity_not_found">Ativity not found</string> <!-- 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="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 with the command "config -set donation_message false"</string> + \n\nYou can disable this message with the command\nconfig -set donation_message false</string> <string name="firsthelp_text">First time with t-ui? Use the command "tutorial" or "help"</string> <!-- app mgr --> @@ -44,6 +45,7 @@ <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_usedefapp">You can use "apps -default_app" instead</string> <!-- alias --> <string name="output_aliasnotfound">Alias not found:</string> @@ -81,7 +83,7 @@ <string name="output_nowriteable">You can\'t write or delete this file</string> <!-- install/uninstall --> - <string name="app_installed">\nApp installed:</string> + <string name="app_installed">App installed:</string> <!-- music --> <string name="output_playing">Playing:</string> @@ -143,6 +145,7 @@ \n-l -> show details about an app \n-ps -> show Google Play Store page for an app \n-st -> show Settings details for an app + \n-default_app -> change the default_app at the specified index ("apps -default_app index appName") \n-frc -> force t-ui to launch an app \n-file -> open apps.xml \nno option -> list your apps @@ -205,7 +208,7 @@ </string> <string name="help_previous">Play the last track played</string> <string name="help_rate">Help T-UI with a positive rate (or negative, I don\'t know)\t;)</string> - <string name="help_refresh">Refresh apps and alias</string> + <string name="help_refresh">Refresh apps, alias, music, contacts</string> <string name="help_restart">Restart t-ui and load modified values</string> <string name="help_rm">Remove a file: \nUsage: @@ -233,7 +236,9 @@ <string name="help_shellcommands">Print Terminal Emulator commands</string> <string name="help_status">Get infos about battery charge, wifi status and mobile data</string> <string name="help_stop">Stop the player</string> - <string name="help_time">Print current time</string> + <string name="help_time">Print the current time with the given format + \n\nUsage: + \n$ time [index]</string> <string name="help_track">Print informations about the current track</string> <string name="help_tracks">Print all of the tracks in your music folder</string> <string name="help_tuixt">Open the text editor. @@ -286,21 +291,16 @@ \ncntcts [option] [*optional* contact] \n\n-ls -> list your contacts \n-l -> show details about a contact - \n-new -> create a new contact + \n-add -> create a new contact \n-edit -> edit an existing contact \n-rm -> remove a contact \n\nExample: \n\ncntcts -edit James Pike - \ncntcts -new</string> + \ncntcts -add</string> <string name="help_exit">Close T-UI and reset launcher preferences</string> <!-- linux --> - <string name="help_cd">Change the current directory - \nUsage: - \n>>cd [path] - \n\nExample: - \n>>cd /storage/sdcard1/DCIM - </string> + <string name="help_ctrlc">Send SIGINT to the current shell process</string> <string name="help_open">Open a file with the default application \nUsage: \n>>open [pathToFile]