Added filter on language

pull/178/head
M66B 5 years ago
parent acb9a02e8a
commit b8ef3357be

@ -80,6 +80,7 @@ public interface DaoMessage {
" AND (NOT :filter_unflagged OR COUNT(message.id) - SUM(1 - message.ui_flagged) > 0)" +
" AND (NOT :filter_unknown OR SUM(message.avatar IS NOT NULL AND message.sender <> identity.email) > 0)" +
" AND (NOT :filter_snoozed OR message.ui_snoozed IS NULL OR " + is_drafts + ")" +
" AND (:filter_language IS NULL OR message.language = :filter_language)" +
" ORDER BY -IFNULL(MAX(message.importance), 1)" +
", CASE" +
" WHEN 'unread' = :sort THEN SUM(1 - message.ui_seen) = 0" +
@ -98,7 +99,7 @@ public interface DaoMessage {
String type,
boolean threading,
String sort, boolean ascending,
boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed,
boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, String filter_language,
boolean found,
boolean debug);
@ -135,6 +136,7 @@ public interface DaoMessage {
" AND (NOT :filter_unknown OR SUM(message.avatar IS NOT NULL AND message.sender <> identity.email) > 0" +
" OR " + is_outbox + " OR " + is_drafts + " OR " + is_sent + ")" +
" AND (NOT :filter_snoozed OR message.ui_snoozed IS NULL OR " + is_outbox + " OR " + is_drafts + ")" +
" AND (:filter_language IS NULL OR message.language = :filter_language)" +
" ORDER BY -IFNULL(MAX(message.importance), 1)" +
", CASE" +
" WHEN 'unread' = :sort THEN SUM(1 - message.ui_seen) = 0" +
@ -152,7 +154,7 @@ public interface DaoMessage {
DataSource.Factory<Integer, TupleMessageEx> pagedFolder(
long folder, boolean threading,
String sort, boolean ascending,
boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed,
boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, String filter_language,
boolean found,
boolean debug);
@ -463,6 +465,14 @@ public interface DaoMessage {
" ORDER BY sender, subject")
Cursor getSuggestions(String query);
@Query("SELECT language FROM message" +
" WHERE (:account IS NULL OR message.account = :account)" +
" AND (:folder IS NULL OR message.folder = :folder)" +
" AND NOT message.language IS NULL" +
" GROUP BY language" +
" ORDER BY COUNT(*) DESC")
List<String> getLanguages(Long account, Long folder);
@Insert
long insertMessage(EntityMessage message);

@ -3426,15 +3426,13 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
menu.findItem(R.id.menu_compact).setChecked(compact);
menu.findItem(R.id.menu_select_all).setVisible(!outbox &&
(viewType == AdapterMessage.ViewType.UNIFIED || viewType == AdapterMessage.ViewType.FOLDER));
boolean list = (viewType == AdapterMessage.ViewType.UNIFIED || viewType == AdapterMessage.ViewType.FOLDER);
menu.findItem(R.id.menu_select_language).setVisible(list && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q);
menu.findItem(R.id.menu_select_all).setVisible(!outbox && list);
menu.findItem(R.id.menu_select_found).setVisible(viewType == AdapterMessage.ViewType.SEARCH);
menu.findItem(R.id.menu_empty_trash).setVisible(EntityFolder.TRASH.equals(type) &&
(viewType == AdapterMessage.ViewType.UNIFIED ||
viewType == AdapterMessage.ViewType.FOLDER));
menu.findItem(R.id.menu_empty_spam).setVisible(EntityFolder.JUNK.equals(type) &&
(viewType == AdapterMessage.ViewType.UNIFIED ||
viewType == AdapterMessage.ViewType.FOLDER));
menu.findItem(R.id.menu_empty_trash).setVisible(EntityFolder.TRASH.equals(type) && list);
menu.findItem(R.id.menu_empty_spam).setVisible(EntityFolder.JUNK.equals(type) && list);
menu.findItem(R.id.menu_force_sync).setVisible(viewType == AdapterMessage.ViewType.UNIFIED);
@ -3534,6 +3532,10 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
onMenuCompact();
return true;
case R.id.menu_select_language:
onMenuSelectLanguage();
return true;
case R.id.menu_select_all:
case R.id.menu_select_found:
onMenuSelectAll();
@ -3625,6 +3627,63 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
getActivity().invalidateOptionsMenu();
}
private void onMenuSelectLanguage() {
Bundle args = new Bundle();
args.putLong("account", account);
args.putLong("folder", folder);
new SimpleTask<List<String>>() {
@Override
protected List<String> onExecute(Context context, Bundle args) {
long account = args.getLong("account");
long folder = args.getLong("folder");
DB db = DB.getInstance(context);
return db.message().getLanguages(account < 0 ? null : account, folder < 0 ? null : folder);
}
@Override
protected void onExecuted(Bundle args, List<String> languages) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
String current = prefs.getString("filter_language", null);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(getContext(), getViewLifecycleOwner(), vwAnchor);
popupMenu.getMenu().add(Menu.NONE, 0, 0, R.string.title_language_all);
for (int i = 0; i < languages.size(); i++) {
String language = languages.get(i);
Locale locale = new Locale(language);
String title = locale.getDisplayLanguage() + (language.equals(current) ? " ★" : "");
popupMenu.getMenu()
.add(Menu.NONE, i + 1, i + 1, title)
.setIntent(new Intent().putExtra("locale", locale));
}
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == 0) // all
prefs.edit().remove("filter_language").apply();
else {
Locale locale = (Locale) item.getIntent().getSerializableExtra("locale");
prefs.edit().putString("filter_language", locale.getLanguage()).apply();
}
loadMessages(true);
return true;
}
});
popupMenu.show();
}
@Override
protected void onException(Bundle args, Throwable ex) {
Log.unexpectedError(getParentFragmentManager(), ex);
}
}.execute(this, args, "menu:language");
}
private void onMenuSelectAll() {
ViewModelMessages model = new ViewModelProvider(getActivity()).get(ViewModelMessages.class);
model.getIds(getContext(), getViewLifecycleOwner(), new Observer<List<Long>>() {
@ -3871,7 +3930,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
boolean filter_seen = prefs.getBoolean("filter_seen", false);
boolean filter_unflagged = prefs.getBoolean("filter_unflagged", false);
boolean filter_unknown = prefs.getBoolean("filter_unknown", false);
boolean filter_active = (filter_seen || filter_unflagged || filter_unknown);
String filter_language = prefs.getString("filter_language", null);
boolean filter_active = (filter_seen || filter_unflagged || filter_unknown || !TextUtils.isEmpty(filter_language));
boolean none = (items == 0 && !loading && tasks == 0 && initialized);
boolean filtered = (filter_active && viewType != AdapterMessage.ViewType.SEARCH);

@ -21,6 +21,7 @@ package eu.faircode.email;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
@ -97,6 +98,7 @@ public class ViewModelMessages extends ViewModel {
args.filter_unflagged,
args.filter_unknown,
args.filter_snoozed,
args.filter_language,
false,
args.debug),
LOCAL_PAGE_SIZE);
@ -116,6 +118,7 @@ public class ViewModelMessages extends ViewModel {
args.filter_unflagged,
args.filter_unknown,
args.filter_snoozed,
args.filter_language,
false,
args.debug),
configFolder);
@ -144,6 +147,7 @@ public class ViewModelMessages extends ViewModel {
args.threading,
"time", false,
false, false, false, false,
null,
true,
args.debug),
configSearch);
@ -153,6 +157,7 @@ public class ViewModelMessages extends ViewModel {
args.folder, args.threading,
"time", false,
false, false, false, false,
null,
true,
args.debug),
configSearch);
@ -330,6 +335,7 @@ public class ViewModelMessages extends ViewModel {
private boolean filter_unknown;
private boolean filter_snoozed;
private boolean filter_archive;
private String filter_language;
private boolean debug;
Args(Context context,
@ -356,6 +362,10 @@ public class ViewModelMessages extends ViewModel {
this.filter_unflagged = prefs.getBoolean("filter_unflagged", false);
this.filter_unknown = prefs.getBoolean("filter_unknown", false);
this.filter_snoozed = prefs.getBoolean("filter_snoozed", true);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q)
this.filter_language = null;
else
this.filter_language = prefs.getString("filter_language", null);
this.debug = prefs.getBoolean("debug", false);
}
@ -379,6 +389,7 @@ public class ViewModelMessages extends ViewModel {
this.filter_unknown == other.filter_unknown &&
this.filter_snoozed == other.filter_snoozed &&
this.filter_archive == other.filter_archive &&
Objects.equals(this.filter_language, other.filter_language) &&
this.debug == other.debug);
} else
return false;
@ -397,6 +408,7 @@ public class ViewModelMessages extends ViewModel {
" unknown=" + filter_unknown +
" snoozed=" + filter_snoozed +
" archive=" + filter_archive +
" language=" + filter_language +
" debug=" + debug;
}
}

@ -102,6 +102,11 @@
android:title="@string/title_compact"
app:showAsAction="never" />
<item
android:id="@+id/menu_select_language"
android:title="@string/title_select_language"
app:showAsAction="never" />
<item
android:id="@+id/menu_select_all"
android:title="@string/title_select_all"

@ -918,10 +918,13 @@
<string name="title_compact">Compact view</string>
<string name="title_zoom">Text size</string>
<string name="title_select_language">Select language</string>
<string name="title_select_all">Select all</string>
<string name="title_select_found">Select found</string>
<string name="title_force_sync">Force sync</string>
<string name="title_language_all">All</string>
<string name="title_previous">Previous</string>
<string name="title_next">Next</string>

Loading…
Cancel
Save