Added direct text share

pull/177/head
M66B 5 years ago
parent 25a1df8350
commit 74f4ffa7de

@ -34,4 +34,9 @@
android:targetPackage="eu.faircode.email.debug" /> android:targetPackage="eu.faircode.email.debug" />
<categories android:name="android.shortcut.conversation" /> <categories android:name="android.shortcut.conversation" />
</shortcut> </shortcut>
<share-target android:targetClass="eu.faircode.email.ActivityMain">
<category android:name="eu.faircode.email.TEXT_SHARE_TARGET" />
<data android:mimeType="text/plain" />
</share-target>
</shortcuts> </shortcuts>

@ -97,6 +97,17 @@ public class ActivityCompose extends ActivityBase implements FragmentManager.OnB
args.putString("body", body); args.putString("body", body);
} }
if (intent.hasExtra(Intent.EXTRA_SHORTCUT_ID)) {
String to = intent.getStringExtra(Intent.EXTRA_SHORTCUT_ID);
if (to != null)
try {
InternetAddress.parse(to);
args.putString("to", to);
} catch (AddressException ex) {
Log.w(ex);
}
}
if (intent.hasExtra(Intent.EXTRA_EMAIL)) { if (intent.hasExtra(Intent.EXTRA_EMAIL)) {
String[] to = intent.getStringArrayExtra(Intent.EXTRA_EMAIL); String[] to = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);
if (to != null) if (to != null)

@ -41,15 +41,14 @@ public interface DaoContact {
" ORDER BY times_contacted DESC, last_contacted DESC") " ORDER BY times_contacted DESC, last_contacted DESC")
LiveData<List<TupleContactEx>> liveContacts(); LiveData<List<TupleContactEx>> liveContacts();
@Query("SELECT * FROM contact" + @Query("SELECT email, name, avatar FROM contact" +
" WHERE state <> " + EntityContact.STATE_IGNORE + " WHERE state <> " + EntityContact.STATE_IGNORE +
" ORDER BY" + " ORDER BY" +
" CASE WHEN state = " + EntityContact.STATE_FAVORITE + " THEN 0 ELSE 1 END" + " CASE WHEN state = " + EntityContact.STATE_FAVORITE + " THEN 0 ELSE 1 END" +
", CASE WHEN avatar IS NULL THEN 1 ELSE 0 END" + ", CASE WHEN avatar IS NULL THEN 1 ELSE 0 END" +
", times_contacted DESC" + ", times_contacted DESC" +
", last_contacted DESC" + ", last_contacted DESC")
" LIMIT :count") Cursor getFrequentlyContacted();
List<EntityContact> getFrequentlyContacted(int count);
@Query("SELECT *" + @Query("SELECT *" +
" FROM contact" + " FROM contact" +

@ -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);
} }

@ -34,4 +34,9 @@
android:targetPackage="eu.faircode.email" /> android:targetPackage="eu.faircode.email" />
<categories android:name="android.shortcut.conversation" /> <categories android:name="android.shortcut.conversation" />
</shortcut> </shortcut>
<share-target android:targetClass="eu.faircode.email.ActivityMain">
<category android:name="eu.faircode.email.TEXT_SHARE_TARGET" />
<data android:mimeType="text/plain" />
</share-target>
</shortcuts> </shortcuts>
Loading…
Cancel
Save