diff --git a/app/build.gradle b/app/build.gradle index ee26b31e702bc837dcbc9eaaf836aeed054d2ae8..cd8655d9023c478d40a96b02c367d871c8e56c51 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { minSdkVersion 9 targetSdkVersion 23 - versionCode 136 - versionName "6.3j" + versionCode 137 + versionName "6.3k" } buildTypes { @@ -48,8 +48,12 @@ android { output.outputFile.name.replace("app-release.apk", "${x}/${variant.applicationId}_${variant.versionName}_${new Date().format("dd-MM_hh.mm.ss")}.apk")) } } + + configurations { + all*.exclude group: 'com.google.firebase', module: 'firebase-core' + all*.exclude group: 'com.google.firebase', module: 'firebase-iid' + } } dependencies { - compile files('libs/anrwatchdog-1.3.0.jar') compile 'com.google.firebase:firebase-database:9.0.0' } \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 414c980e5d8c251f319f13848beb6a0917ede715..2cc184a18730ee2a96aa79e9302fe029e1f7cfc5 100755 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -5,6 +5,8 @@ -keep public class ohi.andre.consolelauncher.managers.notifications.NotificationService -keep public class ohi.andre.consolelauncher.tuils.KeeperService +-keep public class ohi.andre.consolelauncher.managers.options.** + -dontwarn ohi.andre.consolelauncher.commands.main.raw.** -dontwarn javax.annotation.** diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5937f1abe5a1c1fe899813f874a322b6ff5ccdb0..8c33c70bd23da8abcfec4094536b4b3df14a9bc0 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,13 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/Custom.Solid"> + + <meta-data + android:name="firebase_analytics_collection_deactivated" + android:value="true" /> + <meta-data android:name="firebase_crash_collection_enabled" + android:value="false" /> + <activity android:name=".LauncherActivity" android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation" diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java index 735bd325dec883bc6fea8ce281f12e941ebe9e8a..e282eabf73a875c8cb3102f1c58dc74056ee83c7 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java @@ -22,9 +22,6 @@ import android.view.Window; import android.view.WindowManager; import android.widget.Toast; -import com.github.anrwatchdog.ANRError; -import com.github.anrwatchdog.ANRWatchDog; - import java.util.LinkedList; import java.util.Queue; @@ -32,11 +29,15 @@ import ohi.andre.consolelauncher.commands.main.MainPack; import ohi.andre.consolelauncher.commands.tuixt.TuixtActivity; import ohi.andre.consolelauncher.managers.ContactManager; import ohi.andre.consolelauncher.managers.TerminalManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; import ohi.andre.consolelauncher.managers.notifications.NotificationMonitorService; import ohi.andre.consolelauncher.managers.notifications.NotificationService; import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; +import ohi.andre.consolelauncher.managers.xml.options.Notifications; +import ohi.andre.consolelauncher.managers.xml.options.Theme; +import ohi.andre.consolelauncher.managers.xml.options.Ui; import ohi.andre.consolelauncher.tuils.Assist; import ohi.andre.consolelauncher.tuils.InputOutputReceiver; import ohi.andre.consolelauncher.tuils.KeeperService; @@ -66,6 +67,13 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { private boolean openKeyboardOnStart, canApplyTheme; + private Runnable stopActivity = new Runnable() { + @Override + public void run() { + finish(); + } + }; + private CommandExecuter ex = new CommandExecuter() { @Override @@ -126,6 +134,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { boolean charged = false; Handler handler = new Handler(); + Runnable r = new Runnable() { @Override public void run() { @@ -188,6 +197,11 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { } } } + + @Override + public void dispose() { + handler.removeCallbacksAndMessages(null); + } }; private Suggester sugg = new Suggester() { @@ -220,24 +234,12 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { private void finishOnCreate() { - new ANRWatchDog(5000) - .setANRListener(new ANRWatchDog.ANRListener() { - @Override - public void onAppNotResponding(ANRError anrError) { - Tuils.log(anrError); - Tuils.toFile(anrError); - } - }) - .setReportMainThreadOnly() - .start(); - - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - Tuils.log(e); - Tuils.toFile(e); - } - }); +// Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { +// @Override +// public void uncaughtException(Thread t, Throwable e) { +// Tuils.toFile(e); +// } +// }); IntentFilter filter = new IntentFilter(); filter.addAction(InputOutputReceiver.ACTION_CMD); @@ -255,16 +257,16 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { return; } - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.ignore_bar_color)) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !XMLPrefsManager.getBoolean(Ui.ignore_bar_color)) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - window.setStatusBarColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.statusbar_color)); - window.setNavigationBarColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.navigationbar_color)); + window.setStatusBarColor(XMLPrefsManager.getColor(Theme.statusbar_color)); + window.setNavigationBarColor(XMLPrefsManager.getColor(Theme.navigationbar_color)); } - boolean showNotification = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.tui_notification); + boolean showNotification = XMLPrefsManager.getBoolean(Behavior.tui_notification); Intent keeperIntent = new Intent(this, KeeperService.class); if (showNotification) { startService(keeperIntent); @@ -274,9 +276,9 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { } catch (Exception e) {} } - boolean fullscreen = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.fullscreen); + boolean fullscreen = XMLPrefsManager.getBoolean(Ui.fullscreen); - boolean useSystemWP = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper); + boolean useSystemWP = XMLPrefsManager.getBoolean(Ui.system_wallpaper); if (useSystemWP) { if(fullscreen) { setTheme(R.style.Custom_SystemWP_Fullscreen); @@ -298,32 +300,37 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { } - boolean notifications = XMLPrefsManager.get(boolean.class, NotificationManager.Options.show_notifications) || - XMLPrefsManager.get(String.class, NotificationManager.Options.show_notifications).equalsIgnoreCase("enabled"); + boolean notifications = XMLPrefsManager.getBoolean(Notifications.show_notifications) || + XMLPrefsManager.get(Notifications.show_notifications).equalsIgnoreCase("enabled"); if(notifications) { - ComponentName thisComponent = new ComponentName(this, NotificationService.class); - PackageManager pm = getPackageManager(); - pm.setComponentEnabledSetting(thisComponent, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); - - if(!Tuils.hasNotificationAccess(this)) { - Intent i = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); - if(i.resolveActivity(getPackageManager()) == null) { - Toast.makeText(this, R.string.no_notification_access, Toast.LENGTH_LONG).show(); - } else { - startActivity(i); + try { + ComponentName thisComponent = new ComponentName(this, NotificationService.class); + PackageManager pm = getPackageManager(); + pm.setComponentEnabledSetting(thisComponent, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + + if(!Tuils.hasNotificationAccess(this)) { + Intent i = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); + if(i.resolveActivity(getPackageManager()) == null) { + Toast.makeText(this, R.string.no_notification_access, Toast.LENGTH_LONG).show(); + } else { + startActivity(i); + } } - } - Intent monitor = new Intent(this, NotificationMonitorService.class); - startService(monitor); + Intent monitor = new Intent(this, NotificationMonitorService.class); + startService(monitor); - Intent timeColorIntent = new Intent(this, NotificationService.class); - timeColorIntent.putExtra(XMLPrefsManager.Theme.time_color.label(), XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color)); - startService(timeColorIntent); + Intent timeColorIntent = new Intent(this, NotificationService.class); + timeColorIntent.putExtra(Theme.time_color.label(), XMLPrefsManager.getColor(Theme.time_color)); + startService(timeColorIntent); + } catch (NoClassDefFoundError er) { + Intent intent = new Intent(InputOutputReceiver.ACTION_OUTPUT); + intent.putExtra(InputOutputReceiver.TEXT, getString(R.string.output_notification_error) + Tuils.SPACE + er.toString()); + } } - openKeyboardOnStart = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.auto_show_keyboard); + openKeyboardOnStart = XMLPrefsManager.getBoolean(Behavior.auto_show_keyboard); if (!openKeyboardOnStart) { this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } @@ -392,9 +399,10 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { overridePendingTransition(0,0); - if(main != null) { - main.destroy(); - } + if(main != null) main.destroy(); + if(ui != null) ui.dispose(); + + out.dispose(); System.exit(0); } @@ -418,18 +426,18 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public void reload() { - runOnUiThread(new Runnable() { + new Thread() { @Override public void run() { - Handler h = new Handler(); - h.postDelayed(new Runnable() { - @Override - public void run() { - finish(); - } - }, 1000); + super.run(); + + try { + sleep(1000); + } catch (InterruptedException e) {} + + runOnUiThread(stopActivity); } - }); + }.start(); } @Override @@ -509,12 +517,18 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { while(count < permissions.length && count < grantResults.length) { if(grantResults[count] == PackageManager.PERMISSION_DENIED) { Toast.makeText(this, R.string.permissions_toast, Toast.LENGTH_LONG).show(); - new Handler().postDelayed(new Runnable() { + new Thread() { @Override public void run() { - finish(); + super.run(); + + try { + sleep(2000); + } catch (InterruptedException e) {} + + runOnUiThread(stopActivity); } - }, 2000); + }.start(); return; } count++; diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java index 4363a30c7888dfb3fb6a85dd48bd7aad06253f8c..8a890cf53cda416bd6c9fd9f203254b440e2395f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java @@ -20,9 +20,12 @@ 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.RssManager; import ohi.andre.consolelauncher.managers.TerminalManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.managers.music.MusicManager2; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; +import ohi.andre.consolelauncher.managers.xml.options.Theme; import ohi.andre.consolelauncher.tuils.Compare; import ohi.andre.consolelauncher.tuils.StoppableThread; import ohi.andre.consolelauncher.tuils.TimeManager; @@ -116,11 +119,11 @@ public class MainManager { in = i; out = o; - showAliasValue = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_alias_content); - showAppHistory = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_launch_history); - aliasContentColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.alias_content_color); + showAliasValue = XMLPrefsManager.getBoolean(Behavior.show_alias_content); + showAppHistory = XMLPrefsManager.getBoolean(Behavior.show_launch_history); + aliasContentColor = XMLPrefsManager.getColor(Theme.alias_content_color); - multipleCmdSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.multiple_cmd_separator); + multipleCmdSeparator = XMLPrefsManager.get(Behavior.multiple_cmd_separator); CommandGroup group = new CommandGroup(mContext, COMMANDS_PKG); @@ -129,7 +132,7 @@ public class MainManager { cont = new ContactManager(mContext); } catch (NullPointerException e) {} - MusicManager2 music = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enable_music) ? new MusicManager2(mContext) : null; + MusicManager2 music = XMLPrefsManager.getBoolean(Behavior.enable_music) ? new MusicManager2(mContext) : null; AppsManager appsMgr = new AppsManager(c, sugg); AliasManager aliasManager = new AliasManager(mContext); @@ -137,7 +140,9 @@ public class MainManager { ShellHolder shellHolder = new ShellHolder(out); interactive = shellHolder.build(); - mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, c, executer, redirectator, shellHolder); + RssManager rss = new RssManager(mContext); + + mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, c, executer, redirectator, shellHolder, rss); } // command manager @@ -354,9 +359,9 @@ public class MainManager { 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); + appFormat = XMLPrefsManager.get(Behavior.app_launch_format); + timeColor = XMLPrefsManager.getColor(Theme.time_color); + outputColor = XMLPrefsManager.getColor(Theme.output_color); } String a = new String(appFormat); diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java index 4921455d7a2567542ffa10376ce80a2e9031e651..8f9e4b9c301e3f3c383d3b6f4f92f18d18bb60ab 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java @@ -3,10 +3,15 @@ package ohi.andre.consolelauncher; import android.app.Activity; import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; +import android.bluetooth.BluetoothAdapter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.graphics.Typeface; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.BatteryManager; import android.os.Build; import android.os.Handler; import android.text.Editable; @@ -29,7 +34,9 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -39,10 +46,16 @@ import ohi.andre.consolelauncher.commands.main.MainPack; import ohi.andre.consolelauncher.commands.specific.RedirectCommand; import ohi.andre.consolelauncher.managers.MessagesManager; import ohi.andre.consolelauncher.managers.TerminalManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.managers.suggestions.SuggestionRunnable; import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; +import ohi.andre.consolelauncher.managers.xml.options.Suggestions; +import ohi.andre.consolelauncher.managers.xml.options.Theme; +import ohi.andre.consolelauncher.managers.xml.options.Toolbar; +import ohi.andre.consolelauncher.managers.xml.options.Ui; import ohi.andre.consolelauncher.tuils.AllowEqualsSequence; +import ohi.andre.consolelauncher.tuils.NetworkUtils; import ohi.andre.consolelauncher.tuils.StoppableThread; import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -57,6 +70,19 @@ import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces; public class UIManager implements OnTouchListener { + private enum Label { + ram, + device, + time, + battery, + storage, + network; + + static Label last() { + return network; + } + } + private final int RAM_DELAY = 3000; private final int TIME_DELAY = 1000; private final int STORAGE_DELAY = 60 * 1000; @@ -72,10 +98,6 @@ public class UIManager implements OnTouchListener { private CommandExecuter trigger; private TerminalManager mTerminalAdapter; - private TextView[] ts; - private CharSequence deviceText, ramText, storageText, batteryText, timeText; - private int deviceIndex, ramIndex, storageIndex, batteryIndex, timeIndex; - int mediumPercentage, lowPercentage; String batteryFormat; // boolean batteryCharging; @@ -100,22 +122,48 @@ public class UIManager implements OnTouchListener { } }; - int batterySize, ramSize, storageSize, timeSize; + private TextView[] labelViews = new TextView[Label.last().ordinal() + 1]; + private int[] labelSizes = new int[Label.last().ordinal() + 1]; + private CharSequence[] labelTexts = new CharSequence[Label.last().ordinal() + 1]; + private float[] labelIndexes = new float[Label.last().ordinal() + 1]; private OnBatteryUpdate batteryUpdate = new OnBatteryUpdate() { +// %(charging:not charging) + + final Pattern optionalCharging = Pattern.compile("%\\(([^\\/]*)\\/([^)]*)\\)", Pattern.CASE_INSENSITIVE); + final Pattern newline = Pattern.compile("%n", Pattern.LITERAL | Pattern.CASE_INSENSITIVE); + final Pattern value = Pattern.compile("%v", Pattern.LITERAL | Pattern.CASE_INSENSITIVE); + boolean manyStatus, loaded; int colorHigh, colorMedium, colorLow; + boolean charging; + float last = -1; + @Override public void update(float p) { + if(batteryFormat == null) { + batteryFormat = XMLPrefsManager.get(Behavior.battery_format); + + Intent intent = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + if(intent == null) charging = false; + else { + int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + charging = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB; + } + } + + if(p == -1) p = last; + last = p; + if(!loaded) { loaded = true; - manyStatus = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.enable_battery_status); - colorHigh = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_high); - colorMedium = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_medium); - colorLow = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_low); + manyStatus = XMLPrefsManager.getBoolean(Ui.enable_battery_status); + colorHigh = XMLPrefsManager.getColor(Theme.battery_color_high); + colorMedium = XMLPrefsManager.getColor(Theme.battery_color_medium); + colorLow = XMLPrefsManager.getColor(Theme.battery_color_low); } int percentage = (int) p; @@ -130,11 +178,32 @@ public class UIManager implements OnTouchListener { color = colorHigh; } - if(batteryFormat == null) batteryFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.battery_format); + String cp = batteryFormat; + + Matcher m = optionalCharging.matcher(cp); + while (m.find()) { + cp = cp.replace(m.group(0), m.groupCount() == 2 ? m.group(charging ? 1 : 2) : Tuils.EMPTYSTRING); + } + + cp = value.matcher(cp).replaceAll(String.valueOf(percentage)); + cp = newline.matcher(cp).replaceAll(Tuils.NEWLINE); + + int i = Label.battery.ordinal(); - String cp = batteryFormat.replaceAll("%[vV]", String.valueOf(percentage)).replaceAll("%[nN]", Tuils.NEWLINE); - batteryText = Tuils.span(mContext, cp, color, batterySize); - UIManager.this.update(batteryIndex); + labelTexts[i] = Tuils.span(mContext, cp, color, labelSizes[i]); + UIManager.this.update(labelIndexes[i]); + } + + @Override + public void onCharging() { + charging = true; + update(-1); + } + + @Override + public void onNotCharging() { + charging = false; + update(-1); } }; @@ -153,8 +222,8 @@ public class UIManager implements OnTouchListener { @Override public void run() { if(storageFormat == null) { - storageFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.storage_format); - color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.storage_color); + storageFormat = XMLPrefsManager.get(Behavior.storage_format); + color = XMLPrefsManager.getColor(Theme.storage_color); } if(storagePatterns == null) { @@ -234,9 +303,11 @@ public class UIManager implements OnTouchListener { copy = storagePatterns.get(25).matcher(copy).replaceAll(Matcher.quoteReplacement(String.valueOf(Tuils.formatSize((long) eav, Tuils.GIGA)))); copy = storagePatterns.get(26).matcher(copy).replaceAll(Matcher.quoteReplacement(String.valueOf(Tuils.formatSize((long) etot, Tuils.GIGA)))); - storageText = Tuils.span(mContext, copy, color, storageSize); - update(storageIndex); - ts[storageIndex].postDelayed(this, STORAGE_DELAY); + int i = Label.storage.ordinal(); + + labelTexts[i] = Tuils.span(mContext, copy, color, labelSizes[i]); + update(labelIndexes[i]); + labelViews[(int) labelIndexes[i]].postDelayed(this, STORAGE_DELAY); } }; @@ -249,12 +320,14 @@ public class UIManager implements OnTouchListener { public void run() { if(!active) { active = true; - color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color); + color = XMLPrefsManager.getColor(Theme.time_color); } - timeText = TimeManager.replace(mContext, timeSize, "%t0", color); - update(timeIndex); - ts[timeIndex].postDelayed(this, TIME_DELAY); + int i = Label.time.ordinal(); + + labelTexts[i] = TimeManager.replace(mContext, labelSizes[i], "%t0", color); + update(labelIndexes[i]); + labelViews[(int) labelIndexes[i]].postDelayed(this, TIME_DELAY); } }; @@ -274,9 +347,9 @@ public class UIManager implements OnTouchListener { @Override public void run() { if(ramFormat == null) { - ramFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.ram_format); + ramFormat = XMLPrefsManager.get(Behavior.ram_format); - color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.ram_color); + color = XMLPrefsManager.getColor(Theme.ram_color); } if(ramPatterns == null) { @@ -318,36 +391,213 @@ public class UIManager implements OnTouchListener { copy = ramPatterns.get(11).matcher(copy).replaceAll(Matcher.quoteReplacement(Tuils.NEWLINE)); - ramText = Tuils.span(mContext, copy, color, ramSize); - update(ramIndex); - ts[ramIndex].postDelayed(this, RAM_DELAY); + int i = Label.ram.ordinal(); + + labelTexts[i] = Tuils.span(mContext, copy, color, labelSizes[i]); + update(labelIndexes[i]); + labelViews[(int) labelIndexes[i]].postDelayed(this, RAM_DELAY); } }; - private void update(int index) { - CharSequence sequence = Tuils.EMPTYSTRING; + private Runnable networkRunnable = new Runnable() { + +// %() -> wifi +// %[] -> data +// %{} -> bluetooth + + final String zero = "0"; + final String one = "1"; + final String on = "on"; + final String off = "off"; + final String ON = on.toUpperCase(); + final String OFF = off.toUpperCase(); + final String _true = "true"; + final String _false = "false"; + final String TRUE = _true.toUpperCase(); + final String FALSE = _false.toUpperCase(); + + final Pattern w0 = Pattern.compile("%w0", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern w1 = Pattern.compile("%w1", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern w2 = Pattern.compile("%w2", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern w3 = Pattern.compile("%w3", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern w4 = Pattern.compile("%w4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern wn = Pattern.compile("%wn", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern d0 = Pattern.compile("%d0", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern d1 = Pattern.compile("%d1", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern d2 = Pattern.compile("%d2", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern d3 = Pattern.compile("%d3", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern d4 = Pattern.compile("%d4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern b0 = Pattern.compile("%b0", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern b1 = Pattern.compile("%b1", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern b2 = Pattern.compile("%b2", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern b3 = Pattern.compile("%b3", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern b4 = Pattern.compile("%b4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern nl = Pattern.compile("%n", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern ip4 = Pattern.compile("%ip4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + final Pattern ip6 = Pattern.compile("%ip6", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); + + final Pattern optionalWifi = Pattern.compile("%\\(([^/]*)/([^)]*)\\)", Pattern.CASE_INSENSITIVE); + final Pattern optionalData = Pattern.compile("%\\[([^/]*)/([^\\]]*)\\]", Pattern.CASE_INSENSITIVE); + final Pattern optionalBluetooth = Pattern.compile("%\\{([^/]*)/([^}]*)\\}", Pattern.CASE_INSENSITIVE); + + String format; + int color; - if(deviceIndex == index && deviceText != null) { - sequence = deviceText; - } + WifiManager wifiManager; + BluetoothAdapter mBluetoothAdapter; + + ConnectivityManager connectivityManager; + + Class cmClass; + Method method; + + int maxDepth; + int updateTime; + + @Override + public void run() { + if(format == null) { + format = XMLPrefsManager.get(Behavior.network_info_format); + color = XMLPrefsManager.getColor(Theme.network_info_color); + maxDepth = XMLPrefsManager.getInt(Behavior.max_optional_depth_network_info); + + updateTime = XMLPrefsManager.getInt(Behavior.network_info_update_ms); + if(updateTime < 1000) updateTime = Integer.parseInt(Behavior.network_info_update_ms.defaultValue()); + + connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + wifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + + try { + cmClass = Class.forName(connectivityManager.getClass().getName()); + method = cmClass.getDeclaredMethod("getMobileDataEnabled"); + method.setAccessible(true); + } catch (Exception e) { + cmClass = null; + method = null; + } + } - if(batteryIndex == index && batteryText != null) { - sequence = TextUtils.concat(sequence, batteryText); +// mobile data + boolean mobileOn = false; + try { + mobileOn = method != null && connectivityManager != null && (Boolean) method.invoke(connectivityManager); + } catch (Exception e) {} + +// wifi + boolean wifiOn = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected(); + String wifiName = null; + if(wifiOn) { + WifiInfo connectionInfo = wifiManager.getConnectionInfo(); + if (connectionInfo != null) { + wifiName = connectionInfo.getSSID(); + } + } + +// bluetooth + boolean bluetoothOn = mBluetoothAdapter != null && mBluetoothAdapter.isEnabled(); + + String copy = format; + + if(maxDepth > 0) { + copy = apply(1, copy, new boolean[] {wifiOn, mobileOn, bluetoothOn}, optionalWifi, optionalData, optionalBluetooth); + copy = apply(1, copy, new boolean[] {mobileOn, wifiOn, bluetoothOn}, optionalData, optionalWifi, optionalBluetooth); + copy = apply(1, copy, new boolean[] {bluetoothOn, wifiOn, mobileOn}, optionalBluetooth, optionalWifi, optionalData); + } + + copy = w0.matcher(copy).replaceAll(wifiOn ? one : zero); + copy = w1.matcher(copy).replaceAll(wifiOn ? on : off); + copy = w2.matcher(copy).replaceAll(wifiOn ? ON : OFF); + copy = w3.matcher(copy).replaceAll(wifiOn ? _true : _false); + copy = w4.matcher(copy).replaceAll(wifiOn ? TRUE : FALSE); + copy = wn.matcher(copy).replaceAll(wifiName != null ? wifiName.replaceAll("\"", Tuils.EMPTYSTRING) : "null"); + copy = d0.matcher(copy).replaceAll(mobileOn ? one : zero); + copy = d1.matcher(copy).replaceAll(mobileOn ? on : off); + copy = d2.matcher(copy).replaceAll(mobileOn ? ON : OFF); + copy = d3.matcher(copy).replaceAll(mobileOn ? _true : _false); + copy = d4.matcher(copy).replaceAll(mobileOn ? TRUE : FALSE); + copy = b0.matcher(copy).replaceAll(bluetoothOn ? one : zero); + copy = b1.matcher(copy).replaceAll(bluetoothOn ? on : off); + copy = b2.matcher(copy).replaceAll(bluetoothOn ? ON : OFF); + copy = b3.matcher(copy).replaceAll(bluetoothOn ? _true : _false); + copy = b4.matcher(copy).replaceAll(bluetoothOn ? TRUE : FALSE); + copy = ip4.matcher(copy).replaceAll(NetworkUtils.getIPAddress(true)); + copy = ip6.matcher(copy).replaceAll(NetworkUtils.getIPAddress(false)); + copy = nl.matcher(copy).replaceAll(Tuils.NEWLINE); + + int i = Label.network.ordinal(); + + labelTexts[i] = Tuils.span(mContext, copy, color, labelSizes[i]); + update(labelIndexes[i]); + labelViews[i].postDelayed(this, updateTime); } - if(storageIndex == index && storageText != null) { - sequence = TextUtils.concat(sequence, storageText); + private String apply(int depth, String s, boolean[] on, Pattern... ps) { + + if(ps.length == 0) return s; + + Matcher m = ps[0].matcher(s); + while (m.find()) { + if(m.groupCount() < 2) { + s = s.replace(m.group(0), Tuils.EMPTYSTRING); + continue; + } + + String g1 = m.group(1); + String g2 = m.group(2); + + if(depth < maxDepth) { + for(int c = 0; c < ps.length - 1; c++) { + + boolean[] subOn = new boolean[on.length - 1]; + subOn[0] = on[c+1]; + + Pattern[] subPs = new Pattern[ps.length - 1]; + subPs[0] = ps[c+1]; + + for(int j = 1, k = 1; j < subOn.length; j++, k++) { + if(k == c+1) { + j--; + continue; + } + + subOn[j] = on[k]; + subPs[j] = ps[k]; + } + + g1 = apply(depth + 1, g1, subOn, subPs); + g2 = apply(depth + 1, g2, subOn, subPs); + } + } + + s = s.replace(m.group(0), on[0] ? g1 : g2); + } + + return s; } + }; - if(ramIndex == index && ramText != null) { - sequence = TextUtils.concat(sequence, ramText); + private void update(float line) { + int base = (int) line; + + List<Float> indexs = new ArrayList<>(); + for(int count = 0; count < Label.values().length; count++) { + if((int) labelIndexes[count] == base && labelTexts[count] != null) indexs.add(labelIndexes[count]); } +// now I'm sorting the labels on the same line for decimals (2.1, 2.0, ...) + Collections.sort(indexs); + + CharSequence sequence = Tuils.EMPTYSTRING; + + for(int c = 0; c < indexs.size(); c++) { + float i = indexs.get(c); - if(timeIndex == index && timeText != null) { - sequence = TextUtils.concat(sequence, timeText); + for(int a = 0; a < Label.values().length; a++) { + if(i == labelIndexes[a] && labelTexts[a] != null) sequence = TextUtils.concat(sequence, labelTexts[a]); + } } - ts[index].setText(sequence); + labelViews[base].setText(sequence); } private boolean showSuggestions; @@ -401,7 +651,7 @@ public class UIManager implements OnTouchListener { if(multipleCmdSeparator.length() > 0) { String[] split = input.split(multipleCmdSeparator); if(split.length == 0) return; - if(split.length == 1) mTerminalAdapter.setInput(text + Tuils.SPACE); + if(split.length == 1) mTerminalAdapter.setInput(text + (suggestion.type == SuggestionsManager.Suggestion.TYPE_FILE ? Tuils.EMPTYSTRING : Tuils.SPACE)); else { split[split.length - 1] = Tuils.EMPTYSTRING; @@ -410,10 +660,10 @@ public class UIManager implements OnTouchListener { beforeInputs = beforeInputs + split[count] + multipleCmdSeparator; } - mTerminalAdapter.setInput(beforeInputs + text + Tuils.SPACE); + mTerminalAdapter.setInput(beforeInputs + text + (suggestion.type == SuggestionsManager.Suggestion.TYPE_FILE ? Tuils.EMPTYSTRING : Tuils.SPACE)); } } else { - mTerminalAdapter.setInput(text + Tuils.SPACE); + mTerminalAdapter.setInput(text + (suggestion.type == SuggestionsManager.Suggestion.TYPE_FILE ? Tuils.EMPTYSTRING : Tuils.SPACE)); } } @@ -545,7 +795,7 @@ public class UIManager implements OnTouchListener { policy = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); component = new ComponentName(context, PolicyReceiver.class); - multipleCmdSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.multiple_cmd_separator); + multipleCmdSeparator = XMLPrefsManager.get(Behavior.multiple_cmd_separator); // selectFirstSuggestionEnter = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enter_first_suggestion); mContext = context; @@ -553,18 +803,16 @@ public class UIManager implements OnTouchListener { trigger = tri; - final Typeface lucidaConsole = Typeface.createFromAsset(context.getAssets(), "lucida_console.ttf"); - imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); - if (!XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper) || !canApplyTheme) { - rootView.setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.bg_color)); + if (!XMLPrefsManager.getBoolean(Ui.system_wallpaper) || !canApplyTheme) { + rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.bg_color)); } else { - rootView.setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.overlay_color)); + rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.overlay_color)); } // scrolllllll - if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.auto_scroll)) { + if(XMLPrefsManager.getBoolean(Behavior.auto_scroll)) { rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { @@ -577,89 +825,86 @@ public class UIManager implements OnTouchListener { } int rightMM, leftMM, topMM, bottomMM; - rightMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.right_margin_mm); - leftMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.left_margin_mm); - topMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.top_margin_mm); - bottomMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.bottom_margin_mm); + rightMM = XMLPrefsManager.getInt(Ui.right_margin_mm); + leftMM = XMLPrefsManager.getInt(Ui.left_margin_mm); + topMM = XMLPrefsManager.getInt(Ui.top_margin_mm); + bottomMM = XMLPrefsManager.getInt(Ui.bottom_margin_mm); - timeSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.time_size); - ramSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.ram_size); - batterySize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.battery_size); - storageSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.storage_size); + labelSizes[Label.time.ordinal()] = XMLPrefsManager.getInt(Ui.time_size); + labelSizes[Label.ram.ordinal()] = XMLPrefsManager.getInt(Ui.ram_size); + labelSizes[Label.battery.ordinal()] = XMLPrefsManager.getInt(Ui.battery_size); + labelSizes[Label.storage.ordinal()] = XMLPrefsManager.getInt(Ui.storage_size); + labelSizes[Label.network.ordinal()] = XMLPrefsManager.getInt(Ui.network_size); DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); rootView.setPadding(Tuils.mmToPx(metrics, leftMM), Tuils.mmToPx(metrics, topMM), Tuils.mmToPx(metrics, rightMM), Tuils.mmToPx(metrics, bottomMM)); -// batt, ram, ... - ts = new TextView[] { + labelViews = new TextView[] { (TextView) rootView.findViewById(R.id.tv0), (TextView) rootView.findViewById(R.id.tv1), (TextView) rootView.findViewById(R.id.tv2), (TextView) rootView.findViewById(R.id.tv3), - (TextView) rootView.findViewById(R.id.tv4) + (TextView) rootView.findViewById(R.id.tv4), + (TextView) rootView.findViewById(R.id.tv5) }; - boolean showRam = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_ram); - boolean showStorage = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_storage_info); - boolean showDevice = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_device_name); - boolean showTime = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_time); - boolean showBattery = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_battery); - - int rIndex = showRam ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.ram_index) : Integer.MAX_VALUE; - int dIndex = showDevice ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.device_index) : Integer.MAX_VALUE; - int bIndex = showBattery ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.battery_index) : Integer.MAX_VALUE; - int tIndex = showTime ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.time_index) : Integer.MAX_VALUE; - int sIndex = showStorage ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.storage_index) : Integer.MAX_VALUE; - - final int RAM = 1; - final int DEVICE = 2; - final int TIME = 3; - final int BATTERY = 4; - final int STORAGE = 5; + boolean showRam = XMLPrefsManager.getBoolean(Ui.show_ram); + boolean showStorage = XMLPrefsManager.getBoolean(Ui.show_storage_info); + boolean showDevice = XMLPrefsManager.getBoolean(Ui.show_device_name); + boolean showTime = XMLPrefsManager.getBoolean(Ui.show_time); + boolean showBattery = XMLPrefsManager.getBoolean(Ui.show_battery); + boolean showNetwork = XMLPrefsManager.getBoolean(Ui.show_network_info); + + float rIndex = showRam ? XMLPrefsManager.getFloat(Ui.ram_index) : Integer.MAX_VALUE; + float dIndex = showDevice ? XMLPrefsManager.getFloat(Ui.device_index) : Integer.MAX_VALUE; + float bIndex = showBattery ? XMLPrefsManager.getFloat(Ui.battery_index) : Integer.MAX_VALUE; + float tIndex = showTime ? XMLPrefsManager.getFloat(Ui.time_index) : Integer.MAX_VALUE; + float sIndex = showStorage ? XMLPrefsManager.getFloat(Ui.storage_index) : Integer.MAX_VALUE; + float nIndex = showNetwork ? XMLPrefsManager.getFloat(Ui.network_index) : Integer.MAX_VALUE; + + int[] pos = { + XMLPrefsManager.getInt(Ui.status_line0_position), + XMLPrefsManager.getInt(Ui.status_line1_position), + XMLPrefsManager.getInt(Ui.status_line2_position), + XMLPrefsManager.getInt(Ui.status_line3_position), + XMLPrefsManager.getInt(Ui.status_line4_position), + XMLPrefsManager.getInt(Ui.status_line5_position) + }; - final Typeface t = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_font) ? Typeface.DEFAULT : lucidaConsole; + AllowEqualsSequence sequence = new AllowEqualsSequence(new float[] {rIndex, dIndex, bIndex, tIndex, sIndex, nIndex}, + new Object[] {Label.ram, Label.device, Label.battery, Label.time, Label.storage, Label.network}); - AllowEqualsSequence sequence = new AllowEqualsSequence(new int[] {rIndex, dIndex, bIndex, tIndex, sIndex}, new Integer[] {RAM, DEVICE, BATTERY, TIME, STORAGE}); - for(int count = 0; count < ts.length; count++) { + for(int count = 0; count < labelViews.length; count++) { Object[] os = sequence.get(count); - for(Object o : os) { - int i = (Integer) o; - - switch (i) { - case RAM: - this.ramIndex = count; - break; - case DEVICE: - this.deviceIndex = count; - break; - case BATTERY: - this.batteryIndex = count; - break; - case STORAGE: - this.storageIndex = count; - break; - case TIME: - this.timeIndex = count; - break; - } +// views on the same line + for(int j = 0; j < os.length; j++) { +// i is the object gave to the constructor + int i = ((Label) os[j]).ordinal(); +// v is the adjusted index (2.0, 2.1, 2.2, ...) + float v = (float) count + ((float) j * 0.1f); + + labelIndexes[i] = v; } if(count >= sequence.getMinKey() && count <= sequence.getMaxKey() && os.length > 0) { - ts[count].setTypeface(t); + labelViews[count].setTypeface(Tuils.getTypeface(context)); + + int p = pos[count]; + if(p >= 0) labelViews[count].setGravity(p == 0 ? Gravity.CENTER_HORIZONTAL : Gravity.RIGHT); } else { - ts[count].setVisibility(View.GONE); + labelViews[count].setVisibility(View.GONE); } } if (showRam) { memory = new ActivityManager.MemoryInfo(); activityManager = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE); - ts[this.ramIndex].post(ramRunnable); + labelViews[Label.ram.ordinal()].post(ramRunnable); } if(showStorage) { - ts[this.storageIndex].post(storageRunnable); + labelViews[Label.storage.ordinal()].post(storageRunnable); } if (showDevice) { @@ -667,10 +912,10 @@ public class UIManager implements OnTouchListener { Pattern DV = Pattern.compile("%d", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); Pattern NEWLINE = Pattern.compile("%n", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); - String deviceFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.device_format); + String deviceFormat = XMLPrefsManager.get(Behavior.device_format); - String username = XMLPrefsManager.get(XMLPrefsManager.Ui.username); - String deviceName = XMLPrefsManager.get(XMLPrefsManager.Ui.deviceName); + String username = XMLPrefsManager.get(Ui.username); + String deviceName = XMLPrefsManager.get(Ui.deviceName); if (deviceName == null || deviceName.length() == 0) { deviceName = Build.DEVICE; } @@ -679,17 +924,17 @@ public class UIManager implements OnTouchListener { deviceFormat = DV.matcher(deviceFormat).replaceAll(Matcher.quoteReplacement(deviceName)); deviceFormat = NEWLINE.matcher(deviceFormat).replaceAll(Matcher.quoteReplacement(Tuils.NEWLINE)); - deviceText = Tuils.span(mContext, deviceFormat, XMLPrefsManager.getColor(XMLPrefsManager.Theme.device_color), XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.device_size)); - update(this.deviceIndex); + labelTexts[Label.device.ordinal()] = Tuils.span(mContext, deviceFormat, XMLPrefsManager.getColor(Theme.device_color), XMLPrefsManager.getInt(Ui.device_size)); + update(labelIndexes[Label.device.ordinal()]); } if(showTime) { - ts[this.timeIndex].post(timeRunnable); + labelViews[Label.time.ordinal()].post(timeRunnable); } if(showBattery) { - mediumPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_medium); - lowPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_low); + mediumPercentage = XMLPrefsManager.getInt(Behavior.battery_medium); + lowPercentage = XMLPrefsManager.getInt(Behavior.battery_low); Tuils.registerBatteryReceiver(context, batteryUpdate); } else { @@ -697,7 +942,11 @@ public class UIManager implements OnTouchListener { } // batt, ram, ... - final boolean inputBottom = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.input_bottom); + if(showNetwork) { + labelViews[Label.network.ordinal()].post(networkRunnable); + } + + final boolean inputBottom = XMLPrefsManager.getBoolean(Ui.input_bottom); int layoutId = inputBottom ? R.layout.input_down_layout : R.layout.input_up_layout; LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -714,14 +963,14 @@ public class UIManager implements OnTouchListener { TextView prefixView = (TextView) inputOutputView.findViewById(R.id.prefix_view); ImageButton submitView = (ImageButton) inputOutputView.findViewById(R.id.submit_tv); - boolean showSubmit = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_enter_button); + boolean showSubmit = XMLPrefsManager.getBoolean(Ui.show_enter_button); if (!showSubmit) { submitView.setVisibility(View.GONE); submitView = null; } // toolbar - boolean showToolbar = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Toolbar.show_toolbar); + boolean showToolbar = XMLPrefsManager.getBoolean(Toolbar.show_toolbar); ImageButton backView = null; ImageButton nextView = null; ImageButton deleteView = null; @@ -736,7 +985,7 @@ public class UIManager implements OnTouchListener { pasteView = (ImageButton) inputOutputView.findViewById(R.id.paste_view); } - if (XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.show_suggestions)) { + if (XMLPrefsManager.getBoolean(Suggestions.show_suggestions)) { showSuggestions = true; HorizontalScrollView sv = (HorizontalScrollView) rootView.findViewById(R.id.suggestions_container); @@ -769,8 +1018,8 @@ public class UIManager implements OnTouchListener { textView.setLongClickable(false); textView.setClickable(true); - textView.setTypeface(t); - textView.setTextSize(XMLPrefsManager.get(int.class, XMLPrefsManager.Suggestions.suggestions_size)); + textView.setTypeface(Tuils.getTypeface(context)); + textView.setTextSize(XMLPrefsManager.getInt(Suggestions.suggestions_size)); textView.setPadding(PADDING, PADDING, PADDING, PADDING); @@ -787,8 +1036,8 @@ public class UIManager implements OnTouchListener { this.clickListener = null; } - lockOnDbTap = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.double_tap_lock); - doubleTapCmd = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.double_tap_cmd); + lockOnDbTap = XMLPrefsManager.getBoolean(Behavior.double_tap_lock); + doubleTapCmd = XMLPrefsManager.get(Behavior.double_tap_cmd); if(!lockOnDbTap && doubleTapCmd == null) { policy = null; component = null; @@ -798,7 +1047,7 @@ public class UIManager implements OnTouchListener { mTerminalAdapter = new TerminalManager(terminalView, inputView, prefixView, submitView, backView, nextView, deleteView, pasteView, context, mainPack); mTerminalAdapter.setInputListener(inputListener); - if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_hints)) { + if(XMLPrefsManager.getBoolean(Behavior.show_hints)) { MessagesManager messagesManager = new MessagesManager(context, new MessagesManager.Message(context.getString(R.string.hint_alias)), new MessagesManager.Message(context.getString(R.string.hint_appgroups)), @@ -822,6 +1071,10 @@ public class UIManager implements OnTouchListener { } } + public void dispose() { + handler.removeCallbacksAndMessages(null); + } + public void openKeyboard() { mTerminalAdapter.requestInputFocus(); imm.showSoftInput(mTerminalAdapter.getInputView(), InputMethodManager.SHOW_IMPLICIT); 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 b208ef03573157c62d96a25d29f71ff855ee10e6..e104cc4f82edca057ee7b8fe0a35ebe08f9fee9f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java @@ -29,11 +29,14 @@ public class Command { return cmd.onNotArgEnough(info, 0); } - int[] args = info.get(Param.class, 0).args(); - if(args == null || !(mArgs[0] instanceof Param)) return resources.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0]; - Param param = (Param) mArgs[0]; + int[] args = param.args(); + if(args == null || mArgs[0] instanceof String) { + if(((String) mArgs[0]).length() == 0) cmd.onNotArgEnough(info, 0); + else return resources.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0]; + } + if(indexNotFound != -1) { param.onArgNotFound(info, indexNotFound); } @@ -64,7 +67,8 @@ public class Command { int[] args; if (useParamArgs) { - args = ((Param) mArgs[0]).args(); + if(!(mArgs[0] instanceof Param)) args = null; + else args = ((Param) mArgs[0]).args(); } else { args = cmd.argType(); } 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 5fa17a3d50017370e135f723a1e369e9b2a6667a..1f4f9c616977adf37f5c0de8ec26155f73725576 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java @@ -23,6 +23,7 @@ public interface CommandAbstraction { int NO_SPACE_STRING = 27; int APP_GROUP = 28; int APP_INSIDE_GROUP = 29; + int LONG = 30; 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 e0e0dd6aeeb4bde146d1ccf25f6f4980f10e6b34..9bec0aa42b87ddd9e4b7617f2d952065beb5144d 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java @@ -16,9 +16,11 @@ 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.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; import ohi.andre.consolelauncher.managers.music.MusicManager2; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; +import ohi.andre.consolelauncher.managers.xml.options.Apps; +import ohi.andre.consolelauncher.managers.xml.options.Notifications; import ohi.andre.consolelauncher.tuils.SimpleMutableEntry; import ohi.andre.consolelauncher.tuils.Tuils; @@ -56,8 +58,12 @@ public class CommandTuils { if(cmd instanceof ParamCommand) { ArgInfo arg = param((MainPack) info, (ParamCommand) cmd, input); if(arg == null || !arg.found) { + command.indexNotFound = 0; + args.add(input); + command.nArgs = 1; + command.mArgs = args.toArray(new Object[args.size()]); return command; - } + } else input = arg.residualString; Param p = (Param) arg.arg; @@ -167,6 +173,8 @@ public class CommandTuils { return noSpaceString(input); } else if(type == CommandAbstraction.APP_INSIDE_GROUP) { return activityName(input, ((MainPack) info).appsManager); + } else if(type == CommandAbstraction.LONG) { + return numberLong(input); } return null; @@ -175,6 +183,22 @@ public class CommandTuils { // args extractors { + private static ArgInfo numberLong(String input) { + String[] split = input.split(Tuils.SPACE); + + try { + long l = Long.parseLong(split[0]); + + StringBuilder builder = new StringBuilder(); + for(int c = 1; c < split.length; c++) { + builder.append(split[c]).append(Tuils.SPACE); + } + return new ArgInfo(l, builder.toString().trim(), true, 1); + } catch (Exception e) { + return new ArgInfo(null, input, false, 0); + } + } + private static ArgInfo color(String input) { input = input.trim(); @@ -382,7 +406,7 @@ public class CommandTuils { private static ArgInfo contactNumber(String input, ContactManager contacts) { String number; - if (Tuils.isNumber(input)) + if (Tuils.isPhoneNumber(input)) number = input; else number = contacts.findNumber(input); @@ -403,8 +427,8 @@ public class CommandTuils { for(XMLPrefsManager.XMLPrefsRoot element : XMLPrefsManager.XMLPrefsRoot.values()) { xmlPrefsEntrys.addAll(element.copy); } - Collections.addAll(xmlPrefsEntrys, AppsManager.Options.values()); - Collections.addAll(xmlPrefsEntrys, NotificationManager.Options.values()); + Collections.addAll(xmlPrefsEntrys, Apps.values()); + Collections.addAll(xmlPrefsEntrys, Notifications.values()); } String candidate = index == -1 ? input : input.substring(0,index); diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java index 80f9b13193ab3b95ee451f189ce9c670f4e492ed..6d5b429c01090667f04f03d718a79cb479417731 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java @@ -4,7 +4,8 @@ import android.util.SparseArray; import java.util.HashMap; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Cmd; /** * Created by francescoandreuzzi on 06/01/2017. @@ -21,7 +22,7 @@ public class CommandsPreferences { // search Preference searchP = new Preference(); - searchP.add(XMLPrefsManager.get(String.class, XMLPrefsManager.Cmd.default_search), DEFAULT_PARAM); + searchP.add(XMLPrefsManager.get(Cmd.default_search), DEFAULT_PARAM); preferenceHashMap.put("search", searchP); } 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 da4db50bcbf7732be7fb461a282436f3870a7546..27ae035d77b5bdd925226e7a4b0249ff526f6558 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java @@ -2,6 +2,11 @@ package ohi.andre.consolelauncher.commands; import android.content.Context; +import java.util.ArrayList; + +import ohi.andre.consolelauncher.managers.AppsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + @SuppressWarnings("deprecation") public abstract class ExecutePack { @@ -9,17 +14,49 @@ public abstract class ExecutePack { public Context context; public CommandGroup commandGroup; + public int currentIndex = 0; + public ExecutePack(CommandGroup group) { this.commandGroup = group; } @SuppressWarnings("unchecked") + public <T> T get(Class<T> c) { + return (T) get(); + } + public <T> T get(Class<T> c, int index) { - if (index >= this.args.length) { - return null; - } + if(index < args.length) return (T) args[index]; + return null; + } + + public Object get() { + if(currentIndex < args.length) return args[currentIndex++]; + return null; + } + + public String getString() { + return (String) get(); + } + + public int getInt() { + return (int) get(); + } + + public boolean getBoolean() { + return (boolean) get(); + } + + public ArrayList getList() { + return (ArrayList) get(); + } + + public XMLPrefsManager.XMLPrefsSave getPrefsSave() { + return (XMLPrefsManager.XMLPrefsSave) get(); + } - return (T) (this.args[index]); + public AppsManager.LaunchInfo getLaunchInfo() { + return (AppsManager.LaunchInfo) get(); } public void set(Object[] args) { @@ -28,5 +65,6 @@ public abstract class ExecutePack { public void clear() { args = null; + currentIndex = 0; } } 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 6d32798b87a903b28d1c7a778d9027deac469cf8..e24703281dc3a9dc51f17130a5f587f7c5c93ca9 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 @@ -15,9 +15,11 @@ import ohi.andre.consolelauncher.commands.ExecutePack; import ohi.andre.consolelauncher.managers.AliasManager; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.managers.ContactManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.RssManager; import ohi.andre.consolelauncher.managers.flashlight.TorchManager; import ohi.andre.consolelauncher.managers.music.MusicManager2; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter; import ohi.andre.consolelauncher.tuils.interfaces.Redirectator; import ohi.andre.consolelauncher.tuils.interfaces.Reloadable; @@ -77,14 +79,18 @@ public class MainPack extends ExecutePack { public ShellHolder shellHolder; + public RssManager rssManager; + public MainPack(Context context, CommandGroup commandGroup, AliasManager alMgr, AppsManager appmgr, MusicManager2 p, - ContactManager c, Reloadable r, CommandExecuter executeCommand, Redirectator redirectator, ShellHolder shellHolder) { + ContactManager c, Reloadable r, CommandExecuter executeCommand, Redirectator redirectator, ShellHolder shellHolder, RssManager rssManager) { super(commandGroup); - this.currentDirectory = XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.home_path); + this.currentDirectory = XMLPrefsManager.get(File.class, Behavior.home_path); this.shellHolder = shellHolder; + this.rssManager = rssManager; + this.res = context.getResources(); this.executer = executeCommand; @@ -140,5 +146,6 @@ public class MainPack extends ExecutePack { public void destroy() { if(player != null) player.destroy(); appsManager.onDestroy(); + if(rssManager != null) rssManager.dispose(); } } 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 277e8986f36ae1a47b3dfcd535ecffd8d7bbe89d..f467f9c45540d9edd6023754130815d6b5b571c7 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 @@ -21,7 +21,7 @@ public class alias extends ParamCommand { add { @Override public String exec(ExecutePack pack) { - ArrayList<String> args = pack.get(ArrayList.class, 1); + ArrayList<String> args = pack.getList(); if(args.size() < 2) return pack.context.getString(R.string.output_lessarg); if( ((MainPack) pack).aliasManager.add(args.remove(0), Tuils.toPlanString(args, Tuils.SPACE)) ) { @@ -39,7 +39,7 @@ public class alias extends ParamCommand { rm { @Override public String exec(ExecutePack pack) { - ArrayList<String> args = pack.get(ArrayList.class, 1); + ArrayList<String> args = pack.getList(); if(args.size() < 1) return pack.context.getString(R.string.output_lessarg); if(((MainPack) pack).aliasManager.remove(args.get(0))) return null; else return pack.context.getString(R.string.output_aliasnotfound) + Tuils.SPACE + args.get(0); 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 96f7baeed75bf3b41b9c5a7b5942aaefe7454c82..f7600e9f6d6d1adadea5288e6d6caff8c10ea89b 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,7 +14,8 @@ 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.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Apps; import ohi.andre.consolelauncher.tuils.Tuils; public class apps extends ParamCommand { @@ -51,7 +52,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1); + AppsManager.LaunchInfo i = pack.getLaunchInfo(); ((MainPack) pack).appsManager.showActivity(i); return null; } @@ -64,7 +65,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1); + AppsManager.LaunchInfo i = pack.getLaunchInfo(); ((MainPack) pack).appsManager.hideActivity(i); return null; } @@ -78,7 +79,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { try { - AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1); + AppsManager.LaunchInfo i = pack.getLaunchInfo(); 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(i, info); @@ -95,7 +96,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - openPlaystore(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName()); + openPlaystore(pack.context, pack.getLaunchInfo().componentName.getPackageName()); return null; } }, @@ -107,9 +108,9 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - int index = pack.get(int.class, 1); + int index = pack.getInt(); - Object o = pack.get(Object.class, 2); + Object o = pack.get(); String marker; if(o instanceof AppsManager.LaunchInfo) { @@ -120,7 +121,7 @@ public class apps extends ParamCommand { } try { - XMLPrefsManager.XMLPrefsSave save = AppsManager.Options.valueOf("default_app_n" + index); + XMLPrefsManager.XMLPrefsSave save = Apps.valueOf("default_app_n" + index); save.parent().write(save, marker); return null; } catch (Exception e) { @@ -145,7 +146,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - openSettings(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName()); + openSettings(pack.context, pack.getLaunchInfo().componentName.getPackageName()); return null; } }, @@ -157,7 +158,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(AppsManager.LaunchInfo.class, 1)); + Intent intent = ((MainPack) pack).appsManager.getIntent(pack.getLaunchInfo()); pack.context.startActivity(intent); return null; @@ -175,6 +176,86 @@ public class apps extends ParamCommand { return null; } }, +// services { +// @Override +// public int[] args() { +// return new int[] {CommandAbstraction.VISIBLE_PACKAGE}; +// } +// +// @Override +// public String exec(ExecutePack pack) { +// AppsManager.LaunchInfo info = pack.get(AppsManager.LaunchInfo.class, 1); +// +// List<String> services = new ArrayList<>(); +// +// ActivityManager activityManager = (ActivityManager) pack.context.getSystemService(Context.ACTIVITY_SERVICE); +// for(ActivityManager.RunningServiceInfo i : activityManager.getRunningServices(Integer.MAX_VALUE)) { +// ComponentName name = i.service; +// +// if(info.equals(name.getPackageName())) { +// services.add(name.getClassName().replace(name.getPackageName(), Tuils.EMPTYSTRING)); +// } +// } +// +// if(services.size() == 0) return "[]"; +// Collections.sort(services); +// return Tuils.toPlanString(services, Tuils.NEWLINE); +// } +// +// @Override +// public String onNotArgEnough(ExecutePack pack, int n) { +// +// List<SimpleMutableEntry<String, ArrayList<String>>> services = new ArrayList<>(); +// +// ActivityManager activityManager = (ActivityManager) pack.context.getSystemService(Context.ACTIVITY_SERVICE); +// Tuils.log(activityManager.getRunningServices(Integer.MAX_VALUE).toString()); +// for(ActivityManager.RunningServiceInfo i : activityManager.getRunningServices(Integer.MAX_VALUE)) { +// +// boolean check = false; +// for(SimpleMutableEntry<String, ArrayList<String>> s : services) { +// if(s.getKey().equals(i.service.getPackageName())) { +// s.getValue().add(i.service.getClassName().replace(i.service.getPackageName(), Tuils.EMPTYSTRING)); +// +// check = true; +// break; +// } +// } +// +// if(!check) { +// SimpleMutableEntry<String,ArrayList<String>> s = new SimpleMutableEntry<>(i.service.getPackageName(), new ArrayList<String>()); +// s.getValue().add(i.service.getClassName().replace(i.service.getPackageName(), Tuils.EMPTYSTRING)); +// services.add(s); +// } +// } +// +// if(services.size() == 0) return "[]"; +// Collections.sort(services, new Comparator<SimpleMutableEntry<String, ArrayList<String>>>() { +// @Override +// public int compare(SimpleMutableEntry<String, ArrayList<String>> o1, SimpleMutableEntry<String, ArrayList<String>> o2) { +// return o1.getKey().compareTo(o2.getKey()); +// } +// }); +// +// PackageManager manager = pack.context.getPackageManager(); +// StringBuilder b = new StringBuilder(); +// for(SimpleMutableEntry<String, ArrayList<String>> s : services) { +// String appName = null; +// try { +// appName = manager.getApplicationInfo(s.getKey(), 0).loadLabel(manager).toString(); +// } catch (PackageManager.NameNotFoundException e) {} +// +// if(appName != null) b.append(appName).append(Tuils.SPACE).append("(").append(s.getKey()).append(")"); +// else b.append(s.getKey()); +// b.append(Tuils.NEWLINE); +// +// for(String st : s.getValue()) { +// b.append(" - ").append(st).append(Tuils.NEWLINE); +// } +// b.append(Tuils.NEWLINE); +// } +// return b.toString().trim(); +// } +// }, reset { @Override public int[] args() { @@ -183,7 +264,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - AppsManager.LaunchInfo app = pack.get(AppsManager.LaunchInfo.class, 1); + AppsManager.LaunchInfo app = pack.getLaunchInfo(); app.launchedTimes = 0; ((MainPack) pack).appsManager.writeLaunchTimes(app); @@ -198,7 +279,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); + String name = pack.getString(); return ((MainPack) pack).appsManager.createGroup(name); } }, @@ -210,7 +291,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); + String name = pack.getString(); return ((MainPack) pack).appsManager.removeGroup(name); } }, @@ -222,15 +303,15 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); - String color = pack.get(String.class, 2); + String name = pack.getString(); + String color = pack.getString(); return ((MainPack) pack).appsManager.groupBgColor(name, color); } @Override public String onNotArgEnough(ExecutePack pack, int n) { if(n == 2) { - String name = pack.get(String.class, 1); + String name = pack.getString(); return ((MainPack) pack).appsManager.groupBgColor(name, Tuils.EMPTYSTRING); } return super.onNotArgEnough(pack, n); @@ -249,15 +330,15 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); - String color = pack.get(String.class, 2); + String name = pack.getString(); + String color = pack.getString(); return ((MainPack) pack).appsManager.groupForeColor(name, color); } @Override public String onNotArgEnough(ExecutePack pack, int n) { if(n == 2) { - String name = pack.get(String.class, 1); + String name = pack.getString(); return ((MainPack) pack).appsManager.groupForeColor(name, Tuils.EMPTYSTRING); } return super.onNotArgEnough(pack, n); @@ -276,7 +357,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); + String name = pack.getString(); return ((MainPack) pack).appsManager.listGroup(name); } @@ -293,8 +374,8 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); - AppsManager.LaunchInfo app = pack.get(AppsManager.LaunchInfo.class, 2); + String name = pack.getString(); + AppsManager.LaunchInfo app = pack.getLaunchInfo(); return ((MainPack) pack).appsManager.addAppToGroup(name, app); } }, @@ -306,8 +387,8 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - String name = pack.get(String.class, 1); - AppsManager.LaunchInfo app = pack.get(AppsManager.LaunchInfo.class, 2); + String name = pack.getString(); + AppsManager.LaunchInfo app = pack.getLaunchInfo(); return ((MainPack) pack).appsManager.removeAppFromGroup(name, app); } }, diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java index 7b53c49fe691aa77beceb577fc7e17ff7dea62c0..dbf60b7801e86d36ee31c9225c10366cc93081f5 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java @@ -14,7 +14,7 @@ public class bluetooth implements CommandAbstraction { public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - if(adapter.getState() == BluetoothAdapter.STATE_ON) { + if(adapter.isEnabled()) { adapter.disable(); return info.context.getString(R.string.output_bluetooth) + Tuils.SPACE + "false"; } else { diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java index f524cdd2e96f95391bceb420c77d0282b22d5761..12b4875f098bf6843c71378fcf8bfc66e3d6150a 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java @@ -16,7 +16,7 @@ public class calc extends PermanentSuggestionCommand { @Override public String exec(ExecutePack pack) throws Exception { try { - return String.valueOf(Tuils.eval(pack.get(String.class, 0))); + return String.valueOf(Tuils.eval(pack.getString())); } catch (Exception e) { return e.toString(); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java index 50e5d3d38c93fc099a873295f580db83a2ccff7f..dd89f05ed9c31f667a9b96871111cdf09e090dee 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java @@ -27,7 +27,7 @@ public class call implements CommandAbstraction { return info.context.getString(R.string.output_waitingpermission); } - String number = info.get(String.class, 0); + String number = info.getString(); String s = Tuils.EMPTYSTRING; for(char c : number.toCharArray()) { if(c == '#') s += Uri.encode("#"); 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 a5354bbea74c9032270e6c84146225b41509d621..70f544e3a489b627c0018c11870dee8b5ec773e0 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 @@ -63,7 +63,7 @@ public class cntcts extends ParamCommand { return pack.context.getString(R.string.output_waitingpermission); } - ((MainPack) pack).contacts.delete(pack.get(String.class, 1)); + ((MainPack) pack).contacts.delete(pack.getString()); return null; } @@ -81,7 +81,7 @@ public class cntcts extends ParamCommand { @Override public String exec(ExecutePack pack) { Intent editIntent = new Intent(Intent.ACTION_EDIT); - editIntent.setDataAndType(((MainPack) pack).contacts.fromPhone(pack.get(String.class, 1)), ContactsContract.Contacts.CONTENT_ITEM_TYPE); + editIntent.setDataAndType(((MainPack) pack).contacts.fromPhone(pack.getString()), ContactsContract.Contacts.CONTENT_ITEM_TYPE); pack.context.startActivity(editIntent); return null; @@ -100,7 +100,7 @@ public class cntcts extends ParamCommand { l { @Override public String exec(ExecutePack pack) { - String[] about = ((MainPack) pack).contacts.about(pack.get(String.class, 1)); + String[] about = ((MainPack) pack).contacts.about(pack.getString()); StringBuilder builder = new StringBuilder(); builder.append(about[ContactManager.NAME]).append(Tuils.NEWLINE); 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 7949a5e2b3668e11d334e8631622620975e2942e..3e8fbd676156105929ac72136c17fee7208683ae 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 @@ -10,8 +10,10 @@ 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.managers.xml.XMLPrefsManager; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; +import ohi.andre.consolelauncher.managers.xml.options.Apps; +import ohi.andre.consolelauncher.managers.xml.options.Notifications; import ohi.andre.consolelauncher.tuils.Tuils; /** @@ -30,8 +32,8 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1); - save.parent().write(save, pack.get(String.class, 2)); + XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave(); + save.parent().write(save, pack.getString()); if(save.label().startsWith("default_app_n")) { return pack.context.getString(R.string.output_usedefapp); @@ -53,7 +55,7 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - File file = new File(Tuils.getFolder(), pack.get(String.class, 1)); + File file = new File(Tuils.getFolder(), pack.getString()); pack.context.startActivity(Tuils.openFile(file)); return null; } @@ -63,6 +65,26 @@ public class config extends ParamCommand { return pack.context.getString(R.string.output_filenotfound); } }, + append { + @Override + public int[] args() { + return new int[] {CommandAbstraction.CONFIG_ENTRY, CommandAbstraction.PLAIN_TEXT}; + } + + @Override + public String exec(ExecutePack pack) { + XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave(); + save.parent().write(save, XMLPrefsManager.get(save) + pack.getString()); + + return null; + } + + @Override + public String onNotArgEnough(ExecutePack pack, int n) { + pack.args = new Object[] {pack.args[0], pack.args[1], Tuils.EMPTYSTRING}; + return set.exec(pack); + } + }, get { @Override public int[] args() { @@ -71,7 +93,7 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1); + XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave(); String s = XMLPrefsManager.get(String.class, save); if(s.length() == 0) return "\"\""; return s; @@ -85,7 +107,7 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - File file = new File(Tuils.getFolder(), pack.get(String.class, 1)); + File file = new File(Tuils.getFolder(), pack.getString()); String name = file.getName(); for(XMLPrefsManager.XMLPrefsRoot r : XMLPrefsManager.XMLPrefsRoot.values()) { @@ -111,11 +133,11 @@ public class config extends ParamCommand { } } ss.add(AppsManager.PATH); - for(XMLPrefsManager.XMLPrefsSave save : AppsManager.Options.values()) { + for(XMLPrefsManager.XMLPrefsSave save : Apps.values()) { ss.add(Tuils.DOUBLE_SPACE + save.label()); } ss.add(NotificationManager.PATH); - for(XMLPrefsManager.XMLPrefsSave save : NotificationManager.Options.values()) { + for(XMLPrefsManager.XMLPrefsSave save : Notifications.values()) { ss.add(Tuils.DOUBLE_SPACE + save.label()); } @@ -135,7 +157,7 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1); + XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave(); save.parent().write(save, save.defaultValue()); return null; } @@ -148,14 +170,32 @@ public class config extends ParamCommand { @Override public String exec(ExecutePack pack) { - File file = pack.get(File.class, 1); + File file = pack.get(File.class); + + if(!file.getName().endsWith(".xml")) { +// is font + File font = new File(Tuils.getFolder(), Tuils.FONT_PATH); + if(font.exists()) { + File[] files = font.listFiles(); + if(files.length > 0) Tuils.insertOld(files[0]); + Tuils.deleteContent(font); + } else { + font.mkdir(); + } - File old = new File(Tuils.getFolder(), file.getName()); - Tuils.insertOld(old); + File dest = new File(font, file.getName()); + file.renameTo(dest); - file.renameTo(new File(Tuils.getFolder(), file.getName())); + return "Path: " + dest.getAbsolutePath(); + } else { + File old = new File(Tuils.getFolder(), file.getName()); + Tuils.insertOld(old); - return null; + File dest = new File(Tuils.getFolder(), file.getName()); + file.renameTo(dest); + + return "Path: " + dest.getAbsolutePath(); + } } }, tutorial { diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java index 4c143cd7d82b4a60616fc209f9cfe7863e99f815..1360647fb43c89da86000bbd5bb94f08b4cd9f2a 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java @@ -23,7 +23,7 @@ public class devutils extends ParamCommand { notify { @Override public String exec(ExecutePack pack) { - List<String> text = pack.get(List.class, 1); + List<String> text = pack.getList(); String title, txt = null; if(text.size() == 0) return null; diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java index 21f5be37895597a27b32829d18ecf7a7efe5e81e..5644336242fa44e50d3444a9ac1acbfeb77f3507 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java @@ -17,7 +17,7 @@ public class help implements CommandAbstraction { @Override public String exec(ExecutePack pack) throws Exception { MainPack info = (MainPack) pack; - CommandAbstraction cmd = info.get(CommandAbstraction.class, 0); + CommandAbstraction cmd = info.get(CommandAbstraction.class); int res = cmd == null ? R.string.output_commandnotfound : cmd.helpRes(); return info.res.getString(res); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java index e402c36b8331954e604ff0c7b0e3a73a07cf59aa..077e65b2d5d6465ceabae7795cab9810b41fbbc3 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java @@ -8,19 +8,19 @@ import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.music.MusicManager2; import ohi.andre.consolelauncher.managers.music.Song; import ohi.andre.consolelauncher.tuils.Tuils; +import ohi.andre.consolelauncher.tuils.libsuperuser.Shell; public class music extends ParamCommand { private enum Param implements ohi.andre.consolelauncher.commands.main.Param { next { - @Override - public int[] args() { - return new int[0]; - } @Override public String exec(ExecutePack pack) { - if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled); + if(((MainPack) pack).player == null) { + execute("NEXT"); + return null; + } String title = ((MainPack) pack).player.playNext(); if(title != null) return pack.context.getString(R.string.output_playing) + Tuils.SPACE + title; @@ -28,14 +28,13 @@ public class music extends ParamCommand { } }, previous { - @Override - public int[] args() { - return new int[0]; - } @Override public String exec(ExecutePack pack) { - if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled); + if(((MainPack) pack).player == null) { + execute("PREVIOUS"); + return null; + } String title = ((MainPack) pack).player.playPrev(); if(title != null) return pack.context.getString(R.string.output_playing) + Tuils.SPACE + title; @@ -43,10 +42,6 @@ public class music extends ParamCommand { } }, ls { - @Override - public int[] args() { - return new int[0]; - } @Override public String exec(ExecutePack pack) { @@ -56,14 +51,13 @@ public class music extends ParamCommand { } }, play { - @Override - public int[] args() { - return new int[0]; - } @Override public String exec(ExecutePack pack) { - if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled); + if(((MainPack) pack).player == null) { + execute("PLAY_PAUSE"); + return null; + } String title = ((MainPack) pack).player.play(); if(title == null) return null; @@ -71,14 +65,13 @@ public class music extends ParamCommand { } }, stop { - @Override - public int[] args() { - return new int[0]; - } @Override public String exec(ExecutePack pack) { - if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled); + if(((MainPack) pack).player == null) { + execute("CLOSE"); + return null; + } ((MainPack) pack).player.stop(); return null; @@ -94,7 +87,7 @@ public class music extends ParamCommand { public String exec(ExecutePack pack) { if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled); - String s = pack.get(String.class, 1); + String s = pack.getString(); ((MainPack) pack).player.select(s); return null; } @@ -105,10 +98,6 @@ public class music extends ParamCommand { } }, info { - @Override - public int[] args() { - return new int[0]; - } @Override public String exec(ExecutePack pack) { @@ -151,7 +140,7 @@ public class music extends ParamCommand { public String exec(ExecutePack pack) { if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled); - ((MainPack) pack).player.seekTo(pack.get(int.class, 1) * 1000); + ((MainPack) pack).player.seekTo(pack.getInt() * 1000); return null; } @@ -195,6 +184,15 @@ public class music extends ParamCommand { public String onNotArgEnough(ExecutePack pack, int n) { return pack.context.getString(R.string.help_music); } + + @Override + public int[] args() { + return new int[0]; + } + } + + private static void execute(String code) { + Shell.SH.run("input keyevent KEYCODE_MEDIA_" + code); } @Override 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 a3ab9701d87d1ab5f7876451b8821fd8f24a0666..683132af77d622593ff453d402edd0c22f372bc9 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 @@ -9,7 +9,6 @@ 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; @@ -24,7 +23,7 @@ public class notifications extends ParamCommand { inc { @Override public String exec(ExecutePack pack) { - NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, true)); + NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.getLaunchInfo().componentName.getPackageName(), null, true)); return null; } @@ -41,7 +40,7 @@ public class notifications extends ParamCommand { exc { @Override public String exec(ExecutePack pack) { - NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, false)); + NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.getLaunchInfo().componentName.getPackageName(), null, false)); return null; } @@ -59,7 +58,9 @@ public class notifications extends ParamCommand { @Override public String exec(ExecutePack pack) { try { - NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName(), pack.get(String.class, 1), true)); + String s = pack.getString(); + + NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.getLaunchInfo().componentName.getPackageName(), s, true)); } catch (Exception e) {} return null; } @@ -81,8 +82,8 @@ public class notifications extends ParamCommand { title_filter { @Override public String exec(ExecutePack pack) { - int id = pack.get(int.class, 1); - NotificationManager.excludeRegex(pack.get(String.class, 2), "title", id); + int id = pack.getInt(); + NotificationManager.excludeRegex(pack.getString(), "title", id); return null; } @@ -99,8 +100,8 @@ public class notifications extends ParamCommand { text_filter { @Override public String exec(ExecutePack pack) { - int id = pack.get(int.class, 1); - NotificationManager.excludeRegex(pack.get(String.class, 2), "text", id); + int id = pack.getInt(); + NotificationManager.excludeRegex(pack.getString(), "text", id); return null; } @@ -122,8 +123,8 @@ public class notifications extends ParamCommand { @Override public String exec(ExecutePack pack) { - int id = pack.get(int.class, 1); - NotificationManager.applyFilter(id, pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName()); + int id = pack.getInt(); + NotificationManager.applyFilter(id, pack.getLaunchInfo().componentName.getPackageName()); return null; } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java index 860d2092062b72562f7e94651442476f4e011586..1b330d19e7b5a969f9406178ce71e19135ced5ee 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java @@ -14,7 +14,7 @@ public class open implements CommandAbstraction { @Override public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; - File file = info.get(File.class, 0); + File file = info.get(File.class); int result = FileManager.openFile(info.context, file); 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 8f7d63c284489440a4d5536feb030b1cf56073dc..da1883467a218b183d19862e5bc6c5fcc8a6beec 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 @@ -14,6 +14,7 @@ public class refresh implements CommandAbstraction { info.aliasManager.reload(); if(info.player != null) info.player.refresh(); info.contacts.refreshContacts(info.context); + info.rssManager.refresh(); return info.res.getString(R.string.output_refresh); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/regex.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/regex.java new file mode 100644 index 0000000000000000000000000000000000000000..1440638fe01c6374799130cbbbbbca979d2735c8 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/regex.java @@ -0,0 +1,138 @@ +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; +import ohi.andre.consolelauncher.commands.specific.ParamCommand; +import ohi.andre.consolelauncher.managers.RegexManager; +import ohi.andre.consolelauncher.tuils.Tuils; + +/** + * Created by francescoandreuzzi on 04/10/2017. + */ + +public class regex extends ParamCommand { + + private enum Param implements ohi.andre.consolelauncher.commands.main.Param { + + add { + @Override + public String exec(ExecutePack pack) { + String output = RegexManager.add(pack.getInt(), pack.getString()); + if(output == null) return null; + if(output.length() == 0) return pack.context.getString(R.string.regex_exists); + else return output; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; + } + }, + rm { + @Override + public String exec(ExecutePack pack) { + String output = RegexManager.rm(pack.getInt()); + if(output == null) return null; + if(output.length() == 0) return pack.context.getString(R.string.regex_not_found); + return output; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + }, + get { + @Override + public String exec(ExecutePack pack) { + RegexManager.Regex r = RegexManager.get(pack.getInt()); + if(r == null) return pack.context.getString(R.string.id_notfound); + + return r.value; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + }, + test { + @Override + public String exec(ExecutePack pack) { + CharSequence s = RegexManager.test(pack.getInt(), pack.getString()); + if(s.length() == 0) return pack.context.getString(R.string.id_notfound); + + Tuils.sendOutput(pack.context, s); + return null; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; + } + }; + + @Override + public String onArgNotFound(ExecutePack pack, int index) { + return pack.context.getString(R.string.invalid_integer); + } + + @Override + public String onNotArgEnough(ExecutePack pack, int n) { + return pack.context.getString(R.string.help_regex); + } + + @Override + public String label() { + return Tuils.MINUS + name(); + } + + static Param get(String p) { + p = p.toLowerCase(); + Param[] ps = values(); + for (Param p1 : ps) + if (p.endsWith(p1.label())) + return p1; + return null; + } + + static String[] labels() { + Param[] ps = values(); + String[] ss = new String[ps.length]; + + for (int count = 0; count < ps.length; count++) { + ss[count] = ps[count].label(); + } + + return ss; + } + + } + + @Override + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { + return Param.get(param); + } + + @Override + protected String doThings(ExecutePack pack) { + return null; + } + + @Override + public int priority() { + return 2; + } + + @Override + public int helpRes() { + return R.string.help_regex; + } + + @Override + public String[] params() { + return Param.labels(); + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/rss.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/rss.java new file mode 100644 index 0000000000000000000000000000000000000000..dadca042cb8b9aefedfa1eec67aa880bacbb3ebc --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/rss.java @@ -0,0 +1,323 @@ +package ohi.andre.consolelauncher.commands.main.raw; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +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.RssManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Rss; +import ohi.andre.consolelauncher.tuils.TimeManager; +import ohi.andre.consolelauncher.tuils.Tuils; + +/** + * Created by francescoandreuzzi on 30/09/2017. + */ + +public class rss extends ParamCommand { + + private enum Param implements ohi.andre.consolelauncher.commands.main.Param { + + add { + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + long tm = pack.get(long.class); + String url = pack.getString(); + + return ((MainPack) pack).rssManager.add(id, tm, url); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.LONG, CommandAbstraction.PLAIN_TEXT}; + } + }, + rm { + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + + return ((MainPack) pack).rssManager.rm(id); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + + + }, + ls { + @Override + public String exec(ExecutePack pack) { + return ((MainPack) pack).rssManager.list(); + } + + @Override + public int[] args() { + return new int[0]; + } + }, + l { + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + ((MainPack) pack).rssManager.l(id); + return null; + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + }, + show { + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + boolean show = pack.getBoolean(); + + return ((MainPack) pack).rssManager.setShow(id, show); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.BOOLEAN}; + } + }, + time { + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + long tm = pack.get(long.class); + + return ((MainPack) pack).rssManager.setTime(id, tm); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.LONG}; + } + }, + format { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; + } + + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + String s = pack.getString(); + + return ((MainPack) pack).rssManager.setFormat(id, s); + } + }, + color { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.COLOR}; + } + + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + String c = pack.getString(); + + return ((MainPack) pack).rssManager.setColor(id, c); + } + + @Override + public String onArgNotFound(ExecutePack pack, int index) { + if(index == 2) return pack.context.getString(R.string.output_invalidcolor); + return super.onArgNotFound(pack, index); + } + }, + last_check { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + + @Override + public String exec(ExecutePack pack) { + String output = XMLPrefsManager.attrValue(new File(Tuils.getFolder(), RssManager.PATH), RssManager.NAME, + RssManager.RSS_LABEL, new String[] {RssManager.ID_ATTRIBUTE}, new String[] {String.valueOf(pack.getInt())}, + RssManager.LASTCHECKED_ATTRIBUTE); + if(output == null || output.length() == 0) return pack.context.getString(R.string.id_notfound); + + try { + DateFormat defaultRSSDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z"); + return TimeManager.replace(XMLPrefsManager.get(Rss.rss_time_format), defaultRSSDateFormat.parse(output).getTime(), + Integer.MAX_VALUE).toString(); + } catch (Exception e) { + return pack.context.getString(R.string.output_error); + } + } + }, + frc { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + + @Override + public String exec(ExecutePack pack) { + return null; + } + }, + info { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + + @Override + public String exec(ExecutePack pack) { + return null; + } + }, + include_if_matches { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; + } + + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + String r = pack.getString(); + + return ((MainPack) pack).rssManager.setIncludeIfMatches(id, r); + } + }, + exclude_if_matches { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; + } + + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + String r = pack.getString(); + + return ((MainPack) pack).rssManager.setExcludeIfMatches(id, r); + } + }, + wifi_only { + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.BOOLEAN}; + } + + @Override + public String exec(ExecutePack pack) { + int id = pack.getInt(); + boolean w = pack.getBoolean(); + + return ((MainPack) pack).rssManager.setWifiOnly(id, w); + } + }, + add_format { + @Override + public String exec(ExecutePack pack) { + return ((MainPack) pack).rssManager.addFormat(pack.getInt(), pack.getString()); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT}; + } + }, + rm_format { + @Override + public String exec(ExecutePack pack) { + return ((MainPack) pack).rssManager.removeFormat(pack.getInt()); + } + + @Override + public int[] args() { + return new int[] {CommandAbstraction.INT}; + } + }, + file { + @Override + public String exec(ExecutePack pack) { + pack.context.startActivity(Tuils.openFile(new File(Tuils.getFolder(), RssManager.PATH))); + return null; + } + + @Override + public int[] args() { + return new int[0]; + } + }; + + @Override + public String label() { + return Tuils.MINUS + name(); + } + + static Param get(String p) { + p = p.toLowerCase(); + Param[] ps = values(); + for (Param p1 : ps) + if (p.endsWith(p1.label())) + return p1; + return null; + } + + static String[] labels() { + Param[] ps = values(); + String[] ss = new String[ps.length]; + + for (int count = 0; count < ps.length; count++) { + ss[count] = ps[count].label(); + } + + return ss; + } + + @Override + public String onNotArgEnough(ExecutePack pack, int n) { + return pack.context.getString(R.string.help_rss); + } + + @Override + public String onArgNotFound(ExecutePack pack, int index) { + return pack.context.getString(R.string.invalid_integer); + } + } + + @Override + protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) { + return Param.get(param); + } + + @Override + protected String doThings(ExecutePack pack) { + return null; + } + + @Override + public int priority() { + return 3; + } + + @Override + public int helpRes() { + return R.string.help_rss; + } + + @Override + public String[] params() { + return Param.labels(); + } +} 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 f56dac250fb7e53d735a65a7ba8dd2e6bd1ac9b1..d695816c798da59edb0a9c179f4f0ef88a5c212b 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 @@ -4,7 +4,6 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import java.util.ArrayList; import java.util.List; import ohi.andre.consolelauncher.R; @@ -27,7 +26,7 @@ public class search extends ParamCommand { ps { @Override public String exec(ExecutePack pack) { - List<String> args = pack.get(ArrayList.class, 1); + List<String> args = pack.getList(); return playstore(args, pack.context); } }, @@ -42,28 +41,28 @@ public class search extends ParamCommand { gg { @Override public String exec(ExecutePack pack) { - List<String> args = pack.get(ArrayList.class, 1); + List<String> args = pack.getList(); return google(args, pack.context); } }, yt { @Override public String exec(ExecutePack pack) { - List<String> args = pack.get(ArrayList.class, 1); + List<String> args = pack.getList(); return youTube(args, pack.context); } }, u { @Override public String exec(ExecutePack pack) { - List<String> args = pack.get(ArrayList.class, 1); + List<String> args = pack.getList(); return url(Tuils.toPlanString(args, Tuils.SPACE), pack.context); } }, dd { @Override public String exec(ExecutePack pack) { - List<String> args = pack.get(ArrayList.class, 1); + List<String> args = pack.getList(); return duckDuck(args, pack.context); } }; diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java index c4dc50846374b51ba2bb9097b6c50b28faf3ab2f..a80432e33c3c9f57cb562232df88f0fb51d99d3a 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java @@ -15,7 +15,7 @@ public class share implements CommandAbstraction { @Override public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; - File f = info.get(File.class, 0); + File f = info.get(File.class); if (f.isDirectory()) return info.res.getString(R.string.output_isdirectory); 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 5f2da41414319d399775c044985a3979c030ba25..2f8fe265f3b3fd6b50df61a15d7b20686c17650e 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 @@ -29,7 +29,7 @@ public class sms extends RedirectCommand { return info.context.getString(R.string.output_waitingpermission); } - beforeObjects.add(pack.get(String.class, 0)); + beforeObjects.add(pack.getString()); if(afterObjects.size() == 0) { info.redirectator.prepareRedirection(this); diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java index 1fbf0e59595a69cae5b6242c051135677e989309..613167b2f08add0275b7ca136c28267200ab2a23 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java @@ -5,8 +5,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.os.Build; -import android.provider.Settings; + +import java.lang.reflect.Method; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; @@ -24,6 +24,7 @@ public class status implements CommandAbstraction { @Override public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; + ConnectivityManager connManager = (ConnectivityManager) info.context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); boolean wifiConnected = mWifi.isConnected(); @@ -37,20 +38,21 @@ public class status implements CommandAbstraction { } level *= 100; - boolean connected = false; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - connected = Settings.Global.getInt(info.context.getContentResolver(), "mobile_data", 0) == 1; - } - } else { - ConnectivityManager cm = (ConnectivityManager) info.context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); - boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; - } + boolean mobileOn = false; + Class cmClass; + Method method; + try { + cmClass = Class.forName(connManager.getClass().getName()); + method = cmClass.getDeclaredMethod("getMobileDataEnabled"); + method.setAccessible(true); + + mobileOn = (Boolean) method.invoke(connManager); + } catch (Exception e) {} + return info.res.getString(R.string.battery_charge) + Tuils.SPACE + (int) level + PERCENTAGE + Tuils.NEWLINE + info.res.getString(R.string.wifi) + Tuils.SPACE + wifiConnected + Tuils.NEWLINE + - info.res.getString(R.string.mobile_data) + Tuils.SPACE + connected; + info.res.getString(R.string.mobile_data) + Tuils.SPACE + mobileOn; } @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java index a1248c4c79f51751ad07ce4bb3a2e00897f59508..de9a3fa7c8ed8a56747d60019c3c9fe20903df78 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java @@ -26,17 +26,12 @@ public class theme extends ParamCommand { @Override public String exec(ExecutePack pack) { - String theme = pack.get(String.class, 1); + String theme = pack.getString(); ThemesManager.apply(pack.context, theme); return null; } }, view { - @Override - public int[] args() { - return new int[0]; - } - @Override public String exec(ExecutePack pack) { pack.context.startActivity(Tuils.webPage("http://tui-launcher.surge.sh/")); @@ -44,11 +39,6 @@ public class theme extends ParamCommand { } }, create { - @Override - public int[] args() { - return new int[0]; - } - @Override public String exec(ExecutePack pack) { pack.context.startActivity(Tuils.webPage("http://tui-launcher.surge.sh/create")); @@ -56,11 +46,6 @@ public class theme extends ParamCommand { } }, ls { - @Override - public int[] args() { - return new int[0]; - } - @Override public String exec(ExecutePack pack) { ThemesManager.ls(pack.context); @@ -68,11 +53,6 @@ public class theme extends ParamCommand { } }, old { - @Override - public int[] args() { - return new int[0]; - } - @Override public String exec(ExecutePack pack) { File theme = Tuils.getOld("theme.xml"); @@ -93,11 +73,6 @@ public class theme extends ParamCommand { } }, tutorial { - @Override - public int[] args() { - return new int[0]; - } - @Override public String exec(ExecutePack pack) { pack.context.startActivity(Tuils.webPage("https://github.com/Andre1299/TUI-ConsoleLauncher/wiki/Themes")); @@ -139,6 +114,11 @@ public class theme extends ParamCommand { public String onArgNotFound(ExecutePack pack, int index) { return null; } + + @Override + public int[] args() { + return new int[0]; + } } @Override 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 2f5277d3f53c342f97fd3c7ac6c236b78976f73d..8d94335d8452cf0b73fd2a7eb733b781fae74542 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 @@ -11,7 +11,7 @@ import ohi.andre.consolelauncher.tuils.TimeManager; public class time implements CommandAbstraction { @Override public String exec(ExecutePack pack) { - int index = pack.get(int.class, 0); + int index = pack.getInt(); return TimeManager.replace("%t" + index).toString(); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java index 1bf4339a9aef1b2e944ddeb54478223d0ee2f0bf..fc3eb0218d07d16f68c1dd87bfe03e3b74139ebd 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java @@ -24,7 +24,7 @@ public class tuixt implements CommandAbstraction { @Override public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; - File file = info.get(File.class, 0); + File file = info.get(File.class); if(file.isDirectory()) { return info.res.getString(R.string.output_isdirectory); } @@ -61,7 +61,7 @@ public class tuixt implements CommandAbstraction { public String onArgNotFound(ExecutePack pack, int index) { MainPack info = (MainPack) pack; - String path = info.get(String.class, 0); + String path = info.getString(); if(path == null || path.length() == 0) { return onNotArgEnough(info, info.args.length); } 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 23b25e6453d20b0f5ebb1e38c3e61d72524da29a..e1c9543073f50b788b07ea1c30223ca3fdb6787f 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,7 +7,6 @@ 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.Tuils; public class uninstall implements CommandAbstraction { @@ -16,7 +15,7 @@ public class uninstall implements CommandAbstraction { public String exec(ExecutePack pack) { MainPack info = (MainPack) pack; - String packageName = info.get(AppsManager.LaunchInfo.class, 0).componentName.getPackageName(); + String packageName = info.getLaunchInfo().componentName.getPackageName(); Uri packageURI = Uri.parse("package:" + packageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java index e1f513ca1dac945ff80e08ea5de768093c7cbe8c..a3c6e5120f664bc2011ab531540850ed032b06ff 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.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.tuils.Tuils; /** * Created by francescoandreuzzi on 29/04/2017. @@ -14,22 +15,46 @@ import ohi.andre.consolelauncher.commands.main.MainPack; public class vibrate implements CommandAbstraction { - @Override public String exec(ExecutePack pack) throws Exception { - String text = (String) pack.args[0]; - + String text = pack.getString().trim(); Context context = ((MainPack) pack).context; - int ms; - try { - ms = Integer.parseInt(text); - - ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(ms); - } catch (NumberFormatException e) { - return context.getString(R.string.output_numberformat); - } catch (Exception e) { - return e.toString(); + char separator = Tuils.firstNonDigit(text); + + if(separator == 0) { + int ms; + try { + ms = Integer.parseInt(text); + ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(ms); + return null; + } catch (NumberFormatException e) { + return context.getString(R.string.invalid_integer); + } catch (Exception e) { + return e.toString(); + } + } else { + if(separator == ' ') { + char s2 = Tuils.firstNonDigit(Tuils.removeSpaces(text)); + if(s2 != 0) { + text = Tuils.removeSpaces(text); + separator = s2; + } + } + + text = text.trim(); + String[] split = text.split(separator + Tuils.EMPTYSTRING); + long pattern[] = new long[split.length]; + + for(int c = 0; c < split.length; c++) { + try { + pattern[c] = Long.parseLong(split[c]); + } catch (Exception e) { + pattern[c] = 0; + } + } + + ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(pattern, -1); } return null; 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 a2028956637351233ec7dd8f22e13b4a6c8d684d..ef77f6e4d33092ef8db0b46f8356f2f5b9fbd8a0 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 @@ -30,8 +30,10 @@ public abstract class ParamCommand implements CommandAbstraction { String o = doThings(pack); if(o != null) return o; - 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); + Param param = pack.get(Param.class); + if(param == null) { + return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + pack.get(String.class, 0); + } return param.exec(pack); } @@ -56,6 +58,13 @@ public abstract class ParamCommand implements CommandAbstraction { @Override public String onArgNotFound(ExecutePack pack, int indexNotFound) { + if(indexNotFound == 0) { + String param = pack.get(String.class, 0); + if(param.length() == 0) return pack.context.getString(helpRes()); + + return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + param; + } + return pack.context.getString(helpRes()); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java index 9aeacbf078a49059bd34d795dd65f1eb29e1b59c..092c5f17911b909f7c01ba3fc6efa4814f434eaa 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java @@ -3,8 +3,8 @@ package ohi.andre.consolelauncher.commands.tuixt; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Typeface; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.text.InputType; @@ -14,6 +14,8 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.ImageButton; @@ -29,8 +31,9 @@ import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.Command; import ohi.andre.consolelauncher.commands.CommandGroup; import ohi.andre.consolelauncher.commands.CommandTuils; -import ohi.andre.consolelauncher.managers.FileManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Theme; +import ohi.andre.consolelauncher.managers.xml.options.Ui; import ohi.andre.consolelauncher.tuils.Tuils; /** @@ -59,7 +62,6 @@ public class TuixtActivity extends Activity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final Typeface lucidaConsole = Typeface.createFromAsset(getAssets(), "lucida_console.ttf"); final LinearLayout rootView = new LinearLayout(this); final Intent intent = getIntent(); @@ -81,13 +83,23 @@ public class TuixtActivity extends Activity { finish(); } - if (!XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper)) { - rootView.setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.bg_color)); + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !XMLPrefsManager.getBoolean(Ui.ignore_bar_color)) { + Window window = getWindow(); + + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.setStatusBarColor(XMLPrefsManager.getColor(Theme.statusbar_color)); + window.setNavigationBarColor(XMLPrefsManager.getColor(Theme.navigationbar_color)); + } + + if (!XMLPrefsManager.getBoolean(Ui.system_wallpaper)) { + rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.bg_color)); } else { setTheme(R.style.Custom_SystemWP); + rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.overlay_color)); } - final boolean inputBottom = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.input_bottom); + final boolean inputBottom = XMLPrefsManager.getBoolean(Ui.input_bottom); int layoutId = inputBottom ? R.layout.tuixt_view_input_down : R.layout.tuixt_view_input_up; LayoutInflater inflater = getLayoutInflater(); @@ -101,26 +113,25 @@ public class TuixtActivity extends Activity { TextView prefixView = (TextView) inputOutputView.findViewById(R.id.prefix_view); ImageButton submitView = (ImageButton) inputOutputView.findViewById(R.id.submit_tv); - boolean showSubmit = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_enter_button); + boolean showSubmit = XMLPrefsManager.getBoolean(Ui.show_enter_button); if (!showSubmit) { submitView.setVisibility(View.GONE); submitView = null; } - String prefix = XMLPrefsManager.get(XMLPrefsManager.Ui.input_prefix); + String prefix = XMLPrefsManager.get(Ui.input_prefix); - Typeface t = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_font) ? Typeface.DEFAULT : lucidaConsole; - int ioSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.input_output_size); - int outputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color); - int inputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color); + int ioSize = XMLPrefsManager.getInt(Ui.input_output_size); + int outputColor = XMLPrefsManager.getColor(Theme.output_color); + int inputColor = XMLPrefsManager.getColor(Theme.input_color); - prefixView.setTypeface(t); + prefixView.setTypeface(Tuils.getTypeface(this)); prefixView.setTextColor(inputColor); prefixView.setTextSize(ioSize); prefixView.setText(prefix.endsWith(Tuils.SPACE) ? prefix : prefix + Tuils.SPACE); if (submitView != null) { - submitView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.enter_color)); + submitView.setColorFilter(XMLPrefsManager.getColor(Theme.enter_color)); submitView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -129,7 +140,7 @@ public class TuixtActivity extends Activity { }); } - fileView.setTypeface(t); + fileView.setTypeface(Tuils.getTypeface(this)); fileView.setTextSize(ioSize); fileView.setTextColor(outputColor); fileView.setOnTouchListener(new View.OnTouchListener() { @@ -144,13 +155,13 @@ public class TuixtActivity extends Activity { } }); - outputView.setTypeface(t); + outputView.setTypeface(Tuils.getTypeface(this)); outputView.setTextSize(ioSize); outputView.setTextColor(outputColor); outputView.setMovementMethod(new ScrollingMovementMethod()); outputView.setVisibility(View.GONE); - inputView.setTypeface(t); + inputView.setTypeface(Tuils.getTypeface(this)); inputView.setTextSize(ioSize); inputView.setTextColor(inputColor); inputView.setHint(Tuils.getHint(path)); @@ -223,6 +234,16 @@ public class TuixtActivity extends Activity { intent.putExtra(ERROR_KEY, e.toString()); setResult(1, intent); finish(); + } catch (Error er) { + runOnUiThread(new Runnable() { + @Override + public void run() { + System.gc(); + + fileView.setText(Tuils.EMPTYSTRING); + Toast.makeText(TuixtActivity.this, R.string.tuixt_error, Toast.LENGTH_LONG).show(); + } + }); } } }.start(); @@ -248,8 +269,6 @@ public class TuixtActivity extends Activity { @Override protected void onStop() { super.onStop(); - - FileManager.writeOn(pack.editFile, fileView.getText().toString()); this.finish(); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java index 2548e5b36d423290a0119be30d3b1197abe6f90d..57a6ae5bfa53c551ee81558214a55bd8ab9bedf2 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java @@ -22,7 +22,7 @@ public class help implements CommandAbstraction { public String exec(ExecutePack info) throws Exception { TuixtPack pack = (TuixtPack) info; - CommandAbstraction cmd = info.get(CommandAbstraction.class, 0); + CommandAbstraction cmd = info.get(CommandAbstraction.class); int res = cmd == null ? R.string.output_commandnotfound : cmd.helpRes(); return pack.resources.getString(res); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java index 14758b9c3468c915c2c358d663a3f669d28b7b5e..a16e414963b2092bc6b853a67f2a00e5c8d8ad38 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java @@ -15,10 +15,13 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.Reloadable; @@ -36,9 +39,9 @@ public class AliasManager implements Reloadable { reload(); - paramMarker = Pattern.quote(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_marker)); - paramSeparator = Pattern.quote(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_separator)); - aliasLabelFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_content_format); + paramMarker = Pattern.quote(XMLPrefsManager.get(Behavior.alias_param_marker)); + paramSeparator = Pattern.quote(XMLPrefsManager.get(Behavior.alias_param_separator)); + aliasLabelFormat = XMLPrefsManager.get(Behavior.alias_content_format); } public String printAliases() { @@ -207,7 +210,12 @@ public class AliasManager implements Reloadable { } public List<String> getAliases() { - if(aliases == null) return new ArrayList<>(0); - return new ArrayList<>(aliases.keySet()); + List<String> aliasKeys = new ArrayList<>(0); + if(aliases == null) return aliasKeys; + + Set<String> keys = aliases.keySet(); + for(String s : keys) aliasKeys.add(s); + + return aliasKeys; } } 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 50786189b0561f401ecc06e54d631848bec7f03a..b6bdbe74d879c5ec0e39998a6fb183245aaf7c91 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java @@ -32,15 +32,20 @@ import java.util.regex.Pattern; import ohi.andre.consolelauncher.MainManager; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.main.MainPack; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Apps; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; +import ohi.andre.consolelauncher.managers.xml.options.Theme; +import ohi.andre.consolelauncher.managers.xml.options.Ui; import ohi.andre.consolelauncher.tuils.Compare; import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.Suggester; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.VALUE_ATTRIBUTE; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.set; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.writeTo; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.VALUE_ATTRIBUTE; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.resetFile; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.set; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.writeTo; public class AppsManager implements XMLPrefsManager.XmlPrefsElement { @@ -66,7 +71,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private SharedPreferences preferences; private SharedPreferences.Editor editor; - private static XMLPrefsManager.XmlPrefsElement instance = null; + public static XMLPrefsManager.XmlPrefsElement instance = null; private XMLPrefsManager.XMLPrefsList defaultApps; @@ -76,58 +81,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private String appInstalledFormat, appUninstalledFormat; int appInstalledColor, appUninstalledColor; - public enum Options implements XMLPrefsManager.XMLPrefsSave { - - default_app_n1 { - @Override - public String defaultValue() { - return MOST_USED; - } - }, - default_app_n2 { - @Override - public String defaultValue() { - return MOST_USED; - } - }, - default_app_n3 { - @Override - public String defaultValue() { - return "com.android.vending"; - } - }, - default_app_n4 { - @Override - public String defaultValue() { - return NULL; - } - }, - default_app_n5 { - @Override - public String defaultValue() { - return NULL; - } - }; - - public static final String MOST_USED = "most_used"; - public static final String NULL = "null"; - - @Override - public String label() { - return name(); - } - - @Override - public XMLPrefsManager.XmlPrefsElement parent() { - return instance; - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - @Override public String[] deleted() { return new String[0]; @@ -162,16 +115,16 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { this.context = context; - appInstalledFormat = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_app_installed) ? XMLPrefsManager.get(XMLPrefsManager.Behavior.app_installed_format) : null; - appUninstalledFormat = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_app_uninstalled) ? XMLPrefsManager.get(XMLPrefsManager.Behavior.app_uninstalled_format) : null; + appInstalledFormat = XMLPrefsManager.getBoolean(Ui.show_app_installed) ? XMLPrefsManager.get(Behavior.app_installed_format) : null; + appUninstalledFormat = XMLPrefsManager.getBoolean(Ui.show_app_uninstalled) ? XMLPrefsManager.get(Behavior.app_uninstalled_format) : null; if(appInstalledFormat != null || appUninstalledFormat != null) { pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE); pl = Pattern.compile("%l", Pattern.CASE_INSENSITIVE); pn = Pattern.compile("%n", Pattern.CASE_INSENSITIVE); - appInstalledColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.app_installed_color); - appUninstalledColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.app_uninstalled_color); + appInstalledColor = XMLPrefsManager.getColor(Theme.app_installed_color); + appUninstalledColor = XMLPrefsManager.getColor(Theme.app_uninstalled_color); } else { pp = null; pl = null; @@ -232,7 +185,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { Document d = (Document) o[0]; Element root = (Element) o[1]; - List<AppsManager.Options> enums = new ArrayList<>(Arrays.asList(AppsManager.Options.values())); + List<Apps> enums = new ArrayList<>(Arrays.asList(Apps.values())); NodeList nodes = root.getElementsByTagName("*"); for (int count = 0; count < nodes.getLength(); count++) { @@ -474,6 +427,10 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } for(LaunchInfo i : infos) appsHolder.remove(i); + +// for(Group g : groups) { +// removeAppFromGroup(g.getName(), packageName); +// } } public LaunchInfo findLaunchInfoWithLabel(String label, int type) { @@ -484,7 +441,12 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { appList = hiddenApps; } - return AppUtils.findLaunchInfoWithLabel(appList, label); + LaunchInfo i = AppUtils.findLaunchInfoWithLabel(appList, label); + if(i != null) return i; + + List<LaunchInfo> is = AppUtils.findLaunchInfosWithPackage(label, appList); + if(is == null || is.size() == 0) return null; + return is.get(0); } public void writeLaunchTimes(LaunchInfo info) { @@ -628,23 +590,66 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { if(!app.isInside(apps)) return null; String temp = apps.replaceAll(app.write(), Tuils.EMPTYSTRING); - if(temp.length() < apps.length()) apps = temp; - else apps = apps.replaceAll(app.componentName.getPackageName(), Tuils.EMPTYSTRING); - - apps = apps.replaceAll(APPS_SEPARATOR + APPS_SEPARATOR, APPS_SEPARATOR); - if(apps.startsWith(APPS_SEPARATOR)) apps = apps.substring(1); - if(apps.endsWith(APPS_SEPARATOR)) apps = apps.substring(0, apps.length() - 1); + if(temp.length() < apps.length()) { + apps = temp; + apps = apps.replaceAll(APPS_SEPARATOR + APPS_SEPARATOR, APPS_SEPARATOR); + if(apps.startsWith(APPS_SEPARATOR)) apps = apps.substring(1); + if(apps.endsWith(APPS_SEPARATOR)) apps = apps.substring(0, apps.length() - 1); - e.setAttribute(APPS_ATTRIBUTE, apps); + e.setAttribute(APPS_ATTRIBUTE, apps); - XMLPrefsManager.writeTo(d, file); + XMLPrefsManager.writeTo(d, file); - int index = Tuils.find(group, groups); - if(index != -1) groups.get(index).remove(app); + int index = Tuils.find(group, groups); + if(index != -1) groups.get(index).remove(app); + } return null; } +// public String removeAppFromGroup(String group, String app) { +// Object[] o; +// try { +// o = XMLPrefsManager.buildDocument(file, NAME); +// } catch (Exception e) { +// return e.toString(); +// } +// +// Document d = (Document) o[0]; +// Element root = (Element) o[1]; +// +// Node node = XMLPrefsManager.findNode(root, group); +// if(node == null) return context.getString(R.string.output_groupnotfound); +// +// Element e = (Element) node; +// +// String apps = e.getAttribute(APPS_ATTRIBUTE); +// if(apps == null) return null; +// +// if(!apps.contains(app)) return null; +// +// String temp = Pattern.compile(app.replaceAll(".", "\\.") + "(" + LaunchInfo.COMPONENT_SEPARATOR + "[^\\" + APPS_SEPARATOR + "]+)?").matcher(apps).replaceAll(Tuils.EMPTYSTRING); +// if(temp.length() < apps.length()) { +// apps = temp; +// +// apps = apps.replaceAll(APPS_SEPARATOR + APPS_SEPARATOR, APPS_SEPARATOR); +// if(apps.startsWith(APPS_SEPARATOR)) apps = apps.substring(1); +// if(apps.endsWith(APPS_SEPARATOR)) apps = apps.substring(0, apps.length() - 1); +// +// e.setAttribute(APPS_ATTRIBUTE, apps); +// +// XMLPrefsManager.writeTo(d, file); +// +// int index = Tuils.find(group, groups); +// if(index != -1) { +// Group g = groups.get(index); +// g.remove(app); +// } +// } +// +// return null; +// } + public String listGroup(String group) { Object[] o; try { @@ -772,6 +777,13 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { apps.remove(info); } + public void remove(String app) { + List<LaunchInfo> cp = new ArrayList<>(apps); + for(LaunchInfo i : cp) { + if(i.componentName.getPackageName().equals(app)) apps.remove(i); + } + } + public boolean contains(LaunchInfo info) { return apps.contains(info); } @@ -832,6 +844,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { return false; } + } public static class LaunchInfo implements Compare.Stringable { @@ -935,11 +948,11 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { suggested = new ArrayList<>(); final String PREFIX = "default_app_n"; - for(int count = 0; count < Options.values().length; count++) { - String vl = values.get(Options.valueOf(PREFIX + (count + 1))).value; + for(int count = 0; count < Apps.values().length; count++) { + String vl = values.get(Apps.valueOf(PREFIX + (count + 1))).value; - if(vl.equals(Options.NULL)) continue; - if(vl.equals(Options.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED, count + 1)); + if(vl.equals(Apps.NULL)) continue; + if(vl.equals(Apps.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED, count + 1)); else { ComponentName name = null; diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java index b883180525fbb57b1445135db2d81b9277596883..7da2018c9151ac93094912da256c763c58994e8c 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java @@ -6,6 +6,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Theme; import ohi.andre.consolelauncher.tuils.Tuils; /** @@ -37,7 +39,7 @@ public class MessagesManager { count = 0; random = new Random(); - color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.hint_color); + color = XMLPrefsManager.getColor(Theme.hint_color); } public void onCmd() { diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/RegexManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/RegexManager.java new file mode 100644 index 0000000000000000000000000000000000000000..646ace63e6282795064e885fbd3b92eed93cac78 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/RegexManager.java @@ -0,0 +1,200 @@ +package ohi.andre.consolelauncher.managers; + +import android.content.Context; +import android.graphics.Color; +import android.text.SpannableString; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Theme; +import ohi.andre.consolelauncher.tuils.Tuils; + +/** + * Created by francescoandreuzzi on 04/10/2017. + */ + +public class RegexManager { + + private static final String PATH = "regex.xml", ROOT = "REGEX"; + private static final String REGEX_LABEL = "regex", ID_ATTRIBUTE = "id"; + + private static List<Regex> regexes; + + private RegexManager() {} + + private static boolean available = false; + public static void create(Context context) { + if(available) return; + available = true; + + if(regexes != null) regexes.clear(); + else regexes = new ArrayList<>(); + + try { + File file = new File(Tuils.getFolder(), PATH); + if(!file.exists()) { + file.createNewFile(); + XMLPrefsManager.resetFile(file, ROOT); + } + + Object[] o = XMLPrefsManager.buildDocument(file, ROOT); + + Element el = (Element) o[1]; + + List<Integer> busyIds = new ArrayList<>(); + + NodeList nodeList = el.getElementsByTagName(REGEX_LABEL); + + Out: + for(int c = 0; c < nodeList.getLength(); c++) { + Element e = (Element) nodeList.item(c); + + if(!e.hasAttribute(XMLPrefsManager.VALUE_ATTRIBUTE)) continue; + String value = e.getAttribute(XMLPrefsManager.VALUE_ATTRIBUTE); + + int id; + try { + id = Integer.parseInt(e.getAttribute(ID_ATTRIBUTE)); + } catch (Exception exc) { + continue; + } + + for(int j = 0; j < busyIds.size(); j++) { + if((int) busyIds.get(j) == id) continue Out; + } + + busyIds.add(id); + + if(value != null && value.length() > 0) { + regexes.add(new Regex(value, id)); + } + } + } catch (Exception e) { + Tuils.sendOutput(Color.RED, context, context.getString(R.string.output_xmlproblem1) + Tuils.SPACE + PATH + context.getString(R.string.output_xmlproblem2) + + Tuils.NEWLINE + context.getString(R.string.output_errorlabel) + e.toString()); + return; + } + } + + public static Regex get(int id) { + if(!available) return null; + + for(Regex r : regexes) { + if(r.id == id) return r; + } + + return null; + } + + private static void rmFromList(int id) { + Iterator<Regex> iterator = regexes.iterator(); + while (iterator.hasNext()) { + Regex r = iterator.next(); + if(r.id == id) { + iterator.remove(); + } + } + } + +// null: all good +// "": used id + public static String add(int id, String value) { + for(int c = 0; c < regexes.size(); c++) { + if(regexes.get(c).id == id) return Tuils.EMPTYSTRING; + } + + regexes.add(new Regex(value, id)); + + File file = new File(Tuils.getFolder(), PATH); + + return XMLPrefsManager.add(file, ROOT, REGEX_LABEL, new String[] {ID_ATTRIBUTE, XMLPrefsManager.VALUE_ATTRIBUTE}, new String[] {String.valueOf(id), value}); + } + +// null: all good +// "": not found + public static String rm(int id) { + try { + File file = new File(Tuils.getFolder(), PATH); + + Object[] o = XMLPrefsManager.buildDocument(file, ROOT); + + Document d = (Document) o[0]; + Element el = (Element) o[1]; + + boolean needToWrite = false; + + NodeList nodeList = el.getElementsByTagName(REGEX_LABEL); + for(int c = 0; c < nodeList.getLength(); c++) { + Element e = (Element) nodeList.item(c); + + int cId = Integer.MAX_VALUE; + try { + id = Integer.parseInt(e.getAttribute(ID_ATTRIBUTE)); + } catch (Exception exc) { + continue; + } + + if(cId == id) { + needToWrite = true; + el.removeChild(e); + } + } + + if(needToWrite) { + XMLPrefsManager.writeTo(d, file); + rmFromList(id); + return null; + } + else return Tuils.EMPTYSTRING; + } catch (Exception e) { + return e.toString(); + } + } + + public static CharSequence test(int id, String test) { + Regex regex = get(id); + if(regex == null) return Tuils.EMPTYSTRING; + + String r = regex.value; + + Pattern p = Pattern.compile(r); + Matcher m = p.matcher(test); + + int color = XMLPrefsManager.getColor(Theme.mark_color); + int outputColor = XMLPrefsManager.getColor(Theme.output_color); + + if(m.matches()) { + return Tuils.span(color, outputColor, test); + } + + int last = 0; + SpannableString s = Tuils.span(test, outputColor); + while(m.find()) { + String g0 = m.group(0); + last = Tuils.span(color, s, g0, last); + } + + return s; + } + + public static class Regex { + public String value; + public int id; + + public Regex(String value, int id) { + this.value = value; + this.id = id; + } + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/RssManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/RssManager.java new file mode 100644 index 0000000000000000000000000000000000000000..000076a3d7225301cb545f8dd3e467caa163016a --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/RssManager.java @@ -0,0 +1,897 @@ +package ohi.andre.consolelauncher.managers; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.net.ConnectivityManager; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.BufferedInputStream; +import java.io.File; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.tuils.InputOutputReceiver; +import ohi.andre.consolelauncher.tuils.TimeManager; +import ohi.andre.consolelauncher.tuils.Tuils; + +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.VALUE_ATTRIBUTE; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.set; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.writeTo; + +/** + * Created by francescoandreuzzi on 01/10/2017. + */ + +public class RssManager implements XMLPrefsManager.XmlPrefsElement { + +// header: +// last-modified +// etag +// last_checked_client + + private final String RSS_FOLDER = "rss"; + + public static final String TIME_ATTRIBUTE = "time", SHOW_ATTRIBUTE = "show", URL_ATTRIBUTE = "url", LASTCHECKED_ATTRIBUTE = "lastChecked", LASTMODIFIED_ATTRIBUTE = "lastModified", ETAG_ATTRIBUTE = "etag", + LAST_SHOWN_ITEM_ATTRIBUTE = "lastShownItem", ID_ATTRIBUTE = "id", FORMAT_ATTRIBUTE = "format", INCLUDE_ATTRIBUTE = "includeIfMatches", EXCLUDE_ATTRIBUTE = "excludeIfMatches", + COLOR_ATTRIBUTE = "color", WIFIONLY_ATTRIBUTE = "wifiOnly", COMMAND_ATTRIBUTE = "updateCommand"; + + public static final String RSS_LABEL = "rss", FORMAT_LABEL = "format"; + + private final String SEPARATOR = " - "; + private final String ID_LABEL = "ID: ", TIME_LABEL = "update time: ", SHOW_LABEL = "show: ", URL_LABEL = "url: "; + + private final String LAST_MODIFIED_FIELD = "Last-Modified", ETAG_FIELD = "ETag", IF_MODIFIED_SINCE_FIELD = "If-Modified-Since", IF_NONE_MATCH_FIELD = "If-None-Match", GET_LABEL = "GET"; + + private final String PUBDATE_CHILD = "pubDate"; + + private DateFormat defaultRSSDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z"); + + private static XMLPrefsManager.XMLPrefsList values; + + public static final String PATH = "rss.xml"; + public static final String NAME = "RSS"; + + public static XMLPrefsManager.XmlPrefsElement instance = null; + + @Override + public String[] deleted() { + return new String[] {}; + } + + @Override + public XMLPrefsManager.XMLPrefsList getValues() { + return values; + } + + @Override + public void write(XMLPrefsManager.XMLPrefsSave save, String value) { + set(new File(Tuils.getFolder(), PATH), NAME, save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value}); + } + + private int defaultColor; + private String defaultFormat, timeFormat; + private boolean includeRssDefault; + + private Context context; + private Handler handler; + + private File root, rssFile; + + private List<Rss> feeds; + private List<Format> formats; + +// those will obscure the tag and its content + private Pattern[] hideTagPatterns; + + private ConnectivityManager connectivityManager; + + public RssManager(Context context) { + instance = this; + this.context = context; + + connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + + RegexManager.create(context); + + root = new File(Tuils.getFolder(), RSS_FOLDER); + rssFile = new File(Tuils.getFolder(), PATH); + + prepare(); + + values = new XMLPrefsManager.XMLPrefsList(); + + refresh(); + } + + public void refresh() { + if(handler != null) { + handler.removeCallbacksAndMessages(null); + handler = null; + } + + handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + + + } + }; + + if(feeds != null) feeds.clear(); + else feeds = new ArrayList<>(); + + if(formats != null) formats.clear(); + else formats = new ArrayList<>(); + + new Thread() { + @Override + public void run() { + super.run(); + + try { + Object[] o = XMLPrefsManager.buildDocument(rssFile, NAME); + + Document document = (Document) o[0]; + Element rootElement = (Element) o[1]; + + NodeList nodes = rootElement.getElementsByTagName("*"); + + List<ohi.andre.consolelauncher.managers.xml.options.Rss> enums = new ArrayList<>(Arrays.asList(ohi.andre.consolelauncher.managers.xml.options.Rss.values())); + + String[] deleted = instance.deleted(); + boolean needToWrite = false; + + Main: + for(int count = 0; count < nodes.getLength(); count++) { + Node node = nodes.item(count); + + String nn = node.getNodeName(); + if (Tuils.find(nn, (List) enums) != -1) { +// is an enum value + values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); + + for (int en = 0; en < enums.size(); en++) { + if (enums.get(en).label().equals(nn)) { + enums.remove(en); + break; + } + } + } else { +// deleted + int index = deleted == null ? -1 : Tuils.find(nn, deleted); + if(index != -1) { + deleted[index] = null; + Element e = (Element) node; + rootElement.removeChild(e); + + needToWrite = true; + } + + else { + String name = node.getNodeName(); + if (name.equals(RSS_LABEL)) { + Element t = (Element) node; + + int id; + try { + id = Integer.parseInt(t.getAttribute(ID_ATTRIBUTE)); + } catch (Exception exc) { + continue Main; + } + + String url = t.getAttribute(URL_ATTRIBUTE); + long updateTime = Long.parseLong(t.getAttribute(TIME_ATTRIBUTE)); + boolean show = Boolean.parseBoolean(t.getAttribute(SHOW_ATTRIBUTE)); + + long lastChecked = t.hasAttribute(LASTCHECKED_ATTRIBUTE) ? Long.parseLong(t.getAttribute(LASTCHECKED_ATTRIBUTE)) : -1; + long lastShown = t.hasAttribute(LAST_SHOWN_ITEM_ATTRIBUTE) ? Long.parseLong(t.getAttribute(LAST_SHOWN_ITEM_ATTRIBUTE)) : -1; + String lastModified = t.hasAttribute(LASTMODIFIED_ATTRIBUTE) ? t.getAttribute(LASTMODIFIED_ATTRIBUTE) : null; + String etag = t.hasAttribute(ETAG_ATTRIBUTE) ? t.getAttribute(ETAG_ATTRIBUTE) : null; + + String format = t.hasAttribute(FORMAT_ATTRIBUTE) ? t.getAttribute(FORMAT_ATTRIBUTE) : null; + String includeIfMatches = t.hasAttribute(INCLUDE_ATTRIBUTE) ? t.getAttribute(INCLUDE_ATTRIBUTE) : null; + String excludeIfMatches = t.hasAttribute(EXCLUDE_ATTRIBUTE) ? t.getAttribute(EXCLUDE_ATTRIBUTE) : null; + int color; + try { + color = Color.parseColor(t.getAttribute(COLOR_ATTRIBUTE)); + } catch (Exception exc) { + color = Integer.MAX_VALUE; + } + + boolean wifiOnly; + try { + wifiOnly = Boolean.parseBoolean(t.getAttribute(WIFIONLY_ATTRIBUTE)); + } catch (Exception e) { + wifiOnly = false; + } + + String updateCommand = t.hasAttribute(COMMAND_ATTRIBUTE) ? t.getAttribute(COMMAND_ATTRIBUTE) : null; + + final Rss r = new Rss(url, updateTime, lastChecked, lastShown, id, show, lastModified, etag, format, includeIfMatches, excludeIfMatches, color, wifiOnly, updateCommand); + feeds.add(r); + } else if(name.equals(FORMAT_LABEL)) { + Element e = (Element) node; + + int id; + try { + id = Integer.parseInt(e.getAttribute(ID_ATTRIBUTE)); + } catch (Exception exc) { + id = -1; + } + + if(id == -1) continue; + + String format = e.getAttribute(XMLPrefsManager.VALUE_ATTRIBUTE); + + Format i = new Format(format, id); + formats.add(i); + } + } + } + } + + if (enums.size() > 0) { + for (XMLPrefsManager.XMLPrefsSave s : enums) { + String value = s.defaultValue(); + + Element em = document.createElement(s.label()); + em.setAttribute(VALUE_ATTRIBUTE, value); + rootElement.appendChild(em); + + values.add(s.label(), value); + } + + writeTo(document, rssFile); + } else if (needToWrite) { + writeTo(document, rssFile); + } + } catch (Exception e) { + Tuils.log(e); + Tuils.toFile(e); + } + + defaultFormat = XMLPrefsManager.get(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_default_format); + defaultColor = XMLPrefsManager.getColor(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_default_color); + includeRssDefault = XMLPrefsManager.getBoolean(ohi.andre.consolelauncher.managers.xml.options.Rss.include_rss_default); + timeFormat = XMLPrefsManager.get(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_time_format); + + String hiddenTags = XMLPrefsManager.get(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_hidden_tags).replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING); + String[] split = null; + for(int c = 0; c < hiddenTags.length(); c++) { + char ch = hiddenTags.charAt(c); + if(Character.isLetter(ch)) continue; + split = hiddenTags.split(ch + Tuils.EMPTYSTRING); + } + if(split == null) { + split = new String[] {hiddenTags}; + } + + hideTagPatterns = new Pattern[split.length * 2]; + for(int c = 0, j = 0; c < split.length; c++, j += 2) { + hideTagPatterns[j] = Pattern.compile("<" + split[c] + "[^>]*>[^<]*<\\/" + split[c] + ">"); + hideTagPatterns[j + 1] = Pattern.compile("<" + split[c] + "[^>]*\\/>"); + } + + for(Rss rss : feeds) { + rss.updateFormat(); + rss.updateIncludeIfMatches(); + rss.updateExcludeIfMatches(); + + if(rss.color == Integer.MAX_VALUE) rss.color = defaultColor; + + queue(rss); + } + } + }.start(); + } + + public void dispose() { + handler.removeCallbacksAndMessages(null); + } + + public String add(int id, long timeInSeconds, String url) { + String output = XMLPrefsManager.add(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE, TIME_ATTRIBUTE, SHOW_ATTRIBUTE, URL_ATTRIBUTE}, + new String[] {String.valueOf(id), String.valueOf(timeInSeconds * 1000), String.valueOf(true), url}); + + if(output == null) { + try { + Rss r = new Rss(url, timeInSeconds * 1000, id, true); + + r.lastShownItem = System.currentTimeMillis(); + r.format = defaultFormat; + + updateRss(r, true); + feeds.add(r); + + queue(r); + } catch (Exception e) { + Tuils.log(e); + return e.toString(); + } + + return null; + } else return output; + } + + public String addFormat(int id, String value) { + String output = XMLPrefsManager.add(rssFile, NAME, FORMAT_LABEL, new String[] {ID_ATTRIBUTE, XMLPrefsManager.VALUE_ATTRIBUTE}, new String[] {String.valueOf(id), value}); + if(output == null) { + formats.add(new Format(value, id)); + return null; + } else return output; + } + + public String removeFormat(int id) { + String output = XMLPrefsManager.removeNode(rssFile, NAME, FORMAT_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)});; + if(output == null) { + return null; + } else { + if (output.length() > 0) return output; + return context.getString(R.string.id_notfound); + } + } + + public String rm(int id) { + String output = XMLPrefsManager.removeNode(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}); + if(output == null) { + File rss = new File(root, RSS_LABEL + id + ".xml"); + if(rss.exists()) rss.delete(); + + removeId(id); + handler.sendEmptyMessage(id); + + return null; + } + else { + if(output.length() > 0) return output; + else return context.getString(R.string.rss_not_found); + } + } + + public String list() { + StringBuilder builder = new StringBuilder(); + for(Rss r : feeds) { + builder.append(ID_LABEL).append(":").append(Tuils.SPACE).append(r.id).append(Tuils.NEWLINE).append(r.url).append(Tuils.NEWLINE); + } + + return builder.toString().trim(); + } + + public void l(int id) { + for(Rss feed : feeds) { + if(feed.id == id) { + try { + parse(feed, false); + } catch (Exception e) { + Tuils.log(e); + Tuils.toFile(e); + } + break; + } + } + } + + public String setShow(int id, boolean show) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {SHOW_ATTRIBUTE}, new String[] {String.valueOf(show)}, false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.show = show; + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + + public String setTime(int id, long timeSeconds) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {TIME_ATTRIBUTE}, new String[] {String.valueOf(timeSeconds)}, false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.updateTimeSeconds = timeSeconds; + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + + public String setFormat(int id, String format) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {FORMAT_ATTRIBUTE}, new String[] {format}, false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.setFormat(format); + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + + public String setColor(int id, String color) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {COLOR_ATTRIBUTE}, new String[] {color}, false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.color = Color.parseColor(color); + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + + public String setIncludeIfMatches(int id, String regex) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {INCLUDE_ATTRIBUTE}, new String[] {regex}, false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.setIncludeIfMatches(regex); + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + + public String setExcludeIfMatches(int id, String regex) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {EXCLUDE_ATTRIBUTE}, new String[] {regex}, false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.setExcludeIfMatches(regex); + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + + public String setWifiOnly(int id, boolean wifiOnly) { + String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {WIFIONLY_ATTRIBUTE}, new String[] {String.valueOf(wifiOnly)}, + false); + if(output == null) { + Rss r = findId(id); + if(r != null) r.wifiOnly = wifiOnly; + return null; + } + else { + if (output.length() > 0) return output; + return context.getString(R.string.rss_not_found); + } + } + +// base methods + + private void queue(final Rss rss) { + Runnable rn = new Runnable() { + @Override + public void run() { + try { + updateRss(rss, false); + queue(rss); + } catch (Exception e1) { + Tuils.log(e1); + } + } + }; + + long delay; + if(rss.lastCheckedClient == -1) delay = 0; + else delay = rss.updateTimeSeconds - (System.currentTimeMillis() - rss.lastCheckedClient); + + if(delay <= 0) rn.run(); + else { + handler.postDelayed(rn, delay); + } + } + + final String quotes = "\""; + + private void updateRss(final Rss feed, final boolean firstTime) { + if(feed.wifiOnly && !connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) { + + feed.lastCheckedClient = System.currentTimeMillis(); + feed.updateFile(); + + return; + } + + final Object o = new Object(); + + new Thread() { + @Override + public void run() { + super.run(); + + try { + URL uObj = new URL(feed.url); + HttpURLConnection urlConnection = (HttpURLConnection) uObj.openConnection(); + urlConnection.setRequestMethod(GET_LABEL); + + if(!firstTime) { + urlConnection.setRequestProperty(IF_MODIFIED_SINCE_FIELD, feed.lMod); + urlConnection.setRequestProperty(IF_NONE_MATCH_FIELD, quotes + feed.etag + quotes); + } + + urlConnection.connect(); + + if(firstTime || urlConnection.getResponseCode() != 304) { + Tuils.download(new BufferedInputStream(uObj.openStream()), new File(root, RSS_LABEL + feed.id + ".xml")); + + feed.lMod = urlConnection.getHeaderField(LAST_MODIFIED_FIELD); + feed.etag = urlConnection.getHeaderField(ETAG_FIELD); + if(feed.etag != null) feed.etag = feed.etag.replaceAll("\"", Tuils.EMPTYSTRING); + + if(parse(feed, true) && feed.updateCommand != null) { + Intent intent = new Intent(InputOutputReceiver.ACTION_CMD); + intent.putExtra(InputOutputReceiver.SHOW_CONTENT, false); + intent.putExtra(InputOutputReceiver.TEXT, feed.updateCommand); + context.sendBroadcast(intent); + } + } else { +// not modified + } + + feed.lastCheckedClient = System.currentTimeMillis(); + feed.updateFile(); + + } catch (Exception e) { + Tuils.log(e); + Tuils.toFile(e); + } + + synchronized (o) { + o.notify(); + } + } + }.start(); + + synchronized (o) { + try { + o.wait(); + } catch (InterruptedException e) { + Tuils.log(e); + Tuils.toFile(e); + } + } + } + + private boolean parse(Rss feed, boolean time) throws Exception { + Tuils.log("parse"); + + boolean updated = false; + + File rssFile = new File(root, RSS_LABEL + feed.id + ".xml"); + if(!rssFile.exists()) return updated; + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(rssFile); + + doc.getDocumentElement().normalize(); + + long lastShown = feed.lastShownItem; + + NodeList list = doc.getElementsByTagName("item"); + for(int c = list.getLength(); c >= 0; c--) { + Tuils.log("index: " + c); + + Element element = (Element) list.item(c); + if(element == null) { + continue; + } + + if(time) { + Tuils.log("timing"); + NodeList l = element.getElementsByTagName(PUBDATE_CHILD); + if(l.getLength() == 0) continue; + + String date = l.item(0).getTextContent(); + Date d = defaultRSSDateFormat.parse(date); + + long timeLong = d.getTime(); + if(c == 0) { + feed.lastShownItem = d.getTime(); + feed.updateTime(); + } + + Tuils.log("pubDate: " + timeLong); + Tuils.log("lastShown: " + lastShown); + + if(lastShown < timeLong) { + updated = true; + + Tuils.log("showing"); + showItem(feed, element); + } + } else { + updated = true; + + Tuils.log("not timing"); + showItem(feed, element); + } + } + + return updated; + } + + private final Pattern formatPattern = Pattern.compile("%(?:\\[(\\d+)\\])?(?:\\[([^]]+)\\])?([^\\s]+)"); + private final Pattern removeTags = Pattern.compile("<[^>]+>"); + private final String THREE_DOTS = "..."; + +// called when a new element is detected, it could be triggered many times again in some milliseconds + private void showItem(Rss feed, Element item) { + String cp = feed.format != null ? feed.format : defaultFormat; + + CharSequence s = Tuils.span(cp, feed.color); + + Matcher m = formatPattern.matcher(cp); + while(m.find()) { + if(m.groupCount() == 3) { + String length = m.group(1); + String color = m.group(2); + String tag = m.group(3); + + String value; + int cl = feed.color; + + NodeList ls = item.getElementsByTagName(tag); + if(ls.getLength() == 0) value = Tuils.EMPTYSTRING; + else { + value = ls.item(0).getTextContent(); + + if(value.equals(PUBDATE_CHILD)) { + Date d; + try { + d = defaultRSSDateFormat.parse(value); + } catch (ParseException e) { + continue; + } + + long timeLong = d.getTime(); + value = TimeManager.replace(timeFormat, timeLong, Integer.MAX_VALUE).toString(); + + } else { + for(Pattern p : hideTagPatterns) { + value = p.matcher(value).replaceAll(Tuils.EMPTYSTRING); + } + + value = removeTags.matcher(value).replaceAll(Tuils.EMPTYSTRING); + + try { + int l = Integer.parseInt(length); + value = value.substring(0, l); + value = value.concat(THREE_DOTS); + } catch (Exception e) {} + + } + + try { + cl = Color.parseColor(color); + } catch (Exception e) { + cl = feed.color; + } + + } + + CharSequence replace; + if(cl != feed.color && value.length() > 0) { + replace = Tuils.span(value, cl); + } else { + replace = value; + } + + s = TextUtils.replace(s, new String[] {m.group(0)}, new CharSequence[] {replace}); + } + + } + + if(includeRssDefault) { + if(feed.excludeIfMatches != null && feed.excludeIfMatches.length() > 0) { + Pattern p = Pattern.compile(feed.excludeIfMatches); + if (p.matcher(s.toString()).find()) { + return; + } + } + } else { + if(feed.includeIfMatches != null && feed.includeIfMatches.length() > 0) { + Pattern p = Pattern.compile(feed.includeIfMatches); + if (!p.matcher(s.toString()).find()) { + return; + } + } + } + + Tuils.sendOutput(context, s); + } + + private class Rss { + String url; + long updateTimeSeconds, lastCheckedClient, lastShownItem; + int id; + boolean show; + String lMod, etag; + + String format; + String includeIfMatches, excludeIfMatches; + String updateCommand; + + int color; + + boolean wifiOnly; + + public Rss(String url, long updateTimeSeconds, int id, boolean show) { + this(url, updateTimeSeconds, -1, -1, id, show, null, null, null, null, null, Integer.MAX_VALUE, false, null); + } + + public Rss(String url, long updateTimeSeconds, long lastCheckedClient, long lastShownItem, int id, boolean show, String lMod, String etag, String format, + String includeIfMatches, String excludeIfMatches, int color, boolean wifiOnly, String updateCommand) { + this.url = url; + this.updateTimeSeconds = updateTimeSeconds; + this.lastShownItem = lastShownItem; + this.lastCheckedClient = lastCheckedClient; + this.id = id; + this.show = show; + this.lMod = lMod; + this.etag = etag; + + this.format = format; + this.includeIfMatches = includeIfMatches; + this.excludeIfMatches = excludeIfMatches; + + this.color = color; + + this.wifiOnly = wifiOnly; + + this.updateCommand = updateCommand; + } + + private void updateFile() { + XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, + new String[] {LASTCHECKED_ATTRIBUTE, LASTMODIFIED_ATTRIBUTE, ETAG_ATTRIBUTE}, new String[] {String.valueOf(lastCheckedClient), lMod, etag}, + false); + } + + @Override + public String toString() { + return new StringBuilder().append(ID_LABEL).append(id).append(SEPARATOR).append(TIME_LABEL).append(updateTimeSeconds).append(SEPARATOR).append(SHOW_LABEL).append(show).append(Tuils.NEWLINE) + .append(URL_LABEL).append(url).toString(); + } + + public void setFormat(String format) { + this.format = format; + updateFormat(); + } + + public void setIncludeIfMatches(String includeIfMatches) { + this.includeIfMatches = includeIfMatches; + updateIncludeIfMatches(); + } + + public void setExcludeIfMatches(String excludeIfMatches) { + this.excludeIfMatches = excludeIfMatches; + updateExcludeIfMatches(); + } + + public void updateFormat() { + if(format != null) { + try { + int id = Integer.parseInt(format); + for(Format i : formats) { + if(id == i.id) format = i.value; + } + } catch (Exception exc) { +// the format is personalized --> it can't be casted to int + } + } + } + + public void updateIncludeIfMatches() { + if(includeIfMatches != null) { + try { + int id = Integer.parseInt(includeIfMatches); + includeIfMatches = RegexManager.get(id).value; + } catch (Exception exc) {} + } + } + + public void updateExcludeIfMatches() { + if(excludeIfMatches != null) { + try { + int id = Integer.parseInt(excludeIfMatches); + excludeIfMatches = RegexManager.get(id).value; + } catch (Exception exc) {} + } + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof Rss) return id == ((Rss) obj).id; + if(obj instanceof Integer) return id == (int) obj; + return false; + } + + public void updateTime() { + Tuils.log("updating time: " + XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {LAST_SHOWN_ITEM_ATTRIBUTE}, + new String[] {String.valueOf(lastShownItem)}, false)); + } + } + + private static class Format { + String value; + int id; + + public Format(String value, int id) { + this.value = value; + this.id = id; + } + } + +// utils + private void removeId(int id) { + for(int c = 0; c < feeds.size(); c++) { + if(feeds.get(c).id == id) { + feeds.remove(c); + return; + } + } + } + + private Rss findId(int id) { + for(int c = 0; c < feeds.size(); c++) { + Rss r = feeds.get(c); + if(r.id == id) { + return r; + } + } + + return null; + } + + private boolean prepare() { + boolean check = true; + if(!root.isDirectory()) { + check = false; + root.mkdir(); + } + if(!rssFile.exists()) { + try { + rssFile.createNewFile(); + XMLPrefsManager.resetFile(rssFile, NAME); + check = false; + + return check && root.list().length > 1; + } catch (Exception e) { + return false; + } + } + + return check; + } +} 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 04e876c32d95f44da9cebc9b4525668fb11a8e46..86025ada89fd94e6266d204b3b7f9def1ed349c0 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalManager.java @@ -2,8 +2,8 @@ package ohi.andre.consolelauncher.managers; import android.app.Activity; import android.content.Context; -import android.graphics.Typeface; import android.os.IBinder; +import android.text.InputFilter; import android.text.InputType; import android.text.Layout; import android.text.SpannableString; @@ -26,6 +26,10 @@ 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.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; +import ohi.andre.consolelauncher.managers.xml.options.Theme; +import ohi.andre.consolelauncher.managers.xml.options.Ui; import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.Rooter; @@ -53,6 +57,7 @@ public class TerminalManager { public static final int CATEGORY_OUTPUT = 11; public static final int CATEGORY_NOTIFICATION = 12; public static final int CATEGORY_GENERAL = 13; + public static final int CATEGORY_RSS = 14; private long lastEnter; @@ -84,7 +89,7 @@ public class TerminalManager { private MainPack mainPack; - private boolean defaultHint = true; + private boolean defaultHint = true, autoLowerFirstChar; private int clearCmdsCount= 0; @@ -110,31 +115,30 @@ public class TerminalManager { this.mContext = context; - final Typeface lucidaConsole = Typeface.createFromAsset(context.getAssets(), "lucida_console.ttf"); - this.mainPack = mainPack; - this.clearAfterMs = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.clear_after_seconds) * 1000; - this.clearAfterCmds = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.clear_after_cmds); - this.maxLines = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.max_lines); + this.autoLowerFirstChar = XMLPrefsManager.getBoolean(Behavior.autolower_firstchar); + + this.clearAfterMs = XMLPrefsManager.getInt(Behavior.clear_after_seconds) * 1000; + this.clearAfterCmds = XMLPrefsManager.getInt(Behavior.clear_after_cmds); + this.maxLines = XMLPrefsManager.getInt(Behavior.max_lines); - inputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.input_format); - outputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.output_format); + inputFormat = XMLPrefsManager.get(Behavior.input_format); + outputFormat = XMLPrefsManager.get(Behavior.output_format); - prefix = XMLPrefsManager.get(XMLPrefsManager.Ui.input_prefix); - suPrefix = XMLPrefsManager.get(String.class, XMLPrefsManager.Ui.input_root_prefix); + prefix = XMLPrefsManager.get(Ui.input_prefix); + suPrefix = XMLPrefsManager.get(Ui.input_root_prefix); - int ioSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.input_output_size); + int ioSize = XMLPrefsManager.getInt(Ui.input_output_size); - Typeface t = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_font) ? Typeface.DEFAULT : lucidaConsole; - prefixView.setTypeface(t); - prefixView.setTextColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color)); + prefixView.setTypeface(Tuils.getTypeface(context)); + prefixView.setTextColor(XMLPrefsManager.getColor(Theme.input_color)); prefixView.setTextSize(ioSize); prefixView.setText(prefix.endsWith(Tuils.SPACE) ? prefix : prefix + Tuils.SPACE); this.mPrefix = prefixView; if (submitView != null) { - submitView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.enter_color)); + submitView.setColorFilter(XMLPrefsManager.getColor(Theme.enter_color)); submitView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -144,8 +148,8 @@ public class TerminalManager { } if (backView != null) { - ((View) backView.getParent()).setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_bg)); - backView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color)); + ((View) backView.getParent()).setBackgroundColor(XMLPrefsManager.getColor(Theme.toolbar_bg)); + backView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color)); backView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -155,7 +159,7 @@ public class TerminalManager { } if (nextView != null) { - nextView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color)); + nextView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color)); nextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -165,7 +169,7 @@ public class TerminalManager { } if (pasteView != null) { - pasteView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color)); + pasteView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color)); pasteView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -178,7 +182,7 @@ public class TerminalManager { } if (deleteView != null) { - deleteView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color)); + deleteView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color)); deleteView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -188,7 +192,7 @@ public class TerminalManager { } this.mTerminalView = terminalView; - this.mTerminalView.setTypeface(t); + this.mTerminalView.setTypeface(Tuils.getTypeface(context)); this.mTerminalView.setTextSize(ioSize); this.mTerminalView.setFocusable(false); setupScroller(); @@ -232,8 +236,8 @@ public class TerminalManager { this.mInputView = inputView; this.mInputView.setTextSize(ioSize); - this.mInputView.setTextColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color)); - this.mInputView.setTypeface(t); + this.mInputView.setTextColor(XMLPrefsManager.getColor(Theme.input_color)); + this.mInputView.setTypeface(Tuils.getTypeface(context)); this.mInputView.setHint(Tuils.getHint(mainPack.currentDirectory.getAbsolutePath())); this.mInputView.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); this.mInputView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @@ -265,6 +269,20 @@ public class TerminalManager { return true; } }); + if(autoLowerFirstChar) { + this.mInputView.setFilters(new InputFilter[] {new InputFilter() { + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + if (dstart == 0 && dend == 0 && start == 0 && end == 1) { + if(source.length() > 0) { + return TextUtils.concat(source.toString().toLowerCase().charAt(0) + Tuils.EMPTYSTRING, source.subSequence(1,source.length())); + } + } + + return source; + } + }}); + } } private void setupNewInput() { @@ -330,7 +348,7 @@ public class TerminalManager { } if(color == Integer.MAX_VALUE) { - color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color); + color = XMLPrefsManager.getColor(Theme.output_color); } SpannableString si = new SpannableString(output); @@ -398,9 +416,9 @@ public class TerminalManager { boolean su = t.toString().startsWith("su ") || suMode; - SpannableString si = Tuils.span(inputFormat, XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color)); + SpannableString si = Tuils.span(inputFormat, XMLPrefsManager.getColor(Theme.input_color)); - s = TimeManager.replace(si,XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color)); + s = TimeManager.replace(si,XMLPrefsManager.getColor(Theme.time_color)); s = TextUtils.replace(s, new String[] {FORMAT_INPUT, FORMAT_PREFIX, FORMAT_NEWLINE, FORMAT_INPUT.toUpperCase(), FORMAT_PREFIX.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, @@ -410,14 +428,14 @@ public class TerminalManager { case CATEGORY_OUTPUT: t = t.toString().trim(); - SpannableString so = Tuils.span(outputFormat, XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color)); + SpannableString so = Tuils.span(outputFormat, XMLPrefsManager.getColor(Theme.output_color)); s = TextUtils.replace(so, 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_GENERAL: + case CATEGORY_NOTIFICATION: case CATEGORY_GENERAL:case CATEGORY_RSS: s = t; break; default: diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java index 409b59d373d176e5a4d90a437ab598cd0c3b3a9a..63f32231e1dc6f2c0ea148b25a3b3f50b945b394 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java @@ -19,6 +19,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.Tuils; /** diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java deleted file mode 100755 index 2eecd7c8b405a43276d306ccb6edcddeca1b7e52..0000000000000000000000000000000000000000 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java +++ /dev/null @@ -1,1416 +0,0 @@ -package ohi.andre.consolelauncher.managers; - -import android.content.Context; -import android.graphics.Color; -import android.os.Build; -import android.os.Environment; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import ohi.andre.consolelauncher.R; -import ohi.andre.consolelauncher.tuils.Tuils; - -public class XMLPrefsManager { - - public static final String XML_DEFAULT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; - public static final String VALUE_ATTRIBUTE = "value"; - - private static DocumentBuilderFactory factory; - private static DocumentBuilder builder; - - static { - factory = DocumentBuilderFactory.newInstance(); - try { - builder = factory.newDocumentBuilder(); - } catch (ParserConfigurationException e) {} - } - - public interface XMLPrefsSave { - String defaultValue(); - String label(); - XmlPrefsElement parent(); - boolean is(String s); - } - - public enum Theme implements XMLPrefsSave { - - input_color { - @Override - public String defaultValue() { - return "#ff00ff00"; - } - }, - output_color { - @Override - public String defaultValue() { - return "#ffffffff"; - } - }, - bg_color { - @Override - public String defaultValue() { - return "#ff000000"; - } - }, - device_color { - @Override - public String defaultValue() { - return "#ffff9800"; - } - }, - battery_color_high { - @Override - public String defaultValue() { - return "#4CAF50"; - } - }, - battery_color_medium { - @Override - public String defaultValue() { - return "#FFEB3B"; - } - }, - battery_color_low { - @Override - public String defaultValue() { - return "#FF5722"; - } - }, - time_color { - @Override - public String defaultValue() { - return "#03A9F4"; - } - }, - storage_color { - @Override - public String defaultValue() { - return "#9C27B0"; - } - }, - ram_color { - @Override - public String defaultValue() { - return "#fff44336"; - } - }, - toolbar_bg { - @Override - public String defaultValue() { - return "#00000000"; - } - }, - toolbar_color { - @Override - public String defaultValue() { - return "#ffff0000"; - } - }, - enter_color { - @Override - public String defaultValue() { - return "#ffffffff"; - } - }, - overlay_color { - @Override - public String defaultValue() { - return "#80000000"; - } - }, - alias_content_color { - @Override - public String defaultValue() { - return "#1DE9B6"; - } - }, - statusbar_color { - @Override - public String defaultValue() { - return "#000000"; - } - }, - navigationbar_color { - @Override - public String defaultValue() { - return "#000000"; - } - }, - app_installed_color { - @Override - public String defaultValue() { - return "#FF7043"; - } - }, - app_uninstalled_color { - @Override - public String defaultValue() { - return "#FF7043"; - } - }, - hint_color { - @Override - public String defaultValue() { - return "#4CAF50"; - } - }; - - @Override - public XmlPrefsElement parent() { - return XMLPrefsRoot.THEME; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - - public enum Ui implements XMLPrefsSave { - - show_enter_button { - @Override - public String defaultValue() { - return "true"; - } - }, - system_font { - @Override - public String defaultValue() { - return "false"; - } - }, - ram_size { - @Override - public String defaultValue() { - return "13"; - } - }, - battery_size { - @Override - public String defaultValue() { - return "13"; - } - }, - device_size { - @Override - public String defaultValue() { - return "13"; - } - }, - time_size { - @Override - public String defaultValue() { - return "13"; - } - }, - storage_size { - @Override - public String defaultValue() { - return "13"; - } - }, - input_output_size { - @Override - public String defaultValue() { - return "13"; - } - }, - input_bottom { - @Override - public String defaultValue() { - return "true"; - } - }, - show_ram { - @Override - public String defaultValue() { - return "true"; - } - }, - show_device_name { - @Override - public String defaultValue() { - return "true"; - } - }, - show_battery { - @Override - public String defaultValue() { - return "true"; - } - }, - show_storage_info { - @Override - public String defaultValue() { - return "true"; - } - }, - enable_battery_status { - @Override - public String defaultValue() { - return "true"; - } - }, - show_time { - @Override - public String defaultValue() { - return "true"; - } - }, - username { - @Override - public String defaultValue() { - return "user"; - } - }, - deviceName { - @Override - public String defaultValue() { - return Build.DEVICE; - } - }, - system_wallpaper { - @Override - public String defaultValue() { - return "false"; - } - }, - fullscreen { - @Override - public String defaultValue() { - return "false"; - } - }, - device_index { - @Override - public String defaultValue() { - return "0"; - } - }, - ram_index { - @Override - public String defaultValue() { - return "1"; - } - }, - battery_index { - @Override - public String defaultValue() { - return "2"; - } - }, - time_index { - @Override - public String defaultValue() { - return "3"; - } - }, - storage_index { - @Override - public String defaultValue() { - return "4"; - } - }, - input_prefix { - @Override - public String defaultValue() { - return "$"; - } - }, - input_root_prefix { - @Override - public String defaultValue() { - return "#"; - } - }, - left_margin_mm { - @Override - public String defaultValue() { - return "0"; - } - }, - right_margin_mm { - @Override - public String defaultValue() { - return "0"; - } - }, - top_margin_mm { - @Override - public String defaultValue() { - return "0"; - } - }, - bottom_margin_mm { - @Override - public String defaultValue() { - return "0"; - } - }, - ignore_bar_color { - @Override - public String defaultValue() { - return "false"; - } - }, - show_app_installed { - @Override - public String defaultValue() { - return "true"; - } - }, - show_app_uninstalled { - @Override - public String defaultValue() { - return "true"; - } - }, - show_session_info { - @Override - public String defaultValue() { - return "true"; - } - }; - - @Override - public XmlPrefsElement parent() { - return XMLPrefsRoot.UI; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - - public enum Toolbar implements XMLPrefsSave { - - show_toolbar { - @Override - public String defaultValue() { - return "true"; - } - }; - - @Override - public XmlPrefsElement parent() { - return XMLPrefsRoot.TOOLBAR; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - - public enum Suggestions implements XMLPrefsSave { - - show_suggestions { - @Override - public String defaultValue() { - return "true"; - } - }, - transparent_suggestions { - @Override - public String defaultValue() { - return "false"; - } - }, - default_text_color { - @Override - public String defaultValue() { - return "#000000"; - } - }, - default_bg_color { - @Override - public String defaultValue() { - return "#ffffff"; - } - }, - apps_text_color { - @Override - public String defaultValue() { - return ""; - } - }, - apps_bg_color { - @Override - public String defaultValue() { - return "#00897B"; - } - }, - alias_text_color { - @Override - public String defaultValue() { - return ""; - } - }, - alias_bg_color { - @Override - public String defaultValue() { - return "#FF5722"; - } - }, - cmd_text_color { - @Override - public String defaultValue() { - return ""; - } - }, - cmd_bg_color { - @Override - public String defaultValue() { - return "#76FF03"; - } - }, - song_text_color { - @Override - public String defaultValue() { - return ""; - } - }, - song_bg_color { - @Override - public String defaultValue() { - return "#EEFF41"; - } - }, - contact_text_color { - @Override - public String defaultValue() { - return ""; - } - }, - contact_bg_color { - @Override - public String defaultValue() { - return "#64FFDA"; - } - }, - file_text_color { - @Override - public String defaultValue() { - return ""; - } - }, - file_bg_color { - @Override - public String defaultValue() { - return "#03A9F4"; - } - }, - suggest_alias_default { - @Override - public String defaultValue() { - return "true"; - } - }, - suggest_appgp_default { - @Override - public String defaultValue() { - return "true"; - } - }, - click_to_launch { - @Override - public String defaultValue() { - return "true"; - } - }, - suggestions_size { - @Override - public String defaultValue() { - return "12"; - } - }; - - @Override - public XmlPrefsElement parent() { - return XMLPrefsRoot.SUGGESTIONS; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - - public enum Behavior implements XMLPrefsSave { - - double_tap_lock { - @Override - public String defaultValue() { - return "true"; - } - }, - double_tap_cmd { - @Override - public String defaultValue() { - return ""; - } - }, - random_play { - @Override - public String defaultValue() { - return "true"; - } - }, - songs_folder { - @Override - public String defaultValue() { - return ""; - } - }, - songs_from_mediastore { - @Override - public String defaultValue() { - return "true"; - } - }, - tui_notification { - @Override - public String defaultValue() { - return "false"; - } - }, - auto_show_keyboard { - @Override - public String defaultValue() { - return "true"; - } - }, - auto_scroll { - @Override - public String defaultValue() { - return "true"; - } - }, - show_hints { - @Override - public String defaultValue() { - return "true"; - } - }, - show_alias_content { - @Override - public String defaultValue() { - return "false"; - } - }, - show_launch_history { - @Override - public String defaultValue() { - return "true"; - } - }, - clear_after_cmds { - @Override - public String defaultValue() { - return "-1"; - } - }, - clear_after_seconds { - @Override - public String defaultValue() { - return "-1"; - } - }, - max_lines { - @Override - public String defaultValue() { - return "-1"; - } - }, - time_format { - @Override - public String defaultValue() { - return "%m/%d/%y %H.%M"; - } - }, - battery_medium { - @Override - public String defaultValue() { - return "50"; - } - }, - battery_low { - @Override - public String defaultValue() { - return "15"; - } - }, - device_format { - @Override - public String defaultValue() { - return "%d: %u"; - } - }, - ram_format { - @Override - public String defaultValue() { - return "Available RAM: %avgb GB of %totgb GB (%av%%)"; - } - }, - battery_format { - @Override - public String defaultValue() { - return "%v%"; - } - }, - storage_format { - @Override - public String defaultValue() { - return "Internal Storage: %iavgb GB / %itotgb GB (%iav%%)"; - } - }, - input_format { - @Override - public String defaultValue() { - return "[%t] %p %i"; - } - }, - output_format { - @Override - 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 "@"; - } - }, - alias_param_marker { - @Override - public String defaultValue() { - return "%"; - } - }, - alias_param_separator { - @Override - public String defaultValue() { - return ","; - } - }, - multiple_cmd_separator { - @Override - public String defaultValue() { - return ";"; - } - }, - alias_content_format { - @Override - public String defaultValue() { - return "%a --> [%v]"; - } - }, - external_storage_path { - @Override - public String defaultValue() { - String path = System.getenv("SECONDARY_STORAGE"); - if(path == null) return Tuils.EMPTYSTRING; - - File file = new File(path); - if(file != null && file.exists()) return file.getAbsolutePath(); - - return Tuils.EMPTYSTRING; - } - }, - home_path { - @Override - public String defaultValue() { - return Environment.getExternalStorageDirectory().getAbsolutePath(); - } - }, - app_installed_format { - @Override - public String defaultValue() { - return "App installed: %p"; - } - }, - app_uninstalled_format { - @Override - public String defaultValue() { - return "App uninstalled: %p"; - } - }, - enable_music { - @Override - public String defaultValue() { - return "true"; - } - }; - - @Override - public XmlPrefsElement parent() { - return XMLPrefsRoot.BEHAVIOR; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - - public enum Cmd implements XMLPrefsSave { - - default_search { - @Override - public String defaultValue() { - return "-gg"; - } - }; - - @Override - public XmlPrefsElement parent() { - return XMLPrefsRoot.CMD; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - - public enum XMLPrefsRoot implements XmlPrefsElement { - - THEME("theme.xml", Theme.values()) { - @Override - public String[] deleted() { - return new String[0]; - } - }, - CMD("cmd.xml", Cmd.values()) { - @Override - public String[] deleted() { - return new String[] {"time_format"}; - } - }, - TOOLBAR("toolbar.xml", Toolbar.values()) { - @Override - public String[] deleted() { - return new String[] {"enabled"}; - } - }, - UI("ui.xml", Ui.values()) { - @Override - public String[] deleted() { - return new String[] {"show_timestamp_before_cmd", "linux_like", "show_username_ssninfo", "show_ssninfo", "show_path_ssninfo", "show_devicename_ssninfo", "show_alias_suggestions", "transparent_bars"}; - } - }, - BEHAVIOR("behavior.xml", Behavior.values()) { - @Override - public String[] deleted() { - return new String[] {"double_tap_closes", "donation_message"}; - } - }, - SUGGESTIONS("suggestions.xml", Suggestions.values()) { - @Override - public String[] deleted() { - return new String[] {"transparent", "enabled"}; - } - }; - -// notifications -// apps -// alias - - public String path; - XMLPrefsList values; - List<XMLPrefsSave> enums; - public List<XMLPrefsSave> copy; - - XMLPrefsRoot(String path, XMLPrefsSave[] en) { - this.path = path; - this.values = new XMLPrefsList(); - - if(en == null) return; - this.enums = new ArrayList<>(Arrays.asList(en)); - this.copy = new ArrayList<>(enums); - } - - @Override - public void write(XMLPrefsSave save, String value) { - set(new File(Tuils.getFolder(), path), name(), save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value}); - } - - public XMLPrefsList getValues() { - return values; - } - } - - public interface XmlPrefsElement { - XMLPrefsList getValues(); - void write(XMLPrefsSave save, String value); - String[] deleted(); - } - - public static class XMLPrefsEntry { - - public String key, value; - - public XMLPrefsEntry(String key, String value) { - this.key = key; - this.value = value; - } - - @Override - public boolean equals(Object obj) { - if(obj instanceof XMLPrefsEntry) return this == obj; - else if(obj instanceof XMLPrefsSave) return this.key.equals(((XMLPrefsSave) obj).label()); - return obj.equals(key); - } - - @Override - public String toString() { - return key + " --> " + value; - } - } - - public static class XMLPrefsList { - - public List<XMLPrefsEntry> list = new ArrayList<>(); - - public void add(XMLPrefsEntry entry) { - list.add(entry); - } - - public void add(String key, String value) { - list.add(new XMLPrefsEntry(key, value)); - } - - public XMLPrefsEntry get(Object o) { - if(o instanceof Integer) return at((Integer) o); - - for(XMLPrefsEntry e : list) if(e.equals(o)) return e; - return null; - } - - public XMLPrefsEntry at(int index) { - return list.get(index); - } - - public int size() { - return list.size(); - } - - public List<String> values() { - List<String> vs = new ArrayList<>(); - for(XMLPrefsEntry entry : list) vs.add(entry.key + "=" + entry.value); - return vs; - } - } - - private XMLPrefsManager() {} - - static boolean called = false; - public static void create(Context context) throws Exception { - if(called) return; - called = true; - - File folder = Tuils.getFolder(); - - for(XMLPrefsRoot element : XMLPrefsRoot.values()) { - File file = new File(folder, element.path); - if(!file.exists()) { - resetFile(file, element.name()); - } - - Object[] o; - try { - o = buildDocument(file, element.name()); - } catch (Exception e) { - Tuils.sendOutput(Color.RED, context, context.getString(R.string.output_xmlproblem1) + Tuils.SPACE + element.path + context.getString(R.string.output_xmlproblem2) + - Tuils.NEWLINE + context.getString(R.string.output_errorlabel) + e.toString()); - continue; - } - - Document d = (Document) o[0]; - Element root = (Element) o[1]; - - List<XMLPrefsSave> enums = element.enums; - if(enums == null) continue; - - String[] deleted = element.deleted(); - boolean needToWrite = false; - - if(root == null) { - resetFile(file, element.name()); - d = builder.parse(file); - root = (Element) d.getElementsByTagName(element.name()).item(0); - } - NodeList nodes = root.getElementsByTagName("*"); - - for(int count = 0; count < nodes.getLength(); count++) { - Node node = nodes.item(count); - - String nn = node.getNodeName(); - element.values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); - - for(int en = 0; en < enums.size(); en++) { - if(enums.get(en).label().equals(nn)) { - enums.remove(en); - break; - } else if(deleted != null) { - int index = Tuils.find(nn, deleted); - if(index != -1) { - deleted[index] = null; - Element e = (Element) node; - root.removeChild(e); - - needToWrite = true; - } - } - } - } - - if(enums.size() == 0) { - if(needToWrite) writeTo(d, file); - continue; - } - - for(XMLPrefsSave s : enums) { - String value = s.defaultValue(); - - Element em = d.createElement(s.label()); - em.setAttribute(VALUE_ATTRIBUTE, value); - root.appendChild(em); - - element.values.add(s.label(), value); - } - - writeTo(d, file); - } - } - - public static Object transform(String s, Class<?> c) throws Exception { - if(s == null) throw new UnsupportedOperationException(); - - if(c == int.class) return Integer.parseInt(s); - if(c == Color.class) return Color.parseColor(s); - if(c == boolean.class) return Boolean.parseBoolean(s); - if(c == String.class) return s; - if(c == File.class) { - if(s.length() == 0) return null; - - File file = new File(s); - if(!file.exists()) throw new UnsupportedOperationException(); - - return file; - } - - return Tuils.getDefaultValue(c); - } - - static final Pattern p1 = Pattern.compile(">"); -// static final Pattern p2 = Pattern.compile("</"); - static final Pattern p3 = Pattern.compile("\n\n"); - static final String p1s = ">" + Tuils.NEWLINE; -// static final String p2s = "\n</"; - static final String p3s = Tuils.NEWLINE; - - public static String fixNewlines(String s) { - s = p1.matcher(s).replaceAll(p1s); -// s = p2.matcher(s).replaceAll(p2s); - s = p3.matcher(s).replaceAll(p3s); - return s; - } - -// [0] = document -// [1] = root - public static Object[] buildDocument(File file, String root) throws Exception { - Document d = builder.parse(file); - Element r = (Element) d.getElementsByTagName(root).item(0); - - return new Object[] {d, r}; - } - - public static void writeTo(Document d, File f) { - try { - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - - DOMSource source = new DOMSource(d); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - transformer.transform(source, result); - - String s = fixNewlines(writer.toString()); - - FileOutputStream stream = new FileOutputStream(f); - stream.write(s.getBytes()); - - stream.flush(); - stream.close(); - } catch (Exception e) {} - } - - public static String add(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) { - try { - Object[] o; - try { - o = buildDocument(file, rootName); - } catch (Exception e) { - return e.toString(); - } - - Document d = (Document) o[0]; - Element root = (Element) o[1]; - - Element element = d.createElement(elementName); - for(int c = 0; c < attributeNames.length; c++) { - if(attributeValues[c] == null) continue; - element.setAttribute(attributeNames[c], attributeValues[c]); - } - root.appendChild(element); - - writeTo(d, file); - } catch (Exception e) { - return e.toString(); - } - return null; - } - - public static String set(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) { - String[][] values = new String[1][attributeValues.length]; - values[0] = attributeValues; - - return setMany(file, rootName, new String[] {elementName}, attributeNames, values); - } - - public static String setMany(File file, String rootName, String elementNames[], String[] attributeNames, String[][] attributeValues) { - try { - Object[] o; - try { - o = buildDocument(file, rootName); - } catch (Exception e) { - return e.toString(); - } - - Document d = (Document) o[0]; - Element root = (Element) o[1]; - - NodeList nodes = root.getElementsByTagName("*"); - - for(int count = 0; count < nodes.getLength(); count++) { - Node node = nodes.item(count); - - int index = Tuils.find(node.getNodeName(), elementNames); - if(index != -1) { - Element e = (Element) node; - - for(int c = 0; c < attributeNames.length; c++) { - if(attributeValues[index][c] == null) continue; - e.setAttribute(attributeNames[c], attributeValues[index][c]); - } - - writeTo(d, file); - return null; - } - } - -// it wasn't found - for(int count = 0; count < elementNames.length; count++) { - Element element = d.createElement(elementNames[count]); - for(int c = 0; c < attributeNames.length; c++) { - if(attributeValues[count][c] == null) continue; - element.setAttribute(attributeNames[c], attributeValues[count][c]); - } - root.appendChild(element); - } - - writeTo(d, file); - } catch (Exception e) { - Tuils.log(e); - Tuils.toFile(e); - return e.toString(); - } - return null; - } - - public static String removeNode(File file, String rootName, String nodeName) { - try { - Object[] o; - try { - o = buildDocument(file, rootName); - } catch (Exception e) { - return e.toString(); - } - - Document d = (Document) o[0]; - Element root = (Element) o[1]; - - Node node = findNode(root, nodeName); - - if(node == null) return Tuils.EMPTYSTRING; - - root.removeChild(node); - writeTo(d, file); - return null; - } catch (Exception e) { - return e.toString(); - } - } - - public static Node findNode(File file, String rootName, String nodeName) { - try { - Object[] o; - try { - o = buildDocument(file, rootName); - } catch (Exception e) { - return null; - } - - Element root = (Element) o[1]; - - findNode(root, nodeName); - } catch (Exception e) { - return null; - } - - return null; - } - - public static Node findNode(Element root, String nodeName) { - NodeList nodes = root.getElementsByTagName("*"); - - for(int count = 0; count < nodes.getLength(); count++) { - Node node = nodes.item(count); - - if(node.getNodeName().equalsIgnoreCase(nodeName)) { - return node; - } - } - - return null; - } - - public static String[] getAttrValues(File file, String rootName, String nodeName, String[] attrNames) { - try { - Object[] o; - try { - o = buildDocument(file, rootName); - } catch (Exception e) { - return null; - } - - Element root = (Element) o[1]; - - NodeList nodes = root.getElementsByTagName("*"); - - for(int count = 0; count < nodes.getLength(); count++) { - Node node = nodes.item(count); - - if(node.getNodeName().equals(nodeName)) { - Element e = (Element) node; - - String[] values = new String[attrNames.length]; - for(int c = 0; c < attrNames.length; c++) values[count] = e.getAttribute(attrNames[c]); - - return values; - } - } - } catch (Exception e) {} - - return null; - } - - public static <T> T get(Class<T> c, XMLPrefsManager.XMLPrefsSave prefsSave) { - if(prefsSave != null) { - try { - return (T) transform(prefsSave.parent().getValues().get(prefsSave).value, c); - } catch (Exception e) { - - try { - return (T) transform(prefsSave.defaultValue(), c); - } catch (Exception e1) { - return Tuils.getDefaultValue(c); - } - } - } - -// this won't ever happen, I think - return null; - } - - public static String get(XMLPrefsManager.XMLPrefsSave prefsSave) { - return get(String.class, prefsSave); - } - - public static int getColor(XMLPrefsManager.XMLPrefsSave prefsSave) { - try { - return (int) transform(prefsSave.parent().getValues().get(prefsSave).value, Color.class); - } catch (Exception e) { - String def = prefsSave.defaultValue(); - if(def == null || def.length() == 0) { - return Integer.MAX_VALUE; - } - - try { - return (int) transform(def, Color.class); - } catch (Exception e1) { - return Integer.MAX_VALUE; - } - } - } - - public static boolean resetFile(File f, String name) { - try { - FileOutputStream stream = new FileOutputStream(f); - stream.write(XML_DEFAULT.getBytes()); - stream.write(("<" + name + ">\n").getBytes()); - stream.write(("</" + name + ">\n").getBytes()); - stream.flush(); - stream.close(); - return true; - } catch (Exception e) { - return false; - } - } - -// 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/music/MusicManager2.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java index fc26322110029d095a0b262d8a8fa0d20bc5b85a..ff934720036a95ac5aae66ce7baf43f00f621378 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java @@ -16,7 +16,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; import ohi.andre.consolelauncher.tuils.Tuils; /** @@ -152,7 +153,7 @@ public class MusicManager2 implements MediaController.MediaPlayerControl { if(songs == null) songs = new ArrayList<>(); else songs.clear(); - if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.songs_from_mediastore)) { + if(XMLPrefsManager.getBoolean(Behavior.songs_from_mediastore)) { ContentResolver musicResolver = mContext.getContentResolver(); Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); @@ -168,7 +169,7 @@ public class MusicManager2 implements MediaController.MediaPlayerControl { } musicCursor.close(); } else { - String path = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.songs_folder); + String path = XMLPrefsManager.get(Behavior.songs_folder); if(path.length() > 0) { File dir = new File(path); if(dir.isDirectory()) songs.addAll(Tuils.getSongsInFolder(dir)); @@ -192,7 +193,7 @@ public class MusicManager2 implements MediaController.MediaPlayerControl { public void onServiceConnected(ComponentName name, IBinder service) { MusicService.MusicBinder binder = (MusicService.MusicBinder)service; musicSrv = binder.getService(); - musicSrv.setShuffle(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.random_play)); + musicSrv.setShuffle(XMLPrefsManager.getBoolean(Behavior.random_play)); if(songs == null || loader.isAlive()) { synchronized (songs) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java index e5769a61b207a7af3eff12c905f86592f6f1ae12..9c9eefbb33e98150911202239ff966d5e9e20626 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java @@ -31,8 +31,6 @@ public class MusicService extends Service implements public static final int NOTIFY_ID=100001; - public static final String SONGTITLE_KEY = "songTitle"; - private MediaPlayer player; private List<Song> songs; private int songPosn; 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 80bda6240f7c591c75e1e06de9d9bda750509149..7d09624178dc3f74e030163089592d7fd1c21191 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 @@ -12,9 +12,6 @@ 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; @@ -22,14 +19,15 @@ import java.util.List; import java.util.regex.Pattern; import ohi.andre.consolelauncher.R; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Notifications; import ohi.andre.consolelauncher.tuils.Tuils; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.VALUE_ATTRIBUTE; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.set; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.setMany; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.writeTo; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.VALUE_ATTRIBUTE; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.resetFile; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.set; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.setMany; +import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.writeTo; /** * Created by francescoandreuzzi on 29/04/2017. @@ -53,54 +51,11 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { public static final String PATH = "notifications.xml"; private static final String NAME = "NOTIFICATIONS"; - private static XMLPrefsManager.XmlPrefsElement instance = null; + public static XMLPrefsManager.XmlPrefsElement instance = null; public static boolean default_app_state; public static String default_color; - public enum Options implements XMLPrefsManager.XMLPrefsSave { - - show_notifications { - @Override - public String defaultValue() { - return "false"; - } - }, - app_notification_enabled_default { - @Override - public String defaultValue() { - return "true"; - } - }, - default_notification_color { - @Override - public String defaultValue() { - return "#00FF00"; - } - }, - notification_format { - @Override - public String defaultValue() { - return "[%t] %pkg: %ttl --- %txt"; - } - }; - - @Override - public XMLPrefsManager.XmlPrefsElement parent() { - return instance; - } - - @Override - public String label() { - return name(); - } - - @Override - public boolean is(String s) { - return name().equals(s); - } - } - @Override public String[] deleted() { return new String[] {"enabled", "default_color", "default_app_state"}; @@ -120,17 +75,14 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { private static List<NotificatedApp> apps; private static List<FilterGroup> groups; private static SparseArray<List<String>> applies; - private static boolean created = false; private NotificationManager() {} public static void create(Context context) { - if(created) { + if(instance != null) { return; } - created = true; - instance = new NotificationManager(); apps = new ArrayList<>(); @@ -156,7 +108,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { Document d = (Document) o[0]; Element root = (Element) o[1]; - List<Options> enums = new ArrayList<>(Arrays.asList(Options.values())); + List<Notifications> enums = new ArrayList<>(Arrays.asList(Notifications.values())); NodeList nodes = root.getElementsByTagName("*"); String[] deleted = instance.deleted(); @@ -278,8 +230,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { Tuils.toFile(e); } - default_app_state = XMLPrefsManager.get(boolean.class, Options.app_notification_enabled_default); - default_color = XMLPrefsManager.get(String.class, Options.default_notification_color); + default_app_state = XMLPrefsManager.getBoolean(Notifications.app_notification_enabled_default); + default_color = XMLPrefsManager.get(Notifications.default_notification_color); Out: for(int count = 0; count < applies.size(); count++) { @@ -314,14 +266,10 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { public static String getFormat() { try { - return values.get(Options.notification_format).value; + return values.get(Notifications.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(); + Tuils.toFile(e); + return Notifications.notification_format.defaultValue(); } } @@ -356,6 +304,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { int index = Tuils.find(pkg, apps); if(index == -1) return null; return apps.get(index); + } public static class NotificatedApp { 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 d36b2958b2b327d9a15ef016b3c3c07566f48f6c..ec316badba7590aef3d6740bf9d08b1004f1887e 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 @@ -26,7 +26,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import ohi.andre.consolelauncher.managers.TerminalManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Notifications; +import ohi.andre.consolelauncher.managers.xml.options.Theme; import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -50,8 +52,8 @@ public class NotificationService extends NotificationListenerService { manager = getPackageManager(); format = NotificationManager.getFormat(); - enabled = XMLPrefsManager.get(boolean.class, NotificationManager.Options.show_notifications) || - XMLPrefsManager.get(String.class, NotificationManager.Options.show_notifications).equalsIgnoreCase("enabled"); + enabled = XMLPrefsManager.getBoolean(Notifications.show_notifications) || + XMLPrefsManager.get(Notifications.show_notifications).equalsIgnoreCase("enabled"); if(NotificationManager.apps() == 0) { NotificationManager.notificationsChangeFor(new ArrayList<>(Arrays.asList( @@ -86,9 +88,9 @@ public class NotificationService extends NotificationListenerService { @Override public int onStartCommand(Intent intent, int flags, int startId) { if(intent != null) { - timeColor = intent.getIntExtra(XMLPrefsManager.Theme.time_color.label(), Color.parseColor(XMLPrefsManager.Theme.time_color.defaultValue())); + timeColor = intent.getIntExtra(Theme.time_color.label(), Color.parseColor(Theme.time_color.defaultValue())); } else { - timeColor = Color.parseColor(XMLPrefsManager.Theme.time_color.defaultValue()); + timeColor = Color.parseColor(Theme.time_color.defaultValue()); } return START_STICKY; @@ -97,6 +99,7 @@ public class NotificationService extends NotificationListenerService { @Override public void onDestroy() { super.onDestroy(); + handler.removeCallbacksAndMessages(null); } String format; 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 3efc0a5a9978f5f08ef5ee111d9467fbb7b2ed0c..a57965d414dba5b43d3d570fd37e96e0e01fc7bf 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 @@ -26,7 +26,8 @@ import android.widget.TextView; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.managers.AppsManager; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Suggestions; public class SuggestionRunnable implements Runnable { @@ -206,15 +207,15 @@ public class SuggestionRunnable implements Runnable { if(!bgLoad) { bgLoad = true; - transparentSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.transparent_suggestions); + transparentSuggestions = XMLPrefsManager.getBoolean(Suggestions.transparent_suggestions); if(!transparentSuggestions) { - suggAppBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.apps_bg_color); - suggAliasBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.alias_bg_color); - suggCmdBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.cmd_bg_color); - suggContactBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.contact_bg_color); - suggFileBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.file_bg_color); - suggSongBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.song_bg_color); - suggDefaultBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_bg_color); + suggAppBg = XMLPrefsManager.getColor(Suggestions.apps_bg_color); + suggAliasBg = XMLPrefsManager.getColor(Suggestions.alias_bg_color); + suggCmdBg = XMLPrefsManager.getColor(Suggestions.cmd_bg_color); + suggContactBg = XMLPrefsManager.getColor(Suggestions.contact_bg_color); + suggFileBg = XMLPrefsManager.getColor(Suggestions.file_bg_color); + suggSongBg = XMLPrefsManager.getColor(Suggestions.song_bg_color); + suggDefaultBg = XMLPrefsManager.getColor(Suggestions.default_bg_color); } } @@ -244,13 +245,13 @@ public class SuggestionRunnable implements Runnable { if(!textLoad) { textLoad = true; - suggAppText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.apps_text_color); - suggAliasText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.alias_text_color); - suggCmdText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.cmd_text_color); - suggContactText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.contact_text_color); - suggDefaultText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_text_color); - suggFileText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.file_text_color); - suggSongText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.song_text_color); + suggAppText = XMLPrefsManager.getColor(Suggestions.apps_text_color); + suggAliasText = XMLPrefsManager.getColor(Suggestions.alias_text_color); + suggCmdText = XMLPrefsManager.getColor(Suggestions.cmd_text_color); + suggContactText = XMLPrefsManager.getColor(Suggestions.contact_text_color); + suggDefaultText = XMLPrefsManager.getColor(Suggestions.default_text_color); + suggFileText = XMLPrefsManager.getColor(Suggestions.file_text_color); + suggSongText = XMLPrefsManager.getColor(Suggestions.song_text_color); } int chosen; 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 c332d0ab604e0e649481ace9240235734aedf8a9..6729e7ad095d4642ed189b6de244a42c032c6eba 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 @@ -17,9 +17,12 @@ 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.XMLPrefsManager; import ohi.andre.consolelauncher.managers.music.Song; import ohi.andre.consolelauncher.managers.notifications.NotificationManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Apps; +import ohi.andre.consolelauncher.managers.xml.options.Notifications; +import ohi.andre.consolelauncher.managers.xml.options.Suggestions; import ohi.andre.consolelauncher.tuils.Compare; import ohi.andre.consolelauncher.tuils.SimpleMutableEntry; import ohi.andre.consolelauncher.tuils.Tuils; @@ -44,10 +47,10 @@ public class SuggestionsManager { public Suggestion[] getSuggestions(MainPack info, String before, String lastWord) { if(!set) { - showAliasDefault = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.suggest_alias_default); - showAppsGpDefault = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.suggest_appgp_default); + showAliasDefault = XMLPrefsManager.getBoolean(Suggestions.suggest_alias_default); + showAppsGpDefault = XMLPrefsManager.getBoolean(Suggestions.suggest_appgp_default); set = true; - clickToLaunch = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.click_to_launch); + clickToLaunch = XMLPrefsManager.getBoolean(Suggestions.click_to_launch); } List<Suggestion> suggestionList = new ArrayList<>(); @@ -93,7 +96,8 @@ public class SuggestionsManager { suggestPermanentSuggestions(suggestionList, (PermanentSuggestionCommand) cmd.cmd); } - if (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && ((Param) cmd.mArgs[0]).args().length + 1 == cmd.nArgs) { + if (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && cmd.mArgs[0] instanceof Param && + ((Param) cmd.mArgs[0]).args().length + 1 == cmd.nArgs) { return new Suggestion[0]; } @@ -104,7 +108,7 @@ public class SuggestionsManager { // suggestArgs(info, cmd.cmd instanceof ParamCommand ? ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0])[cmd.nArgs - 1] : cmd.cmd.argType()[cmd.nArgs], suggestionList, lastWord, before); // } - if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) { + if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0 || cmd.mArgs[0] instanceof String)) { suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, null); } else suggestArgs(info, cmd.nextArg(), suggestionList, before); @@ -152,7 +156,7 @@ public class SuggestionsManager { // lastWord = before.substring(index) + lastWord; // } - if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) { + if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0 || cmd.mArgs[0] instanceof String)) { suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, lastWord); } else suggestArgs(info, cmd.nextArg(), suggestionList, lastWord, before); } else { @@ -516,8 +520,8 @@ public class SuggestionsManager { for(XMLPrefsManager.XMLPrefsRoot element : XMLPrefsManager.XMLPrefsRoot.values()) xmlPrefsEntrys.addAll(element.copy); - Collections.addAll(xmlPrefsEntrys, AppsManager.Options.values()); - Collections.addAll(xmlPrefsEntrys, NotificationManager.Options.values()); + Collections.addAll(xmlPrefsEntrys, Apps.values()); + Collections.addAll(xmlPrefsEntrys, Notifications.values()); } if(prev == null || prev.length() == 0) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/XMLPrefsManager.java new file mode 100755 index 0000000000000000000000000000000000000000..c493900369f1581d5a8dc5874f733fb260b5ea38 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/XMLPrefsManager.java @@ -0,0 +1,693 @@ +package ohi.andre.consolelauncher.managers.xml; + +import android.content.Context; +import android.graphics.Color; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import ohi.andre.consolelauncher.R; +import ohi.andre.consolelauncher.managers.xml.options.*; +import ohi.andre.consolelauncher.tuils.Tuils; + +public class XMLPrefsManager { + + public static final String XML_DEFAULT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + public static final String VALUE_ATTRIBUTE = "value"; + + private static DocumentBuilderFactory factory; + private static DocumentBuilder builder; + + static { + factory = DocumentBuilderFactory.newInstance(); + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) {} + } + + public interface XMLPrefsSave { + String defaultValue(); + String label(); + XmlPrefsElement parent(); + boolean is(String s); + } + + public enum XMLPrefsRoot implements XmlPrefsElement { + + THEME("theme.xml", Theme.values()) { + @Override + public String[] deleted() { + return new String[0]; + } + }, + CMD("cmd.xml", Cmd.values()) { + @Override + public String[] deleted() { + return new String[] {"time_format"}; + } + }, + TOOLBAR("toolbar.xml", Toolbar.values()) { + @Override + public String[] deleted() { + return new String[] {"enabled"}; + } + }, + UI("ui.xml", Ui.values()) { + @Override + public String[] deleted() { + return new String[] {"show_timestamp_before_cmd", "linux_like", "show_username_ssninfo", "show_ssninfo", "show_path_ssninfo", "show_devicename_ssninfo", "show_alias_suggestions", "transparent_bars"}; + } + }, + BEHAVIOR("behavior.xml", Behavior.values()) { + @Override + public String[] deleted() { + return new String[] {"double_tap_closes", "donation_message"}; + } + }, + SUGGESTIONS("suggestions.xml", Suggestions.values()) { + @Override + public String[] deleted() { + return new String[] {"transparent", "enabled"}; + } + }; + +// notifications +// apps +// alias + + public String path; + XMLPrefsList values; + List<XMLPrefsSave> enums; + public List<XMLPrefsSave> copy; + + XMLPrefsRoot(String path, XMLPrefsSave[] en) { + this.path = path; + this.values = new XMLPrefsList(); + + if(en == null) return; + this.enums = new ArrayList<>(Arrays.asList(en)); + this.copy = new ArrayList<>(enums); + } + + @Override + public void write(XMLPrefsSave save, String value) { + set(new File(Tuils.getFolder(), path), name(), save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value}); + } + + public XMLPrefsList getValues() { + return values; + } + } + + public interface XmlPrefsElement { + XMLPrefsList getValues(); + void write(XMLPrefsSave save, String value); + String[] deleted(); + } + + public static class XMLPrefsEntry { + + public String key, value; + + public XMLPrefsEntry(String key, String value) { + this.key = key; + this.value = value; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof XMLPrefsEntry) return this == obj; + else if(obj instanceof XMLPrefsSave) return this.key.equals(((XMLPrefsSave) obj).label()); + return obj.equals(key); + } + + @Override + public String toString() { + return key + " --> " + value; + } + } + + public static class XMLPrefsList { + + public List<XMLPrefsEntry> list = new ArrayList<>(); + + public void add(XMLPrefsEntry entry) { + list.add(entry); + } + + public void add(String key, String value) { + list.add(new XMLPrefsEntry(key, value)); + } + + public XMLPrefsEntry get(Object o) { + if(o instanceof Integer) return at((Integer) o); + + for(XMLPrefsEntry e : list) if(e.equals(o)) return e; + return null; + } + + public XMLPrefsEntry at(int index) { + return list.get(index); + } + + public int size() { + return list.size(); + } + + public List<String> values() { + List<String> vs = new ArrayList<>(); + for(XMLPrefsEntry entry : list) vs.add(entry.key + "=" + entry.value); + return vs; + } + } + + private XMLPrefsManager() {} + + static boolean called = false; + public static void create(Context context) throws Exception { + if(called) return; + called = true; + + File folder = Tuils.getFolder(); + + for(XMLPrefsRoot element : XMLPrefsRoot.values()) { + File file = new File(folder, element.path); + if(!file.exists()) { + resetFile(file, element.name()); + } + + Object[] o; + try { + o = buildDocument(file, element.name()); + } catch (Exception e) { + Tuils.sendOutput(Color.RED, context, context.getString(R.string.output_xmlproblem1) + Tuils.SPACE + element.path + context.getString(R.string.output_xmlproblem2) + + Tuils.NEWLINE + context.getString(R.string.output_errorlabel) + e.toString()); + continue; + } + + Document d = (Document) o[0]; + Element root = (Element) o[1]; + + List<XMLPrefsSave> enums = element.enums; + if(enums == null) continue; + + String[] deleted = element.deleted(); + boolean needToWrite = false; + + if(root == null) { + resetFile(file, element.name()); + d = builder.parse(file); + root = (Element) d.getElementsByTagName(element.name()).item(0); + } + NodeList nodes = root.getElementsByTagName("*"); + + for(int count = 0; count < nodes.getLength(); count++) { + Node node = nodes.item(count); + + String nn = node.getNodeName(); + element.values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); + + for(int en = 0; en < enums.size(); en++) { + if(enums.get(en).label().equals(nn)) { + enums.remove(en); + break; + } else if(deleted != null) { + int index = Tuils.find(nn, deleted); + if(index != -1) { + deleted[index] = null; + Element e = (Element) node; + root.removeChild(e); + + needToWrite = true; + } + } + } + } + + if(enums.size() == 0) { + if(needToWrite) writeTo(d, file); + continue; + } + + for(XMLPrefsSave s : enums) { + String value = s.defaultValue(); + + Element em = d.createElement(s.label()); + em.setAttribute(VALUE_ATTRIBUTE, value); + root.appendChild(em); + + element.values.add(s.label(), value); + } + + writeTo(d, file); + } + } + + public static Object transform(String s, Class<?> c) throws Exception { + if(s == null) throw new UnsupportedOperationException(); + + if(c == int.class) return Integer.parseInt(s); + if(c == Color.class) return Color.parseColor(s); + if(c == boolean.class) return Boolean.parseBoolean(s); + if(c == String.class) return s; + if(c == float.class) return Float.parseFloat(s); + if(c == double.class) return Double.parseDouble(s); + if(c == File.class) { + if(s.length() == 0) return null; + + File file = new File(s); + if(!file.exists()) throw new UnsupportedOperationException(); + + return file; + } + + return Tuils.getDefaultValue(c); + } + + static final Pattern p1 = Pattern.compile(">"); +// static final Pattern p2 = Pattern.compile("</"); + static final Pattern p3 = Pattern.compile("\n\n"); + static final String p1s = ">" + Tuils.NEWLINE; +// static final String p2s = "\n</"; + static final String p3s = Tuils.NEWLINE; + + public static String fixNewlines(String s) { + s = p1.matcher(s).replaceAll(p1s); +// s = p2.matcher(s).replaceAll(p2s); + s = p3.matcher(s).replaceAll(p3s); + return s; + } + +// [0] = document +// [1] = root + public static Object[] buildDocument(File file, String root) throws Exception { + Document d = builder.parse(file); + Element r = (Element) d.getElementsByTagName(root).item(0); + + return new Object[] {d, r}; + } + + public static void writeTo(Document d, File f) { + try { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + + DOMSource source = new DOMSource(d); + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + transformer.transform(source, result); + + String s = fixNewlines(writer.toString()); + + FileOutputStream stream = new FileOutputStream(f); + stream.write(s.getBytes()); + + stream.flush(); + stream.close(); + } catch (Exception e) {} + } + +// this will only add, it won't check if there's already one + public static String add(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) { + try { + Object[] o; + try { + o = buildDocument(file, rootName); + } catch (Exception e) { + Tuils.log(e); + return e.toString(); + } + + Document d = (Document) o[0]; + Element root = (Element) o[1]; + + Element element = d.createElement(elementName); + for(int c = 0; c < attributeNames.length; c++) { + if(attributeValues[c] == null) continue; + element.setAttribute(attributeNames[c], attributeValues[c]); + } + root.appendChild(element); + + writeTo(d, file); + } catch (Exception e) { + Tuils.log(e); + return e.toString(); + } + return null; + } + + public static String set(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) { + return set(file, rootName, elementName, null, null, attributeNames, attributeValues, true); + } + + public static String set(File file, String rootName, String elementName, String[] thatHasThose, String[] forValues, String[] attributeNames, String[] attributeValues, boolean addIfNotFound) { + String[][] values = new String[1][attributeValues.length]; + values[0] = attributeValues; + + return setMany(file, rootName, new String[] {elementName}, thatHasThose, forValues, attributeNames, values, addIfNotFound); + } + + public static String setMany(File file, String rootName, String elementNames[], String[] attributeNames, String[][] attributeValues) { + return setMany(file, rootName, elementNames, null, null, attributeNames, attributeValues, true); + } + + public static String setMany(File file, String rootName, String elementNames[], String[] thatHasThose, String[] forValues, String[] attributeNames, String[][] attributeValues, boolean addIfNotFound) { + try { + Object[] o; + try { + o = buildDocument(file, rootName); + } catch (Exception e) { + return e.toString(); + } + + Document d = (Document) o[0]; + Element root = (Element) o[1]; + + Main: + for(int c = 0; c < elementNames.length; c++) { + NodeList nodes = root.getElementsByTagName(elementNames[c]); + + Nodes: + for(int j = 0; j < nodes.getLength(); j++) { + Node n = nodes.item(j); + if(n.getNodeType() == Node.ELEMENT_NODE) { + Element e = (Element) n; + + if(checkAttributes(e, thatHasThose, forValues)) continue Nodes; + + for(int a = 0; a < attributeNames.length; a++) { + e.setAttribute(attributeNames[a], attributeValues[c][a]); + } + + elementNames[c] = null; + continue Main; + } + } + } + + boolean notFoundSomething = false; + +// not found + for(int count = 0; count < elementNames.length; count++) { + if(elementNames[count] == null || elementNames[count].length() == 0) continue; + + notFoundSomething = true; + + if(!addIfNotFound) continue; + + Element element = d.createElement(elementNames[count]); + for(int c = 0; c < attributeNames.length; c++) { + if(attributeValues[count][c] == null) continue; + element.setAttribute(attributeNames[c], attributeValues[count][c]); + } + root.appendChild(element); + } + + writeTo(d, file); + + if(notFoundSomething) return Tuils.EMPTYSTRING; + } catch (Exception e) { + Tuils.log(e); + Tuils.toFile(e); + return e.toString(); + } + return null; + } + +// return "" if node not found, null if all good + public static String removeNode(File file, String rootName, String nodeName) { + return removeNode(file, rootName, nodeName, null, null); + } + + public static String removeNode(File file, String rootName, String nodeName, String[] thatHasThose, String[] forValues) { + try { + Object[] o; + try { + o = buildDocument(file, rootName); + } catch (Exception e) { + return e.toString(); + } + + Document d = (Document) o[0]; + Element root = (Element) o[1]; + + NodeList nodeList = root.getElementsByTagName(nodeName); + if(nodeList == null || nodeList.getLength() == 0) return Tuils.EMPTYSTRING; + + for(int c = 0; c < nodeList.getLength(); c++) { + Node n = nodeList.item(c); + + if (n.getNodeType() == Node.ELEMENT_NODE && !checkAttributes((Element) n, thatHasThose, forValues)) + continue; + + root.removeChild(n); + writeTo(d, file); + return null; + } + } catch (Exception e) { + return e.toString(); + } + + return Tuils.EMPTYSTRING; + } + + public static Node findNode(File file, String rootName, String nodeName) { + try { + Object[] o; + try { + o = buildDocument(file, rootName); + } catch (Exception e) { + return null; + } + + Element root = (Element) o[1]; + + findNode(root, nodeName); + } catch (Exception e) { + return null; + } + + return null; + } + + public static Node findNode(Element root, String nodeName) { + NodeList nodes = root.getElementsByTagName(nodeName); + if(nodes.getLength() == 0) return null; + return nodes.item(0); + } + + public static String attrValue(File file, String rootName, String nodeName, String attrName) { + return attrValue(file, rootName, nodeName, null, null, attrName); + } + + public static String attrValue(File file, String rootName, String nodeName, String[] thatHasThose, String[] forValues, String attrName) { + String[] vs = attrValues(file, rootName, nodeName, thatHasThose, forValues, new String[] {attrName}); + if(vs != null && vs.length > 0) return vs[0]; + return null; + } + + public static String[] attrValues(File file, String rootName, String nodeName, String[] attrNames) { + return attrValues(file, rootName, nodeName, null, null, attrNames); + } + + public static String[] attrValues(File file, String rootName, String nodeName, String[] thatHasThose, String[] forValues, String[] attrNames) { + try { + Object[] o; + try { + o = buildDocument(file, rootName); + } catch (Exception e) { + return null; + } + + Element root = (Element) o[1]; + NodeList nodes = root.getElementsByTagName(nodeName); + + for(int count = 0; count < nodes.getLength(); count++) { + Node node = nodes.item(count); + Element e = (Element) node; + + if(!checkAttributes(e, thatHasThose, forValues)) continue; + + String[] values = new String[attrNames.length]; + for(int c = 0; c < attrNames.length; c++) values[count] = e.getAttribute(attrNames[c]); + + return values; + } + } catch (Exception e) {} + + return null; + } + + private static boolean checkAttributes(Element e, String[] thatHasThose, String[] forValues) { + if(thatHasThose != null && forValues != null && thatHasThose.length == forValues.length) { + for(int a = 0; a < thatHasThose.length; a++) { + if(!e.hasAttribute(thatHasThose[a]) || !forValues[a].equals(e.getAttribute(thatHasThose[a]))) return false; + } + } + return true; + } + + public static float getFloat(XMLPrefsManager.XMLPrefsSave prefsSave) { + return get(float.class, prefsSave); + } + + public static double getDouble(XMLPrefsManager.XMLPrefsSave prefsSave) { + return get(double.class, prefsSave); + } + + public static int getInt(XMLPrefsManager.XMLPrefsSave prefsSave) { + return get(int.class, prefsSave); + } + + public static boolean getBoolean(XMLPrefsManager.XMLPrefsSave prefsSave) { + return get(boolean.class, prefsSave); + } + + public static int getColor(XMLPrefsManager.XMLPrefsSave prefsSave) { + if(prefsSave.parent() == null) return Integer.MAX_VALUE; + + try { + return (int) transform(prefsSave.parent().getValues().get(prefsSave).value, Color.class); + } catch (Exception e) { + String def = prefsSave.defaultValue(); + if(def == null || def.length() == 0) { + return Integer.MAX_VALUE; + } + + try { + return (int) transform(def, Color.class); + } catch (Exception e1) { + return Integer.MAX_VALUE; + } + } + } + + public static String getString(XMLPrefsSave prefsSave) { + return get(prefsSave); + } + + public static <T> T get(Class<T> c, XMLPrefsManager.XMLPrefsSave prefsSave) { + try { + return (T) transform(prefsSave.parent().getValues().get(prefsSave).value, c); + } catch (Exception e) { + Tuils.log(e); + try { + return (T) transform(prefsSave.defaultValue(), c); + } catch (Exception e1) { + Tuils.log(e1); + return Tuils.getDefaultValue(c); + } + } + } + + public static String get(XMLPrefsManager.XMLPrefsSave prefsSave) { + return get(String.class, prefsSave); + } + + public static boolean resetFile(File f, String name) { + try { + FileOutputStream stream = new FileOutputStream(f); + stream.write(XML_DEFAULT.getBytes()); + stream.write(("<" + name + ">\n").getBytes()); + stream.write(("</" + name + ">\n").getBytes()); + stream.flush(); + stream.close(); + return true; + } catch (Exception e) { + return false; + } + } + +// 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/xml/options/Apps.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Apps.java new file mode 100644 index 0000000000000000000000000000000000000000..d775371c2cb39844b530f3df7fac6551a118f0b8 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Apps.java @@ -0,0 +1,60 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.AppsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Apps implements XMLPrefsManager.XMLPrefsSave { + + default_app_n1 { + @Override + public String defaultValue() { + return MOST_USED; + } + }, + default_app_n2 { + @Override + public String defaultValue() { + return MOST_USED; + } + }, + default_app_n3 { + @Override + public String defaultValue() { + return "com.android.vending"; + } + }, + default_app_n4 { + @Override + public String defaultValue() { + return NULL; + } + }, + default_app_n5 { + @Override + public String defaultValue() { + return NULL; + } + }; + + public static final String MOST_USED = "most_used"; + public static final String NULL = "null"; + + @Override + public String label() { + return name(); + } + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return AppsManager.instance; + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Behavior.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Behavior.java new file mode 100644 index 0000000000000000000000000000000000000000..ae2e396c029657d7054b2382159b7821e035ba8d --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Behavior.java @@ -0,0 +1,277 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import android.os.Environment; + +import java.io.File; + +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.tuils.Tuils; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Behavior implements XMLPrefsManager.XMLPrefsSave { + + double_tap_lock { + @Override + public String defaultValue() { + return "true"; + } + }, + double_tap_cmd { + @Override + public String defaultValue() { + return ""; + } + }, + random_play { + @Override + public String defaultValue() { + return "true"; + } + }, + songs_folder { + @Override + public String defaultValue() { + return ""; + } + }, + songs_from_mediastore { + @Override + public String defaultValue() { + return "true"; + } + }, + tui_notification { + @Override + public String defaultValue() { + return "false"; + } + }, + auto_show_keyboard { + @Override + public String defaultValue() { + return "true"; + } + }, + auto_scroll { + @Override + public String defaultValue() { + return "true"; + } + }, + show_hints { + @Override + public String defaultValue() { + return "true"; + } + }, + show_alias_content { + @Override + public String defaultValue() { + return "false"; + } + }, + show_launch_history { + @Override + public String defaultValue() { + return "true"; + } + }, + clear_after_cmds { + @Override + public String defaultValue() { + return "-1"; + } + }, + clear_after_seconds { + @Override + public String defaultValue() { + return "-1"; + } + }, + max_lines { + @Override + public String defaultValue() { + return "-1"; + } + }, + time_format { + @Override + public String defaultValue() { + return "%m/%d/%y %H.%M"; + } + }, + battery_medium { + @Override + public String defaultValue() { + return "50"; + } + }, + battery_low { + @Override + public String defaultValue() { + return "15"; + } + }, + device_format { + @Override + public String defaultValue() { + return "%d: %u"; + } + }, + ram_format { + @Override + public String defaultValue() { + return "Available RAM: %avgb GB of %totgb GB (%av%%)"; + } + }, + battery_format { + @Override + public String defaultValue() { + return "%(Charging: /)%v%"; + } + }, + storage_format { + @Override + public String defaultValue() { + return "Internal Storage: %iavgb GB / %itotgb GB (%iav%%)"; + } + }, + network_info_format { + @Override + public String defaultValue() { + return "%(WiFi - %wn/%[Mobile Data: %d3/No Internet access])"; + } + }, + input_format { + @Override + public String defaultValue() { + return "[%t] %p %i"; + } + }, + output_format { + @Override + 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 "@"; + } + }, + alias_param_marker { + @Override + public String defaultValue() { + return "%"; + } + }, + alias_param_separator { + @Override + public String defaultValue() { + return ","; + } + }, + multiple_cmd_separator { + @Override + public String defaultValue() { + return ";"; + } + }, + alias_content_format { + @Override + public String defaultValue() { + return "%a --> [%v]"; + } + }, + external_storage_path { + @Override + public String defaultValue() { + String path = System.getenv("SECONDARY_STORAGE"); + if(path == null) return Tuils.EMPTYSTRING; + + File file = new File(path); + if(file != null && file.exists()) return file.getAbsolutePath(); + + return Tuils.EMPTYSTRING; + } + }, + home_path { + @Override + public String defaultValue() { + return Environment.getExternalStorageDirectory().getAbsolutePath(); + } + }, + app_installed_format { + @Override + public String defaultValue() { + return "App installed: %p"; + } + }, + app_uninstalled_format { + @Override + public String defaultValue() { + return "App uninstalled: %p"; + } + }, + enable_music { + @Override + public String defaultValue() { + return "true"; + } + }, + autolower_firstchar { + @Override + public String defaultValue() { + return "true"; + } + }, + max_optional_depth_network_info { + @Override + public String defaultValue() { + return "2"; + } + }, + network_info_update_ms { + @Override + public String defaultValue() { + return "3500"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return XMLPrefsManager.XMLPrefsRoot.BEHAVIOR; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} \ No newline at end of file diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Cmd.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Cmd.java new file mode 100644 index 0000000000000000000000000000000000000000..6a75bb22e61aaf5648351f6caf651915e71d96ad --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Cmd.java @@ -0,0 +1,32 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Cmd implements XMLPrefsManager.XMLPrefsSave { + + default_search { + @Override + public String defaultValue() { + return "-gg"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return XMLPrefsManager.XMLPrefsRoot.CMD; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Notifications.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Notifications.java new file mode 100644 index 0000000000000000000000000000000000000000..ea3fd931044fb62439626d4ed8b3076bca8162a4 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Notifications.java @@ -0,0 +1,51 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.notifications.NotificationManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Notifications implements XMLPrefsManager.XMLPrefsSave { + + show_notifications { + @Override + public String defaultValue() { + return "false"; + } + }, + app_notification_enabled_default { + @Override + public String defaultValue() { + return "true"; + } + }, + default_notification_color { + @Override + public String defaultValue() { + return "#00FF00"; + } + }, + notification_format { + @Override + public String defaultValue() { + return "[%t] %pkg: %ttl --- %txt"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return NotificationManager.instance; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Rss.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Rss.java new file mode 100644 index 0000000000000000000000000000000000000000..894d1d0b5996351e7053349d048b54f481d712a3 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Rss.java @@ -0,0 +1,57 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.RssManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 03/10/2017. + */ + +public enum Rss implements XMLPrefsManager.XMLPrefsSave { + + rss_default_color { + @Override + public String defaultValue() { + return "#f44336"; + } + }, + rss_default_format { + @Override + public String defaultValue() { + return "%[50]title --- %[100]description"; + } + }, + include_rss_default { + @Override + public String defaultValue() { + return "true"; + } + }, + rss_hidden_tags { + @Override + public String defaultValue() { + return "img"; + } + }, + rss_time_format { + @Override + public String defaultValue() { + return "%t0"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return RssManager.instance; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Suggestions.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Suggestions.java new file mode 100644 index 0000000000000000000000000000000000000000..62fff83e33eb25c2c08d6b61316b46cf00b65d4e --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Suggestions.java @@ -0,0 +1,146 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Suggestions implements XMLPrefsManager.XMLPrefsSave { + + show_suggestions { + @Override + public String defaultValue() { + return "true"; + } + }, + transparent_suggestions { + @Override + public String defaultValue() { + return "false"; + } + }, + default_text_color { + @Override + public String defaultValue() { + return "#000000"; + } + }, + default_bg_color { + @Override + public String defaultValue() { + return "#ffffff"; + } + }, + apps_text_color { + @Override + public String defaultValue() { + return ""; + } + }, + apps_bg_color { + @Override + public String defaultValue() { + return "#00897B"; + } + }, + alias_text_color { + @Override + public String defaultValue() { + return ""; + } + }, + alias_bg_color { + @Override + public String defaultValue() { + return "#FF5722"; + } + }, + cmd_text_color { + @Override + public String defaultValue() { + return ""; + } + }, + cmd_bg_color { + @Override + public String defaultValue() { + return "#76FF03"; + } + }, + song_text_color { + @Override + public String defaultValue() { + return ""; + } + }, + song_bg_color { + @Override + public String defaultValue() { + return "#EEFF41"; + } + }, + contact_text_color { + @Override + public String defaultValue() { + return ""; + } + }, + contact_bg_color { + @Override + public String defaultValue() { + return "#64FFDA"; + } + }, + file_text_color { + @Override + public String defaultValue() { + return ""; + } + }, + file_bg_color { + @Override + public String defaultValue() { + return "#03A9F4"; + } + }, + suggest_alias_default { + @Override + public String defaultValue() { + return "true"; + } + }, + suggest_appgp_default { + @Override + public String defaultValue() { + return "true"; + } + }, + click_to_launch { + @Override + public String defaultValue() { + return "true"; + } + }, + suggestions_size { + @Override + public String defaultValue() { + return "12"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return XMLPrefsManager.XMLPrefsRoot.SUGGESTIONS; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} \ No newline at end of file diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Theme.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Theme.java new file mode 100644 index 0000000000000000000000000000000000000000..31f138de80dbd9d35197b78333b972d9311df1ab --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Theme.java @@ -0,0 +1,164 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Theme implements XMLPrefsManager.XMLPrefsSave { + + input_color { + @Override + public String defaultValue() { + return "#ff00ff00"; + } + }, + output_color { + @Override + public String defaultValue() { + return "#ffffffff"; + } + }, + bg_color { + @Override + public String defaultValue() { + return "#ff000000"; + } + }, + device_color { + @Override + public String defaultValue() { + return "#ffff9800"; + } + }, + battery_color_high { + @Override + public String defaultValue() { + return "#4CAF50"; + } + }, + battery_color_medium { + @Override + public String defaultValue() { + return "#FFEB3B"; + } + }, + battery_color_low { + @Override + public String defaultValue() { + return "#FF5722"; + } + }, + time_color { + @Override + public String defaultValue() { + return "#03A9F4"; + } + }, + storage_color { + @Override + public String defaultValue() { + return "#9C27B0"; + } + }, + ram_color { + @Override + public String defaultValue() { + return "#fff44336"; + } + }, + network_info_color { + @Override + public String defaultValue() { + return "#FFCA28"; + } + }, + toolbar_bg { + @Override + public String defaultValue() { + return "#00000000"; + } + }, + toolbar_color { + @Override + public String defaultValue() { + return "#ffff0000"; + } + }, + enter_color { + @Override + public String defaultValue() { + return "#ffffffff"; + } + }, + overlay_color { + @Override + public String defaultValue() { + return "#80000000"; + } + }, + alias_content_color { + @Override + public String defaultValue() { + return "#1DE9B6"; + } + }, + statusbar_color { + @Override + public String defaultValue() { + return "#000000"; + } + }, + navigationbar_color { + @Override + public String defaultValue() { + return "#000000"; + } + }, + app_installed_color { + @Override + public String defaultValue() { + return "#FF7043"; + } + }, + app_uninstalled_color { + @Override + public String defaultValue() { + return "#FF7043"; + } + }, + hint_color { + @Override + public String defaultValue() { + return "#4CAF50"; + } + }, + rss_color { + @Override + public String defaultValue() { + return null; + } + }, + mark_color { + @Override + public String defaultValue() { + return "#CDDC39"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return XMLPrefsManager.XMLPrefsRoot.THEME; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} \ No newline at end of file diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Toolbar.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Toolbar.java new file mode 100644 index 0000000000000000000000000000000000000000..c5bc862cb222c153f6ab3c6a423fbd4479861ff7 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Toolbar.java @@ -0,0 +1,32 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Toolbar implements XMLPrefsManager.XMLPrefsSave { + + show_toolbar { + @Override + public String defaultValue() { + return "true"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return XMLPrefsManager.XMLPrefsRoot.TOOLBAR; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} \ No newline at end of file diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Ui.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Ui.java new file mode 100644 index 0000000000000000000000000000000000000000..18c78bdbbf394949aec48dfd74f773991076be7f --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Ui.java @@ -0,0 +1,286 @@ +package ohi.andre.consolelauncher.managers.xml.options; + +import android.os.Build; + +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; + +/** + * Created by francescoandreuzzi on 24/09/2017. + */ + +public enum Ui implements XMLPrefsManager.XMLPrefsSave { + + show_enter_button { + @Override + public String defaultValue() { + return "true"; + } + }, + system_font { + @Override + public String defaultValue() { + return "false"; + } + }, + ram_size { + @Override + public String defaultValue() { + return "13"; + } + }, + battery_size { + @Override + public String defaultValue() { + return "13"; + } + }, + device_size { + @Override + public String defaultValue() { + return "13"; + } + }, + time_size { + @Override + public String defaultValue() { + return "13"; + } + }, + storage_size { + @Override + public String defaultValue() { + return "13"; + } + }, + network_size { + @Override + public String defaultValue() { + return "13"; + } + }, + input_output_size { + @Override + public String defaultValue() { + return "13"; + } + }, + input_bottom { + @Override + public String defaultValue() { + return "true"; + } + }, + show_ram { + @Override + public String defaultValue() { + return "true"; + } + }, + show_device_name { + @Override + public String defaultValue() { + return "true"; + } + }, + show_battery { + @Override + public String defaultValue() { + return "true"; + } + }, + show_network_info { + @Override + public String defaultValue() { + return "true"; + } + }, + show_storage_info { + @Override + public String defaultValue() { + return "true"; + } + }, + enable_battery_status { + @Override + public String defaultValue() { + return "true"; + } + }, + show_time { + @Override + public String defaultValue() { + return "true"; + } + }, + username { + @Override + public String defaultValue() { + return "user"; + } + }, + deviceName { + @Override + public String defaultValue() { + return Build.DEVICE; + } + }, + system_wallpaper { + @Override + public String defaultValue() { + return "false"; + } + }, + fullscreen { + @Override + public String defaultValue() { + return "false"; + } + }, + device_index { + @Override + public String defaultValue() { + return "0"; + } + }, + ram_index { + @Override + public String defaultValue() { + return "1"; + } + }, + battery_index { + @Override + public String defaultValue() { + return "2"; + } + }, + time_index { + @Override + public String defaultValue() { + return "3"; + } + }, + storage_index { + @Override + public String defaultValue() { + return "4"; + } + }, + network_index { + @Override + public String defaultValue() { + return "5"; + } + }, + status_line0_position { + @Override + public String defaultValue() { + return "-1"; + } + }, + status_line1_position { + @Override + public String defaultValue() { + return "-1"; + } + }, + status_line2_position { + @Override + public String defaultValue() { + return "-1"; + } + }, + status_line3_position { + @Override + public String defaultValue() { + return "-1"; + } + }, + status_line4_position { + @Override + public String defaultValue() { + return "-1"; + } + }, + status_line5_position { + @Override + public String defaultValue() { + return "-1"; + } + }, + input_prefix { + @Override + public String defaultValue() { + return "$"; + } + }, + input_root_prefix { + @Override + public String defaultValue() { + return "#"; + } + }, + left_margin_mm { + @Override + public String defaultValue() { + return "0"; + } + }, + right_margin_mm { + @Override + public String defaultValue() { + return "0"; + } + }, + top_margin_mm { + @Override + public String defaultValue() { + return "0"; + } + }, + bottom_margin_mm { + @Override + public String defaultValue() { + return "0"; + } + }, + ignore_bar_color { + @Override + public String defaultValue() { + return "false"; + } + }, + show_app_installed { + @Override + public String defaultValue() { + return "true"; + } + }, + show_app_uninstalled { + @Override + public String defaultValue() { + return "true"; + } + }, + show_session_info { + @Override + public String defaultValue() { + return "true"; + } + }; + + @Override + public XMLPrefsManager.XmlPrefsElement parent() { + return XMLPrefsManager.XMLPrefsRoot.UI; + } + + @Override + public String label() { + return name(); + } + + @Override + public boolean is(String s) { + return name().equals(s); + } +} \ No newline at end of file diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java index 5f2e1cb3591a6b4f7b5bc33683036a0ffcb808c9..34c551b76fd7001df44ee1e8d627ef0bc73aecdd 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java @@ -14,12 +14,12 @@ public class AllowEqualsSequence { List<Entry> sequence; - public AllowEqualsSequence(int[] keys, Object[] values) { + public AllowEqualsSequence(float[] values, Object[] objs) { this.sequence = new ArrayList<>(); - for (int count = 0; count < keys.length; count++) { - if(keys[count] == Integer.MAX_VALUE) continue; - sequence.add(new Entry(keys[count], values[count])); + for (int count = 0; count < values.length; count++) { + if(values[count] == Integer.MAX_VALUE) continue; + sequence.add(new Entry(values[count], objs[count])); } Collections.sort(this.sequence); @@ -27,19 +27,18 @@ public class AllowEqualsSequence { for(int count = 0; count < sequence.size(); count++) { Entry entry = sequence.get(count); - int key = entry.key; - if(key != last) { - counter++; - } + int i = (int) entry.value; + if(i != last) counter++; + entry.key = counter; - last = key; + last = counter; } } public Object[] get(int key) { List<Object> o = new ArrayList<>(); for(Entry entry : sequence) { - if(entry.key == key) o.add(entry.value); + if(entry.key == key) o.add(entry.obj); else if(o.size() > 0) break; } @@ -61,22 +60,29 @@ public class AllowEqualsSequence { } private class Entry implements Comparable<Entry> { + + float value; + Object obj; + int key; - Object value; - public Entry(int key, Object value) { - this.key = key; + public Entry(float value, Object obj) { this.value = value; + this.obj = obj; } @Override public int compareTo(@NonNull Entry o) { - return this.key - o.key; + float result = value - o.value; + + if(result == 0) return 0; + if(result < 0) return -1; + return 1; } @Override public String toString() { - return key + ": " + value.toString(); + return value + ": " + obj.toString(); } } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java index 4f21af22623438913f0d6f2d2d30021b6d323883..925cfdc5d55735ac61dbf5e216d57c41ec7dee3b 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java @@ -27,6 +27,7 @@ public class InputOutputReceiver extends BroadcastReceiver { public static final String TEXT = "ohi.andre.consolelauncher.text"; public static final String TYPE = "ohi.andre.consolelauncher.type"; public static final String COLOR = "ohi.andre.consolelauncher.color"; + public static final String SHOW_CONTENT = "ohi.andre.consolelauncher.show_content"; CommandExecuter executer; Outputable outputable; @@ -45,17 +46,16 @@ public class InputOutputReceiver extends BroadcastReceiver { if(text == null) return; if(intent.getAction().equals(ACTION_CMD)) { - executer.exec(text.toString()); + executer.exec(text.toString(), intent.getBooleanExtra(SHOW_CONTENT, true)); } else { int color = intent.getIntExtra(COLOR, Integer.MAX_VALUE); if(color != Integer.MAX_VALUE) { outputable.onOutput(color, text); - } - else { + } else { int type = intent.getIntExtra(TYPE, -1); if(type != -1) outputable.onOutput(text, type); - else outputable.onOutput(text, TerminalManager.CATEGORY_OUTPUT); + else outputable.onOutput(text, TerminalManager.CATEGORY_GENERAL); } } } else { diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/NetworkUtils.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/NetworkUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..00246ae4ef2da400477adec96723e381ff871a38 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/NetworkUtils.java @@ -0,0 +1,128 @@ +package ohi.andre.consolelauncher.tuils; + +/** + * Created by francescoandreuzzi on 28/09/2017. + */ + +import java.io.*; +import java.net.*; +import java.util.*; + +public class NetworkUtils { + + /** + * Convert byte array to hex string + * @param bytes + * @return + */ + public static String bytesToHex(byte[] bytes) { + StringBuilder sbuf = new StringBuilder(); + for(int idx=0; idx < bytes.length; idx++) { + int intVal = bytes[idx] & 0xff; + if (intVal < 0x10) sbuf.append("0"); + sbuf.append(Integer.toHexString(intVal).toUpperCase()); + } + return sbuf.toString(); + } + + /** + * Get utf8 byte array. + * @param str + * @return array of NULL if error was found + */ + public static byte[] getUTF8Bytes(String str) { + try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; } + } + + /** + * Load UTF8withBOM or any ansi text file. + * @param filename + * @return + * @throws java.io.IOException + */ + public static String loadFileAsString(String filename) throws java.io.IOException { + final int BUFLEN=1024; + BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN); + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN); + byte[] bytes = new byte[BUFLEN]; + boolean isUTF8=false; + int read,count=0; + while((read=is.read(bytes)) != -1) { + if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) { + isUTF8=true; + baos.write(bytes, 3, read-3); // drop UTF8 bom marker + } else { + baos.write(bytes, 0, read); + } + count+=read; + } + return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray()); + } finally { + try{ is.close(); } catch(Exception ex){} + } + } + + /** + * Returns MAC address of the given interface name. + * @param interfaceName eth0, wlan0 or NULL=use first interface + * @return mac address or empty string + */ + public static String getMACAddress(String interfaceName) { + try { + List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface intf : interfaces) { + if (interfaceName != null) { + if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; + } + byte[] mac = intf.getHardwareAddress(); + if (mac==null) return ""; + StringBuilder buf = new StringBuilder(); + for (int idx=0; idx<mac.length; idx++) + buf.append(String.format("%02X:", mac[idx])); + if (buf.length()>0) buf.deleteCharAt(buf.length()-1); + return buf.toString(); + } + } catch (Exception ex) { } // for now eat exceptions + return ""; + /*try { + // this is so Linux hack + return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim(); + } catch (IOException ex) { + return null; + }*/ + } + + /** + * Get IP address from first non-localhost interface + * @param ipv4 true=return ipv4, false=return ipv6 + * @return address or empty string + */ + public static String getIPAddress(boolean useIPv4) { + try { + List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface intf : interfaces) { + List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); + for (InetAddress addr : addrs) { + if (!addr.isLoopbackAddress()) { + String sAddr = addr.getHostAddress(); + //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); + boolean isIPv4 = sAddr.indexOf(':')<0; + + if (useIPv4) { + if (isIPv4) + return sAddr; + } else { + if (!isIPv4) { + int delim = sAddr.indexOf('%'); // drop ip6 zone suffix + return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); + } + } + } + } + } + } catch (Exception ex) { } // for now eat exceptions + return ""; + } + +} \ No newline at end of file diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java index 8aec73189bcff0e220827388102c71df5d55d12d..854139936e02445c0185fdd9eca331e5cde9ad9f 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java @@ -12,7 +12,8 @@ import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; /** * Created by francescoandreuzzi on 26/07/2017. @@ -26,8 +27,8 @@ public class TimeManager { 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); + String format = XMLPrefsManager.get(Behavior.time_format); + String separator = XMLPrefsManager.get(Behavior.time_format_separator); time = new Time(); @@ -93,12 +94,15 @@ public class TimeManager { String tf = time.format(t); - SpannableString spannableString = null; + SpannableString spannableString = new SpannableString(tf); if(color != Integer.MAX_VALUE) { - spannableString = new SpannableString(tf); - spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } - cs = TextUtils.replace(cs, new String[] {"%t"}, new CharSequence[] {spannableString != null ? spannableString : tf}); + if(size != Integer.MAX_VALUE && context != null) { + spannableString.setSpan(new AbsoluteSizeSpan(Tuils.convertSpToPixels(size, context)), 0, tf.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + + cs = TextUtils.replace(cs, new String[] {"%t"}, new CharSequence[] {spannableString}); 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 0d13ed7ac809d22acd007c7b93e85b1b34222ed7..4836734666f5b5a5cb0ee3d3e74ecd90c936c856 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java @@ -13,6 +13,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.graphics.Typeface; import android.net.Uri; import android.os.BatteryManager; import android.os.Build; @@ -24,6 +25,7 @@ import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.style.AbsoluteSizeSpan; +import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; import android.util.DisplayMetrics; import android.util.Log; @@ -37,7 +39,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; @@ -54,10 +58,13 @@ import java.util.regex.Pattern; import dalvik.system.DexFile; import ohi.andre.consolelauncher.BuildConfig; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.TerminalManager; import ohi.andre.consolelauncher.managers.music.MusicManager2; import ohi.andre.consolelauncher.managers.music.Song; import ohi.andre.consolelauncher.managers.notifications.NotificationService; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; +import ohi.andre.consolelauncher.managers.xml.options.Ui; import ohi.andre.consolelauncher.tuils.interfaces.OnBatteryUpdate; import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity; @@ -72,6 +79,44 @@ public class Tuils { private static final String TUI_FOLDER = "t-ui"; public static final String MINUS = "-"; + public static final String FONT_PATH = "font"; + private static Typeface globalTypeface = null; + public static Typeface getTypeface(Context context) { + if(globalTypeface == null) { + try { + XMLPrefsManager.create(context); + } catch (Exception e) { + return null; + } + + boolean systemFont = XMLPrefsManager.getBoolean(Ui.system_font); + if(systemFont) globalTypeface = Typeface.DEFAULT; + else { + File tui = Tuils.getFolder(); + + File font = null; + for(File f : tui.listFiles()) { + if(f.getName().startsWith(FONT_PATH)) { + font = f; + break; + } + } + + if(font != null) { + try { + globalTypeface = Typeface.createFromFile(font); + if(globalTypeface == null) throw new UnsupportedOperationException(); + } catch (Exception e) { + globalTypeface = null; + } + } + } + + if(globalTypeface == null) globalTypeface = systemFont ? Typeface.DEFAULT : Typeface.createFromAsset(context.getAssets(), "lucida_console.ttf"); + } + return globalTypeface; + } + public static boolean notificationServiceIsRunning(Context context) { ComponentName collectorComponent = new ComponentName(context, NotificationService.class); ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); @@ -104,6 +149,9 @@ public class Tuils { public static void registerBatteryReceiver(Context context, OnBatteryUpdate listener) { try { IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + iFilter.addAction(Intent.ACTION_POWER_CONNECTED); + iFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); + context.registerReceiver(batteryReceiver, iFilter); batteryUpdate = listener; @@ -118,8 +166,18 @@ public class Tuils { public void onReceive(Context context, Intent intent) { if(batteryUpdate == null) return; - int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); - batteryUpdate.update(level); + switch (intent.getAction()) { + case Intent.ACTION_BATTERY_CHANGED: + int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + batteryUpdate.update(level); + break; + case Intent.ACTION_POWER_CONNECTED: + batteryUpdate.onCharging(); + break; + case Intent.ACTION_POWER_DISCONNECTED: + batteryUpdate.onNotCharging(); + break; + } } }; @@ -160,6 +218,34 @@ public class Tuils { return songs; } + public static void download(InputStream in, File file) throws Exception { + OutputStream out = new FileOutputStream(file, false); + + byte data[] = new byte[1024]; + + int count; + while ((count = in.read(data)) != -1) { + out.write(data, 0, count); + } + + out.flush(); + out.close(); + in.close(); + } + + public static void write(File file, String separator, String... ss) throws Exception { + FileOutputStream headerStream = new FileOutputStream(file, false); + + for(int c = 0; c < ss.length - 1; c++) { + headerStream.write(ss[c].getBytes()); + headerStream.write(separator.getBytes()); + } + headerStream.write(ss[ss.length - 1].getBytes()); + + headerStream.flush(); + headerStream.close(); + } + public static float dpToPx(Context context, float valueInDp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); @@ -225,7 +311,7 @@ public class Tuils { public static double getAvailableExternalMemorySize(int unit) { try { - return getAvailableSpace(XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.external_storage_path), unit); + return getAvailableSpace(XMLPrefsManager.get(File.class, Behavior.external_storage_path), unit); } catch (Exception e) { return -1; } @@ -233,7 +319,7 @@ public class Tuils { public static double getTotalExternalMemorySize(int unit) { try { - return getTotaleSpace(XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.external_storage_path), unit); + return getTotaleSpace(XMLPrefsManager.get(File.class, Behavior.external_storage_path), unit); } catch (Exception e) { return -1; } @@ -302,11 +388,30 @@ public class Tuils { return spannableString; } + public static SpannableString span(int bgColor, int foreColor, String text) { + SpannableString spannableString = new SpannableString(text); + spannableString.setSpan(new BackgroundColorSpan(bgColor), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannableString.setSpan(new ForegroundColorSpan(foreColor), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + return spannableString; + } + + public static int span(int bgColor, SpannableString text, String section, int fromIndex) { + int index = text.toString().indexOf(section, fromIndex); + if(index == -1) return index; + + text.setSpan(new BackgroundColorSpan(bgColor), index, index + section.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + return index + section.length(); + } + public static int convertSpToPixels(float sp, Context context) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics()); } public static void delete(File dir) { + File[] files = dir.listFiles(); + if(files == null) return; + for(File f : dir.listFiles()) { if(f.isDirectory()) delete(f); f.delete(); @@ -314,6 +419,16 @@ public class Tuils { dir.delete(); } + public static void deleteContent(File dir) { + File[] files = dir.listFiles(); + if(files == null) return; + + for(File f : dir.listFiles()) { + if(f.isDirectory()) delete(f); + f.delete(); + } + } + public static boolean insertOld(File oldFile) { if(oldFile == null || !oldFile.exists()) return false; @@ -369,7 +484,7 @@ public class Tuils { } public static void sendOutput(int color, Context context, CharSequence s) { - sendOutput(color, context, s, -1); + sendOutput(color, context, s, TerminalManager.CATEGORY_GENERAL); } public static void sendOutput(Context context, CharSequence s, int type) { @@ -448,7 +563,7 @@ public class Tuils { } private static String getNicePath(String filePath) { - String home = XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.home_path).getAbsolutePath(); + String home = XMLPrefsManager.get(File.class, Behavior.home_path).getAbsolutePath(); if(filePath.equals(home)) { return "~"; @@ -495,17 +610,17 @@ public class Tuils { static Pattern pu = Pattern.compile("%u", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); static Pattern pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE | Pattern.LITERAL); public static String getHint(String currentPath) { - if(!XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_session_info)) return null; + if(!XMLPrefsManager.getBoolean(Ui.show_session_info)) return null; - String format = XMLPrefsManager.get(XMLPrefsManager.Behavior.session_info_format); + String format = XMLPrefsManager.get(Behavior.session_info_format); if(format.length() == 0) return null; - String deviceName = XMLPrefsManager.get(XMLPrefsManager.Ui.deviceName); + String deviceName = XMLPrefsManager.get(Ui.deviceName); if(deviceName == null || deviceName.length() == 0) { deviceName = Build.DEVICE; } - String username = XMLPrefsManager.get(XMLPrefsManager.Ui.username); + String username = XMLPrefsManager.get(Ui.username); if(username == null) username = Tuils.EMPTYSTRING; format = pd.matcher(format).replaceAll(Matcher.quoteReplacement(deviceName)); @@ -677,7 +792,7 @@ public class Tuils { return true; } - public static boolean isNumber(String s) { + public static boolean isPhoneNumber(String s) { if(s == null) { return false; } @@ -692,6 +807,23 @@ public class Tuils { return true; } +// return -1 if only digit + public static char firstNonDigit(String s) { + if(s == null) { + return 0; + } + + char[] chars = s.toCharArray(); + + for (char c : chars) { + if (!Character.isDigit(c)) { + return c; + } + } + + return 0; + } + public static Intent openFile(File url) { Uri u = Uri.fromFile(url); Intent intent = new Intent(android.content.Intent.ACTION_VIEW); @@ -817,25 +949,22 @@ public class Tuils { return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); } - private static final int FILEUPDATE_DELAY = 300; + private static final int FILEUPDATE_DELAY = 75; private static File folder = null; public static File getFolder() { if(folder != null) return folder; - final File tuiFolder = Tuils.getTuiFolder(); - while (true) { - if (tuiFolder != null && (tuiFolder.isDirectory() || tuiFolder.mkdir())) { - break; + File tuiFolder = Tuils.getTuiFolder(); + if(tuiFolder != null && ((tuiFolder.exists() && tuiFolder.isDirectory()) || tuiFolder.mkdir())) { + folder = tuiFolder; + return folder; } try { Thread.sleep(FILEUPDATE_DELAY); } catch (InterruptedException e) {} } - - folder = tuiFolder; - return folder; } public static int alphabeticCompare(String s1, String s2) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java index 1dfb5f87162194e3d70da4a0474a19371c2d4a01..ce6380abcff602f53462cc29d0aadbc481429854 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java @@ -7,4 +7,6 @@ package ohi.andre.consolelauncher.tuils.interfaces; public interface OnBatteryUpdate { void update(float percentage); + void onCharging(); + void onNotCharging(); } 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 dd41e2af3383b394eab94e5aad1203a2378f770e..1742d62dceb4f7f1708f95695bda17e9ac7079b3 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 @@ -7,4 +7,5 @@ public interface Outputable { void onOutput(CharSequence output, int category); void onOutput(int color, CharSequence output); void onOutput(CharSequence output); + void dispose(); } diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java index ef8b1dcf44f1f03117956fbc2f4c1129889db3bf..215332861a39d2edd87517f6344a0a0404689f76 100644 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java @@ -2,7 +2,8 @@ package ohi.andre.consolelauncher.tuils.libsuperuser; import java.io.File; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager; +import ohi.andre.consolelauncher.managers.xml.options.Behavior; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; /** @@ -32,7 +33,7 @@ public class ShellHolder { } }) .open(); - interactive.addCommand("cd " + XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.home_path)); + interactive.addCommand("cd " + XMLPrefsManager.get(File.class, Behavior.home_path)); return interactive; } } diff --git a/app/src/main/res/layout/about_device_view.xml b/app/src/main/res/layout/about_device_view.xml index 3d440497637d2178d1f594f26934fc67897e0ec4..feec5874d14c8d8512206cf9929d47bdb1e82625 100755 --- a/app/src/main/res/layout/about_device_view.xml +++ b/app/src/main/res/layout/about_device_view.xml @@ -24,4 +24,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + <TextView android:id="@+id/tv5" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67ee18d107c9a7c2b8546ba4b33d85cabe5d07cc..2241b0b9bb5baf8bd1ccc198b98f8c1ac4715d3a 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,13 +8,17 @@ <string name="output_about">Francesco Andreuzzi (Italy)\n\t-> Programmer \n\nLuke Winward (USA)\n\t-> Idea and design \n\nAlexander King (Australia)\n\t-> t-ui theme website and db management</string> - <string name="output_refresh">Refresh: apps, alias, music, contacts</string> + <string name="output_refresh">Refresh: apps, alias, music, contacts, rss feeds</string> <string name="output_rate">Thank you!</string> <string name="start_notification">T-UI started</string> <string name="tui_running">T-UI is running</string> <string name="anr">t-ui is having some issues. Please send to the developer your file crash.txt in the "t-ui" folder</string> <string name="admin_permission">Lock the screen on double tap</string> + <!-- regex --> + <string name="regex_not_found">Couldn\'t find a Regex with this ID</string> + <string name="regex_exists">An other Regex is already using this ID</string> + <!-- theme --> <string name="theme_not_found">Theme not found</string> <string name="theme_invalid">Invalid theme</string> @@ -70,7 +74,6 @@ <string name="output_nopermissions">You didn\'t grant the permission</string> <string name="output_waitingpermission">Waiting permission</string> <string name="output_problemcamera">There was a problem while connecting to your device camera</string> - <string name="output_numberformat">Wrong number format</string> <string name="output_invalidarg">Invalid argument</string> <string name="output_lessarg">Less arguments than expected</string> <string name="invalid_integer">Invalid integer</string> @@ -82,6 +85,13 @@ <string name="output_groupnotfound">Group not found</string> <string name="output_groupexists">This group already exists</string> <string name="output_groupspace">Spaces are not allowed inside group names</string> + <string name="output_notification_error">The notification service couldn\'t be started:</string> + + <!-- rss --> + <string name="rss_not_found">Invalid ID: no RSS feed found</string> + <string name="id_already">This ID has already been used</string> + <string name="id_notfound">Invalid ID</string> + <!-- alias --> <string name="output_aliasnotfound">Alias not found:</string> @@ -92,14 +102,14 @@ <!-- tuixt --> <string name="help_tuixt_help">Print the list of commands, or info about a command - \nUsage: + \n\nUsage: \nhelp [command] \n\nExample: - \nhelp exit + \n$ help exit </string> <string name="help_tuixt_exit">Exit from tuixt</string> <string name="help_tuixt_save">Save changes</string> - <string name="tuixt_back_pressed">You pressed back key</string> + <string name="tuixt_back_pressed">You pressed the back key</string> <string name="tuixt_saved">Saved</string> <string name="tuixt_reading">Reading</string> <string name="tuixt_label">TUIXT</string> @@ -118,7 +128,7 @@ <string name="output_musicdisabled">enable_music is false!</string> <!-- command/args --> - <string name="output_commandnotfound">Command not found.\nTry to use \">>help\" or \">>tutorial\"</string> + <string name="output_commandnotfound">Command not found.\nTry to use \"$ help\" or \"$ tutorial\"</string> <string name="output_invalid_param">Invalid option:</string> <!-- flash --> @@ -127,7 +137,7 @@ <string name="output_flashlightnotavailable">Your device doesn\'t support flashlight</string> <!-- status --> - <string name="battery_charge">Battery charge:</string> + <string name="battery_charge">Battery:</string> <string name="mobile_data">Mobile data:</string> <string name="wifi">WiFi:</string> @@ -139,16 +149,12 @@ <string name="help_airplane">Toggle airplane mode</string> - <string name="help_alias">Manage your aliases - \n\nUsage: - \n-add [aliasName] [alias content] -> add a new alias + <string name="help_alias">-add [aliasName] [alias content] -> add a new alias \n-rm [aliasName] -> remove an existing alias \n-ls -> list your aliases \n-file -> open alias.xml </string> - <string name="help_apps">Manage your apps - \n\nUsage: - \n-ls -> list your apps + <string name="help_apps">-ls -> list your apps \n-lsh -> list your hidden apps \n-show [appName] -> re-show an hidden app \n-hide [appName] -> hide an app @@ -158,7 +164,7 @@ \n-default_app [index] [appName or most_used or null] -> set the default_app at the specified index \n-frc [appName] -> force t-ui to launch an app \n-file -> open apps.xml - \n-refresh [appName] -> refresh the \"launched_times\" value of the given app to 0 + \n-reset [appName] -> reset the \"launched_times\" value of the given app to 0 \n-mkgp [groupName] -> create a new group with the given name \n-rmgp [groupName] -> delete the group with the given name \n-gpcolor [groupName] [color] -> set the color for the given group @@ -170,36 +176,36 @@ <string name="help_clear">Clear the screen</string> <string name="help_calc" formatted="false">Perform basic operations (+ - * / % ^ sqrt) \nExample: - \n\n>>calc 4+2-5 + \n\n$ calc 4+2-5 \n1 - \n\n>>calc 2 ^ (2*2) + \n\n$ calc 2 ^ (2*2) \n16 - \n\n>>calc sqrt25 + \n\n$ calc sqrt25 \n5 </string> - <string name="help_call">Make a call - \nUsage: call [number] OR [contactName] + <string name="help_call">Call someone + \n\nUsage: + \n$ call [number] OR [contactName] </string> - <string name="help_config">Usage: - \n-set [option] [value] -> set the value of an option + <string name="help_config">-set [option] [value] -> set the value of an option + \n-append [option] [value] -> append the given string to the value of the selected option \n-file [file] -> open a config file \n-get [option] -> get the value of an option \n-reset [option] -> reset the value of an option \n-apply [file] -> move a file to the t-ui directory + \n-tutorial -> open the tutorial page </string> <string name="help_data">Toggle mobile data</string> - <string name="help_devutils">Usage: - \nnotify [title] [text]</string> + <string name="help_devutils">There\'s nothing interesting there</string> <string name="help_donate">Offer a coffee to the developer (PayPal only)</string> <string name="help_flash">Toggle the flashlight</string> - <string name="help_help">Print a list of the available commands, or info about a command - \nUsage: - \n>>help [command] + <string name="help_help">Print the available commands, or info about a command + \n\nUsage: + \n$ help [command] </string> - <string name="help_music">Usage: - \n-next -> play the next song in the queue - \n-previous -> play the previous song in the queue - \n-play -> play/pause + <string name="help_music">-next -> play the next song + \n-previous -> play the previous song + \n-play -> play/pause the player \n-stop -> stop the player \n-ls -> list your tracks \n-select [song] -> play the selected song @@ -207,23 +213,21 @@ \n-seekto [seconds] -> seek to the selected part of the current song</string> <string name="help_rate">Leave a feedback on the Play Store page</string> <string name="help_refresh">Refresh apps, alias, music, contacts</string> + <string name="help_regex">-add [ID] [regex] -> add a new regex with the given ID + \n-rm [ID] -> remove the regex with the given ID + \n-test [ID] [string] -> test the corresponding regex over the given string</string> <string name="help_restart">Restart t-ui and load modified values</string> - <string name="help_search">Search something somewhere - \n\nUsage: - \n-gg [search this...] -> Google Search + <string name="help_search">-gg [search this...] -> Google Search \n-ps [search this...] -> Google Play Store \n-file [search this...] -> Files \n-yt [search this...] -> YouTube \n-dd [search this...] -> DuckDuck Go </string> - <string name="help_share">Share a file - \nUsage: - \n>>share [pathToFile] + <string name="help_share">$ share [pathToFile] </string> <string name="help_shellcommands">Print the commands in /system/bin and /system/xbin</string> <string name="help_status">Get info about battery charge, wifi status and mobile data</string> - <string name="help_theme">Usage: - \n-apply [theme] -> apply the selected theme (case sensitive). require internet connection. may take some seconds + <string name="help_theme">-apply [theme] -> apply the selected theme (case sensitive). require internet connection. may take some seconds \n-view -> view the available themes \n-create -> create a new theme \n-old -> re-apply the theme that was replaced by the current one</string> @@ -231,12 +235,10 @@ \n\nUsage: \n$ time [index] (index means the index of the desired time_format</string> <string name="help_tuixt">Open the text editor. - \nUsage: - \n>>tuixt [textFile] + \n\nUsage: + \n$ tuixt [textFile] </string> - <string name="help_tui"> - Usage: - \n-rm -> remove t-ui + <string name="help_tui">-rm -> uninstall t-ui \n-about -> show info about the developer and the current version</string> \n-reset -> removes the t-ui folder and resets default settings (restart required) \n-twitter -> show t-ui Twitter page @@ -245,24 +247,26 @@ \n-folder -> print the path of the t-ui folder <string name="help_tutorial">Open the tutorial page on GitHub</string> <string name="help_uninstall">Uninstall an application - \nUsage: - \n>>uninstall [appName] + \n\nUsage: + \n$ uninstall [appName] </string> <string name="help_wifi">Toggle wifi</string> <string name="help_sms">Send an SMS. - \nUsage: - \n>>sms [contactName] OR [number] - \n>>[text] + \n\nUsage: + \n$ sms [contactName] OR [number] + \n$ [text] </string> - <string name="help_vibrate">Vibrate your device. - \nUsage: - \n>>vibrate [milliseconds]</string> - <string name="help_beep">Emit a beep. - \nUsage: - \n>>beep</string> - <string name="help_notifications">Manage your notifications. + <string name="help_vibrate">Make your device vibrate. \n\nUsage: - \n-inc [appName] -> include an application + \n$ vibrate [milliseconds] + \n$ vibrate [pattern: wait, vibrate, wait, vibrate, wait, ...] + \n\nExample: + \n$ vibrate 300 + \n$ vibrate 0,300,500,300</string> + <string name="help_beep">Emit a \"beep\". + \n\nUsage: + \n$ beep</string> + <string name="help_notifications">-inc [appName] -> include an application \n-exc [appName] -> exclude an application \n-clr [color] [appName] -> set the color to be used for the application \n-file -> open notifications.xml @@ -270,21 +274,36 @@ \n-text_filter [ID] [regex] -> set a filter over notifications text with a given ID \n-apply_filter [ID] [appName] -> apply a filter (or a group of filters) to a single application \n-access -> show the system settings page dedicated to the Notification Access</string> - <string name="help_location">Show the current location</string> - <string name="help_cntcts">Manage your contacts. - \n\nUsage: - \n-ls -> list your contacts + <string name="help_location">Show your current location</string> + <string name="help_cntcts">-ls -> list your contacts \n-l [contactName] -> show details about a contact \n-add -> create a new contact \n-edit [contactName] -> edit an existing contact \n-rm [contactName] -> remove a contact</string> - <string name="help_exit">Close T-UI and reset launcher preferences</string> + <string name="help_exit">Close T-UI and reset the default launcher</string> + <string name="help_rss">-add [ID] [update_time_in_seconds] [url] -> add a new RSS feed. t-ui will try to get new contents every [update_time_in_seconds] seconds + \n-rm [ID] -> remove this RSS feed + \n-ls -> list your RSS feeds + \n-l [ID] -> show the whole content of the corresponding RSS feed + \n-show [ID] [boolean] -> toggle the [show] property of the given saved RSS feed + \n-time [ID] [update_time_in_seconds] -> set the update time of the corresponding RSS feed + \n-format [ID] [format] -> set the format of the corresponding RSS feed ([format] can be both a string or the ID of an existing format) + \n-color [ID] [color] -> set the base color of the corresponding RSS feed + \n-wifi_only [ID] [boolean] -> if [boolean] is true, the corresponding feed will be updated only if your device is connected to a WiFi network + \n-last_check [ID] -> show the last time t-ui checked this RSS feed + \n-frc [ID] -> update the corresponding RSS feed and eventually show new updates + \n-info [ID] -> show info about the corresponding RSS feed settings + \n-include_if_matches [ID] [regex] -> if the given regex matches on an RSS feed item, it will be shown ([regex] can be both a string or the ID of a regex saved inside regex.xml) + \n-exclude_if_matches [ID] [regex] -> if the given regex matches on an RSS feed item, it won\'t be shown ([regex] can be both a string or the ID of a regex saved inside regex.xml) + \n-add_format [ID] [format] -> create a new format that you will be able to use for more than one RSS feed + \n-rm_format [ID] [format] -> remove an existing format + \n-file -> open the file RSS.xml</string> <!-- linux --> <string name="help_ctrlc">Interrupt the current shell process and create a new one</string> <string name="help_open">Open a file \nUsage: - \n>>open [pathToFile] + \n$ open [pathToFile] </string> </resources>