mirror of
https://github.com/M66B/FairEmail.git
synced 2025-01-01 12:44:42 +00:00
Use local database for frequently used contacts
This commit is contained in:
parent
0b10f00368
commit
843cd61e51
2 changed files with 31 additions and 57 deletions
|
@ -33,7 +33,6 @@ import android.content.SharedPreferences;
|
||||||
import android.content.pm.ShortcutInfo;
|
import android.content.pm.ShortcutInfo;
|
||||||
import android.content.pm.ShortcutManager;
|
import android.content.pm.ShortcutManager;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.database.Cursor;
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.drawable.Icon;
|
import android.graphics.drawable.Icon;
|
||||||
|
@ -798,64 +797,34 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
|
||||||
" manifest=" + sm.getManifestShortcuts().size());
|
" manifest=" + sm.getManifestShortcuts().size());
|
||||||
|
|
||||||
List<ShortcutInfo> shortcuts = new ArrayList<>();
|
List<ShortcutInfo> shortcuts = new ArrayList<>();
|
||||||
|
if (count > 0) {
|
||||||
|
DB db = DB.getInstance(context);
|
||||||
|
List<EntityContact> frequently = db.contact().getFrequentlyContacted(count);
|
||||||
|
for (EntityContact contact : frequently) {
|
||||||
|
Intent intent = new Intent(context, ActivityCompose.class);
|
||||||
|
intent.setAction(Intent.ACTION_SEND);
|
||||||
|
intent.setData(Uri.parse("mailto:" + contact.email));
|
||||||
|
|
||||||
if (hasPermission(Manifest.permission.READ_CONTACTS)) {
|
Icon icon = null;
|
||||||
// https://developer.android.com/guide/topics/providers/contacts-provider#ObsoleteData
|
if (contact.avatar != null &&
|
||||||
try (Cursor cursor = getContentResolver().query(
|
Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) {
|
||||||
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
|
// Create icon from bitmap because launcher might not have contacts permission
|
||||||
new String[]{
|
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(
|
||||||
ContactsContract.RawContacts._ID,
|
getContentResolver(), Uri.parse(contact.avatar));
|
||||||
ContactsContract.Contacts.LOOKUP_KEY,
|
Bitmap bitmap = BitmapFactory.decodeStream(is);
|
||||||
ContactsContract.Contacts.DISPLAY_NAME,
|
if (bitmap != null)
|
||||||
ContactsContract.CommonDataKinds.Email.DATA,
|
icon = Icon.createWithBitmap(bitmap);
|
||||||
ContactsContract.Contacts.STARRED,
|
}
|
||||||
ContactsContract.Contacts.TIMES_CONTACTED,
|
if (icon == null)
|
||||||
ContactsContract.Contacts.LAST_TIME_CONTACTED
|
icon = Icon.createWithResource(context, R.drawable.ic_shortcut_email);
|
||||||
},
|
|
||||||
ContactsContract.CommonDataKinds.Email.DATA + " <> ''",
|
|
||||||
null,
|
|
||||||
ContactsContract.Contacts.STARRED + " DESC" +
|
|
||||||
", " + ContactsContract.Contacts.TIMES_CONTACTED + " DESC" +
|
|
||||||
", " + ContactsContract.Contacts.LAST_TIME_CONTACTED + " DESC")) {
|
|
||||||
while (cursor != null && cursor.moveToNext() && shortcuts.size() < count)
|
|
||||||
try {
|
|
||||||
long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts._ID));
|
|
||||||
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
|
|
||||||
String email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
|
|
||||||
int starred = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.STARRED));
|
|
||||||
int times = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.TIMES_CONTACTED));
|
|
||||||
long last = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts.LAST_TIME_CONTACTED));
|
|
||||||
|
|
||||||
Log.i("Shortcut id=" + id + " email=" + email +
|
shortcuts.add(
|
||||||
" starred=" + starred + " times=" + times + " last=" + last);
|
new ShortcutInfo.Builder(context, Long.toString(contact.id))
|
||||||
|
.setIcon(icon)
|
||||||
if (starred == 0 && times == 0 && last == 0)
|
.setRank(shortcuts.size() + 1)
|
||||||
continue;
|
.setShortLabel(contact.name == null ? contact.email : contact.name)
|
||||||
|
.setIntent(intent)
|
||||||
Uri uri = ContactsContract.Contacts.getLookupUri(
|
.build());
|
||||||
cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts._ID)),
|
|
||||||
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)));
|
|
||||||
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(
|
|
||||||
getContentResolver(), uri);
|
|
||||||
Bitmap bitmap = BitmapFactory.decodeStream(is);
|
|
||||||
Icon icon = (bitmap == null
|
|
||||||
? Icon.createWithResource(context, R.drawable.ic_shortcut_email)
|
|
||||||
: Icon.createWithBitmap(bitmap));
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, ActivityCompose.class);
|
|
||||||
intent.setAction(Intent.ACTION_SEND);
|
|
||||||
intent.setData(Uri.parse("mailto:" + email));
|
|
||||||
|
|
||||||
shortcuts.add(
|
|
||||||
new ShortcutInfo.Builder(context, Long.toString(id))
|
|
||||||
.setIcon(icon)
|
|
||||||
.setRank(shortcuts.size() + 1)
|
|
||||||
.setShortLabel(name)
|
|
||||||
.setIntent(intent)
|
|
||||||
.build());
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
Log.e(ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,11 @@ public interface DaoContact {
|
||||||
" ORDER BY times_contacted DESC, last_contacted DESC")
|
" ORDER BY times_contacted DESC, last_contacted DESC")
|
||||||
LiveData<List<EntityContact>> liveContacts();
|
LiveData<List<EntityContact>> liveContacts();
|
||||||
|
|
||||||
|
@Query("SELECT * FROM contact" +
|
||||||
|
" ORDER BY times_contacted DESC, last_contacted DESC" +
|
||||||
|
" LIMIT :count")
|
||||||
|
List<EntityContact> getFrequentlyContacted(int count);
|
||||||
|
|
||||||
@Query("SELECT *" +
|
@Query("SELECT *" +
|
||||||
" FROM contact" +
|
" FROM contact" +
|
||||||
" WHERE email = :email" +
|
" WHERE email = :email" +
|
||||||
|
|
Loading…
Reference in a new issue