diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 3a7ad91529..f7c3872e60 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -1458,6 +1458,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB args.putLong("id", intent.getLongExtra("id", -1)); args.putBoolean("filter_archive", intent.getBooleanExtra("filter_archive", true)); args.putBoolean("found", found); + args.putBoolean("pinned", intent.getBooleanExtra("pinned", false)); FragmentMessages fragment = new FragmentMessages(); fragment.setArguments(args); diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index ad1e69a61f..9f0a02ce5b 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -116,6 +116,7 @@ import androidx.core.content.FileProvider; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; import androidx.core.graphics.ColorUtils; +import androidx.core.graphics.drawable.IconCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; @@ -4157,6 +4158,7 @@ public class AdapterMessage extends RecyclerView.Adapter() { + @Override + protected ContactInfo[] onExecute(Context context, Bundle args) { + long account = args.getLong("account"); + String folderType = args.getString("folderType"); + Address[] addresses = (Address[]) args.getSerializable("addresses"); + return ContactInfo.get(context, account, folderType, addresses); + } + + @Override + protected void onExecuted(Bundle args, ContactInfo[] contactInfo) { + Intent thread = new Intent(context, ActivityView.class); + thread.setAction("thread:" + message.id); + thread.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + thread.putExtra("account", message.account); + thread.putExtra("folder", message.folder); + thread.putExtra("thread", message.thread); + thread.putExtra("filter_archive", true); + thread.putExtra("pinned", true); + + Bitmap bm; + if (contactInfo[0].hasPhoto()) + bm = contactInfo[0].getPhotoBitmap(); + else { + int resid = R.drawable.baseline_mail_24; + Drawable d = context.getDrawable(resid); + bm = Bitmap.createBitmap( + d.getIntrinsicWidth(), + d.getIntrinsicHeight(), + Bitmap.Config.ARGB_8888); + } + + String label = (TextUtils.isEmpty(message.subject) ? context.getString(R.string.app_name) : message.subject); + + IconCompat icon = IconCompat.createWithBitmap(bm); + String id = "message:" + message.id; + ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(context, id) + .setIcon(icon) + .setShortLabel(label) + .setLongLabel(label) + .setIntent(thread); + + ShortcutManagerCompat.requestPinShortcut(context, builder.build(), null); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(parentFragment.getParentFragmentManager(), ex); + } + }.execute(context, owner, args, "message:pin"); + } + private void onMenuPrint(TupleMessageEx message) { Bundle args = new Bundle(); args.putLong("id", message.id); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index cb156403fb..6b5dad71bc 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -277,6 +277,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. private long id; private boolean filter_archive; private boolean found; + private boolean pinned; private BoundaryCallbackMessages.SearchCriteria criteria = null; private boolean pane; @@ -388,6 +389,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. id = args.getLong("id", -1); filter_archive = args.getBoolean("filter_archive", true); found = args.getBoolean("found", false); + pinned = args.getBoolean("pinned", false); criteria = (BoundaryCallbackMessages.SearchCriteria) args.getSerializable("criteria"); pane = args.getBoolean("pane", false); primary = args.getLong("primary", -1); @@ -4836,6 +4838,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. private boolean handleThreadActions( @NonNull PagedList messages, ArrayList targets, List removed) { + if (messages.size() == 0 && pinned) + return false; + // Auto close / next if (messages.size() == 0 && (autoclose || onclose != null)) { handleAutoClose(); diff --git a/app/src/main/res/menu/popup_message_more.xml b/app/src/main/res/menu/popup_message_more.xml index 03ad07c440..8db0b44db5 100644 --- a/app/src/main/res/menu/popup_message_more.xml +++ b/app/src/main/res/menu/popup_message_more.xml @@ -72,6 +72,10 @@ android:id="@+id/menu_share" android:title="@string/title_share" /> + +