diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 3778eb3bed..04a7d58b4f 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -130,6 +130,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES"; static final String ACTION_SEARCH_ADDRESS = BuildConfig.APPLICATION_ID + ".SEARCH_ADDRESS"; static final String ACTION_VIEW_THREAD = BuildConfig.APPLICATION_ID + ".VIEW_THREAD"; + static final String ACTION_VIEW_OUTBOX = BuildConfig.APPLICATION_ID + ".VIEW_OUTBOX"; static final String ACTION_EDIT_FOLDER = BuildConfig.APPLICATION_ID + ".EDIT_FOLDER"; static final String ACTION_EDIT_ANSWERS = BuildConfig.APPLICATION_ID + ".EDIT_ANSWERS"; static final String ACTION_EDIT_ANSWER = BuildConfig.APPLICATION_ID + ".EDIT_ANSWER"; @@ -645,6 +646,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB iff.addAction(ACTION_VIEW_MESSAGES); iff.addAction(ACTION_SEARCH_ADDRESS); iff.addAction(ACTION_VIEW_THREAD); + iff.addAction(ACTION_VIEW_OUTBOX); iff.addAction(ACTION_EDIT_FOLDER); iff.addAction(ACTION_EDIT_ANSWERS); iff.addAction(ACTION_EDIT_ANSWER); @@ -1334,6 +1336,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB onSearchAddress(intent); else if (ACTION_VIEW_THREAD.equals(action)) onViewThread(intent); + else if (ACTION_VIEW_OUTBOX.equals(action)) + onMenuOutbox(); else if (ACTION_EDIT_FOLDER.equals(action)) onEditFolder(intent); else if (ACTION_EDIT_ANSWERS.equals(action)) diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index e11be0e715..8619a50770 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -245,6 +245,13 @@ public interface DaoMessage { boolean filter_archive, boolean ascending, boolean debug); + @Query("SELECT COUNT(*) FROM message" + + " JOIN folder_view AS folder ON folder.id = message.folder" + + " LEFT JOIN operation ON operation.message = message.id" + + " WHERE " + is_outbox + + " AND operation.id IS NULL") + LiveData liveOutboxPending(); + @Query("SELECT account.name AS accountName" + ", COUNT(message.id) AS count" + ", SUM(message.ui_seen) AS seen" + diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 56600b5fd2..e8b21a22cc 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -248,6 +248,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. private SeekBar sbThread; private ImageButton ibDown; private ImageButton ibUp; + private ImageButton ibOutbox; + private TextView tvOutboxCount; private ImageButton ibSeen; private ImageButton ibUnflagged; private ImageButton ibSnoozed; @@ -258,6 +260,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. private Group grpHintSwipe; private Group grpHintSelect; private Group grpReady; + private Group grpOutbox; private FloatingActionButton fabReply; private FloatingActionButton fabCompose; private FloatingActionButton fabMore; @@ -458,6 +461,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. sbThread = view.findViewById(R.id.sbThread); ibDown = view.findViewById(R.id.ibDown); ibUp = view.findViewById(R.id.ibUp); + ibOutbox = view.findViewById(R.id.ibOutbox); + tvOutboxCount = view.findViewById(R.id.tvOutboxCount); ibSeen = view.findViewById(R.id.ibSeen); ibUnflagged = view.findViewById(R.id.ibUnflagged); ibSnoozed = view.findViewById(R.id.ibSnoozed); @@ -469,6 +474,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. grpHintSwipe = view.findViewById(R.id.grpHintSwipe); grpHintSelect = view.findViewById(R.id.grpHintSelect); grpReady = view.findViewById(R.id.grpReady); + grpOutbox = view.findViewById(R.id.grpOutbox); fabReply = view.findViewById(R.id.fabReply); fabCompose = view.findViewById(R.id.fabCompose); @@ -771,6 +777,14 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. } }); + ibOutbox.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(v.getContext()); + lbm.sendBroadcast(new Intent(ActivityView.ACTION_VIEW_OUTBOX)); + } + }); + ibSeen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -1126,6 +1140,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. bottom_navigation.setVisibility(actionbar && viewType == AdapterMessage.ViewType.THREAD ? View.INVISIBLE : View.GONE); grpReady.setVisibility(View.GONE); pbWait.setVisibility(View.VISIBLE); + grpOutbox.setVisibility(View.GONE); fabReply.hide(); @@ -3728,6 +3743,16 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. updateState(folders); } }); + db.message().liveOutboxPending().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer pending) { + if (pending != null && pending > 10) + tvOutboxCount.setText("+"); + else + tvOutboxCount.setText(pending == null || pending == 0 ? null : NF.format(pending)); + grpOutbox.setVisibility(pending == null || pending == 0 ? View.GONE : View.VISIBLE); + } + }); break; case FOLDER: @@ -3741,6 +3766,16 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. updateState(folders); } }); + db.message().liveOutboxPending().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer pending) { + if (pending != null && pending > 10) + tvOutboxCount.setText("+"); + else + tvOutboxCount.setText(pending == null || pending == 0 ? null : NF.format(pending)); + grpOutbox.setVisibility(pending == null || pending == 0 ? View.GONE : View.VISIBLE); + } + }); break; case THREAD: diff --git a/app/src/main/res/drawable/twotone_schedule_send_24.xml b/app/src/main/res/drawable/twotone_schedule_send_24.xml new file mode 100644 index 0000000000..2611b048fb --- /dev/null +++ b/app/src/main/res/drawable/twotone_schedule_send_24.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_messages.xml b/app/src/main/res/layout/fragment_messages.xml index f10c83d404..03e85d907c 100644 --- a/app/src/main/res/layout/fragment_messages.xml +++ b/app/src/main/res/layout/fragment_messages.xml @@ -234,6 +234,30 @@ app:layout_constraintStart_toEndOf="@+id/ibDown" app:srcCompat="@drawable/twotone_vertical_align_top_24" /> + + + + + +