diff --git a/app/build.gradle b/app/build.gradle index 22bac843ab9149a187b8f00c779ea94127d7d6c9..4198e72e17d3b1c0c2d15e3addc3d44656741e87 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 8 targetSdkVersion 23 - versionCode 103 - versionName "6.0a" + versionCode 104 + versionName "6.0b" } buildTypes { diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java index 603517a439d4e3da1bcb2540c89148c1525cb818..90e91360e0ef12a6dfa21ffccefad9872706e0cf 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java +++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java @@ -344,7 +344,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable { public void run() { finish(); } - }, 2 * 1000); + }, 1000); } }); } @@ -406,6 +406,10 @@ 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); + } + try { switch (requestCode) { case COMMAND_REQUEST_PERMISSION: diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java index 1ea63524a1f5849fa56a36b36db4afc92f10ac35..9e19bf9b26bb5d4c8ab4e623ed395ca635f31adf 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java +++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java @@ -65,7 +65,9 @@ public class CommandTuils { try { if(cmd instanceof ParamCommand) { ArgInfo arg = param(input); - if(arg == null || !arg.found) return command; + if(arg == null || !arg.found) { + return command; + } input = arg.residualString; String param = (String) arg.arg; @@ -329,18 +331,15 @@ public class CommandTuils { } private static ArgInfo param(String input) { - String param = null; - int indexOfFirstSpace = 0; - - if (input.startsWith("-")) { - indexOfFirstSpace = input.indexOf(Tuils.SPACE); - if (indexOfFirstSpace == -1) - indexOfFirstSpace = input.length(); - - param = input.substring(0, indexOfFirstSpace); + int indexOfFirstSpace = input.indexOf(Tuils.SPACE); + if (indexOfFirstSpace == -1) { + indexOfFirstSpace = input.length(); } - return new ArgInfo(param, param != null ? input.substring(indexOfFirstSpace) : input, param != null, param != null ? 1 : 0); + String param = input.substring(0, indexOfFirstSpace).trim(); + if(param.length() > 0 && !param.startsWith("-")) param = "-".concat(param); + + return new ArgInfo(param.length() > 0 ? param : null, input.substring(indexOfFirstSpace), param.length() > 0, param.length() > 0 ? 1 : 0); } private static ArgInfo packageName(String input, AppsManager apps) { 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 c8ef105b15f8498cb4240bf33ded544a0042664e..9971ee260e6a4daa7a31a762f73ffb7fcd4d3a20 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 @@ -1,13 +1,10 @@ package ohi.andre.consolelauncher.commands.main.raw; -import android.app.Activity; - 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; -import ohi.andre.consolelauncher.managers.XMLPrefsManager; public class refresh implements CommandAbstraction { @@ -18,7 +15,7 @@ public class refresh implements CommandAbstraction { // info.preferencesManager.refresh(XMLPrefsManager.ALIAS); info.aliasManager.reload(); info.player.refresh(info.context); - info.contacts = new ContactManager(info.context); + ContactManager.refreshContacts(info.contacts, info.context); return info.res.getString(R.string.output_refresh); } 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 139a308ec36825f0076ebce355d2ce872d8b2c78..9d009cdfb2980ace035c6e77ab243df7a5ce1830 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 @@ -29,7 +29,7 @@ public class tui extends ParamCommand { Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); info.context.startActivity(uninstallIntent); - return Tuils.EMPTYSTRING; + return null; } }, about { @@ -43,6 +43,31 @@ public class tui extends ParamCommand { @Override public String exec(ExecutePack pack) { FileManager.rm(Tuils.getFolder(), false); + return null; + } + }, + folder { + @Override + public String exec(ExecutePack pack) { +// Intent intent = new Intent(Intent.ACTION_VIEW); +// intent.setData(Uri.fromFile(Tuils.getFolder())); +// pack.context.startActivity(intent); + +// Intent intent = new Intent(Intent.ACTION_GET_CONTENT); +// Uri uri = Uri.parse(Tuils.getFolder().getAbsolutePath()); +// intent.setDataAndType(uri, "*/*"); +// pack.context.startActivity(Intent.createChooser(intent, "Open folder")); + + Uri selectedUri = Uri.parse(Tuils.getFolder().getAbsolutePath()); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(selectedUri, "resource/folder"); + + if (intent.resolveActivityInfo(pack.context.getPackageManager(), 0) != null) { + pack.context.startActivity(intent); + } else { + return Tuils.getFolder().getAbsolutePath(); + } + return null; } }; 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 a91ca7355156451b6b56614caac7a84d1fc95563..57615ac87fa4b54de1dc34978422a96b6faf1e9f 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java @@ -2,37 +2,22 @@ package ohi.andre.consolelauncher.managers; import android.util.Log; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - import ohi.andre.consolelauncher.tuils.Tuils; import ohi.andre.consolelauncher.tuils.interfaces.Reloadable; -import static android.R.id.list; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile; -import static ohi.andre.consolelauncher.managers.XMLPrefsManager.set; - public class AliasManager implements Reloadable { public static final String PATH = "alias.txt"; @@ -78,14 +63,12 @@ public class AliasManager implements Reloadable { } public boolean add(String name, String value) { - reload(); - - if(aliases.containsKey(name)) return false; + Log.e("andre", "adding: " + name + " ---> " + value); FileOutputStream fos; try { - fos = new FileOutputStream(new File(Tuils.getFolder(), PATH)); - fos.write((name + "=" + value + Tuils.NEWLINE).getBytes()); + fos = new FileOutputStream(new File(Tuils.getFolder(), PATH), true); + fos.write((Tuils.NEWLINE + name + "=" + value).getBytes()); fos.close(); aliases.put(name, value); 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 fca527a4db89bba4917e44be2f0afda16e96501e..73455dd9907f7d904780b018e239765dd1550fad 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java @@ -7,14 +7,13 @@ import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; +import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; import ohi.andre.comparestring.Compare; import ohi.andre.consolelauncher.LauncherActivity; @@ -25,92 +24,20 @@ public class ContactManager { public static final boolean USE_SCROLL_COMPARE = false; private Context context; + private List<Contact> contacts; public ContactManager(Context context) { this.context = context; - } - - private Map<String, String> getContacts() { - Map<String, String> contacts = new TreeMap<>(); - - 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); - return contacts; - } - - Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); - if (phones != null) { - while (phones.moveToNext()) { -// if(!phones.getString(phones.getColumnIndex("sort_key")).equals("Numero Fittizio")) continue; -// -// for(int count = 0; count < phones.getColumnCount(); count++) { -// -// Log.e("andre", phones.getColumnName(count)); -// int type = phones.getType(count); -// switch (type) { -// case Cursor.FIELD_TYPE_STRING: -// Log.e("andre", "string"); -// Log.e("andre", phones.getString(count)); -// break; -// case Cursor.FIELD_TYPE_FLOAT: -// Log.e("andre", "float"); -// Log.e("andre", String.valueOf(phones.getFloat(count))); -// break; -// case Cursor.FIELD_TYPE_BLOB: -// Log.e("andre", "blob"); -// Log.e("andre", Arrays.toString(phones.getBlob(count))); -// break; -// case Cursor.FIELD_TYPE_INTEGER: -// Log.e("andre", "int"); -// Log.e("andre", String.valueOf(phones.getInt(count))); -// break; -// case Cursor.FIELD_TYPE_NULL: -// Log.e("andre", "null"); -// break; -// } -//// Log.e("andre", phones.getColumnName(count) + ", " + phones.getString(count)); -// } -// Log.e("andre", "#######"); -// - String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); - String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); - - contacts.put(name, phoneNumber); - } - phones.close(); - } - - return contacts; - } - - public List<String> listNames() { - List<String> contacts = new ArrayList<>(); - - 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); - return contacts; - } - - Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME}, null, null, - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); - - if (phones != null) { - while (phones.moveToNext()) { - String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); - contacts.add(name); - } - phones.close(); - } - return contacts; + refreshContacts(this, context); } - public List<Contact> listContacts() { + public static void refreshContacts(ContactManager mgr, Context context) { List<Contact> contacts = new ArrayList<>(); 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); - return contacts; + return; } Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, @@ -132,7 +59,7 @@ public class ContactManager { prim = phones.getInt(phones.getColumnIndex(ContactsContract.Data.IS_SUPER_PRIMARY)); if(prim > 0) { - defaultNumber = lastNumbers.size() - 1; + defaultNumber = lastNumbers.size(); } if(number == null || number.length() == 0) continue; @@ -147,6 +74,8 @@ public class ContactManager { lastNumbers = new ArrayList<>(); nrml = new ArrayList<>(); + name = null; + defaultNumber = 0; name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); } @@ -156,6 +85,10 @@ public class ContactManager { nrml.add(normalized); lastNumbers.add(number); } + + if(name != null && phones.isLast()) { + contacts.add(new Contact(name, lastNumbers, defaultNumber)); + } } phones.close(); } @@ -165,57 +98,39 @@ public class ContactManager { if(cp.get(count).numbers.size() == 0) contacts.remove(count--); } - return contacts; + mgr.contacts = contacts; + Collections.sort(mgr.contacts); } - public List<String> listNamesAndNumbers() { - - List<String> contacts = new ArrayList<>(); - - Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, - new String[] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); - - if (phones != null) { - - int lastId = -1; - List<String> lastNumbers = new ArrayList<>(); - List<String> nrml = new ArrayList<>(); - String name = null; - - while (phones.moveToNext()) { - int id = phones.getInt(phones.getColumnIndex(ContactsContract.Data.CONTACT_ID)); - String number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); - - if(number == null || number.length() == 0) continue; + public List<String> listNames() { + List<String> names = new ArrayList<>(); + for(Contact c : contacts) names.add(c.name); + return names; + } - if(phones.isFirst()) { - lastId = id; - name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); - } else if(id != lastId || phones.isLast()) { - lastId = id; + public List<Contact> getContacts() { + return contacts; + } - for(String n : lastNumbers) { - name = name + Tuils.NEWLINE + "\t\t\t" + n; - } - contacts.add(name); + public List<String> listNamesAndNumbers() { + List<String> c = new ArrayList<>(); - lastNumbers = new ArrayList<>(); - nrml = new ArrayList<>(); + for(int count = 0; count < contacts.size(); count++) { + Contact cnt = contacts.get(count); - name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); - } + StringBuilder b = new StringBuilder(); + b.append(cnt.name); - String normalized = number.replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING); - if(!nrml.contains(normalized)) { - nrml.add(normalized); - lastNumbers.add(number); - } + for(String n : cnt.numbers) { + b.append(Tuils.NEWLINE); + b.append("\t"); + b.append(n); } - phones.close(); + + c.add(b.toString()); } - return contacts; + return c; } public static final int NAME = 0; @@ -294,28 +209,18 @@ public class ContactManager { } public String findNumber(String name, int minRate) { - Map<String, String> contacts = getContacts(); - Set<String> names = contacts.keySet(); + String mostSuitable = Compare.similarString(listNames(), name, minRate, USE_SCROLL_COMPARE); + if(mostSuitable == null) return null; - String mostSuitable = Compare.similarString(names, name, minRate, USE_SCROLL_COMPARE); - return mostSuitable == null ? null : contacts.get(mostSuitable); - } + for(int count = 0; count < contacts.size(); count++) { + Contact c = contacts.get(count); + if(c.name.equals(mostSuitable)) { + if(c.numbers.size() > 0) return c.numbers.get(0); + } + } -// public void delete(String phone) { -// Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, -// new String[] {ContactsContract.Data.CONTACT_ID}, -// ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?", new String[]{phone}, -// null); -// -// if(cursor != null && cursor.getCount() > 0) { -// cursor.moveToNext(); -// String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID)); -// cursor.close(); -// context.getContentResolver().delete(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, -// ContactsContract.Data.CONTACT_ID + " = ?", new String[] {id}); -// } -// -// } + return null; + } public boolean delete(String phone) { return context.getContentResolver().delete(fromPhone(phone), null, null) > 0; @@ -349,7 +254,7 @@ public class ContactManager { return ContactsContract.Contacts.getLookupUri(mCurrentId, mCurrentLookupKey); } - public static class Contact { + public static class Contact implements Comparable<Contact> { public String name; public List<String> numbers = new ArrayList<>(); @@ -364,6 +269,7 @@ public class ContactManager { public void setSelectedNumber(int s) { if(s >= numbers.size()) s = 0; + this.selectedNumber = s; } public int getSelectedNumber() { @@ -374,5 +280,13 @@ public class ContactManager { public String toString() { return name + " : " + numbers.toString(); } + + @Override + public int compareTo(@NonNull Contact o) { + char tf = name.toUpperCase().charAt(0); + char of = o.name.toUpperCase().charAt(0); + + return tf - of; + } } } 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 7e8b2c7226ce2807f66b57d1a087ec037b138b8e..d944a1401a79bf20d13b8b866f2c0fb36c2e8cde 100755 --- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java +++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java @@ -572,7 +572,7 @@ public class XMLPrefsManager { max_lines { @Override public String defaultValue() { - return "100"; + return "300"; } }, time_format { 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 9a493dc39d1e51f4b659934879ccafdbc68e4d28..6fcc3252ce6a0592254c71e4fc427785c78901cc 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 @@ -176,9 +176,18 @@ public class SuggestionsManager { return; } - boolean exec = false; - if(lastWord == null || lastWord.length() == 0) for (String s : cmd.params()) suggestions.add(new Suggestion(before, s, exec, NO_RATE, 0)); - else for (String s : cmd.params()) if (s.startsWith(lastWord)) suggestions.add(new Suggestion(before, s, exec, NO_RATE, 0)); + if(lastWord == null || lastWord.length() == 0) { + for (String s : cmd.params()) { + int[] args = cmd.argsForParam(s); + suggestions.add(new Suggestion(before, s, args == null || args.length == 0, NO_RATE, 0)); + } + } + else { + for (String s : cmd.params()) { + int[] args = cmd.argsForParam(s); + if (s.startsWith(lastWord) || s.replace("-", Tuils.EMPTYSTRING).startsWith(lastWord)) suggestions.add(new Suggestion(before, s, args == null || args.length == 0, NO_RATE, 0)); + } + } } private void suggestArgs(MainPack info, int type, List<Suggestion> suggestions, String prev, String before) { @@ -300,21 +309,21 @@ public class SuggestionsManager { private void suggestContact(MainPack info, List<Suggestion> suggestions, String prev, String before) { if (prev == null || prev.length() == 0) { - for (ContactManager.Contact contact : info.contacts.listContacts()) + for (ContactManager.Contact contact : info.contacts.getContacts()) suggestions.add(new Suggestion(before, contact.name, true, NO_RATE, Suggestion.TYPE_CONTACT, contact)); } else if(prev.length() <= FIRST_INTERVAL) { prev = prev.trim().toLowerCase(); - for (ContactManager.Contact contact : info.contacts.listContacts()) + for (ContactManager.Contact contact : info.contacts.getContacts()) if(contact.name.toLowerCase().trim().startsWith(prev)) { suggestions.add(new Suggestion(before, contact.name, true, NO_RATE, Suggestion.TYPE_CONTACT, contact)); } } else { - for(ContactManager.Contact contact : info.contacts.listContacts()) { + for(ContactManager.Contact contact : info.contacts.getContacts()) { int rate = ContactManager.USE_SCROLL_COMPARE ? Compare.scrollComparison(contact.name, prev) : Compare.linearComparison(contact.name, prev); if(rate >= min_contacts_rate) { suggestions.add(new Suggestion(before, contact.name, true, NO_RATE, Suggestion.TYPE_CONTACT, contact)); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83d5e4b431cb7bbdeb185182103db83983aa9436..38ef6789a645fb2cf2f4451d51ef965bb48b7927 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -138,12 +138,12 @@ \n\nUsage: \n>>apps [option] [app name] \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 + \n-show -> show an hidden app + \n-hide -> hide an app + \n-l -> show details about an app + \n-ps -> show Google Play Store page for an app + \n-st -> show Settings details for an app + \n-frc -> force t-ui to launch an app \n-file -> open apps.xml \nno option -> list your apps \n\nExample: