|
|
|
@ -21,6 +21,7 @@ package eu.faircode.email;
|
|
|
|
|
|
|
|
|
|
import android.Manifest;
|
|
|
|
|
import android.annotation.TargetApi;
|
|
|
|
|
import android.content.ContentResolver;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.content.Intent;
|
|
|
|
|
import android.content.SharedPreferences;
|
|
|
|
@ -32,6 +33,7 @@ import android.net.Uri;
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.provider.ContactsContract;
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
import androidx.core.app.Person;
|
|
|
|
@ -41,6 +43,8 @@ import androidx.core.graphics.drawable.IconCompat;
|
|
|
|
|
import androidx.lifecycle.LifecycleOwner;
|
|
|
|
|
import androidx.preference.PreferenceManager;
|
|
|
|
|
|
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
@ -48,6 +52,8 @@ import java.util.HashSet;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
import javax.mail.internet.InternetAddress;
|
|
|
|
|
|
|
|
|
|
class Shortcuts {
|
|
|
|
|
private static final int MAX_SHORTCUTS = 4;
|
|
|
|
|
|
|
|
|
@ -87,48 +93,10 @@ class Shortcuts {
|
|
|
|
|
if (emails.contains(email))
|
|
|
|
|
continue;
|
|
|
|
|
emails.add(email);
|
|
|
|
|
EntityLog.log(context, "Shortcut email=" + email);
|
|
|
|
|
|
|
|
|
|
Intent intent = new Intent(context, ActivityMain.class);
|
|
|
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
|
|
|
intent.setAction(Intent.ACTION_SEND);
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_DEFAULT);
|
|
|
|
|
intent.setData(Uri.parse("mailto:" + email));
|
|
|
|
|
|
|
|
|
|
IconCompat icon = null;
|
|
|
|
|
if (avatar != null &&
|
|
|
|
|
Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) {
|
|
|
|
|
// Create icon from bitmap because launcher might not have contacts permission
|
|
|
|
|
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(
|
|
|
|
|
context.getContentResolver(), Uri.parse(avatar));
|
|
|
|
|
Bitmap bitmap = BitmapFactory.decodeStream(is);
|
|
|
|
|
if (bitmap != null)
|
|
|
|
|
icon = IconCompat.createWithBitmap(bitmap);
|
|
|
|
|
}
|
|
|
|
|
if (icon == null)
|
|
|
|
|
icon = IconCompat.createWithResource(context, R.drawable.ic_shortcut_email);
|
|
|
|
|
|
|
|
|
|
Set<String> categories = new HashSet<>(Arrays.asList("eu.faircode.email.TEXT_SHARE_TARGET"));
|
|
|
|
|
|
|
|
|
|
String id = (name == null ? email : "\"" + name + "\" <" + email + ">");
|
|
|
|
|
ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(context, id)
|
|
|
|
|
.setIcon(icon)
|
|
|
|
|
.setRank(shortcuts.size() + 1)
|
|
|
|
|
.setShortLabel(name == null ? email : name)
|
|
|
|
|
.setLongLabel(name == null ? email : name)
|
|
|
|
|
.setCategories(categories)
|
|
|
|
|
.setIntent(intent);
|
|
|
|
|
|
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
|
|
|
Person.Builder person = new Person.Builder()
|
|
|
|
|
.setIcon(icon)
|
|
|
|
|
.setName(name == null ? email : name)
|
|
|
|
|
.setImportant(true);
|
|
|
|
|
if (avatar != null)
|
|
|
|
|
person.setUri(avatar);
|
|
|
|
|
builder.setPerson(person.build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EntityLog.log(context, "Shortcut email=" + email);
|
|
|
|
|
ShortcutInfoCompat.Builder builder = getShortcut(context, email, name, avatar);
|
|
|
|
|
builder.setRank(shortcuts.size() + 1);
|
|
|
|
|
shortcuts.add(builder.build());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -149,4 +117,94 @@ class Shortcuts {
|
|
|
|
|
}
|
|
|
|
|
}.execute(context, owner, new Bundle(), "shortcuts:update");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
|
static ShortcutInfoCompat.Builder getShortcut(Context context, InternetAddress address) {
|
|
|
|
|
String name = address.getPersonal();
|
|
|
|
|
String email = address.getAddress();
|
|
|
|
|
|
|
|
|
|
Uri lookupUri = null;
|
|
|
|
|
boolean contacts = Helper.hasPermission(context, Manifest.permission.READ_CONTACTS);
|
|
|
|
|
if (contacts) {
|
|
|
|
|
ContentResolver resolver = context.getContentResolver();
|
|
|
|
|
try (Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
|
|
|
|
|
new String[]{
|
|
|
|
|
ContactsContract.CommonDataKinds.Photo.CONTACT_ID,
|
|
|
|
|
ContactsContract.Contacts.LOOKUP_KEY,
|
|
|
|
|
ContactsContract.Contacts.DISPLAY_NAME
|
|
|
|
|
},
|
|
|
|
|
ContactsContract.CommonDataKinds.Email.ADDRESS + " = ?",
|
|
|
|
|
new String[]{email}, null)) {
|
|
|
|
|
if (cursor != null && cursor.moveToNext()) {
|
|
|
|
|
int colContactId = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo.CONTACT_ID);
|
|
|
|
|
int colLookupKey = cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY);
|
|
|
|
|
int colDisplayName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
|
|
|
|
|
|
|
|
|
|
long contactId = cursor.getLong(colContactId);
|
|
|
|
|
String lookupKey = cursor.getString(colLookupKey);
|
|
|
|
|
String displayName = cursor.getString(colDisplayName);
|
|
|
|
|
|
|
|
|
|
lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
|
|
|
|
|
if (!TextUtils.isEmpty(displayName))
|
|
|
|
|
name = displayName;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return getShortcut(context, email, name, lookupUri);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
|
static ShortcutInfoCompat.Builder getShortcut(Context context, EntityContact contact) {
|
|
|
|
|
return getShortcut(context, contact.email, contact.name, contact.avatar);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
|
private static ShortcutInfoCompat.Builder getShortcut(Context context, String email, String name, String avatar) {
|
|
|
|
|
return getShortcut(context, email, name, avatar == null ? null : Uri.parse(avatar));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
|
private static ShortcutInfoCompat.Builder getShortcut(Context context, String email, String name, Uri avatar) {
|
|
|
|
|
Intent intent = new Intent(context, ActivityMain.class);
|
|
|
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
|
|
|
intent.setAction(Intent.ACTION_SEND);
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_DEFAULT);
|
|
|
|
|
intent.setData(Uri.parse("mailto:" + email));
|
|
|
|
|
|
|
|
|
|
IconCompat icon = null;
|
|
|
|
|
if (avatar != null &&
|
|
|
|
|
Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) {
|
|
|
|
|
// Create icon from bitmap because launcher might not have contacts permission
|
|
|
|
|
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(
|
|
|
|
|
context.getContentResolver(), avatar);
|
|
|
|
|
Bitmap bitmap = BitmapFactory.decodeStream(is);
|
|
|
|
|
if (bitmap != null)
|
|
|
|
|
icon = IconCompat.createWithBitmap(bitmap);
|
|
|
|
|
}
|
|
|
|
|
if (icon == null)
|
|
|
|
|
icon = IconCompat.createWithResource(context, R.drawable.ic_shortcut_email);
|
|
|
|
|
|
|
|
|
|
Set<String> categories = new HashSet<>(Arrays.asList("eu.faircode.email.TEXT_SHARE_TARGET"));
|
|
|
|
|
|
|
|
|
|
String id = (name == null ? email : "\"" + name + "\" <" + email + ">");
|
|
|
|
|
ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(context, id)
|
|
|
|
|
.setIcon(icon)
|
|
|
|
|
.setShortLabel(name == null ? email : name)
|
|
|
|
|
.setLongLabel(name == null ? email : name)
|
|
|
|
|
.setCategories(categories)
|
|
|
|
|
.setIntent(intent);
|
|
|
|
|
|
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
|
|
|
Person.Builder person = new Person.Builder()
|
|
|
|
|
.setIcon(icon)
|
|
|
|
|
.setName(name == null ? email : name)
|
|
|
|
|
.setImportant(true);
|
|
|
|
|
if (avatar != null)
|
|
|
|
|
person.setUri(avatar.toString());
|
|
|
|
|
builder.setPerson(person.build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return builder;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|