Added fail safes

pull/178/head
M66B 5 years ago
parent 58ad6b0465
commit d89c6fe433

@ -699,39 +699,43 @@ public class FragmentCompose extends FragmentBase {
@Override @Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) { public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
int id = view.getId(); try {
if (id == R.id.tvName) { int id = view.getId();
if (colName < 0) if (id == R.id.tvName) {
colName = cursor.getColumnIndex("name"); if (colName < 0)
colName = cursor.getColumnIndex("name");
if (cursor.isNull(colName)) {
((TextView) view).setText("-"); if (cursor.isNull(colName)) {
return true; ((TextView) view).setText("-");
} return true;
} else if (id == R.id.ivPhoto) { }
if (colLocal < 0) } else if (id == R.id.ivPhoto) {
colLocal = cursor.getColumnIndex("local"); if (colLocal < 0)
colLocal = cursor.getColumnIndex("local");
ImageView photo = (ImageView) view;
GradientDrawable bg = new GradientDrawable(); ImageView photo = (ImageView) view;
if (circular)
bg.setShape(GradientDrawable.OVAL);
else
bg.setCornerRadius(dp3);
photo.setBackground(bg);
photo.setClipToOutline(true);
if (cursor.getInt(colLocal) == 1) GradientDrawable bg = new GradientDrawable();
photo.setImageDrawable(null); if (circular)
else { bg.setShape(GradientDrawable.OVAL);
String uri = cursor.getString(columnIndex);
if (uri == null)
photo.setImageResource(R.drawable.baseline_person_24);
else else
photo.setImageURI(Uri.parse(uri)); bg.setCornerRadius(dp3);
photo.setBackground(bg);
photo.setClipToOutline(true);
if (cursor.getInt(colLocal) == 1)
photo.setImageDrawable(null);
else {
String uri = cursor.getString(columnIndex);
if (uri == null)
photo.setImageResource(R.drawable.baseline_person_24);
else
photo.setImageURI(Uri.parse(uri));
}
return true;
} }
return true; } catch (Throwable ex) {
Log.e(ex);
} }
return false; return false;
} }
@ -742,132 +746,142 @@ public class FragmentCompose extends FragmentBase {
private int colEmail = -1; private int colEmail = -1;
public CharSequence convertToString(Cursor cursor) { public CharSequence convertToString(Cursor cursor) {
if (colName < 0) try {
colName = cursor.getColumnIndex("name"); if (colName < 0)
if (colEmail < 0) colName = cursor.getColumnIndex("name");
colEmail = cursor.getColumnIndex("email"); if (colEmail < 0)
colEmail = cursor.getColumnIndex("email");
String name = cursor.getString(colName);
String email = MessageHelper.sanitizeEmail(cursor.getString(colEmail)); String name = cursor.getString(colName);
StringBuilder sb = new StringBuilder(); String email = MessageHelper.sanitizeEmail(cursor.getString(colEmail));
if (name == null) StringBuilder sb = new StringBuilder();
sb.append(email); if (name == null)
else { sb.append(email);
sb.append("\"").append(name).append("\" "); else {
sb.append("<").append(email).append(">"); sb.append("\"").append(name).append("\" ");
sb.append("<").append(email).append(">");
}
return sb.toString();
} catch (Throwable ex) {
Log.e(ex);
return ex.toString();
} }
return sb.toString();
} }
}); });
cadapter.setFilterQueryProvider(new FilterQueryProvider() { cadapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence typed) { public Cursor runQuery(CharSequence typed) {
Log.i("Suggest contact=" + typed);
MatrixCursor result = new MatrixCursor(new String[]{"_id", "name", "email", "photo", "local"}); MatrixCursor result = new MatrixCursor(new String[]{"_id", "name", "email", "photo", "local"});
if (typed == null)
return result;
String wildcard = "%" + typed + "%";
Map<String, EntityContact> map = new HashMap<>();
boolean contacts = Helper.hasPermission(getContext(), Manifest.permission.READ_CONTACTS);
if (contacts) {
Cursor cursor = resolver.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[]{
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.Contacts.PHOTO_THUMBNAIL_URI
},
ContactsContract.CommonDataKinds.Email.DATA + " <> ''" +
" AND (" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?" +
" OR " + ContactsContract.CommonDataKinds.Email.DATA + " LIKE ?)",
new String[]{wildcard, wildcard},
null);
while (cursor != null && cursor.moveToNext()) { try {
EntityContact item = new EntityContact(); Log.i("Suggest contact=" + typed);
item.id = 0L; if (typed == null)
item.name = cursor.getString(0); return result;
item.email = cursor.getString(1);
item.avatar = cursor.getString(2); String wildcard = "%" + typed + "%";
item.times_contacted = 0; Map<String, EntityContact> map = new HashMap<>();
item.last_contacted = 0L;
EntityContact existing = map.get(item.email); boolean contacts = Helper.hasPermission(getContext(), Manifest.permission.READ_CONTACTS);
if (existing == null || if (contacts) {
(existing.avatar == null && item.avatar != null)) Cursor cursor = resolver.query(
map.put(item.email, item); ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[]{
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.Contacts.PHOTO_THUMBNAIL_URI
},
ContactsContract.CommonDataKinds.Email.DATA + " <> ''" +
" AND (" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?" +
" OR " + ContactsContract.CommonDataKinds.Email.DATA + " LIKE ?)",
new String[]{wildcard, wildcard},
null);
while (cursor != null && cursor.moveToNext()) {
EntityContact item = new EntityContact();
item.id = 0L;
item.name = cursor.getString(0);
item.email = cursor.getString(1);
item.avatar = cursor.getString(2);
item.times_contacted = 0;
item.last_contacted = 0L;
EntityContact existing = map.get(item.email);
if (existing == null ||
(existing.avatar == null && item.avatar != null))
map.put(item.email, item);
}
} }
}
List<EntityContact> items = new ArrayList<>(); List<EntityContact> items = new ArrayList<>();
if (suggest_sent) if (suggest_sent)
items.addAll(db.contact().searchContacts(null, EntityContact.TYPE_TO, wildcard)); items.addAll(db.contact().searchContacts(null, EntityContact.TYPE_TO, wildcard));
if (suggest_received) if (suggest_received)
items.addAll(db.contact().searchContacts(null, EntityContact.TYPE_FROM, wildcard)); items.addAll(db.contact().searchContacts(null, EntityContact.TYPE_FROM, wildcard));
for (EntityContact item : items) { for (EntityContact item : items) {
EntityContact existing = map.get(item.email); EntityContact existing = map.get(item.email);
if (existing == null) if (existing == null)
map.put(item.email, item); map.put(item.email, item);
else { else {
existing.times_contacted = Math.max(existing.times_contacted, item.times_contacted); existing.times_contacted = Math.max(existing.times_contacted, item.times_contacted);
existing.last_contacted = Math.max(existing.last_contacted, item.last_contacted); existing.last_contacted = Math.max(existing.last_contacted, item.last_contacted);
}
} }
}
items = new ArrayList<>(map.values()); items = new ArrayList<>(map.values());
final Collator collator = Collator.getInstance(Locale.getDefault()); final Collator collator = Collator.getInstance(Locale.getDefault());
collator.setStrength(Collator.SECONDARY); // Case insensitive, process accents etc collator.setStrength(Collator.SECONDARY); // Case insensitive, process accents etc
Collections.sort(items, new Comparator<EntityContact>() { Collections.sort(items, new Comparator<EntityContact>() {
@Override @Override
public int compare(EntityContact i1, EntityContact i2) { public int compare(EntityContact i1, EntityContact i2) {
try { try {
if (suggest_frequently) { if (suggest_frequently) {
int t = -i1.times_contacted.compareTo(i2.times_contacted); int t = -i1.times_contacted.compareTo(i2.times_contacted);
if (t != 0) if (t != 0)
return t; return t;
int l = -i1.last_contacted.compareTo(i2.last_contacted); int l = -i1.last_contacted.compareTo(i2.last_contacted);
if (l != 0) if (l != 0)
return l; return l;
} else { } else {
int a = -Boolean.compare(i1.id == 0, i2.id == 0); int a = -Boolean.compare(i1.id == 0, i2.id == 0);
if (a != 0) if (a != 0)
return a; return a;
} }
if (TextUtils.isEmpty(i1.name) && TextUtils.isEmpty(i2.name)) if (TextUtils.isEmpty(i1.name) && TextUtils.isEmpty(i2.name))
return 0; return 0;
if (TextUtils.isEmpty(i1.name) && !TextUtils.isEmpty(i2.name)) if (TextUtils.isEmpty(i1.name) && !TextUtils.isEmpty(i2.name))
return 1; return 1;
if (!TextUtils.isEmpty(i1.name) && TextUtils.isEmpty(i2.name)) if (!TextUtils.isEmpty(i1.name) && TextUtils.isEmpty(i2.name))
return -1; return -1;
int n = collator.compare(i1.name, i2.name); int n = collator.compare(i1.name, i2.name);
if (n != 0) if (n != 0)
return n; return n;
return collator.compare(i1.email, i2.email); return collator.compare(i1.email, i2.email);
} catch (Throwable ex) { } catch (Throwable ex) {
Log.e(ex); Log.e(ex);
return 0; return 0;
}
} }
} });
});
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
EntityContact item = items.get(i); EntityContact item = items.get(i);
result.newRow() result.newRow()
.add(i + 1) // id .add(i + 1) // id
.add(item.name) .add(item.name)
.add(item.email) .add(item.email)
.add(item.avatar) .add(item.avatar)
.add(item.id == 0 ? 0 : 1); .add(item.id == 0 ? 0 : 1);
}
} catch (Throwable ex) {
Log.e(ex);
} }
Log.i("Suggesting contacts=" + result.getCount());
return result; return result;
} }
}); });

Loading…
Cancel
Save