Quick actions config dialog

pull/207/head
M66B 3 years ago
parent 157708e19f
commit 2b5fc81e45

@ -292,6 +292,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
private TextView tvSelectedCount;
private CardView cardMore;
private ImageButton ibLowImportance;
private ImageButton ibHighImportance;
private ImageButton ibBatchSeen;
private ImageButton ibBatchFlag;
private ImageButton ibBatchSnooze;
@ -391,6 +392,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
private static final int SWIPE_DISABLE_SELECT_DURATION = 1500; // milliseconds
private static final float LUMINANCE_THRESHOLD = 0.7f;
private static final int ITEM_CACHE_SIZE = 10; // Default: 2 items
private static final int MAX_QUICK_ACTIONS = 5;
private static final int REQUEST_RAW = 1;
private static final int REQUEST_OPENPGP = 4;
@ -417,6 +419,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
private static final int REQUEST_ALL_READ = 25;
private static final int REQUEST_SAVE_SEARCH = 26;
private static final int REQUEST_DELETE_SEARCH = 27;
private static final int REQUEST_QUICK_ACTIONS = 28;
static final String ACTION_STORE_RAW = BuildConfig.APPLICATION_ID + ".STORE_RAW";
static final String ACTION_DECRYPT = BuildConfig.APPLICATION_ID + ".DECRYPT";
@ -565,6 +568,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
tvSelectedCount = view.findViewById(R.id.tvSelectedCount);
cardMore = view.findViewById(R.id.cardMore);
ibLowImportance = view.findViewById(R.id.ibLowImportance);
ibHighImportance = view.findViewById(R.id.ibHighImportance);
ibBatchSeen = view.findViewById(R.id.ibBatchSeen);
ibBatchFlag = view.findViewById(R.id.ibBatchFlag);
ibBatchSnooze = view.findViewById(R.id.ibBatchSnooze);
@ -1306,6 +1310,13 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
}
});
ibHighImportance.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onActionSetImportanceSelection(EntityMessage.PRIORITIY_HIGH, true);
}
});
ibBatchSeen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -1358,60 +1369,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
ibMoreSettings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(v.getContext(), getViewLifecycleOwner(), ibMoreSettings);
popupMenu.inflate(R.menu.popup_config_more);
popupMenu.getMenu().findItem(R.id.menu_importance_low)
.setChecked(prefs.getBoolean("more_importance_low", false));
popupMenu.getMenu().findItem(R.id.menu_seen)
.setChecked(prefs.getBoolean("more_seen", false));
popupMenu.getMenu().findItem(R.id.menu_flag)
.setChecked(prefs.getBoolean("more_flag", false));
popupMenu.getMenu().findItem(R.id.menu_snooze)
.setChecked(prefs.getBoolean("more_snooze", false));
popupMenu.getMenu().findItem(R.id.menu_inbox)
.setChecked(prefs.getBoolean("more_inbox", true));
popupMenu.getMenu().findItem(R.id.menu_archive)
.setChecked(prefs.getBoolean("more_archive", true));
popupMenu.getMenu().findItem(R.id.menu_junk)
.setChecked(prefs.getBoolean("more_junk", true));
popupMenu.getMenu().findItem(R.id.menu_trash)
.setChecked(prefs.getBoolean("more_trash", true));
popupMenu.insertIcons(v.getContext());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem target) {
String key;
int itemId = target.getItemId();
if (itemId == R.id.menu_importance_low)
key = "more_importance_low";
else if (itemId == R.id.menu_seen)
key = "more_seen";
else if (itemId == R.id.menu_flag)
key = "more_flag";
else if (itemId == R.id.menu_snooze)
key = "more_snooze";
else if (itemId == R.id.menu_inbox)
key = "more_inbox";
else if (itemId == R.id.menu_archive)
key = "more_archive";
else if (itemId == R.id.menu_junk)
key = "more_junk";
else if (itemId == R.id.menu_trash)
key = "more_trash";
else
return false;
prefs.edit().putBoolean(key, !target.isChecked()).apply();
updateMore();
return true;
}
});
popupMenu.show();
FragmentDialogQuickActions buttons = new FragmentDialogQuickActions();
buttons.setTargetFragment(FragmentMessages.this, REQUEST_QUICK_ACTIONS);
buttons.show(getParentFragmentManager(), "dialog:quickactions");
}
});
@ -5841,18 +5801,47 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
@Override
protected void onExecuted(Bundle args, MoreResult result) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean importance = (prefs.getBoolean("more_importance_low", false) &&
boolean more_trash = prefs.getBoolean("more_trash", true);
boolean more_junk = prefs.getBoolean("more_junk", true);
boolean more_archive = prefs.getBoolean("more_archive", true);
boolean more_inbox = prefs.getBoolean("more_inbox", true);
boolean more_snooze = prefs.getBoolean("more_snooze", true);
boolean more_flag = prefs.getBoolean("more_flag", true);
boolean more_seen = prefs.getBoolean("more_seen", true);
boolean more_importance_high = prefs.getBoolean("more_importance_high", true);
boolean more_importance_low = prefs.getBoolean("more_importance_low", true);
int count = 0;
boolean trash = (more_trash && count < MAX_QUICK_ACTIONS && result.canTrash());
if (trash)
count++;
boolean junk = (more_junk && count < MAX_QUICK_ACTIONS && result.canJunk());
if (junk)
count++;
boolean archive = (more_archive && count < MAX_QUICK_ACTIONS && result.canArchive());
if (archive)
count++;
boolean inbox = (more_inbox && count < MAX_QUICK_ACTIONS && result.canInbox());
if (inbox)
count++;
boolean snooze = (more_snooze && count < MAX_QUICK_ACTIONS);
if (snooze)
count++;
boolean flag = (more_flag && count < MAX_QUICK_ACTIONS && result.unflagged);
if (flag)
count++;
boolean seen = (more_seen && count < MAX_QUICK_ACTIONS && result.unseen);
if (seen)
count++;
boolean importance_high = (more_importance_high && count < MAX_QUICK_ACTIONS &&
!EntityMessage.PRIORITIY_HIGH.equals(result.importance));
if (importance_high)
count++;
boolean importance_low = (more_importance_low && count < MAX_QUICK_ACTIONS &&
!EntityMessage.PRIORITIY_LOW.equals(result.importance));
boolean seen = (prefs.getBoolean("more_seen", false) && result.unseen);
boolean flag = (prefs.getBoolean("more_flag", false) && result.unflagged);
boolean snooze = (prefs.getBoolean("more_snooze", false));
boolean inbox = (prefs.getBoolean("more_inbox", true) && result.canInbox());
boolean archive = (prefs.getBoolean("more_archive", true) && result.canArchive());
boolean junk = (prefs.getBoolean("more_junk", true) && result.canJunk());
boolean trash = (prefs.getBoolean("more_trash", true) && result.canTrash());
ibLowImportance.setVisibility(importance ? View.VISIBLE : View.GONE);
ibLowImportance.setVisibility(importance_low ? View.VISIBLE : View.GONE);
ibHighImportance.setVisibility(importance_high ? View.VISIBLE : View.GONE);
ibBatchSeen.setVisibility(seen ? View.VISIBLE : View.GONE);
ibBatchFlag.setVisibility(flag ? View.VISIBLE : View.GONE);
ibBatchSnooze.setVisibility(snooze ? View.VISIBLE : View.GONE);
@ -7500,6 +7489,10 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
if (resultCode == RESULT_OK && data != null)
onDeleteSearch(data.getBundleExtra("args"));
break;
case REQUEST_QUICK_ACTIONS:
if (resultCode == RESULT_OK)
updateMore();
break;
}
} catch (Throwable ex) {
Log.e(ex);
@ -10179,4 +10172,63 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
}
}
}
public static class FragmentDialogQuickActions extends FragmentDialogBase {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
final Context context = getContext();
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
final View dview = LayoutInflater.from(context).inflate(R.layout.dialog_quick_actions, null);
final TextView tvHint = dview.findViewById(R.id.tvHint);
final CheckBox cbImportanceLow = dview.findViewById(R.id.cbImportanceLow);
final CheckBox cbImportanceHigh = dview.findViewById(R.id.cbImportanceHigh);
final CheckBox cbSeen = dview.findViewById(R.id.cbSeen);
final CheckBox cbFlag = dview.findViewById(R.id.cbFlag);
final CheckBox cbSnooze = dview.findViewById(R.id.cbSnooze);
final CheckBox cbInbox = dview.findViewById(R.id.cbInbox);
final CheckBox cbArchive = dview.findViewById(R.id.cbArchive);
final CheckBox cbJunk = dview.findViewById(R.id.cbJunk);
final CheckBox cbTrash = dview.findViewById(R.id.cbTrash);
tvHint.setText(getString(R.string.title_quick_actions_hint, MAX_QUICK_ACTIONS));
cbImportanceLow.setChecked(prefs.getBoolean("more_importance_low", false));
cbImportanceHigh.setChecked(prefs.getBoolean("more_importance_high", false));
cbSeen.setChecked(prefs.getBoolean("more_seen", false));
cbFlag.setChecked(prefs.getBoolean("more_flag", false));
cbSnooze.setChecked(prefs.getBoolean("more_snooze", true));
cbInbox.setChecked(prefs.getBoolean("more_inbox", true));
cbArchive.setChecked(prefs.getBoolean("more_archive", true));
cbJunk.setChecked(prefs.getBoolean("more_junk", true));
cbTrash.setChecked(prefs.getBoolean("more_trash", false));
return new AlertDialog.Builder(getContext())
.setView(dview)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("more_importance_low", cbImportanceLow.isChecked());
editor.putBoolean("more_importance_high", cbImportanceHigh.isChecked());
editor.putBoolean("more_seen", cbSeen.isChecked());
editor.putBoolean("more_flag", cbFlag.isChecked());
editor.putBoolean("more_snooze", cbSnooze.isChecked());
editor.putBoolean("more_inbox", cbInbox.isChecked());
editor.putBoolean("more_archive", cbArchive.isChecked());
editor.putBoolean("more_junk", cbJunk.isChecked());
editor.putBoolean("more_trash", cbTrash.isChecked());
editor.apply();
sendResult(Activity.RESULT_OK);
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
sendResult(Activity.RESULT_CANCELED);
}
})
.create();
}
}
}

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<eu.faircode.email.ScrollViewEx xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadeScrollbars="false"
android:padding="24dp"
android:scrollbarStyle="outsideOverlay">
<eu.faircode.email.ConstraintLayoutEx
android:layout_width="match_parent"
android:layout_height="wrap_content">
<eu.faircode.email.FixedTextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:text="@string/title_quick_actions"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_quick_actions_hint"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvTitle" />
<CheckBox
android:id="@+id/cbImportanceLow"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/baseline_arrow_downward_24"
android:drawablePadding="6dp"
android:text="@string/title_quick_actions_low"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvHint" />
<CheckBox
android:id="@+id/cbImportanceHigh"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/baseline_arrow_upward_24"
android:drawablePadding="6dp"
android:text="@string/title_quick_actions_high"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbImportanceLow" />
<CheckBox
android:id="@+id/cbSeen"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_drafts_24"
android:drawablePadding="6dp"
android:text="@string/title_seen"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbImportanceHigh" />
<CheckBox
android:id="@+id/cbFlag"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_star_24"
android:drawablePadding="6dp"
android:text="@string/title_flag"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbSeen" />
<CheckBox
android:id="@+id/cbSnooze"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_timelapse_24"
android:drawablePadding="6dp"
android:text="@string/title_quick_actions_snooze"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbFlag" />
<CheckBox
android:id="@+id/cbInbox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_inbox_24"
android:drawablePadding="6dp"
android:text="@string/title_folder_inbox"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbSnooze" />
<CheckBox
android:id="@+id/cbArchive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_archive_24"
android:drawablePadding="6dp"
android:text="@string/title_archive"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbInbox" />
<CheckBox
android:id="@+id/cbJunk"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_report_24"
android:drawablePadding="6dp"
android:text="@string/title_folder_junk"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbArchive" />
<CheckBox
android:id="@+id/cbTrash"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_delete_24"
android:drawablePadding="6dp"
android:text="@string/title_trash"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbJunk" />
</eu.faircode.email.ConstraintLayoutEx>
</eu.faircode.email.ScrollViewEx>

@ -530,6 +530,21 @@
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/baseline_arrow_downward_24" />
<eu.faircode.email.FixedImageButton
android:id="@+id/ibHighImportance"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_importance_high"
android:padding="6dp"
android:scaleType="fitCenter"
android:tint="@color/action_foreground"
android:tooltipText="@string/title_importance_high"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/ibLowImportance"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/baseline_arrow_upward_24" />
<eu.faircode.email.FixedImageButton
android:id="@+id/ibBatchSeen"
android:layout_width="48dp"
@ -540,7 +555,8 @@
android:scaleType="fitCenter"
android:tint="@color/action_foreground"
android:tooltipText="@string/title_toggle_seen"
app:layout_constraintEnd_toStartOf="@+id/ibLowImportance"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/ibHighImportance"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twotone_drafts_24" />
@ -554,6 +570,7 @@
android:scaleType="fitCenter"
android:tint="@color/action_foreground"
android:tooltipText="@string/title_flag"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/ibBatchSeen"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twotone_star_24" />
@ -568,6 +585,7 @@
android:scaleType="fitCenter"
android:tint="@color/action_foreground"
android:tooltipText="@string/title_snooze_now"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/ibBatchFlag"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twotone_timelapse_24" />

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_importance_low"
android:checkable="true"
android:icon="@drawable/baseline_arrow_downward_24"
android:title="@string/title_importance_low" />
<item
android:id="@+id/menu_seen"
android:checkable="true"
android:icon="@drawable/twotone_drafts_24"
android:title="@string/title_seen" />
<item
android:id="@+id/menu_flag"
android:checkable="true"
android:icon="@drawable/twotone_star_24"
android:title="@string/title_flag" />
<item
android:id="@+id/menu_snooze"
android:checkable="true"
android:icon="@drawable/twotone_timelapse_24"
android:title="@string/title_snooze_now" />
<item
android:id="@+id/menu_inbox"
android:checkable="true"
android:icon="@drawable/twotone_inbox_24"
android:title="@string/title_folder_inbox" />
<item
android:id="@+id/menu_archive"
android:checkable="true"
android:icon="@drawable/twotone_archive_24"
android:title="@string/title_archive" />
<item
android:id="@+id/menu_junk"
android:checkable="true"
android:icon="@drawable/twotone_report_24"
android:title="@string/title_folder_junk" />
<item
android:id="@+id/menu_trash"
android:checkable="true"
android:icon="@drawable/twotone_delete_24"
android:title="@string/title_trash" />
</menu>

@ -1193,6 +1193,12 @@
<string name="title_button_search_text">Search in message text</string>
<string name="title_configure_buttons">Configure buttons &#8230;</string>
<string name="title_quick_actions">Select actions</string>
<string name="title_quick_actions_hint">Up to %1$d actions will be shown</string>
<string name="title_quick_actions_low">Low importance</string>
<string name="title_quick_actions_high">High importance</string>
<string name="title_quick_actions_snooze">Snooze</string>
<string name="title_trash">Trash</string>
<string name="title_copy">Copy &#8230;</string>
<string name="title_copy_to">Copy to &#8230;</string>

Loading…
Cancel
Save