|
|
@ -24,13 +24,13 @@ import android.annotation.TargetApi;
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.content.pm.ShortcutManager;
|
|
|
|
import android.content.pm.ShortcutManager;
|
|
|
|
|
|
|
|
import android.database.Cursor;
|
|
|
|
import android.graphics.Bitmap;
|
|
|
|
import android.graphics.Bitmap;
|
|
|
|
import android.graphics.BitmapFactory;
|
|
|
|
import android.graphics.BitmapFactory;
|
|
|
|
import android.net.Uri;
|
|
|
|
import android.net.Uri;
|
|
|
|
import android.os.Build;
|
|
|
|
import android.os.Build;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.provider.ContactsContract;
|
|
|
|
import android.provider.ContactsContract;
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
|
|
import androidx.core.app.Person;
|
|
|
|
import androidx.core.app.Person;
|
|
|
@ -41,7 +41,10 @@ import androidx.lifecycle.LifecycleOwner;
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
|
|
public class Shortcuts {
|
|
|
|
public class Shortcuts {
|
|
|
|
static void update(final Context context, final LifecycleOwner owner) {
|
|
|
|
static void update(final Context context, final LifecycleOwner owner) {
|
|
|
@ -58,23 +61,34 @@ public class Shortcuts {
|
|
|
|
int count = app - manifest;
|
|
|
|
int count = app - manifest;
|
|
|
|
Log.i("Shortcuts count=" + count + " app=" + app + " manifest=" + manifest);
|
|
|
|
Log.i("Shortcuts count=" + count + " app=" + app + " manifest=" + manifest);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DB db = DB.getInstance(context);
|
|
|
|
|
|
|
|
List<String> emails = new ArrayList<>();
|
|
|
|
List<ShortcutInfoCompat> shortcuts = new ArrayList<>();
|
|
|
|
List<ShortcutInfoCompat> shortcuts = new ArrayList<>();
|
|
|
|
if (count > 0) {
|
|
|
|
try (Cursor cursor = db.contact().getFrequentlyContacted()) {
|
|
|
|
DB db = DB.getInstance(context);
|
|
|
|
int colEmail = cursor.getColumnIndex("email");
|
|
|
|
List<EntityContact> frequently = db.contact().getFrequentlyContacted(count);
|
|
|
|
int colName = cursor.getColumnIndex("name");
|
|
|
|
for (EntityContact contact : frequently) {
|
|
|
|
int colAvatar = cursor.getColumnIndex("avatar");
|
|
|
|
|
|
|
|
while (shortcuts.size() < count && cursor.moveToNext()) {
|
|
|
|
|
|
|
|
String email = cursor.getString(colEmail);
|
|
|
|
|
|
|
|
String name = (cursor.isNull(colName) ? null : cursor.getString(colName));
|
|
|
|
|
|
|
|
String avatar = (cursor.isNull(colAvatar) ? null : cursor.getString(colAvatar));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (emails.contains(email))
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
emails.add(email);
|
|
|
|
|
|
|
|
|
|
|
|
Intent intent = new Intent(context, ActivityMain.class);
|
|
|
|
Intent intent = new Intent(context, ActivityMain.class);
|
|
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
|
|
intent.setAction(Intent.ACTION_SEND);
|
|
|
|
intent.setAction(Intent.ACTION_SEND);
|
|
|
|
intent.addCategory(Intent.CATEGORY_DEFAULT);
|
|
|
|
intent.addCategory(Intent.CATEGORY_DEFAULT);
|
|
|
|
intent.setData(Uri.parse("mailto:" + contact.email));
|
|
|
|
intent.setData(Uri.parse("mailto:" + email));
|
|
|
|
|
|
|
|
|
|
|
|
IconCompat icon = null;
|
|
|
|
IconCompat icon = null;
|
|
|
|
if (contact.avatar != null &&
|
|
|
|
if (avatar != null &&
|
|
|
|
Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) {
|
|
|
|
Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) {
|
|
|
|
// Create icon from bitmap because launcher might not have contacts permission
|
|
|
|
// Create icon from bitmap because launcher might not have contacts permission
|
|
|
|
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(
|
|
|
|
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(
|
|
|
|
context.getContentResolver(), Uri.parse(contact.avatar));
|
|
|
|
context.getContentResolver(), Uri.parse(avatar));
|
|
|
|
Bitmap bitmap = BitmapFactory.decodeStream(is);
|
|
|
|
Bitmap bitmap = BitmapFactory.decodeStream(is);
|
|
|
|
if (bitmap != null)
|
|
|
|
if (bitmap != null)
|
|
|
|
icon = IconCompat.createWithBitmap(bitmap);
|
|
|
|
icon = IconCompat.createWithBitmap(bitmap);
|
|
|
@ -82,25 +96,24 @@ public class Shortcuts {
|
|
|
|
if (icon == null)
|
|
|
|
if (icon == null)
|
|
|
|
icon = IconCompat.createWithResource(context, R.drawable.ic_shortcut_email);
|
|
|
|
icon = IconCompat.createWithResource(context, R.drawable.ic_shortcut_email);
|
|
|
|
|
|
|
|
|
|
|
|
String name = (TextUtils.isEmpty(contact.name) ? contact.email : contact.name);
|
|
|
|
Set<String> categories = new HashSet<>(Arrays.asList("eu.faircode.email.TEXT_SHARE_TARGET"));
|
|
|
|
|
|
|
|
|
|
|
|
//Set<String> categories = new HashSet<>(Arrays.asList(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(context, Long.toString(contact.id))
|
|
|
|
String id = (name == null ? email : "\"" + name + "\" <" + email + ">");
|
|
|
|
|
|
|
|
ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(context, id)
|
|
|
|
.setIcon(icon)
|
|
|
|
.setIcon(icon)
|
|
|
|
.setRank(shortcuts.size() + 1)
|
|
|
|
.setRank(shortcuts.size() + 1)
|
|
|
|
.setShortLabel(name)
|
|
|
|
.setShortLabel(name == null ? email : name)
|
|
|
|
.setLongLabel(name)
|
|
|
|
.setLongLabel(name == null ? email : name)
|
|
|
|
//.setCategories(categories)
|
|
|
|
.setCategories(categories)
|
|
|
|
.setIntent(intent);
|
|
|
|
.setIntent(intent);
|
|
|
|
|
|
|
|
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
|
|
Person.Builder person = new Person.Builder()
|
|
|
|
Person.Builder person = new Person.Builder()
|
|
|
|
.setIcon(icon)
|
|
|
|
.setIcon(icon)
|
|
|
|
.setName(name)
|
|
|
|
.setName(name == null ? email : name)
|
|
|
|
.setImportant(true);
|
|
|
|
.setImportant(true);
|
|
|
|
if (contact.avatar != null)
|
|
|
|
if (avatar != null)
|
|
|
|
person.setUri(contact.avatar);
|
|
|
|
person.setUri(avatar);
|
|
|
|
builder.setPerson(person.build());
|
|
|
|
builder.setPerson(person.build());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -114,6 +127,7 @@ public class Shortcuts {
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@TargetApi(Build.VERSION_CODES.N_MR1)
|
|
|
|
@TargetApi(Build.VERSION_CODES.N_MR1)
|
|
|
|
protected void onExecuted(Bundle args, List<ShortcutInfoCompat> shortcuts) {
|
|
|
|
protected void onExecuted(Bundle args, List<ShortcutInfoCompat> shortcuts) {
|
|
|
|
|
|
|
|
ShortcutManagerCompat.removeAllDynamicShortcuts(context);
|
|
|
|
ShortcutManagerCompat.addDynamicShortcuts(context, shortcuts);
|
|
|
|
ShortcutManagerCompat.addDynamicShortcuts(context, shortcuts);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|