From 1973f71316055692da2ec91392b1fef925b5781a Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi <andreuzzi.francesco@gmail.com> Date: Sat, 8 Jul 2017 09:20:53 +0200 Subject: [PATCH] 5.3i --- app/build.gradle | 12 +- app/src/main/AndroidManifest.xml | 11 - .../consolelauncher/LauncherActivity.java | 26 +- .../ohi/andre/consolelauncher/UIManager.java | 105 +++++-- .../commands/main/raw/apps.java | 24 +- .../commands/main/raw/cntcts.java | 3 +- .../commands/main/raw/time.java | 14 +- .../commands/main/raw/tui.java | 10 +- .../commands/main/raw/tutorial.java | 55 ---- .../consolelauncher/managers/AppsManager.java | 110 +++++++- .../consolelauncher/managers/FileManager.java | 20 +- .../consolelauncher/managers/SkinManager.java | 229 +++++++++------- .../managers/TerminalMAnager.java | 77 ++++-- .../managers/XMLPrefsManager.java | 80 +++++- .../notifications/NotificationService.java | 10 +- .../suggestions/SuggestionsManager.java | 2 +- .../andre/consolelauncher/tuils/Tuils.java | 31 ++- .../tuils/tutorial/TutorialActivity.java | 259 ------------------ app/src/main/res/drawable/big_icon.png | Bin 33045 -> 0 bytes app/src/main/res/drawable/ic_email.png | Bin 1964 -> 0 bytes app/src/main/res/drawable/ic_git.png | Bin 2781 -> 0 bytes app/src/main/res/drawable/ic_googlep.png | Bin 2461 -> 0 bytes .../res/drawable/tutorial_end_icon_bg.xml | 7 - app/src/main/res/layout/about_device_view.xml | 8 + .../main/res/layout/tutorial_base_layout.xml | 26 -- .../main/res/layout/tutorial_end_layout.xml | 76 ----- .../main/res/layout/tutorial_first_layout.xml | 40 --- app/src/main/res/values-h1024dp/dimension.xml | 4 - app/src/main/res/values-h320dp/dimension.xml | 2 - app/src/main/res/values-h720dp/dimension.xml | 4 - app/src/main/res/values/dimension.xml | 4 - app/src/main/res/values/ids.xml | 11 - app/src/main/res/values/integers.xml | 9 - app/src/main/res/values/strings.xml | 106 +------ app/src/main/res/values/styles.xml | 53 ---- 35 files changed, 549 insertions(+), 879 deletions(-) delete mode 100755 app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tutorial.java delete mode 100755 app/src/main/java/ohi/andre/consolelauncher/tuils/tutorial/TutorialActivity.java delete mode 100755 app/src/main/res/drawable/big_icon.png delete mode 100755 app/src/main/res/drawable/ic_email.png delete mode 100755 app/src/main/res/drawable/ic_git.png delete mode 100755 app/src/main/res/drawable/ic_googlep.png delete mode 100755 app/src/main/res/drawable/tutorial_end_icon_bg.xml delete mode 100755 app/src/main/res/layout/tutorial_base_layout.xml delete mode 100755 app/src/main/res/layout/tutorial_end_layout.xml delete mode 100755 app/src/main/res/layout/tutorial_first_layout.xml delete mode 100755 app/src/main/res/values/ids.xml diff --git a/app/build.gradle b/app/build.gradle index 45809d5..457f2bc 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 8 targetSdkVersion 23 - versionCode 92 - versionName "5.3f" + versionCode 95 + versionName "5.3i" } buildTypes { @@ -32,4 +32,12 @@ android { compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.github.Andre1299:CompareString:1.4.2' } + + applicationVariants.all { variant -> + variant.outputs.each { output -> + output.outputFile = new File( + output.outputFile.parent, + output.outputFile.name.replace("app-release.apk", "${variant.applicationId}_${variant.versionName}.apk")) + } + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0e3dc44..0972875 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,7 +60,6 @@ <uses-feature android:name="android.hardware.location.gps" android:required="false"/> - <!-- t-ui --> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" @@ -178,16 +177,6 @@ </activity> - <activity android:name=".tuils.tutorial.TutorialActivity" - android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen" - android:windowSoftInputMode="stateAlwaysHidden" - - android:excludeFromRecents="true"> - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value=".LauncherActivity" /> - </activity> - <service android:name=".managers.notifications.NotificationService" android:label="@string/notification_reader" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java index 64b8276..a0531e7 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java @@ -12,7 +12,6 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.provider.Settings; @@ -43,7 +42,6 @@ import ohi.andre.consolelauncher.tuils.interfaces.Inputable; import ohi.andre.consolelauncher.tuils.interfaces.Outputable; import ohi.andre.consolelauncher.tuils.interfaces.Reloadable; import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver; -import ohi.andre.consolelauncher.tuils.tutorial.TutorialActivity; public class LauncherActivity extends AppCompatActivity implements Reloadable { @@ -110,7 +108,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public void onOutput(String output) { try { - ui.setOutput(output, true); + ui.setOutput(output); } catch (NullPointerException e) { e.printStackTrace(); } @@ -146,9 +144,6 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(FIRSTACCESS_KEY, false); editor.commit(); - - Intent intent = new Intent(this, TutorialActivity.class); - startActivity(intent); } try { @@ -269,12 +264,6 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { runOnUiThread(new Runnable() { @Override public void run() { -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { -// reloadOver11(); -// } else { -// finish(); -// startActivity(starterIntent); -// } Intent mStartActivity = new Intent(LauncherActivity.this, LauncherActivity.class); int mPendingIntentId = 123456; @@ -287,11 +276,6 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { }); } -// @TargetApi(Build.VERSION_CODES.HONEYCOMB) -// private void reloadOver11() { -// recreate(); -// } - @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); @@ -356,7 +340,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { MainPack info = main.getMainPack(); main.onCommand(info.lastCommand, null); } else { - ui.setOutput(getString(R.string.output_nopermissions), false); + ui.setOutput(getString(R.string.output_nopermissions)); main.sendPermissionNotGrantedWarning(); } break; @@ -375,7 +359,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { break; case COMMAND_SUGGESTION_REQUEST_PERMISSION: if (grantResults.length == 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { - ui.setOutput(getString(R.string.output_nopermissions), false); + ui.setOutput(getString(R.string.output_nopermissions)); } break; } @@ -396,11 +380,11 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { String pack = intent.getStringExtra("package"); String title = intent.getStringExtra("title"); String text = intent.getStringExtra("text"); - String color = intent.getStringExtra("color"); + int color = intent.getIntExtra("color", -1); if(ui != null) { ui.setOutput(pack + ": " + (title == null ? Tuils.EMPTYSTRING : title + (text == null ? Tuils.EMPTYSTRING : " --- ")) + (text == null ? Tuils.EMPTYSTRING : text), - Color.parseColor(color), + color, false); } } diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java index 320f596..e0f85d3 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java @@ -9,6 +9,7 @@ import android.graphics.Typeface; import android.os.Handler; import android.text.Editable; import android.text.TextWatcher; +import android.text.format.Time; import android.view.GestureDetector; import android.view.GestureDetector.OnDoubleTapListener; import android.view.Gravity; @@ -17,6 +18,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.HorizontalScrollView; @@ -44,7 +46,8 @@ import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces; public class UIManager implements OnTouchListener { private final int RAM_DELAY = 3000; - public Handler handler; + private final int BATTERY_DELAY = 20 * 1000; + private final int TIME_DELAY = 1000; protected Context mContext; @@ -60,16 +63,44 @@ public class UIManager implements OnTouchListener { private TerminalManager mTerminalAdapter; private TextView ram; + private TextView device; + private TextView battery; + private TextView time; + + private Runnable batteryRunnable = new Runnable() { + @Override + public void run() { + int percentage = Tuils.getBatteryPercentage(mContext); + + if(percentage >= 50 || !skinManager.manyColorsBattery) battery.setTextColor(skinManager.battery_color_high); + else if(percentage >= 10) battery.setTextColor(skinManager.battery_color_medium); + else battery.setTextColor(skinManager.battery_color_low); + + battery.setText(percentage + "%"); + + battery.postDelayed(batteryRunnable, BATTERY_DELAY); + } + }; + + private String format; + private Runnable timeRunnable = new Runnable() { + @Override + public void run() { + Time t = new Time(); + t.setToNow(); + + time.setText(t.format(format)); + time.postDelayed(this, TIME_DELAY); + } + }; private ActivityManager.MemoryInfo memory; private ActivityManager activityManager; private Runnable ramRunnable = new Runnable() { @Override public void run() { - if (handler != null) { - updateRamDetails(); - handler.postDelayed(this, RAM_DELAY); - } + updateRamDetails(); + ram.postDelayed(this, RAM_DELAY); } }; @@ -319,7 +350,7 @@ public class UIManager implements OnTouchListener { lastSuggestionThread.start(); } - protected UIManager(ExecutePack info, Context context, final ViewGroup rootView, final CommandExecuter tri, DevicePolicyManager mgr, ComponentName name, + protected UIManager(ExecutePack info, final Context context, final ViewGroup rootView, final CommandExecuter tri, DevicePolicyManager mgr, ComponentName name, MainPack mainPack) { rootView.setOnTouchListener(this); @@ -345,19 +376,34 @@ public class UIManager implements OnTouchListener { rootView.setBackgroundColor(skinManager.overlayColor); } +// scrolllllll + if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.auto_scroll)) { + rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + int heightDiff = rootView.getRootView().getHeight() - rootView.getHeight(); + if (heightDiff > Tuils.dpToPx(context, 200)) { // if more than 200 dp, it's probably a keyboard... + if(mTerminalAdapter != null) mTerminalAdapter.scrollToEnd(); + } + } + }); + } + ram = (TextView) rootView.findViewById(R.id.ram_tv); - TextView deviceInfo = (TextView) rootView.findViewById(R.id.deviceinfo_tv); + device = (TextView) rootView.findViewById(R.id.deviceinfo_tv); + battery = (TextView) rootView.findViewById(R.id.battery_tv); + time = (TextView) rootView.findViewById(R.id.time_tv); + boolean showRam = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_ram); if (showRam) { ram.setTextColor(skinManager.ramColor); - ram.setTextSize(skinManager.getRamSize()); + ram.setTextSize(skinManager.getTextSize()); ram.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); memory = new ActivityManager.MemoryInfo(); activityManager = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE); - handler = new Handler(); - handler.postDelayed(ramRunnable, RAM_DELAY); + ram.postDelayed(ramRunnable, RAM_DELAY); } else { ram.setVisibility(View.GONE); ram = null; @@ -367,13 +413,35 @@ public class UIManager implements OnTouchListener { if (showDevice) { String deviceName = skinManager.deviceName; - deviceInfo.setText(deviceName); - deviceInfo.setTextColor(skinManager.deviceColor); - deviceInfo.setTextSize(skinManager.getDeviceSize()); + device.setText(deviceName); + device.setTextColor(skinManager.deviceColor); + device.setTextSize(skinManager.getTextSize()); + device.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); + } else { + device.setVisibility(View.GONE); + } - deviceInfo.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); + boolean showTime = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_time); + if(showTime) { + format = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format); + + time.setTextColor(skinManager.time_color); + time.setTextSize(skinManager.getTextSize()); + time.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); + + time.post(timeRunnable); } else { - deviceInfo.setVisibility(View.GONE); + time.setVisibility(View.GONE); + } + + boolean showBattery = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_battery); + if(showBattery) { + battery.setTextSize(skinManager.getTextSize()); + battery.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); + + battery.post(batteryRunnable); + } else { + battery.setVisibility(View.GONE); } final boolean inputBottom = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.input_bottom); @@ -498,7 +566,6 @@ public class UIManager implements OnTouchListener { public void onStart(boolean openKeyboardOnStart) { if(openKeyboardOnStart) openKeyboard(); - mTerminalAdapter.scrollToEnd(); } public void setInput(String s) { @@ -517,12 +584,12 @@ public class UIManager implements OnTouchListener { mTerminalAdapter.setDefaultHint(); } - public void setOutput(String string, boolean fromUser) { - mTerminalAdapter.setOutput(string, fromUser); + public void setOutput(String string) { + mTerminalAdapter.setOutput(string); } public void setOutput(String s, int color, boolean fromUser) { - mTerminalAdapter.setOutput(s, color, fromUser); + mTerminalAdapter.setOutput(s, color); } public void disableSuggestions() { 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 e35ceba..153d06c 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 @@ -2,6 +2,8 @@ package ohi.andre.consolelauncher.commands.main.raw; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.net.Uri; import java.io.File; @@ -10,7 +12,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.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.AppsManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -19,7 +20,7 @@ public class apps extends ParamCommand { private enum Param implements ohi.andre.consolelauncher.commands.main.Param { - lshidden { + lsh { @Override public int[] args() { return new int[0]; @@ -38,7 +39,7 @@ public class apps extends ParamCommand { @Override public String exec(ExecutePack pack) { - ((MainPack) pack).appsManager.hideApp(pack.get(String.class, 1)); + ((MainPack) pack).appsManager.unhideApp(pack.get(String.class, 1)); return null; } }, @@ -54,6 +55,23 @@ public class apps extends ParamCommand { return null; } }, + l { + @Override + public int[] args() { + return new int[] {CommandAbstraction.VISIBLE_PACKAGE}; + } + + @Override + public String exec(ExecutePack pack) { + try { + PackageInfo info = pack.context.getPackageManager().getPackageInfo(pack.get(String.class, 1), PackageManager.GET_PERMISSIONS | PackageManager.GET_ACTIVITIES | + PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS); + return AppsManager.AppUtils.format(info); + } catch (PackageManager.NameNotFoundException e) { + return e.toString(); + } + } + }, ps { @Override public int[] args() { 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 0154676..37ab532 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 @@ -15,7 +15,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.commands.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; import ohi.andre.consolelauncher.managers.ContactManager; import ohi.andre.consolelauncher.tuils.Tuils; @@ -88,7 +87,7 @@ public class cntcts extends ParamCommand { return new int[] {CommandAbstraction.CONTACTNUMBER}; } }, - show { + l { @Override public String exec(ExecutePack pack) { String[] about = ((MainPack) pack).contacts.about(pack.get(String.class, 1)); 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 25ea3e3..45eff34 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java @@ -1,10 +1,11 @@ package ohi.andre.consolelauncher.commands.main.raw; -import java.util.Calendar; +import android.text.format.Time; import ohi.andre.consolelauncher.R; import ohi.andre.consolelauncher.commands.CommandAbstraction; import ohi.andre.consolelauncher.commands.ExecutePack; +import ohi.andre.consolelauncher.managers.XMLPrefsManager; /** * Created by andre on 03/12/15. @@ -12,14 +13,9 @@ import ohi.andre.consolelauncher.commands.ExecutePack; public class time implements CommandAbstraction { @Override public String exec(ExecutePack pack) { - Calendar c = Calendar.getInstance(); - int hours = c.get(Calendar.HOUR_OF_DAY); - int minutes = c.get(Calendar.MINUTE); - - if(minutes < 10) - return hours + ":0" + minutes; - else - return hours + ":" + minutes; + Time time = new Time(); + time.setToNow(); + return time.format(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format)); } @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java index 93e2289..139a308 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java @@ -5,11 +5,10 @@ import android.net.Uri; import ohi.andre.consolelauncher.BuildConfig; 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.main.Param; import ohi.andre.consolelauncher.commands.specific.ParamCommand; +import ohi.andre.consolelauncher.managers.FileManager; import ohi.andre.consolelauncher.tuils.Tuils; /** @@ -39,6 +38,13 @@ public class tui extends ParamCommand { MainPack info = (MainPack) pack; return info.res.getString(R.string.version_label) + Tuils.SPACE + BuildConfig.VERSION_NAME + Tuils.NEWLINE + Tuils.NEWLINE + info.res.getString(R.string.output_about); } + }, + reset { + @Override + public String exec(ExecutePack pack) { + FileManager.rm(Tuils.getFolder(), false); + return null; + } }; @Override diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tutorial.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tutorial.java deleted file mode 100755 index 14fea49..0000000 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tutorial.java +++ /dev/null @@ -1,55 +0,0 @@ -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.tuils.Tuils; - -public class tutorial implements CommandAbstraction { - - @Override - public String exec(ExecutePack pack) { - MainPack info = (MainPack) pack; - Tuils.showTutorial(info.context); - return null; - } - - @Override - public int minArgs() { - return 0; - } - - @Override - public int maxArgs() { - return 0; - } - - @Override - public int[] argType() { - return new int[0]; - } - - @Override - public int priority() { - return 4; - } - - @Override - public int helpRes() { - return R.string.help_tutorial; - } - - @Override - public String onArgNotFound(ExecutePack info, int index) { - return null; - } - - @Override - public String onNotArgEnough(ExecutePack info, int nArgs) { - return null; - } - -} - - 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 791f664..41220a3 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java @@ -8,12 +8,15 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; import android.os.Build; import android.os.Handler; import android.support.annotation.NonNull; +import android.text.format.Time; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -239,7 +242,10 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } catch (Exception e) {} for(Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) { - if (entry.getValue() instanceof Integer) map.get(entry.getKey()).launchedTimes = (Integer) entry.getValue(); + if (entry.getValue() instanceof Integer) { + AppInfo info = map.get(entry.getKey()); + if(info != null) info.launchedTimes = (Integer) entry.getValue(); + } } for (Map.Entry<String, AppInfo> stringAppInfoEntry : map.entrySet()) { @@ -505,6 +511,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { else { AppInfo info = AppUtils.findAppInfo(vl, infos); if(info == null) continue; + suggested.add(new SuggestedApp(info, USER_DEFINIED)); } } @@ -541,28 +548,52 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } public void attemptInsertSuggestion(AppInfo info) { +// Log.e("andre", "attempt: " + info.toString()); + if (info.launchedTimes == 0 || lastWriteable == -1) { return; } - int index = indexOf(info); - if (index == -1) { - for (int count = 0; count <= lastWriteable; count++) { +// Log.e("andre", String.valueOf(lastWriteable)); - SuggestedApp app = get(count); - if (app.app == null || info.launchedTimes > app.app.launchedTimes) { - SuggestedApp s = suggested.get(count); + int i = Tuils.find(info, suggested); + if(i == -1) { + int index = indexOf(info); + if (index == -1) { + for (int count = 0; count <= lastWriteable; count++) { +// Log.e("andre", "loop: " + count); - AppInfo before = s.app; - s.change(info); + SuggestedApp app = get(count); +// Log.e("andre", app.toString()); - if(before != null) attemptInsertSuggestion(before); + if (app.app == null || info.launchedTimes > app.app.launchedTimes) { +// Log.e("andre", "yes"); + SuggestedApp s = suggested.get(count); - break; +// Log.e("andre", "before it was: " + s.toString()); +// Log.e("andre", suggested.toString()); + + AppInfo before = s.app; + s.change(info); + +// Log.e("andre", suggested.toString()); + + if(before != null) { +// Log.e("andre", "rec"); + attemptInsertSuggestion(before); + } + + break; + } } } } +// else { +// Log.e("andre", "index == -1"); +// Log.e("andre", suggested.toString()); +// } sort(); +// Log.e("andre", suggested.toString()); } // public void updateSuggestion(AppInfo info) { @@ -638,7 +669,17 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { @Override public boolean equals(Object o) { - return this.app != null && o instanceof SuggestedApp && ((SuggestedApp) o).app != null && this.app.equals(((SuggestedApp) o).app); + if(o instanceof SuggestedApp) { + try { + return (app == null && ((SuggestedApp) o).app == null) || app.equals(((SuggestedApp) o).app); + } catch (NullPointerException e) { + return false; + } + } else if(o instanceof AppInfo) { + if(app == null) return false; + return app.equals(o); + } + return false; } @Override @@ -754,7 +795,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } } - private static class AppUtils { + public static class AppUtils { public static void checkEquality(List<AppInfo> list) { @@ -814,6 +855,49 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } } + public static String format(PackageInfo info) { + StringBuilder builder = new StringBuilder(); + + builder.append(info.packageName).append(Tuils.NEWLINE); + builder.append("vrs: ").append(info.versionCode).append(" - ").append(info.versionName).append(Tuils.NEWLINE).append(Tuils.NEWLINE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + Time time = new Time(); + time.set(info.firstInstallTime); + builder.append("Install: ").append(time.format(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format))).append(Tuils.NEWLINE).append(Tuils.NEWLINE); + } + + ActivityInfo[] a = info.activities; + if(a != null && a.length > 0) { + List<String> as = new ArrayList<>(); + for(ActivityInfo i : a) as.add(i.name.replace(info.packageName, Tuils.EMPTYSTRING)); + builder.append("Activities: ").append(Tuils.NEWLINE).append(Tuils.toPlanString(as, Tuils.NEWLINE)).append(Tuils.NEWLINE).append(Tuils.NEWLINE); + } + + ServiceInfo[] s = info.services; + if(s != null && s.length > 0) { + List<String> ss = new ArrayList<>(); + for(ServiceInfo i : s) ss.add(i.name.replace(info.packageName, Tuils.EMPTYSTRING)); + builder.append("Services: ").append(Tuils.NEWLINE).append(Tuils.toPlanString(ss, Tuils.NEWLINE)).append(Tuils.NEWLINE).append(Tuils.NEWLINE); + } + + ActivityInfo[] r = info.receivers; + if(r != null && r.length > 0) { + List<String> rs = new ArrayList<>(); + for(ActivityInfo i : r) rs.add(i.name.replace(info.packageName, Tuils.EMPTYSTRING)); + builder.append("Receivers: ").append(Tuils.NEWLINE).append(Tuils.toPlanString(rs, Tuils.NEWLINE)).append(Tuils.NEWLINE).append(Tuils.NEWLINE); + } + + String[] p = info.requestedPermissions; + if(p != null && p.length > 0) { + List<String> ps = new ArrayList<>(); + for(String i : p) ps.add(i.substring(i.lastIndexOf(".") + 1)); + builder.append("Permissions: ").append(Tuils.NEWLINE).append(Tuils.toPlanString(ps, ", ")); + } + + return builder.toString(); + } + protected static AppInfo findAppInfo(String packageName, List<AppInfo> infos) { for(AppInfo info : infos) { if(info.packageName.equals(packageName)) { diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/FileManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/FileManager.java index 27b4d31..8292b04 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/FileManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/FileManager.java @@ -79,12 +79,10 @@ public class FileManager { } private static int mv(File f, File where, boolean su) throws IOException { + ShellUtils.CommandResult result = ShellUtils.execCommand("mv " + Tuils.SPACE + + f.getAbsolutePath() + Tuils.SPACE + + where.getAbsolutePath(), su, null); - ShellUtils.CommandResult result = ShellUtils.execCommand("mv " + - (f.isDirectory() ? "-r" : Tuils.EMPTYSTRING) + - Tuils.SPACE + - "\"" + f.getAbsolutePath() + "\"" + Tuils.SPACE + - "\"" + where.getAbsolutePath() + "\"", su, null); return result.result; } @@ -101,11 +99,11 @@ public class FileManager { } public static int rm(File f, boolean su) { - ShellUtils.CommandResult result = ShellUtils.execCommand("rm " + (f.isDirectory() ? "-r" : Tuils.EMPTYSTRING) + Tuils.SPACE + - "\"" + f.getAbsolutePath() + "\"", su, null); + f.getAbsolutePath(), su, null); + if(result == null) return IOERROR; return result.result; } @@ -127,11 +125,9 @@ public class FileManager { } private static int cp(File f, File where, boolean su) throws IOException { - ShellUtils.CommandResult result = ShellUtils.execCommand("cp " + - (f.isDirectory() ? "-r" : Tuils.EMPTYSTRING) + - Tuils.SPACE + - "\"" + f.getAbsolutePath() + "\"" + Tuils.SPACE + - "\"" + where.getAbsolutePath() + "\"", su, null); + ShellUtils.CommandResult result = ShellUtils.execCommand("cp " + Tuils.SPACE + + f.getAbsolutePath() + Tuils.SPACE + + where.getAbsolutePath(), su, null); return result.result; } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java index 3f857da..c361c08 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java @@ -16,17 +16,18 @@ public class SkinManager implements Parcelable { public static final int SUGGESTION_PADDING_HORIZONTAL = 15; public static final int SUGGESTION_MARGIN = 20; - private static final int deviceScale = 3; - private static final int textScale = 2; - private static final int ramScale = 3; private static final int suggestionScale = 0; + private static final int textScale = 3; + + public static final int COLOR_NOT_SET = 16777216; + public int globalFontSize; public String deviceName; - public int deviceColor, inputColor, outputColor, ramColor, bgColor, overlayColor, toolbarColor, enter_color; + public int deviceColor, inputColor, outputColor, ramColor, bgColor, overlayColor, toolbarColor, toolbarBg, enter_color, time_color, battery_color_high, battery_color_medium, battery_color_low; - public boolean useSystemWp, showSuggestions, systemFont, inputBottom, showSubmit; + public boolean useSystemWp, showSuggestions, systemFont, inputBottom, showSubmit, manyColorsBattery; public String username = null; public boolean showUsernameAndDeviceWhenEmpty = true, showUsername = false, showDeviceInSessionInfo = false, linuxAppearence = true, showPath = true; @@ -39,6 +40,8 @@ public class SkinManager implements Parcelable { inputBottom = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.input_bottom); showSubmit = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_enter_button); + manyColorsBattery = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.enable_battery_status); + globalFontSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.font_size); useSystemWp = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper); @@ -53,7 +56,14 @@ public class SkinManager implements Parcelable { inputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color); outputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color); toolbarColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color); + toolbarBg = XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_bg); enter_color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.enter_color); + time_color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color); + battery_color_high = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_high); + if(manyColorsBattery) { + battery_color_medium = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_medium); + battery_color_low = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_low); + } deviceName = XMLPrefsManager.get(String.class, XMLPrefsManager.Ui.deviceName); if (deviceName.length() == 0 || deviceName.equals("null")) { @@ -104,6 +114,63 @@ public class SkinManager implements Parcelable { } } + protected SkinManager(Parcel in) { + globalFontSize = in.readInt(); + deviceName = in.readString(); + deviceColor = in.readInt(); + inputColor = in.readInt(); + outputColor = in.readInt(); + ramColor = in.readInt(); + bgColor = in.readInt(); + overlayColor = in.readInt(); + toolbarColor = in.readInt(); + toolbarBg = in.readInt(); + enter_color = in.readInt(); + time_color = in.readInt(); + battery_color_high = in.readInt(); + battery_color_medium = in.readInt(); + battery_color_low = in.readInt(); + useSystemWp = in.readByte() != 0; + showSuggestions = in.readByte() != 0; + systemFont = in.readByte() != 0; + inputBottom = in.readByte() != 0; + showSubmit = in.readByte() != 0; + manyColorsBattery = in.readByte() != 0; + username = in.readString(); + showUsernameAndDeviceWhenEmpty = in.readByte() != 0; + showUsername = in.readByte() != 0; + showDeviceInSessionInfo = in.readByte() != 0; + linuxAppearence = in.readByte() != 0; + showPath = in.readByte() != 0; + suggDefaultText = in.readInt(); + suggDefaultBg = in.readInt(); + suggAliasText = in.readInt(); + suggAliasBg = in.readInt(); + suggSongText = in.readInt(); + suggSongBg = in.readInt(); + suggContactText = in.readInt(); + suggContactBg = in.readInt(); + suggAppText = in.readInt(); + suggAppBg = in.readInt(); + suggCmdText = in.readInt(); + suggCmdBg = in.readInt(); + suggFileText = in.readInt(); + suggFileBg = in.readInt(); + transparentSuggestions = in.readByte() != 0; + } + + public static final Creator<SkinManager> CREATOR = new Creator<SkinManager>() { + @Override + public SkinManager createFromParcel(Parcel in) { + return new SkinManager(in); + } + + @Override + public SkinManager[] newArray(int size) { + return new SkinManager[size]; + } + }; + public ColorDrawable getSuggestionBg(Integer type) { if(transparentSuggestions) { return new ColorDrawable(Color.TRANSPARENT); @@ -128,47 +195,40 @@ public class SkinManager implements Parcelable { } public int getSuggestionTextColor(Integer type) { - int choosen; + int chosen; + switch (type) { case SuggestionsManager.Suggestion.TYPE_APP: - choosen = suggAppText; + chosen = suggAppText; break; case SuggestionsManager.Suggestion.TYPE_ALIAS: - choosen = suggAliasText; + chosen = suggAliasText; break; case SuggestionsManager.Suggestion.TYPE_COMMAND: - choosen = suggCmdText; + chosen = suggCmdText; break; case SuggestionsManager.Suggestion.TYPE_CONTACT: - choosen = suggContactText; + chosen = suggContactText; break; case SuggestionsManager.Suggestion.TYPE_FILE: - choosen = suggFileText; + chosen = suggFileText; break; case SuggestionsManager.Suggestion.TYPE_SONG: - choosen = suggSongText; + chosen = suggSongText; break; default: - choosen = suggDefaultText; + chosen = suggDefaultText; break; } - if(choosen == -1) choosen = suggDefaultText; - return choosen; - } - - public int getDeviceSize() { - return globalFontSize - deviceScale; + if(chosen == COLOR_NOT_SET) chosen = suggDefaultText; + return chosen; } public int getTextSize() { return globalFontSize - textScale; } - public int getRamSize() { - return globalFontSize - ramScale; - } - public int getSuggestionSize() { return globalFontSize - suggestionScale; } @@ -180,86 +240,47 @@ public class SkinManager implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(this.globalFontSize); - dest.writeString(this.deviceName); - dest.writeInt(this.deviceColor); - dest.writeInt(this.inputColor); - dest.writeInt(this.outputColor); - dest.writeInt(this.ramColor); - dest.writeInt(this.bgColor); - dest.writeByte(this.useSystemWp ? (byte) 1 : (byte) 0); - dest.writeByte(this.showSuggestions ? (byte) 1 : (byte) 0); - dest.writeByte(this.systemFont ? (byte) 1 : (byte) 0); - dest.writeByte(this.inputBottom ? (byte) 1 : (byte) 0); - dest.writeByte(this.showSubmit ? (byte) 1 : (byte) 0); - dest.writeString(this.username); - dest.writeByte(this.showUsernameAndDeviceWhenEmpty ? (byte) 1 : (byte) 0); - dest.writeByte(this.showUsername ? (byte) 1 : (byte) 0); - dest.writeByte(this.showDeviceInSessionInfo ? (byte) 1 : (byte) 0); - dest.writeByte(this.linuxAppearence ? (byte) 1 : (byte) 0); - dest.writeByte(this.showPath ? (byte) 1 : (byte) 0); - dest.writeInt(this.suggDefaultText); - dest.writeInt(this.suggDefaultBg); - dest.writeInt(this.suggAliasText); - dest.writeInt(this.suggAliasBg); - dest.writeInt(this.suggSongText); - dest.writeInt(this.suggSongBg); - dest.writeInt(this.suggContactText); - dest.writeInt(this.suggContactBg); - dest.writeInt(this.suggAppText); - dest.writeInt(this.suggAppBg); - dest.writeInt(this.suggCmdText); - dest.writeInt(this.suggCmdBg); - dest.writeInt(this.suggFileText); - dest.writeInt(this.suggFileBg); - dest.writeByte(this.transparentSuggestions ? (byte) 1 : (byte) 0); + dest.writeInt(globalFontSize); + dest.writeString(deviceName); + dest.writeInt(deviceColor); + dest.writeInt(inputColor); + dest.writeInt(outputColor); + dest.writeInt(ramColor); + dest.writeInt(bgColor); + dest.writeInt(overlayColor); + dest.writeInt(toolbarColor); + dest.writeInt(toolbarBg); + dest.writeInt(enter_color); + dest.writeInt(time_color); + dest.writeInt(battery_color_high); + dest.writeInt(battery_color_medium); + dest.writeInt(battery_color_low); + dest.writeByte((byte) (useSystemWp ? 1 : 0)); + dest.writeByte((byte) (showSuggestions ? 1 : 0)); + dest.writeByte((byte) (systemFont ? 1 : 0)); + dest.writeByte((byte) (inputBottom ? 1 : 0)); + dest.writeByte((byte) (showSubmit ? 1 : 0)); + dest.writeByte((byte) (manyColorsBattery ? 1 : 0)); + dest.writeString(username); + dest.writeByte((byte) (showUsernameAndDeviceWhenEmpty ? 1 : 0)); + dest.writeByte((byte) (showUsername ? 1 : 0)); + dest.writeByte((byte) (showDeviceInSessionInfo ? 1 : 0)); + dest.writeByte((byte) (linuxAppearence ? 1 : 0)); + dest.writeByte((byte) (showPath ? 1 : 0)); + dest.writeInt(suggDefaultText); + dest.writeInt(suggDefaultBg); + dest.writeInt(suggAliasText); + dest.writeInt(suggAliasBg); + dest.writeInt(suggSongText); + dest.writeInt(suggSongBg); + dest.writeInt(suggContactText); + dest.writeInt(suggContactBg); + dest.writeInt(suggAppText); + dest.writeInt(suggAppBg); + dest.writeInt(suggCmdText); + dest.writeInt(suggCmdBg); + dest.writeInt(suggFileText); + dest.writeInt(suggFileBg); + dest.writeByte((byte) (transparentSuggestions ? 1 : 0)); } - - protected SkinManager(Parcel in) { - this.globalFontSize = in.readInt(); - this.deviceName = in.readString(); - this.deviceColor = in.readInt(); - this.inputColor = in.readInt(); - this.outputColor = in.readInt(); - this.ramColor = in.readInt(); - this.bgColor = in.readInt(); - this.useSystemWp = in.readByte() != 0; - this.showSuggestions = in.readByte() != 0; - this.systemFont = in.readByte() != 0; - this.inputBottom = in.readByte() != 0; - this.showSubmit = in.readByte() != 0; - this.username = in.readString(); - this.showUsernameAndDeviceWhenEmpty = in.readByte() != 0; - this.showUsername = in.readByte() != 0; - this.showDeviceInSessionInfo = in.readByte() != 0; - this.linuxAppearence = in.readByte() != 0; - this.showPath = in.readByte() != 0; - this.suggDefaultText = in.readInt(); - this.suggDefaultBg = in.readInt(); - this.suggAliasText = in.readInt(); - this.suggAliasBg = in.readInt(); - this.suggSongText = in.readInt(); - this.suggSongBg = in.readInt(); - this.suggContactText = in.readInt(); - this.suggContactBg = in.readInt(); - this.suggAppText = in.readInt(); - this.suggAppBg = in.readInt(); - this.suggCmdText = in.readInt(); - this.suggCmdBg = in.readInt(); - this.suggFileText = in.readInt(); - this.suggFileBg = in.readInt(); - this.transparentSuggestions = in.readByte() != 0; - } - - public static final Creator<SkinManager> CREATOR = new Creator<SkinManager>() { - @Override - public SkinManager createFromParcel(Parcel source) { - return new SkinManager(source); - } - - @Override - public SkinManager[] newArray(int size) { - return new SkinManager[size]; - } - }; } 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 2de232a..2070ddb 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java @@ -6,10 +6,12 @@ import android.os.IBinder; import android.text.InputType; import android.text.Spannable; import android.text.SpannableString; +import android.text.TextUtils; import android.text.method.ScrollingMovementMethod; import android.text.style.ForegroundColorSpan; import android.view.KeyEvent; import android.view.View; +import android.view.ViewTreeObserver; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.ImageButton; @@ -46,8 +48,6 @@ public class TerminalManager { public static final int INPUT = 10; public static final int OUTPUT = 11; - private int cmds = 0; - private long lastEnter; private CharSequence prefix; @@ -78,7 +78,19 @@ public class TerminalManager { private boolean defaultHint = true; - public TerminalManager(TextView terminalView, EditText inputView, TextView prefixView, ImageButton submitView, final ImageButton backView, ImageButton nextView, ImageButton deleteView, + private int clearCmdsCount= 0, messagesCmdsCount = 0; + + private int clearAfterCmds, clearAfterMs, maxLines; + private Runnable clearRunnable = new Runnable() { + + @Override + public void run() { + clear(); + mTerminalView.postDelayed(this, clearAfterMs); + } + }; + + public TerminalManager(final TextView terminalView, EditText inputView, TextView prefixView, ImageButton submitView, final ImageButton backView, ImageButton nextView, ImageButton deleteView, ImageButton pasteView, SkinManager skinManager, final Context context, MainPack mainPack) { if (terminalView == null || inputView == null || prefixView == null || skinManager == null) throw new UnsupportedOperationException(); @@ -88,6 +100,10 @@ public class TerminalManager { this.mSkinManager = skinManager; 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); + if(skinManager.linuxAppearence) { prefix = "$ "; } else { @@ -109,6 +125,7 @@ public class TerminalManager { } if (backView != null) { + ((View) backView.getParent()).setBackgroundColor(mSkinManager.toolbarBg); backView.setColorFilter(this.mSkinManager.toolbarColor); backView.setOnClickListener(new View.OnClickListener() { @Override @@ -157,6 +174,32 @@ public class TerminalManager { this.mTerminalView.setFocusable(false); setupScroller(); + if(clearAfterMs > 0) this.mTerminalView.postDelayed(clearRunnable, clearAfterMs); + if(maxLines > 0) { + this.mTerminalView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + int count = terminalView.getLayout().getLineCount() - 1; + + if(count > maxLines) { + int excessive = count - maxLines; + + CharSequence text = terminalView.getText(); + while (excessive >= 0) { + int index = TextUtils.indexOf(text, Tuils.NEWLINE); + if(index == -1) break; + text = text.subSequence(index + 1, text.length()); + excessive--; + } + + terminalView.setText(text); + } + + return true; + } + }); + } + View v = mTerminalView; do { v = (View) v.getParent(); @@ -222,9 +265,15 @@ public class TerminalManager { String input = mInputView.getText().toString().trim(); if(input.length() > 0) { + clearCmdsCount++; + messagesCmdsCount++; + + if(clearCmdsCount != 0 && clearAfterCmds > 0 && clearCmdsCount % clearAfterCmds == 0) clear(); + + for (Messager messager : messagers) if (messagesCmdsCount != 0 && messagesCmdsCount % messager.n == 0) writeToView(messager.message, OUTPUT); + writeToView((input.startsWith("su ") ? "# " : prefix) + input, INPUT); - cmds++; if(cmdList.size() == CMD_LIST_SIZE) { cmdList.remove(0); } @@ -242,15 +291,15 @@ public class TerminalManager { return true; } - public void setOutput(String output, boolean fromUser) { - setOutput(output, -1, OUTPUT, fromUser); + public void setOutput(String output) { + setOutput(output, -1, OUTPUT); } - public void setOutput(String output, int color, boolean fromUser) { - setOutput(output, color, -1, fromUser); + public void setOutput(String output, int color) { + setOutput(output, color, -1); } - public void setOutput(String output, int color, int type, boolean fromUser) { + public void setOutput(String output, int color, int type) { if (output == null) return; output = output.trim(); @@ -263,9 +312,6 @@ public class TerminalManager { if(color == -1) writeToView(output, type); else writeToView(color, output); - - if(fromUser) - for (Messager messager : messagers) if (cmds != 0 && cmds % messager.n == 0) writeToView(messager.message, OUTPUT); } public void onBackPressed() { @@ -413,13 +459,8 @@ public class TerminalManager { mTerminalView.setText(Tuils.EMPTYSTRING); } }); - mInputView.post(new Runnable() { - @Override - public void run() { - mInputView.setText(Tuils.EMPTYSTRING); - } - }); cmdList.clear(); + clearCmdsCount = 0; } public static class Messager { diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java index 3e23aaf..4803de3 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java @@ -63,12 +63,42 @@ public class XMLPrefsManager { 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"; + } + }, ram_color { @Override public String defaultValue() { return "#fff44336"; } }, + toolbar_bg { + @Override + public String defaultValue() { + return "#00000000"; + } + }, toolbar_color { @Override public String defaultValue() { @@ -172,6 +202,24 @@ public class XMLPrefsManager { return "true"; } }, + show_battery { + @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() { @@ -397,6 +445,12 @@ public class XMLPrefsManager { return "true"; } }, + auto_scroll { + @Override + public String defaultValue() { + return "true"; + } + }, donation_message { @Override public String defaultValue() { @@ -420,6 +474,30 @@ public class XMLPrefsManager { public String defaultValue() { return "true"; } + }, + clear_after_cmds { + @Override + public String defaultValue() { + return "20"; + } + }, + clear_after_seconds { + @Override + public String defaultValue() { + return "-1"; + } + }, + max_lines { + @Override + public String defaultValue() { + return "100"; + } + }, + time_format { + @Override + public String defaultValue() { + return "%m/%d/%y %H.%M"; + } }; @Override @@ -815,7 +893,7 @@ public class XMLPrefsManager { } catch (Exception e) { String def = prefsSave.defaultValue(); if(def == null || def.length() == 0) { - return -1; + return SkinManager.COLOR_NOT_SET; } return (int) transform(def, Color.class); } 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 016953a..e2a4c62 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 @@ -7,6 +7,7 @@ package ohi.andre.consolelauncher.managers.notifications; import android.annotation.TargetApi; import android.app.Notification; import android.content.Intent; +import android.graphics.Color; import android.os.Build; import android.os.Handler; import android.service.notification.NotificationListenerService; @@ -112,11 +113,18 @@ public class NotificationService extends NotificationListenerService { if(NotificationManager.textMatches(text) || NotificationManager.titleMatches(title)) return; + int color; + try { + color = Color.parseColor(nApp.color); + } catch (Exception e) { + color = Color.parseColor(default_color); + } + Intent msgrcv = new Intent("Msg"); msgrcv.putExtra("package", pack); msgrcv.putExtra("title", title); msgrcv.putExtra("text", text); - msgrcv.putExtra("color", nApp != null ? nApp.color : default_color); + msgrcv.putExtra("color", color); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(msgrcv); } 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 7bcad0d..46fe0c9 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 @@ -42,7 +42,7 @@ public class SuggestionsManager { private final int MAX_RATE = 100; private final int NO_RATE = -1; - private final int FIRST_INTERVAL = 3; + private final int FIRST_INTERVAL = 5; private boolean showAlias, showAliasWasSet = false; 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 e6a5ac7..396f3f0 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java @@ -12,17 +12,19 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; +import android.os.BatteryManager; import android.os.Build; import android.os.Environment; import android.provider.MediaStore; import android.provider.Settings; import android.text.TextUtils; import android.util.DisplayMetrics; -import android.util.Log; +import android.util.TypedValue; import java.io.DataOutputStream; import java.io.File; @@ -40,7 +42,6 @@ import ohi.andre.consolelauncher.managers.MusicManager; import ohi.andre.consolelauncher.managers.SkinManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity; -import ohi.andre.consolelauncher.tuils.tutorial.TutorialActivity; public class Tuils { @@ -62,6 +63,19 @@ public class Tuils { return false; } + public static int getBatteryPercentage(Context context) { + + IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + Intent batteryStatus = context.registerReceiver(null, iFilter); + + int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; + int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; + + float batteryPct = level / (float) scale; + + return (int) (batteryPct * 100); + } + public static boolean containsExtension(String[] array, String value) { try { value = value.toLowerCase().trim(); @@ -99,6 +113,11 @@ public class Tuils { return songs; } + public static float dpToPx(Context context, float valueInDp) { + DisplayMetrics metrics = context.getResources().getDisplayMetrics(); + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); + } + public static boolean hasNotificationAccess(Context context) { String pkgName = BuildConfig.APPLICATION_ID; final String flat = Settings.Secure.getString(context.getContentResolver(), "enabled_notification_listeners"); @@ -129,10 +148,6 @@ public class Tuils { packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP); } - public static void showTutorial(Context context) { - context.startActivity(new Intent(context, TutorialActivity.class)); - } - @TargetApi(Build.VERSION_CODES.GINGERBREAD) public static void openSettingsPage(Context c, String packageName) { Intent intent = new Intent(); @@ -195,6 +210,7 @@ public class Tuils { public static int find(Object o, List list) { for(int count = 0; count < list.size(); count++) { Object x = list.get(count); + if(o instanceof XMLPrefsManager.XMLPrefsSave) { try { if(((XMLPrefsManager.XMLPrefsSave) o).is((String) x)) return count; @@ -207,8 +223,7 @@ public class Tuils { } catch (Exception e) {} } - Object ob = list.get(count); - if(o.equals(ob) || ob.equals(o)) return count; + if(o.equals(x) || x.equals(o)) return count; } return -1; } diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/tutorial/TutorialActivity.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/tutorial/TutorialActivity.java deleted file mode 100755 index ed1cb2f..0000000 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/tutorial/TutorialActivity.java +++ /dev/null @@ -1,259 +0,0 @@ -package ohi.andre.consolelauncher.tuils.tutorial; - -import android.content.Intent; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Typeface; -import android.net.Uri; -import android.os.Build; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.ScrollView; -import android.widget.TextView; - -import ohi.andre.consolelauncher.BuildConfig; -import ohi.andre.consolelauncher.LauncherActivity; -import ohi.andre.consolelauncher.R; -import ohi.andre.consolelauncher.tuils.Animator; -import ohi.andre.consolelauncher.tuils.Tuils; - -public class TutorialActivity extends AppCompatActivity { - - private final int FIRST = 0, END = 7; - - int position = FIRST; - - boolean[] visited = new boolean[END + 1]; - - RelativeLayout root; - TextView back, next, title; - - LayoutInflater inflater; - Resources resources; - - RelativeLayout.LayoutParams containerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - LinearLayout.LayoutParams bigMarginParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - LinearLayout.LayoutParams smallMarginParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - - Typeface lucidaConsole; - - private View.OnClickListener nextListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - if(position < END) { - position++; - update(); - } else { - TutorialActivity.this.finish(); - startActivity(new Intent(TutorialActivity.this, LauncherActivity.class)); - } - } - }; - - private View.OnClickListener backListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - if(position > FIRST) { - position--; - update(); - } - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - resources = getResources(); - setContentView(R.layout.tutorial_base_layout); - - root = (RelativeLayout) findViewById(R.id.tutorial_root); - - RelativeLayout.LayoutParams backParam = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - backParam.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - backParam.addRule(RelativeLayout.ALIGN_PARENT_LEFT); - RelativeLayout.LayoutParams nextParam = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - nextParam.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - nextParam.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - - containerParams.addRule(RelativeLayout.BELOW, R.id.tutorial_std_title); - containerParams.addRule(RelativeLayout.ABOVE, R.id.tutorial_navigation_container); - bigMarginParams.setMargins(0,0,0,Tuils.dpToPx(resources, resources.getInteger(R.integer.tutorial_items_bigmargin))); - smallMarginParams.setMargins(0,0,0,Tuils.dpToPx(resources, resources.getInteger(R.integer.tutorial_items_smallmargin))); - - back = (TextView) findViewById(R.id.tutorial_navigation_back); - back.setOnClickListener(backListener); - back.setTypeface(lucidaConsole); - - next = (TextView) findViewById(R.id.tutorial_navigation_next); - next.setOnClickListener(nextListener); - next.setTypeface(lucidaConsole); - - title = (TextView) findViewById(R.id.tutorial_std_title); - title.setTypeface(lucidaConsole); - - inflater = getLayoutInflater(); - lucidaConsole = Typeface.createFromAsset(getAssets(), "lucida_console.ttf"); - - update(); - } - - private void update() { - View remove = root.findViewById(R.id.tutorial_container); - if(remove != null) { - root.removeView(remove); - } - - back.setText(R.string.tutorial_navigation_left); - next.setText(R.string.tutorial_navigation_right); - - View view = getView(inflater); - view.setId(R.id.tutorial_container); - - if(position == FIRST) { - TextView introduction = (TextView) view.findViewById(R.id.tutorial_first_title); - introduction.setTypeface(lucidaConsole); - - TextView version = back; - version.setText("vrs. " + BuildConfig.VERSION_NAME); - - title.setText(Tuils.EMPTYSTRING); - - if(!visited[position]) { - Animator nextAnimator = new Animator(next); - Animator versionAnimator = new Animator(version).setChained(nextAnimator); - new Animator(introduction, getString(R.string.tutorial_title)).setChained(versionAnimator).animate(); - } else { - introduction.setText(R.string.tutorial_title); - } - } else if(position == END) { - - TextView author = (TextView) view.findViewById(R.id.tutorial_end_label1); - author.setTypeface(lucidaConsole); - TextView location = (TextView) view.findViewById(R.id.tutorial_end_label2); - location.setTypeface(lucidaConsole); - - title.setText(Tuils.EMPTYSTRING); - - final String email = "andreuzzi.francesco@gmail.com"; - String name = "Francesco Andreuzzi"; - - ImageView git = (ImageView) view.findViewById(R.id.tutorial_end_github), mail = (ImageView) view.findViewById(R.id.tutorial_end_gmail), - googlep = (ImageView) view.findViewById(R.id.tutorial_end_googlep); - - git.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/Andre1299/TUI-ConsoleLauncher")); - startActivity(browserIntent); - } - }); - - mail.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(Intent.ACTION_SENDTO); - intent.setData(Uri.parse("mailto:")); - intent.putExtra(Intent.EXTRA_EMAIL, new String[]{email}); - intent.putExtra(Intent.EXTRA_SUBJECT, "About T-UI"); - if (intent.resolveActivity(getPackageManager()) != null) { - startActivity(intent); - } - } - }); - - googlep.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - final Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "https://plus.google.com/communities/103936578623101446195") ); - if (intent.resolveActivity(getPackageManager()) != null) { - startActivity(intent); - } - } - }); - - if(!visited[position]) { - Animator a2 = new Animator(location, email); - new Animator(author, name).setChained(a2).animate(); - - new Animator(mail).setChained(new Animator(git).setChained(new Animator(googlep))).animate(); - } else { - location.setText(email); - author.setText(name); - } - } else { - buildTutorial((LinearLayout) view.findViewById(R.id.tutorial_std_container), title, position); - } - - visited[position] = true; - - root.addView(view, 0, containerParams); - } - - private void buildTutorial(LinearLayout container, TextView title, int position) { - TypedArray ta = resources.obtainTypedArray(R.array.tutorial); - CharSequence[] strings = ta.getTextArray(position - 1); - ta.recycle(); - - title.setText(strings[0]); - title.setTypeface(lucidaConsole); - - for(int count = 1; count < strings.length; count++) { - String bigSpaceString = strings[count].subSequence(0,1).toString(), isCommandString = strings[count].subSequence(1,2).toString(); - if(!bigSpaceString.equals("0") && !bigSpaceString.equals("1") && !isCommandString.equals("0") && !isCommandString.equals("1")) { - bigSpaceString = "0"; - isCommandString = "1"; - } else { - strings[count] = strings[count].subSequence(2,strings[count].length()); - } - - boolean bigSpace = bigSpaceString.equals("0"); - boolean isCommand = isCommandString.equals("0"); - - TextView textView = new TextView(this); - - int styleRes = isCommand ? R.style.Tutorial_Text_Primary : R.style.Tutorial_Text_Secondary; - textView.setTextAppearance(this, styleRes); - textView.setTypeface(lucidaConsole); - - container.addView(textView, bigSpace ? bigMarginParams : smallMarginParams); - - if(isCommand && !visited[position]) { - new Animator(textView, strings[count].toString()).animate(); - } else { - textView.setText(strings[count]); - } - } - } - - private View getView(LayoutInflater inflater) { - int res; - if(position == FIRST) { - res = R.layout.tutorial_first_layout; - } else if(position == END) { - res = R.layout.tutorial_end_layout; - } else { - ScrollView scrollView = new ScrollView(this); - scrollView.setClipToPadding(false); - if(Build.VERSION.SDK_INT >= 9) { - scrollView.setOverScrollMode(ScrollView.OVER_SCROLL_NEVER); - } - - LinearLayout container = new LinearLayout(this); - container.setOrientation(LinearLayout.VERTICAL); - container.setId(R.id.tutorial_std_container); - - scrollView.addView(container); - - return scrollView; - } - - return inflater.inflate(res, null); - } -} diff --git a/app/src/main/res/drawable/big_icon.png b/app/src/main/res/drawable/big_icon.png deleted file mode 100755 index 94753f9d9e89d0a41207bbda978216e79cc4bd11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33045 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 diff --git a/app/src/main/res/drawable/ic_email.png b/app/src/main/res/drawable/ic_email.png deleted file mode 100755 index 6608943db52b2c0fd79ee9003f4cf08bd215bf40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1964 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 diff --git a/app/src/main/res/drawable/ic_git.png b/app/src/main/res/drawable/ic_git.png deleted file mode 100755 index d001e67a3dd88ffbd4461c99bbaec450872b0bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2781 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 diff --git a/app/src/main/res/drawable/ic_googlep.png b/app/src/main/res/drawable/ic_googlep.png deleted file mode 100755 index bf9148b37fdc0ac29d8b78d8578933bc80351343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2461 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 diff --git a/app/src/main/res/drawable/tutorial_end_icon_bg.xml b/app/src/main/res/drawable/tutorial_end_icon_bg.xml deleted file mode 100755 index 5815491..0000000 --- a/app/src/main/res/drawable/tutorial_end_icon_bg.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="oval"> - - <solid android:color="@android:color/white"/> - -</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/about_device_view.xml b/app/src/main/res/layout/about_device_view.xml index f154ea3..758411b 100755 --- a/app/src/main/res/layout/about_device_view.xml +++ b/app/src/main/res/layout/about_device_view.xml @@ -14,4 +14,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + <TextView android:id="@+id/battery_tv" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <TextView android:id="@+id/time_tv" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_base_layout.xml b/app/src/main/res/layout/tutorial_base_layout.xml deleted file mode 100755 index c815b1e..0000000 --- a/app/src/main/res/layout/tutorial_base_layout.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/tutorial_root" - - android:layout_width="match_parent" - android:layout_height="match_parent" - - android:background="@color/default_bg_color"> - - <TextView style="@style/Tutorial.Text.Title" - android:paddingBottom="@dimen/tutorial_title_marginbottom"/> - - <LinearLayout android:id="@+id/tutorial_navigation_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - - android:layout_alignParentBottom="true"> - - <TextView style="@style/Tutorial.Navigation.Left"/> - - <TextView style="@style/Tutorial.Navigation.Right"/> - - </LinearLayout> - -</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_end_layout.xml b/app/src/main/res/layout/tutorial_end_layout.xml deleted file mode 100755 index 8615820..0000000 --- a/app/src/main/res/layout/tutorial_end_layout.xml +++ /dev/null @@ -1,76 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout android:id="@+id/tutorial_logo_container" - android:layout_width="match_parent" - android:layout_height="match_parent" - - android:orientation="vertical" - android:weightSum="2"> - - <LinearLayout android:id="@+id/tutorial_end_icons_container" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - - android:orientation="horizontal" - android:gravity="center_vertical" - - android:weightSum="@integer/tutorial_end_icon_weightsum"> - - <View style="@style/Tutorial.End.IconRow"/> - - <ohi.andre.consolelauncher.tuils.SquareImageView style="@style/Tutorial.End.Icon" - android:id="@+id/tutorial_end_gmail" - - android:src="@drawable/ic_email"/> - - <View style="@style/Tutorial.End.IconRow"/> - - <ohi.andre.consolelauncher.tuils.SquareImageView style="@style/Tutorial.End.Icon" - android:id="@+id/tutorial_end_github" - - android:src="@drawable/ic_git"/> - - <View style="@style/Tutorial.End.IconRow"/> - - <ohi.andre.consolelauncher.tuils.SquareImageView style="@style/Tutorial.End.Icon" - android:id="@+id/tutorial_end_googlep" - - android:src="@drawable/ic_googlep"/> - - <View style="@style/Tutorial.End.IconRow"/> - - </LinearLayout> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - - android:orientation="vertical" - android:gravity="center_horizontal" - - android:layout_centerInParent="true"> - - <TextView style="@style/TextAppearance.AppCompat.Body1" - android:id="@+id/tutorial_end_label1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - - android:textColor="@color/default_output_color"/> - - <TextView style="@style/TextAppearance.AppCompat.Body1" - android:id="@+id/tutorial_end_label2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - - android:textColor="@color/default_output_color"/> - - </LinearLayout> - -</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_first_layout.xml b/app/src/main/res/layout/tutorial_first_layout.xml deleted file mode 100755 index 69185c3..0000000 --- a/app/src/main/res/layout/tutorial_first_layout.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout android:id="@+id/tutorial_logo_container" - android:layout_width="match_parent" - android:layout_height="match_parent" - - android:orientation="vertical" - android:weightSum="2"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - - android:weightSum="@integer/tutorial_bigicon_weightsum" - android:gravity="center"> - - <ImageView - android:layout_width="0dp" - android:layout_weight="@integer/tutorial_bigicon_weight" - android:layout_height="wrap_content" - - android:scaleType="fitCenter" - android:adjustViewBounds="true" - android:src="@drawable/big_icon"/> - - </LinearLayout> - - </LinearLayout> - - <TextView style="@style/Tutorial.Text.Secondary" - android:id="@+id/tutorial_first_title" - - android:layout_centerInParent="true"/> - -</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/values-h1024dp/dimension.xml b/app/src/main/res/values-h1024dp/dimension.xml index 1e0872c..b3b54ef 100755 --- a/app/src/main/res/values-h1024dp/dimension.xml +++ b/app/src/main/res/values-h1024dp/dimension.xml @@ -5,8 +5,4 @@ <dimen name="suggestion_height">60dp</dimen> <dimen name="tools_height">35dp</dimen> - <dimen name="tutorial_vertical_margin">26dp</dimen> - - <dimen name="tutorial_title_marginbottom">22dp</dimen> - </resources> diff --git a/app/src/main/res/values-h320dp/dimension.xml b/app/src/main/res/values-h320dp/dimension.xml index fca9b04..159bde8 100755 --- a/app/src/main/res/values-h320dp/dimension.xml +++ b/app/src/main/res/values-h320dp/dimension.xml @@ -5,6 +5,4 @@ <dimen name="suggestion_height">50dp</dimen> <dimen name="tools_height">22dp</dimen> - <dimen name="tutorial_title_marginbottom">15dp</dimen> - </resources> diff --git a/app/src/main/res/values-h720dp/dimension.xml b/app/src/main/res/values-h720dp/dimension.xml index 4f0fbf2..5367d0f 100755 --- a/app/src/main/res/values-h720dp/dimension.xml +++ b/app/src/main/res/values-h720dp/dimension.xml @@ -5,8 +5,4 @@ <dimen name="suggestion_height">55dp</dimen> <dimen name="tools_height">30dp</dimen> - <dimen name="tutorial_vertical_margin">22dp</dimen> - - <dimen name="tutorial_title_marginbottom">18dp</dimen> - </resources> diff --git a/app/src/main/res/values/dimension.xml b/app/src/main/res/values/dimension.xml index f862bd8..73f019e 100755 --- a/app/src/main/res/values/dimension.xml +++ b/app/src/main/res/values/dimension.xml @@ -6,8 +6,4 @@ <dimen name="cursor_width">8dp</dimen> <dimen name="tools_height">15dp</dimen> - <dimen name="tutorial_end_icons_padding">10dp</dimen> - <dimen name="tutorial_navigation_padding">15dp</dimen> - <dimen name="tutorial_title_marginbottom">10dp</dimen> - </resources> diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml deleted file mode 100755 index ca9d4a9..0000000 --- a/app/src/main/res/values/ids.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <item name="tutorial_navigation_next" type="id"/> - <item name="tutorial_navigation_back" type="id"/> - - <item name="tutorial_container" type="id"/> - <item name="tutorial_std_container" type="id"/> - <item name="tutorial_std_title" type="id"/> - -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 3b1df68..775d29d 100755 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -10,13 +10,4 @@ <integer name="tools_view_weightsum">4</integer> <integer name="tools_view_weight">1</integer> - <integer name="tutorial_bigicon_weightsum">3</integer> - <integer name="tutorial_bigicon_weight">1</integer> - - <integer name="tutorial_items_bigmargin">35</integer> - <integer name="tutorial_items_smallmargin">15</integer> - - <integer name="tutorial_end_icon_weightsum">7</integer> - <integer name="tutorial_end_icon_weight">1</integer> - </resources> \ 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 6d07d0b..99ea4d5 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,9 +133,10 @@ <string name="help_apps">Manage your apps \n\nUsage: \n>>apps [option] [app name] - \n\n-lshidden -> show hidden apps + \n\n-lsh -> show hidden apps \n-show -> show an hidden application \n-hide -> hide an application + \n-l -> show details about an application \n-ps -> show Google Play Store page for this app \n-st -> show Settings details for this app \n-frc -> force t-ui to open this app @@ -161,7 +162,6 @@ \nUsage: call [number] OR [name] (if you don\'t specify a number or a name you will get the list of your contacts) \n\n>>call James </string> - <string name="help_contacts">Print your contacts</string> <string name="help_config">Manage your config files. \nUsage: \n>>config [option] [file OR config_entry] [*value] @@ -236,6 +236,7 @@ \nt>>tui [option] \n\n-rm -> remove t-ui \n-about -> show info about the developer and the current version</string> + \n-reset -> Removes t-ui folder and resets default settings (restart required) <string name="help_tutorial">Go to T-UI tutorial page</string> <string name="help_uninstall">Uninstall an application \nUsage: @@ -274,7 +275,7 @@ \nUsage: \ncntcts [option] [*optional* contact] \n\n-ls -> list your contacts - \n-show -> show details about a contact + \n-l -> show details about a contact \n-new -> create a new contact \n-edit -> edit an existing contact \n-rm -> remove a contact @@ -306,105 +307,6 @@ <string name="start_notification">T-UI started</string> <string name="tui_running">T-UI is running</string> - <!-- tutorial --> - <string name="tutorial_title">A brief introduction</string> - - <string name="tutorial_navigation_right">- - ></string> - <string name="tutorial_navigation_left">< - -</string> - <string name="tutorial_navigation">End</string> - - <string-array name="tutorial_help"> - <item>the command \"help\"</item> - <item>11help gives you information about commands that comes with T-UI. click on the input area on the bottom of the screen and type \"help\".</item> - <item>10$ help</item> - <item>01A\nabout airplane alias aliasfile apps\nB\n...</item> - <item>11\"help\" has also an other important feature: it works like Linux\'s man, therefore it tells you how to use a command. For example:</item> - <item>10$ help search</item> - <item>11will prints this:</item> - <item>@string/help_search</item> - </string-array> - - <string-array name="tutorial_apps"> - <item>how to use your apps</item> - <item>11you can launch an app typing its name (or package name) in the input area. For example</item> - <item>10$ Chrome</item> - <item>01--> com.google.android.apps.chrome.Main</item> - <item>11you should also know something about the command \"apps\", which lets you know what apps are installed on your device and provides some shortcuts (mostly to Play Store and Settings) - \nTherefore, to learn something about this command:</item> - <item>10$ help apps</item> - <item>@string/help_apps</item> - </string-array> - - <string-array name="tutorial_usefulcommands"> - <item>some useful commands</item> - <item>11you can call a contact of yours with the command \"call\"</item> - <item>00$ call Francesco Andreuzzi</item> - <item>11if you want to remove an app from your device use the command \"uninstall\"</item> - <item>00$ uninstall AwfulAppName</item> - <item>11use \"calc\" for quick math operations</item> - <item>00$ calc sqrt(4 * 6 + (189 % 3))</item> - <item>11you can also use rm, cp and mv for file-management</item> - <item>00$ mv /storage/sdcard0/Downloads/file.txt /storage/sdcard1/Docs</item> - <item>11use \"open\" to view files saved on your phone</item> - <item>00$ open /storage/sdcard0/Downloads/file.txt</item> - <item>11use the command \"clear\" to clean the screen, and \"restart\" to reboot T-UI (and apply setting changes)</item> - <item>10$ clear</item> - <item>10$ restart</item> - </string-array> - - <string-array name="tutorial_oscommands"> - <item>control your device</item> - <item>11you can toggle your WI-FI connection with the command \"wifi\"</item> - <item>00$ wifi</item> - <item>11the command \"flash\" lets you turn on or off the flashlight in no time</item> - <item>00$ flash</item> - <item>11there are many commands like these, for example:</item> - <item>10$ airplane</item> - <item>10$ bluetooth</item> - <item>10$ data true</item> - <item>10$ data false</item> - </string-array> - - <string-array name="tutorial_tuixt"> - <item>tuixt - text editor</item> - <item>11the release 5.0 introduced tuixt, the built-in text editor of T-UI. you can start it with this command</item> - <item>10$ tuixt [path to file]</item> - <item>01the file can also be non existent, in that case tuixt will create it</item> - <item>11use the command \"save\" to apply changes on the file, or you will lose them</item> - <item>00$ save</item> - <item>11the command \"exit\" closes tuixt (without saving!) and brings you to your home screen</item> - <item>00$ exit</item> - </string-array> - - <string-array name="tutorial_settings"> - <item>settings and aliases</item> - <item>11T-UI is an highly customizable launcher. you can start using the command \"tuisettings\" which opens a text file called \"settings.txt\"</item> - <item>10$ tuisettings</item> - <item>11as you will see it contains many lines of \"properties\" written with the scheme \"propertyName=propertyValue\". - \ndo not ever edit propertyName, or you\'ll break that feature. just change propertyValue - \nfor example:</item> - <item>11backgroundColor=#ff000000</item> - <item>01if you change #ff000000 (hexadecimal code) to #ffff0000 your background will become red</item> - <item>11aliases are one of the most powerful features of T-UI. you can assign a name to a command you use frequently and make it quicker to use - \nstart using the command \"aliasfile\"</item> - <item>10$ aliasfile</item> - <item>11this will open a file called \"alias.txt\" which already contains two aliases I created to show you how they work. - \nthe scheme is easy to understand: aliasName=command - \nyou can now create your personal aliases appending them to the file (one per line)</item> - <item>11you can use an alias typing its name in the input area and clicking enter. for example</item> - <item>10$ st</item> - <item>01--> com.android.settings.Settings</item> - </string-array> - - <array name="tutorial"> - <item>@array/tutorial_help</item> - <item>@array/tutorial_apps</item> - <item>@array/tutorial_usefulcommands</item> - <item>@array/tutorial_oscommands</item> - <item>@array/tutorial_tuixt</item> - <item>@array/tutorial_settings</item> - </array> - </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6f391a7..6d60d4f 100755 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -35,57 +35,4 @@ <item name="android:scaleType">fitCenter</item> </style> - - <!--tutorial--> - <style name="Tutorial"/> - - <style name="Tutorial.Text" parent="TextAppearance.AppCompat.Subhead"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - </style> - <style name="Tutorial.Text.Primary" parent="Tutorial.Text"> - <item name="android:textColor">@color/default_input_color</item> - </style> - <style name="Tutorial.Text.Secondary" parent="Tutorial.Text"> - <item name="android:textColor">@color/default_output_color</item> - </style> - <style name="Tutorial.Text.Title" parent="TextAppearance.AppCompat.Title"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:textColor">@color/default_input_color</item> - <item name="android:id">@id/tutorial_std_title</item> - </style> - - <style name="Tutorial.Navigation" parent="TextAppearance.AppCompat.Headline"> - <item name="android:layout_width">0dp</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_weight">1</item> - - <item name="android:padding">@dimen/tutorial_navigation_padding</item> - <item name="android:gravity">center_horizontal</item> - - <item name="android:textColor">@color/default_input_color</item> - </style> - <style name="Tutorial.Navigation.Right" parent="Tutorial.Navigation"> - <item name="android:text">@string/tutorial_navigation_right</item> - <item name="android:id">@id/tutorial_navigation_next</item> - </style> - <style name="Tutorial.Navigation.Left" parent="Tutorial.Navigation"> - <item name="android:text">@string/tutorial_navigation_left</item> - <item name="android:id">@id/tutorial_navigation_back</item> - </style> - - <style name="Tutorial.End"/> - <style name="Tutorial.End.IconRow"> - <item name="android:layout_width">0dp</item> - <item name="android:layout_weight">@integer/tutorial_end_icon_weight</item> - <item name="android:layout_height">wrap_content</item> - </style> - <style name="Tutorial.End.Icon" parent="Tutorial.End.IconRow"> - <item name="android:adjustViewBounds">true</item> - <item name="android:scaleType">centerCrop</item> - <item name="android:background">@drawable/tutorial_end_icon_bg</item> - <item name="android:padding">@dimen/tutorial_end_icons_padding</item> - </style> - </resources> -- GitLab