From 81bb23938d0b956c39e5eaa5b8d36352f891dded Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi <andreuzzi.francesco@gmail.com> Date: Tue, 8 Aug 2017 13:47:10 +0200 Subject: [PATCH] 6.0h --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 1 - .../consolelauncher/LauncherActivity.java | 27 ++-- .../andre/consolelauncher/MainManager.java | 1 - .../ohi/andre/consolelauncher/UIManager.java | 14 +- .../commands/CommandsPreferences.java | 6 +- .../commands/main/raw/config.java | 13 ++ .../commands/main/raw/notifications.java | 4 +- .../commands/main/raw/refresh.java | 3 +- .../managers/AliasManager.java | 10 +- .../consolelauncher/managers/AppsManager.java | 141 +++++++----------- .../managers/ContactManager.java | 122 ++++++++------- .../consolelauncher/managers/SkinManager.java | 2 +- .../managers/XMLPrefsManager.java | 88 ++--------- .../managers/music/MusicManager.java | 60 +++++++- .../notifications/NotificationManager.java | 140 +++++++++-------- .../notifications/NotificationService.java | 33 ++-- .../suggestions/SuggestionsManager.java | 2 +- .../andre/consolelauncher/tuils/Tuils.java | 100 +++++-------- .../tuils/interfaces/OnBatteryUpdate.java | 10 ++ app/src/main/res/values/strings.xml | 8 +- 21 files changed, 376 insertions(+), 415 deletions(-) create mode 100644 app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java diff --git a/app/build.gradle b/app/build.gradle index 3a873f4..cd0208e 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 8 targetSdkVersion 23 - versionCode 117 - versionName "6.1c" + versionCode 119 + versionName "6.1g" } buildTypes { @@ -49,5 +49,5 @@ android { } } dependencies { - compile files('libs/anrwatchdog-1.3.0.jar') +// compile files('libs/anrwatchdog-1.3.0.jar') } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 64565b3..ba66070 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,7 +15,6 @@ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> - <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java index 026e473..b66e36e 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java @@ -23,9 +23,6 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Toast; -import com.github.anrwatchdog.ANRError; -import com.github.anrwatchdog.ANRWatchDog; - import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -150,18 +147,16 @@ 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); - - Toast.makeText(LauncherActivity.this, R.string.anr, Toast.LENGTH_LONG).show(); - } - }) - .setReportMainThreadOnly() - .start(); +// 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 @@ -392,7 +387,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { if(permissions.length > 0 && permissions[0].equals(Manifest.permission.READ_CONTACTS) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - ContactManager.refreshContacts(main.getMainPack().contacts, this); + main.getMainPack().contacts.refreshContacts(this); } try { diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java index 23df155..7e9dc51 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java @@ -392,7 +392,6 @@ public class MainManager { } catch (Exception e) { out.onOutput(Tuils.getStackTrace(e)); Tuils.log(e); - Tuils.toFile(e); } } }.start(); diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java index 58ab51b..1d8f4c8 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java @@ -46,6 +46,7 @@ import ohi.andre.consolelauncher.tuils.TimeManager; import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter; import ohi.andre.consolelauncher.tuils.interfaces.Hintable; +import ohi.andre.consolelauncher.tuils.interfaces.OnBatteryUpdate; import ohi.andre.consolelauncher.tuils.interfaces.OnRedirectionListener; import ohi.andre.consolelauncher.tuils.interfaces.Rooter; import ohi.andre.consolelauncher.tuils.interfaces.SuggestionViewDecorer; @@ -55,7 +56,6 @@ import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces; public class UIManager implements OnTouchListener { private final int RAM_DELAY = 3000; - private final int BATTERY_DELAY = 20 * 1000; private final int TIME_DELAY = 1000; private final int STORAGE_DELAY = 60 * 1000; @@ -102,10 +102,10 @@ public class UIManager implements OnTouchListener { } }; - private Runnable batteryRunnable = new Runnable() { + private OnBatteryUpdate batteryUpdate = new OnBatteryUpdate() { @Override - public void run() { - int percentage = Tuils.getBatteryPercentage(mContext); + public void update(float p) { + int percentage = (int) p; if(skinManager.manyColorsBattery) { if(percentage > mediumPercentage) battery.setTextColor(skinManager.battery_color_high); @@ -119,8 +119,6 @@ public class UIManager implements OnTouchListener { String cp = batteryFormat.replaceAll("%[vV]", String.valueOf(percentage)).replaceAll("%[nN]", Tuils.NEWLINE); battery.setText(cp); - - battery.postDelayed(batteryRunnable, BATTERY_DELAY); } }; @@ -487,7 +485,7 @@ public class UIManager implements OnTouchListener { component = new ComponentName(context, PolicyReceiver.class); multipleCmdSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.multiple_cmd_separator); - selectFirstSuggestionEnter = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enter_first_suggestion); +// selectFirstSuggestionEnter = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enter_first_suggestion); mContext = context; this.info = (MainPack) info; @@ -636,7 +634,7 @@ public class UIManager implements OnTouchListener { battery.setTextSize(skinManager.getTextSize()); battery.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole); - battery.post(batteryRunnable); + Tuils.registerBatteryReceiver(context, batteryUpdate); } else { battery.setVisibility(View.GONE); } 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 1e500d9..80f9b13 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java @@ -1,5 +1,7 @@ package ohi.andre.consolelauncher.commands; +import android.util.SparseArray; + import java.util.HashMap; import ohi.andre.consolelauncher.managers.XMLPrefsManager; @@ -28,12 +30,10 @@ public class CommandsPreferences { } public class Preference { - HashMap<Integer, String> prefs = new HashMap<>(); - + SparseArray<String> prefs = new SparseArray<>(); public void add(String pref, int id) { prefs.put(id, pref); } - public String get(int id) { return prefs.get(id); } 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 c2bfd70..b67edce 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 @@ -61,6 +61,19 @@ public class config extends ParamCommand { if(s.length() == 0) return "\"\""; return s; } + }, + reset { + @Override + public int[] args() { + return new int[] {CommandAbstraction.CONFIG_ENTRY}; + } + + @Override + public String exec(ExecutePack pack) { + XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1); + save.parent().write(save, save.defaultValue()); + return null; + } }; static Param get(String p) { 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 39ee7fa..d6c570d 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 @@ -1,8 +1,6 @@ package ohi.andre.consolelauncher.commands.main.raw; import android.content.Intent; -import android.os.Build; -import android.provider.Settings; import java.io.File; @@ -122,7 +120,7 @@ public class notifications extends ParamCommand { @Override public String exec(ExecutePack pack) { try { - pack.context.startActivity(new Intent(Build.VERSION.SDK_INT >= 22 ? Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS : "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")); + pack.context.startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")); } catch (Exception e) { return pack.context.getString(R.string.activity_not_found); } 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 39333e5..7137a12 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 @@ -4,7 +4,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.ContactManager; public class refresh implements CommandAbstraction { @@ -14,7 +13,7 @@ public class refresh implements CommandAbstraction { info.appsManager.fill(); info.aliasManager.reload(); info.player.refresh(info.context); - ContactManager.refreshContacts(info.contacts, info.context); + info.contacts.refreshContacts(info.context); return info.res.getString(R.string.output_refresh); } 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 3c9fb41..f77cda6 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java @@ -28,8 +28,8 @@ public class AliasManager implements Reloadable { public AliasManager() { reload(); - paramMarker = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_marker); - paramSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_separator); + 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); } @@ -76,13 +76,11 @@ public class AliasManager implements Reloadable { public String format(String aliasValue, String params) { params = params.trim(); - String quoted = Pattern.quote(paramSeparator); - if(params.length() == 0) return aliasValue; - String[] split = params.split(quoted); + String[] split = params.split(paramSeparator); for(String s : split) { - aliasValue = aliasValue.replaceFirst(quoted, s); + aliasValue = aliasValue.replaceFirst(paramMarker, s); } return aliasValue; 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 0ce4670..0bd0bf7 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java @@ -9,10 +9,8 @@ import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; -import android.os.AsyncTask; import android.os.Build; import android.support.annotation.NonNull; @@ -26,10 +24,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; @@ -57,7 +53,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { private final String SHOW_ATTRIBUTE = "show"; private Context context; - private PackageManager pkgManager; private File folder; private AppsHolder appsHolder; @@ -123,11 +118,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } @Override @@ -163,7 +153,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { instance = this; this.context = context; - this.pkgManager = context.getPackageManager(); this.outputable = outputable; @@ -173,18 +162,15 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { this.folder = Tuils.getFolder(); initAppListener(context); - new AsyncTask<Void,Void,Void>() { + new Thread() { @Override - protected Void doInBackground(Void... params) { - fill(); - return null; - } + public void run() { + super.run(); - @Override - protected void onPostExecute(Void aVoid) { + fill(); s.requestUpdate(); } - }.execute(); + }.start(); } private void initAppListener(Context c) { @@ -200,20 +186,15 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { List<LaunchInfo> allApps = createAppMap(context.getPackageManager()); hiddenApps = new ArrayList<>(); - Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>(); - for(XMLPrefsManager.XMLPrefsSave s : Options.values()) { - String r = s.hasReplaced(); - if(r != null) replacedValues.put(r, s); - } + try { - defaultApps = new XMLPrefsManager.XMLPrefsList(); + defaultApps = new XMLPrefsManager.XMLPrefsList(); - try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); File file = new File(folder, PATH); - if(!file.exists() && !file.createNewFile()) return; + if (!file.exists() && !file.createNewFile()) return; Document d; try { @@ -226,7 +207,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { List<AppsManager.Options> enums = new ArrayList<>(Arrays.asList(AppsManager.Options.values())); Element root = (Element) d.getElementsByTagName(NAME).item(0); - if(root == null) { + if (root == null) { resetFile(file, NAME); d = builder.parse(file); @@ -234,57 +215,51 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } NodeList nodes = root.getElementsByTagName("*"); - for(int count = 0; count < nodes.getLength(); count++) { + for (int count = 0; count < nodes.getLength(); count++) { Node node = nodes.item(count); String nn = node.getNodeName(); int nodeIndex = Tuils.find(nn, (List) enums); - if(nodeIndex != -1) { + if (nodeIndex != -1) { defaultApps.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); - for(int en = 0; en < enums.size(); en++) { - if(enums.get(en).label().equals(nn)) { + for (int en = 0; en < enums.size(); en++) { + if (enums.get(en).label().equals(nn)) { enums.remove(en); break; } } - } else if(replacedValues.containsKey(nn)) { - XMLPrefsManager.XMLPrefsSave s = replacedValues.remove(nn); - - Element e = (Element) node; - String oldValue = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null; - root.removeChild(e); - - replacedValues.put(oldValue, s); } // todo support delete else { - if(node.getNodeType() == Node.ELEMENT_NODE) { + if (node.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) node; boolean shown = !e.hasAttribute(SHOW_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(SHOW_ATTRIBUTE)); - if(!shown) { + if (!shown) { ComponentName name = null; String[] split = nn.split("-"); - if(split.length >= 2) { + if (split.length >= 2) { name = new ComponentName(split[0], split[1]); - } else if(split.length == 1) { - if(split[0].contains("Activity")) { - for(LaunchInfo i : allApps) { - if(i.componentName.getClassName().equals(split[0])) name = i.componentName; + } else if (split.length == 1) { + if (split[0].contains("Activity")) { + for (LaunchInfo i : allApps) { + if (i.componentName.getClassName().equals(split[0])) + name = i.componentName; } } else { - for(LaunchInfo i : allApps) { - if(i.componentName.getPackageName().equals(split[0])) name = i.componentName; + for (LaunchInfo i : allApps) { + if (i.componentName.getPackageName().equals(split[0])) + name = i.componentName; } } } - if(name == null) continue; + if (name == null) continue; LaunchInfo removed = AppUtils.findLaunchInfoWithComponent(allApps, name); - if(removed != null) { + if (removed != null) { allApps.remove(removed); hiddenApps.add(removed); } @@ -293,14 +268,9 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } } - if(enums.size() > 0) { - Set<Map.Entry<String, XMLPrefsManager.XMLPrefsSave>> es = replacedValues.entrySet(); - for(XMLPrefsManager.XMLPrefsSave s : enums) { - String value = null; - for(Map.Entry<String, XMLPrefsManager.XMLPrefsSave> e : es) { - if(e.getValue().equals(s)) value = e.getKey(); - } - if(value == null) value = s.defaultValue(); + if (enums.size() > 0) { + for (XMLPrefsManager.XMLPrefsSave s : enums) { + String value = s.defaultValue(); Element em = d.createElement(s.label()); em.setAttribute(VALUE_ATTRIBUTE, value); @@ -310,35 +280,38 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { } writeTo(d, file); } - } catch (Exception e) { - Tuils.toFile(e); - } - for(Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) { - Object value = entry.getValue(); - if (value instanceof Integer) { - ComponentName name = null; + for (Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) { + Object value = entry.getValue(); + if (value instanceof Integer) { + ComponentName name = null; - String[] split = entry.getKey().split("-"); - if(split.length >= 2) { - name = new ComponentName(split[0], split[1]); - } else if(split.length == 1) { - if(split[0].contains("Activity")) { - for(LaunchInfo i : allApps) { - if(i.componentName.getClassName().equals(split[0])) name = i.componentName; - } - } else { - for(LaunchInfo i : allApps) { - if(i.componentName.getPackageName().equals(split[0])) name = i.componentName; + String[] split = entry.getKey().split("-"); + if (split.length >= 2) { + name = new ComponentName(split[0], split[1]); + } else if (split.length == 1) { + if (split[0].contains("Activity")) { + for (LaunchInfo i : allApps) { + if (i.componentName.getClassName().equals(split[0])) + name = i.componentName; + } + } else { + for (LaunchInfo i : allApps) { + if (i.componentName.getPackageName().equals(split[0])) + name = i.componentName; + } } } - } - if(name == null) continue; + if (name == null) continue; - LaunchInfo info = AppUtils.findLaunchInfoWithComponent(allApps, name); - if(info != null) info.launchedTimes = (Integer) value; + LaunchInfo info = AppUtils.findLaunchInfoWithComponent(allApps, name); + if (info != null) info.launchedTimes = (Integer) value; + } } + + } catch (Exception e1) { + Tuils.toFile(e1); } appsHolder = new AppsHolder(allApps, defaultApps); @@ -378,7 +351,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { appsHolder.add(app); outputable.onOutput(context.getString(R.string.app_installed) + Tuils.SPACE + packageName); - } catch (NameNotFoundException e) {} + } catch (Exception e) {} } private void appUninstalled(String packageName) { @@ -789,8 +762,10 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement { return null; } + private static Pattern removeSpacePattern = Pattern.compile("\\s+"); public static LaunchInfo findLaunchInfoWithLabel(List<LaunchInfo> appList, String label) { - for(LaunchInfo i : appList) if(i.publicLabel.equalsIgnoreCase(label.trim())) return i; + label = removeSpacePattern.matcher(label).replaceAll(Tuils.EMPTYSTRING); + for(LaunchInfo i : appList) if(removeSpacePattern.matcher(i.publicLabel).replaceAll(Tuils.EMPTYSTRING).equalsIgnoreCase(label)) return i; return null; } diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java index 10e8aa7..94c988d 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java @@ -25,81 +25,95 @@ public class ContactManager { public ContactManager(Context context) { this.context = context; - } - public static void refreshContacts(ContactManager mgr, Context context) { - List<Contact> contacts = new ArrayList<>(); + if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + refreshContacts(context); + } + } + public void refreshContacts(final Context context) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS}, LauncherActivity.COMMAND_SUGGESTION_REQUEST_PERMISSION); - mgr.contacts = contacts; return; } - Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, - new String[] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Data.IS_SUPER_PRIMARY,}, null, null, - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); + new Thread() { + @Override + public void run() { + super.run(); - if (phones != null) { + if(contacts == null) { + contacts = new ArrayList<>(); + } else { + contacts.clear(); + } + List<Contact> contacts = ContactManager.this.contacts; - int lastId = -1; - List<String> lastNumbers = new ArrayList<>(); - List<String> nrml = new ArrayList<>(); - int defaultNumber = 0; - String name = null, number; - int id, prim; + Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + new String[] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Data.IS_SUPER_PRIMARY,}, null, null, + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); - while (phones.moveToNext()) { - id = phones.getInt(phones.getColumnIndex(ContactsContract.Data.CONTACT_ID)); - number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); + if (phones != null) { - prim = phones.getInt(phones.getColumnIndex(ContactsContract.Data.IS_SUPER_PRIMARY)); - if(prim > 0) { - defaultNumber = lastNumbers.size(); - } + int lastId = -1; + List<String> lastNumbers = new ArrayList<>(); + List<String> nrml = new ArrayList<>(); + int defaultNumber = 0; + String name = null, number; + int id, prim; - if(number == null || number.length() == 0) continue; + while (phones.moveToNext()) { + id = phones.getInt(phones.getColumnIndex(ContactsContract.Data.CONTACT_ID)); + number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); - if(phones.isFirst()) { - lastId = id; - name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); - } else if(id != lastId || phones.isLast()) { - lastId = id; + prim = phones.getInt(phones.getColumnIndex(ContactsContract.Data.IS_SUPER_PRIMARY)); + if(prim > 0) { + defaultNumber = lastNumbers.size(); + } - contacts.add(new Contact(name, lastNumbers, defaultNumber)); + if(number == null || number.length() == 0) continue; - lastNumbers = new ArrayList<>(); - nrml = new ArrayList<>(); - name = null; - defaultNumber = 0; + if(phones.isFirst()) { + lastId = id; + name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); + } else if(id != lastId || phones.isLast()) { + lastId = id; - name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); - } + contacts.add(new Contact(name, lastNumbers, defaultNumber)); - String normalized = number.replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING); - if(!nrml.contains(normalized)) { - nrml.add(normalized); - lastNumbers.add(number); - } + lastNumbers = new ArrayList<>(); + nrml = new ArrayList<>(); + name = null; + defaultNumber = 0; - if(name != null && phones.isLast()) { - contacts.add(new Contact(name, lastNumbers, defaultNumber)); + name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); + } + + String normalized = number.replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING); + if(!nrml.contains(normalized)) { + nrml.add(normalized); + lastNumbers.add(number); + } + + if(name != null && phones.isLast()) { + contacts.add(new Contact(name, lastNumbers, defaultNumber)); + } + } + phones.close(); } - } - phones.close(); - } - List<Contact> cp = new ArrayList<>(contacts); - for(int count = 0; count < cp.size(); count++) { - if(cp.get(count).numbers.size() == 0) contacts.remove(count--); - } + List<Contact> cp = new ArrayList<>(contacts); + for(int count = 0; count < cp.size(); count++) { + if(cp.get(count).numbers.size() == 0) contacts.remove(count--); + } - mgr.contacts = contacts; - Collections.sort(mgr.contacts); + Collections.sort(contacts); + } + }.start(); } public List<String> listNames() { - if(contacts == null || contacts.size() == 0) refreshContacts(this, context); + if(contacts == null || contacts.size() == 0) refreshContacts(context); List<String> names = new ArrayList<>(); for(Contact c : contacts) names.add(c.name); @@ -107,13 +121,13 @@ public class ContactManager { } public List<Contact> getContacts() { - if(contacts == null || contacts.size() == 0) refreshContacts(this, context); + if(contacts == null || contacts.size() == 0) refreshContacts(context); return contacts; } public List<String> listNamesAndNumbers() { - if(contacts == null || contacts.size() == 0) refreshContacts(this, context); + if(contacts == null || contacts.size() == 0) refreshContacts(context); List<String> c = new ArrayList<>(); @@ -211,7 +225,7 @@ public class ContactManager { } public String findNumber(String name) { - if(contacts == null) refreshContacts(this, context); + if(contacts == null) refreshContacts(context); for(int count = 0; count < contacts.size(); count++) { Contact c = contacts.get(count); 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 c5e48fc..4708be1 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java @@ -77,7 +77,7 @@ public class SkinManager implements Parcelable { suggDefaultText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_text_color); suggDefaultBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_bg_color); - transparentSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.transparent); + transparentSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.transparent_suggestions); if(transparentSuggestions && suggDefaultText == bgColor) { suggDefaultText = Color.GREEN; 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 834cf04..48cea17 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java @@ -1,7 +1,6 @@ package ohi.andre.consolelauncher.managers; import android.graphics.Color; -import android.util.Log; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -13,10 +12,7 @@ import java.io.FileOutputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; @@ -26,7 +22,6 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import ohi.andre.consolelauncher.managers.notifications.NotificationManager; import ohi.andre.consolelauncher.tuils.Tuils; public class XMLPrefsManager { @@ -40,7 +35,6 @@ public class XMLPrefsManager { String label(); XmlPrefsElement parent(); boolean is(String s); - String hasReplaced(); } public enum Theme implements XMLPrefsSave { @@ -144,11 +138,6 @@ public class XMLPrefsManager { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } public enum Ui implements XMLPrefsSave { @@ -318,11 +307,6 @@ public class XMLPrefsManager { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } public enum Toolbar implements XMLPrefsSave { @@ -332,11 +316,6 @@ public class XMLPrefsManager { public String defaultValue() { return "true"; } - - @Override - public String hasReplaced() { - return "enabled"; - } }; @Override @@ -362,13 +341,8 @@ public class XMLPrefsManager { public String defaultValue() { return "true"; } - - @Override - public String hasReplaced() { - return "enabled"; - } }, - transparent { + transparent_suggestions { @Override public String defaultValue() { return "false"; @@ -485,11 +459,6 @@ public class XMLPrefsManager { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } public enum Behavior implements XMLPrefsSave { @@ -679,12 +648,6 @@ public class XMLPrefsManager { public String defaultValue() { return "%a --> [%v]"; } - }, - enter_first_suggestion { - @Override - public String defaultValue() { - return "true"; - } }; @Override @@ -701,11 +664,6 @@ public class XMLPrefsManager { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } public enum Cmd implements XMLPrefsSave { @@ -731,11 +689,6 @@ public class XMLPrefsManager { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } public enum XMLPrefsRoot implements XmlPrefsElement { @@ -755,7 +708,7 @@ public class XMLPrefsManager { TOOLBAR("toolbar.xml", Toolbar.values()) { @Override public String[] deleted() { - return new String[0]; + return new String[] {"enabled"}; } }, UI("ui.xml", Ui.values()) { @@ -773,7 +726,7 @@ public class XMLPrefsManager { SUGGESTIONS("suggestions.xml", Suggestions.values()) { @Override public String[] deleted() { - return new String[0]; + return new String[] {"transparent", "enabled"}; } }; @@ -891,13 +844,8 @@ public class XMLPrefsManager { List<XMLPrefsSave> enums = element.enums; if(enums == null) continue; - Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>(); - for(XMLPrefsManager.XMLPrefsSave s : NotificationManager.Options.values()) { - String r = s.hasReplaced(); - if(r != null) replacedValues.put(r, s); - } - String[] deleted = element.deleted(); + boolean needToWrite = false; Element root = (Element) d.getElementsByTagName(element.name()).item(0); if(root == null) { @@ -917,37 +865,26 @@ public class XMLPrefsManager { if(enums.get(en).label().equals(nn)) { enums.remove(en); break; - } else if(replacedValues.containsKey(nn)) { - XMLPrefsManager.XMLPrefsSave s = replacedValues.remove(nn); - - Element e = (Element) node; - String oldValue = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null; - root.removeChild(e); - - replacedValues.put(oldValue, s); } 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) continue; - - Set<Map.Entry<String, XMLPrefsSave>> es = replacedValues.entrySet(); + if(enums.size() == 0) { + if(needToWrite) writeTo(d, file); + continue; + } for(XMLPrefsSave s : enums) { - String value = null; - for(Map.Entry<String, XMLPrefsManager.XMLPrefsSave> e : es) { - if(e.getValue().equals(s)) value = e.getKey(); - } - if(value == null) { - value = s.defaultValue(); - } + String value = s.defaultValue(); Element em = d.createElement(s.label()); em.setAttribute(VALUE_ATTRIBUTE, value); @@ -1088,7 +1025,8 @@ public class XMLPrefsManager { writeTo(d, file); } catch (Exception e) { - Log.e("andre", "", e); + Tuils.log(e); + Tuils.toFile(e); return e.toString(); } return null; diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java index 1e9a4ac..0e28f8e 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java @@ -1,11 +1,15 @@ package ohi.andre.consolelauncher.managers.music; import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.database.Cursor; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; +import android.net.Uri; +import android.provider.MediaStore; import java.io.File; import java.util.ArrayList; @@ -45,6 +49,7 @@ public class MusicManager implements OnCompletionListener { try { this.mp = new MediaPlayer(); this.mp.setOnCompletionListener(this); + this.files = new ArrayList<>(); this.outputable = outputable; @@ -74,13 +79,9 @@ public class MusicManager implements OnCompletionListener { return prepareSong(currentSongIndex); } - // return a song by incomplete name -// public String getSong(String s) { -// return s; -// } - - // return the path by complete name public String getPath(String name) { + if(files == null) return null; + int count = 0; File file = files.get(count); while(!file.getName().equals(name)) { @@ -208,11 +209,54 @@ public class MusicManager implements OnCompletionListener { public void refresh(Context c) { if(fromMediastore) { - files = Tuils.getMediastoreSongs(c); + fillFromMediaStore(c, files); } else { - files = Tuils.getSongsInFolder(songsFolder); + fillFromDir(files, songsFolder); } + } + private static void fillFromMediaStore(final Context c, final List<File> files) { + files.clear(); + + new Thread() { + @Override + public void run() { + ContentResolver cr = c.getContentResolver(); + + Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; + String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; + Cursor cur = cr.query(uri, null, selection, null, sortOrder); + int count = 0; + + if(cur != null) { + count = cur.getCount(); + if(count > 0) { + while(cur.moveToNext()) { + String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA)); + if(data != null) { + try { + files.add(new File(data)); + } catch (Exception e) {} + } + } + } + + cur.close(); + } + } + }.start(); + } + + private static void fillFromDir(final List<File> files, final File dir) { + files.clear(); + + new Thread() { + @Override + public void run() { + files.addAll(Tuils.getSongsInFolder(dir)); + } + }.start(); } @Override 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 077a74d..ccbba64 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 @@ -2,7 +2,7 @@ package ohi.andre.consolelauncher.managers.notifications; import android.annotation.TargetApi; import android.os.Build; -import android.util.Log; +import android.util.SparseArray; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -16,10 +16,7 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; @@ -68,11 +65,6 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { public String defaultValue() { return "false"; } - - @Override - public String hasReplaced() { - return "enabled"; - } }, default_app_state { @Override @@ -107,16 +99,11 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { public boolean is(String s) { return name().equals(s); } - - @Override - public String hasReplaced() { - return null; - } } @Override public String[] deleted() { - return new String[0]; + return new String[] {"enabled"}; } @Override @@ -132,7 +119,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { private static XMLPrefsManager.XMLPrefsList values; private static List<NotificatedApp> apps; private static List<FilterGroup> groups; - private static HashMap<Integer, String> applies; + private static SparseArray<List<String>> applies; private static boolean created = false; private NotificationManager() {} @@ -145,7 +132,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { apps = new ArrayList<>(); groups = new ArrayList<>(); - applies = new HashMap<>(); + applies = new SparseArray<>(); values = new XMLPrefsManager.XMLPrefsList(); try { @@ -174,35 +161,32 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { } NodeList nodes = root.getElementsByTagName("*"); - Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>(); - for(XMLPrefsManager.XMLPrefsSave s : Options.values()) { - String r = s.hasReplaced(); - if(r != null) replacedValues.put(r, s); - } + 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) { + if (Tuils.find(nn, (List) enums) != -1) { values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue()); - for(int en = 0; en < enums.size(); en++) { - if(enums.get(en).label().equals(nn)) { + for (int en = 0; en < enums.size(); en++) { + if (enums.get(en).label().equals(nn)) { enums.remove(en); break; } } - } else if(nn.equals(FILTER_NODE)) { - if(node.getNodeType() == Node.ELEMENT_NODE) { + } else if (nn.equals(FILTER_NODE)) { + if (node.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) node; String regex = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null; - if(regex == null) continue; + if (regex == null) continue; String on = e.hasAttribute(ON_ATTRIBUTE) ? e.getAttribute(ON_ATTRIBUTE) : null; - if(on == null) on = "text"; + if (on == null) on = "text"; int id; try { @@ -212,11 +196,11 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { } Filter filter = Filter.getInstance(regex, on.equals("title") ? TITLE : TEXT); - if(filter == null) continue; + if (filter == null) continue; - if(id != -1) { - for(FilterGroup group : groups) { - if(id == group.id) { + if (id != -1) { + for (FilterGroup group : groups) { + if (id == group.id) { group.add(filter); continue Main; } @@ -227,8 +211,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { group.add(filter); groups.add(group); } - } else if(nn.equals(APPLY_NODE)) { - if(node.getNodeType() == Node.ELEMENT_NODE) { + } else if (nn.equals(APPLY_NODE)) { + if (node.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) node; int id; @@ -239,22 +223,27 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { } String pkg = e.hasAttribute(PACKAGE_ATTRIBUTE) ? e.getAttribute(PACKAGE_ATTRIBUTE) : null; - if(pkg == null) continue; - - applies.put(id, pkg); + if (pkg == null) continue; + + List<String> at = applies.get(id); + if(at == null) { + at = new ArrayList<>(); + at.add(pkg); + applies.put(id, at); + } else at.add(pkg); } - } else if(replacedValues.containsKey(nn)) { - XMLPrefsManager.XMLPrefsSave s = replacedValues.remove(nn); + } else { - Element e = (Element) node; - String oldValue = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null; - root.removeChild(e); + int index = deleted == null ? -1 : Tuils.find(nn, deleted); + if(index != -1) { + deleted[index] = null; + Element e = (Element) node; + root.removeChild(e); - replacedValues.put(oldValue, s); - } -// todo support delete - else { - if(node.getNodeType() == Node.ELEMENT_NODE) { + needToWrite = true; + } + + if (node.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) node; NotificatedApp app; @@ -262,7 +251,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { boolean enabled = !e.hasAttribute(ENABLED_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(ENABLED_ATTRIBUTE)); String color = null; - if(enabled) color = e.hasAttribute(COLOR_ATTRIBUTE) ? e.getAttribute(COLOR_ATTRIBUTE) : null; + if (enabled) + color = e.hasAttribute(COLOR_ATTRIBUTE) ? e.getAttribute(COLOR_ATTRIBUTE) : null; app = new NotificatedApp(nn, color, enabled); apps.add(app); @@ -270,14 +260,9 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { } } - if(enums.size() > 0) { - Set<Map.Entry<String, XMLPrefsManager.XMLPrefsSave>> es = replacedValues.entrySet(); - for(XMLPrefsManager.XMLPrefsSave s : enums) { - String value = null; - for(Map.Entry<String, XMLPrefsManager.XMLPrefsSave> e : es) { - if(e.getValue().equals(s)) value = e.getKey(); - } - if(value == null) value = s.defaultValue(); + if (enums.size() > 0) { + for (XMLPrefsManager.XMLPrefsSave s : enums) { + String value = s.defaultValue(); Element em = d.createElement(s.label()); em.setAttribute(VALUE_ATTRIBUTE, value); @@ -286,19 +271,25 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { values.add(s.label(), value); } + writeTo(d, file); + } else if (needToWrite) { writeTo(d, file); } } catch (Exception e) { - Log.e("andre", "", e); + Tuils.log(e); + Tuils.toFile(e); } default_app_state = XMLPrefsManager.get(boolean.class, Options.default_app_state); default_color = XMLPrefsManager.get(String.class, Options.default_color); Out: - for(Map.Entry<Integer, String> e : applies.entrySet()) { + for(int count = 0; count < applies.size(); count++) { + int id = applies.keyAt(count); + List<String> pkgs = applies.get(id); + for(FilterGroup g : groups) { - if(g.applyTo(e.getKey(), e.getValue())) continue Out; + if(g.applyTo(id, pkgs)) continue Out; } } } @@ -309,7 +300,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { public static boolean match(String pkg, String text, String title) { for(FilterGroup group : groups) { - if(group.pkgs != null && !group.pkgs.contains(pkg)) continue; + if(group.pkgs == null || !group.pkgs.contains(pkg)) continue; if(group.check(title, text)) return true; } return false; @@ -421,15 +412,23 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { } public boolean check(String title, String text) { + boolean matchTitle = false, matchText = false; + for(Filter filter : brothers) { String s; - if(filter.on == TITLE) s = title; - else s = text; + if(filter.on == TITLE) { + s = title; + } else { + s = text; + } + + boolean b = filter.pattern.matcher(s).find(); - if(!filter.pattern.matcher(s).find()) return false; + if(filter.on == TITLE) matchTitle = matchTitle || b; + else matchText = matchText || b; } - return true; + return matchText && matchTitle; } public boolean applyTo(int id, String s) { @@ -442,5 +441,16 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement { return false; } + + public boolean applyTo(int id, List<String> ss) { + if(this.id == id) { + if(pkgs == null) pkgs = new ArrayList<>(); + + pkgs.addAll(ss); + return true; + } + + return false; + } } } 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 cc5ef5c..b54ffba 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 @@ -16,13 +16,13 @@ import android.service.notification.StatusBarNotification; import android.support.v4.content.LocalBroadcastManager; import android.text.Spannable; import android.text.SpannableString; -import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.tuils.TimeManager; @@ -87,11 +87,11 @@ public class NotificationService extends NotificationListenerService { String format; int timeColor; - final String FORMAT_PKG = "%pkg"; - final String FORMAT_TEXT = "%txt"; - final String FORMAT_TITLE = "%ttl"; - final String FORMAT_APPNAME = "%app"; - final String FORMAT_NEWLINE = "%n"; + final Pattern patternPkg = Pattern.compile("%pkg", Pattern.CASE_INSENSITIVE); + final Pattern patternText = Pattern.compile("%txt", Pattern.CASE_INSENSITIVE); + final Pattern patternTitle = Pattern.compile("%ttl", Pattern.CASE_INSENSITIVE); + final Pattern patternAppname = Pattern.compile("%app", Pattern.CASE_INSENSITIVE); + final Pattern patternNewline = Pattern.compile("%n", Pattern.CASE_INSENSITIVE); PackageManager manager; @@ -160,20 +160,19 @@ public class NotificationService extends NotificationListenerService { color = Color.parseColor(default_color); } - SpannableString spanned = new SpannableString(format); - spanned.setSpan(new ForegroundColorSpan(color), 0, format.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + String finalText = format; + finalText = patternPkg.matcher(finalText).replaceAll(pack); + finalText = patternAppname.matcher(finalText).replaceAll(appName); + finalText = patternText.matcher(finalText).replaceAll(text); + finalText = patternTitle.matcher(finalText).replaceAll(title); + finalText = patternNewline.matcher(finalText).replaceAll(Tuils.NEWLINE); + + SpannableString spannableString = new SpannableString(finalText); + spannableString.setSpan(new ForegroundColorSpan(color), 0, finalText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); CharSequence s; try { - s = TextUtils.replace(spanned, - new String[] {FORMAT_PKG, FORMAT_APPNAME, FORMAT_TEXT, FORMAT_TITLE, FORMAT_NEWLINE, - FORMAT_PKG.toUpperCase(), FORMAT_APPNAME.toUpperCase(), FORMAT_TEXT.toUpperCase(), FORMAT_TITLE.toUpperCase(), FORMAT_NEWLINE.toUpperCase()}, - new CharSequence[] { - pack, appName, text, title, Tuils.NEWLINE, pack, appName, text, title, Tuils.NEWLINE - } - ); - - s = TimeManager.replace(s, timeColor); + s = TimeManager.replace(spannableString, timeColor); } catch (Exception e) { return; } 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 7cb4270..f55f371 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 @@ -192,7 +192,7 @@ public class SuggestionsManager { } private boolean needsFileSuggestion(String cmd) { - return cmd.equalsIgnoreCase("ls") || cmd.equalsIgnoreCase("cd") || cmd.equalsIgnoreCase("mv") || cmd.equalsIgnoreCase("cp") || cmd.equalsIgnoreCase("rm"); + return cmd.equalsIgnoreCase("ls") || cmd.equalsIgnoreCase("cd") || cmd.equalsIgnoreCase("mv") || cmd.equalsIgnoreCase("cp") || cmd.equalsIgnoreCase("rm") || cmd.equalsIgnoreCase("cat"); } private void suggestPermanentSuggestions(List<Suggestion> suggestions, PermanentSuggestionCommand cmd) { 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 99a280a..3185a36 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java @@ -4,22 +4,20 @@ import android.annotation.TargetApi; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.admin.DevicePolicyManager; +import android.content.BroadcastReceiver; import android.content.ClipData; import android.content.ClipboardManager; 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.os.StatFs; -import android.provider.MediaStore; import android.provider.Settings; import android.text.TextUtils; import android.util.DisplayMetrics; @@ -32,7 +30,6 @@ import android.webkit.MimeTypeMap; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; @@ -43,6 +40,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.Enumeration; import java.util.List; import java.util.regex.Pattern; @@ -52,6 +50,7 @@ import ohi.andre.consolelauncher.BuildConfig; import ohi.andre.consolelauncher.managers.SkinManager; import ohi.andre.consolelauncher.managers.XMLPrefsManager; import ohi.andre.consolelauncher.managers.music.MusicManager; +import ohi.andre.consolelauncher.tuils.interfaces.OnBatteryUpdate; import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity; public class Tuils { @@ -74,23 +73,28 @@ public class Tuils { return false; } - public static int getBatteryPercentage(Context context) { - + public static void registerBatteryReceiver(Context context, OnBatteryUpdate listener) { try { IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - Intent batteryStatus = context.registerReceiver(null, iFilter); - - int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; - int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; - - float batteryPct = level / (float) scale; + context.registerReceiver(batteryReceiver, iFilter); - return (int) (batteryPct * 100); + batteryUpdate = listener; } catch (Exception e) { - return -1; + Tuils.toFile(e); } } + private static OnBatteryUpdate batteryUpdate; + private static BroadcastReceiver batteryReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if(batteryUpdate == null) return; + + int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + batteryUpdate.update(level); + } + }; + public static boolean containsExtension(String[] array, String value) { try { value = value.toLowerCase().trim(); @@ -397,17 +401,12 @@ public class Tuils { public static void insertHeaders(List<String> s, boolean newLine) { char current = 0; for (int count = 0; count < s.size(); count++) { - char c = 0; - - String st = s.get(count); - for (int count2 = 0; count2 < st.length(); count2++) { - c = st.charAt(count2); - if (c != ' ') - break; - } + String st = s.get(count).trim().toUpperCase(); + if(st.length() < 0) continue; + char c = st.charAt(0); if (current != c) { - s.add(count, (newLine ? NEWLINE : EMPTYSTRING) + Character.toString(c).toUpperCase() + (newLine ? NEWLINE : EMPTYSTRING)); + s.add(count, (newLine ? NEWLINE : EMPTYSTRING) + c + (newLine ? NEWLINE : EMPTYSTRING)); current = c; } } @@ -454,8 +453,11 @@ public class Tuils { public static void toFile(Throwable e) { try { - e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true))); - } catch (FileNotFoundException e1) {} + FileOutputStream out = new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true); + out.write((Tuils.NEWLINE + Tuils.NEWLINE + new Date().toString() + Tuils.NEWLINE).getBytes()); + e.printStackTrace(new PrintStream(out)); + out.close(); + } catch (Exception e1) {} } public static String toPlanString(List<String> strings, String separator) { @@ -574,37 +576,6 @@ public class Tuils { return new File(internalDir, TUI_FOLDER); } - public static List<File> getMediastoreSongs(Context activity) { - ContentResolver cr = activity.getContentResolver(); - - List<File> paths = new ArrayList<>(); - - Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; - String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; - Cursor cur = cr.query(uri, null, selection, null, sortOrder); - int count = 0; - - if(cur != null) { - count = cur.getCount(); - if(count > 0) { - while(cur.moveToNext()) { - String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA)); - if(data != null) { - try { - paths.add(new File(data)); - } catch (Exception e) {} - } - } - - } - - cur.close(); - } - - return paths; - } - public static double eval(final String str) { return new Object() { int pos = -1, ch; @@ -721,22 +692,23 @@ public class Tuils { } public static int alphabeticCompare(String s1, String s2) { - String cmd1 = removeSpaces(s1); - cmd1 = cmd1.toLowerCase(); - String cmd2 = removeSpaces(s2); - cmd2 = cmd2.toLowerCase(); + String cmd1 = removeSpaces(s1).toLowerCase(); + String cmd2 = removeSpaces(s2).toLowerCase(); for (int count = 0; count < cmd1.length() && count < cmd2.length(); count++) { - if (cmd1.charAt(count) < cmd2.charAt(count)) { + char c1 = cmd1.charAt(count); + char c2 = cmd2.charAt(count); + + if (c1 < c2) { return -1; - } else if (cmd1.charAt(count) > cmd2.charAt(count)) { + } else if (c1 > c2) { return 1; } } - if (cmd1.length() > cmd2.length()) { + if (s1.length() > s2.length()) { return 1; - } else if (cmd1.length() < cmd2.length()) { + } else if (s1.length() < s2.length()) { return -1; } return 0; 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 new file mode 100644 index 0000000..1dfb5f8 --- /dev/null +++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java @@ -0,0 +1,10 @@ +package ohi.andre.consolelauncher.tuils.interfaces; + +/** + * Created by francescoandreuzzi on 04/08/2017. + */ + +public interface OnBatteryUpdate { + + void update(float percentage); +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1134ffe..7322363 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,7 +10,7 @@ <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</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> <!-- files --> <string name="output_error">An unknown error has occurred</string> @@ -77,8 +77,7 @@ <string name="output_stopped">Player stopped</string> <string name="output_nomusic">Player wasn\'t started</string> <string name="output_cantstop">Couldn\'t stop the player. Force stop t-ui from settings</string> - <string name="output_musicfoldererror">Music folder doesn\'t exist, or doesn\'t contain audio files.\nYou should set the right path - in settings.txt + <string name="output_musicfoldererror">Music folder doesn\'t exist, or doesn\'t contain audio files.\nYou should set the right path with "config -set songs_path" </string> <!-- command/args --> @@ -142,9 +141,10 @@ <string name="help_community">Show the t-ui community on Google+</string> <string name="help_config">Manage your config files. \nUsage: - \n-set [option] [value] -> set the value of a config node + \n-set [option] [value] -> set the value of an option \n-open [file] -> open a config file \n-get [option] -> get the value of an option + \n-reset [option] -> reset the value of an option </string> <string name="help_data">Toggle mobile data</string> <string name="help_donate">Offer a coffee to the developer (PayPal only)</string> -- GitLab