From 9f2af6a6ff510d52a04a2a844b571d7f082220b0 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 13 Sep 2018 10:06:48 +0000 Subject: [PATCH] Added sort Fixes #101 --- .../java/eu/faircode/email/DaoMessage.java | 24 +- .../eu/faircode/email/FragmentMessages.java | 376 ++++++++++-------- .../main/res/drawable/baseline_sort_24.xml | 10 + app/src/main/res/menu/menu_list.xml | 20 + app/src/main/res/values-af/strings.xml | 4 + app/src/main/res/values-ar-rBH/strings.xml | 4 + app/src/main/res/values-ar-rEG/strings.xml | 4 + app/src/main/res/values-ar-rSA/strings.xml | 4 + app/src/main/res/values-ar-rYE/strings.xml | 4 + app/src/main/res/values-ar/strings.xml | 4 + app/src/main/res/values-ca/strings.xml | 4 + app/src/main/res/values-cs/strings.xml | 4 + app/src/main/res/values-da/strings.xml | 4 + app/src/main/res/values-de/strings.xml | 4 + app/src/main/res/values-el/strings.xml | 4 + app/src/main/res/values-en/strings.xml | 4 + app/src/main/res/values-es-rES/strings.xml | 4 + app/src/main/res/values-fi/strings.xml | 4 + app/src/main/res/values-fr/strings.xml | 4 + app/src/main/res/values-he/strings.xml | 4 + app/src/main/res/values-hu/strings.xml | 4 + app/src/main/res/values-it/strings.xml | 4 + app/src/main/res/values-iw/strings.xml | 4 + app/src/main/res/values-ja/strings.xml | 4 + app/src/main/res/values-ko/strings.xml | 4 + app/src/main/res/values-nb/strings.xml | 4 + app/src/main/res/values-nl/strings.xml | 4 + app/src/main/res/values-no/strings.xml | 4 + app/src/main/res/values-pl/strings.xml | 14 +- app/src/main/res/values-pt-rBR/strings.xml | 4 + app/src/main/res/values-pt-rPT/strings.xml | 4 + app/src/main/res/values-ro/strings.xml | 4 + app/src/main/res/values-ru/strings.xml | 4 + app/src/main/res/values-sr/strings.xml | 4 + app/src/main/res/values-sv-rSE/strings.xml | 4 + app/src/main/res/values-tr/strings.xml | 4 + app/src/main/res/values-uk/strings.xml | 4 + app/src/main/res/values-vi/strings.xml | 4 + app/src/main/res/values-zh-rCN/strings.xml | 4 + app/src/main/res/values-zh-rTW/strings.xml | 4 + app/src/main/res/values/strings.xml | 5 + 41 files changed, 421 insertions(+), 168 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_sort_24.xml diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 451d6477..c73053b9 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -51,8 +51,12 @@ public interface DaoMessage { " AND (NOT message.ui_hide OR :debug)" + " GROUP BY account.id, CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END" + " HAVING SUM(unified) > 0" + - " ORDER BY message.received DESC") - DataSource.Factory pagedUnifiedInbox(boolean debug); + " ORDER BY CASE" + + " WHEN 'unread' = :sort THEN NOT message.seen" + + " WHEN 'starred' = :sort THEN message.flagged" + + " ELSE 0" + + " END DESC, message.received DESC, message.sent DESC") + DataSource.Factory pagedUnifiedInbox(String sort, boolean debug); @Query("SELECT message.*" + ", account.name AS accountName, account.color AS accountColor" + @@ -72,8 +76,12 @@ public interface DaoMessage { " AND (NOT :found OR ui_found = :found)" + " GROUP BY CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END" + " HAVING SUM(CASE WHEN folder.id = :folder THEN 1 ELSE 0 END) > 0" + - " ORDER BY message.received DESC, message.sent DESC") - DataSource.Factory pagedFolder(long folder, boolean found, boolean debug); + " ORDER BY CASE" + + " WHEN 'unread' = :sort THEN NOT message.seen" + + " WHEN 'starred' = :sort THEN message.flagged" + + " ELSE 0" + + " END DESC, message.received DESC, message.sent DESC") + DataSource.Factory pagedFolder(long folder, String sort, boolean found, boolean debug); @Query("SELECT message.*" + ", account.name AS accountName, account.color AS accountColor" + @@ -87,8 +95,12 @@ public interface DaoMessage { " WHERE (NOT message.ui_hide OR :debug)" + " AND message.account = (SELECT m1.account FROM message m1 WHERE m1.id = :msgid)" + " AND message.thread = (SELECT m2.thread FROM message m2 WHERE m2.id = :msgid)" + - " ORDER BY message.received DESC, message.sent DESC") - DataSource.Factory pagedThread(long msgid, boolean debug); + " ORDER BY CASE" + + " WHEN 'unread' = :sort THEN NOT message.seen" + + " WHEN 'starred' = :sort THEN message.flagged" + + " ELSE 0" + + " END DESC, message.received DESC, message.sent DESC") + DataSource.Factory pagedThread(long msgid, String sort, boolean debug); @Query("SELECT *" + " FROM message" + diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 74631395..a5f26b2a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -80,6 +80,9 @@ public class FragmentMessages extends FragmentEx { private long primary = -1; private AdapterMessage adapter; + private AdapterMessage.ViewType viewType; + private LiveData> messages = null; + private SearchState searchState = SearchState.Reset; private BoundaryCallbackMessages searchCallback = null; @@ -122,7 +125,6 @@ public class FragmentMessages extends FragmentEx { grpReady = view.findViewById(R.id.grpReady); fab = view.findViewById(R.id.fab); - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); // Wire controls @@ -148,7 +150,6 @@ public class FragmentMessages extends FragmentEx { LinearLayoutManager llm = new LinearLayoutManager(getContext()); rvMessage.setLayoutManager(llm); - AdapterMessage.ViewType viewType; if (TextUtils.isEmpty(search)) if (thread < 0) if (folder < 0) @@ -384,6 +385,7 @@ public class FragmentMessages extends FragmentEx { final DB db = DB.getInstance(getContext()); + // Primary account db.account().livePrimaryAccount().observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged(EntityAccount account) { @@ -392,170 +394,55 @@ public class FragmentMessages extends FragmentEx { } }); - LiveData> messages; + // Folder + switch (viewType) { + case UNIFIED: + db.folder().liveUnified().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(List folders) { + int unseen = 0; + if (folders != null) + for (TupleFolderEx folder : folders) + unseen += folder.unseen; + String name = getString(R.string.title_folder_unified); + if (unseen > 0) + setSubtitle(getString(R.string.title_folder_unseen, name, unseen)); + else + setSubtitle(name); + } + }); + break; - // Observe folder/messages/search - if (TextUtils.isEmpty(search)) { - boolean debug = prefs.getBoolean("debug", false); - if (thread < 0) - if (folder < 0) { - db.folder().liveUnified().observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(List folders) { - int unseen = 0; - if (folders != null) - for (TupleFolderEx folder : folders) - unseen += folder.unseen; - String name = getString(R.string.title_folder_unified); - if (unseen > 0) - setSubtitle(getString(R.string.title_folder_unseen, name, unseen)); + case FOLDER: + db.folder().liveFolderEx(folder).observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable TupleFolderEx folder) { + if (folder == null) + setSubtitle(null); + else { + String name = Helper.localizeFolderName(getContext(), folder.name); + if (folder.unseen > 0) + setSubtitle(getString(R.string.title_folder_unseen, name, folder.unseen)); else setSubtitle(name); } - }); - - messages = new LivePagedListBuilder<>(db.message().pagedUnifiedInbox(debug), MESSAGES_PAGE_SIZE).build(); - } else { - db.folder().liveFolderEx(folder).observe(getViewLifecycleOwner(), new Observer() { - @Override - public void onChanged(@Nullable TupleFolderEx folder) { - if (folder == null) - setSubtitle(null); - else { - String name = Helper.localizeFolderName(getContext(), folder.name); - if (folder.unseen > 0) - setSubtitle(getString(R.string.title_folder_unseen, name, folder.unseen)); - else - setSubtitle(name); - } - } - }); - - messages = new LivePagedListBuilder<>(db.message().pagedFolder(folder, false, debug), MESSAGES_PAGE_SIZE).build(); - } - else { - setSubtitle(R.string.title_folder_thread); - messages = new LivePagedListBuilder<>(db.message().pagedThread(thread, debug), MESSAGES_PAGE_SIZE).build(); - } - - messages.observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(@Nullable PagedList messages) { - if (messages == null) { - finish(); - return; } + }); + break; - Log.i(Helper.TAG, "Submit messages=" + messages.size()); - adapter.submitList(messages); - - pbWait.setVisibility(View.GONE); - grpReady.setVisibility(View.VISIBLE); - - if (messages.size() == 0) { - tvNoEmail.setVisibility(View.VISIBLE); - rvMessage.setVisibility(View.GONE); - } else { - tvNoEmail.setVisibility(View.GONE); - rvMessage.setVisibility(View.VISIBLE); - } - } - }); - } else { - Log.i(Helper.TAG, "Search state=" + searchState); - setSubtitle(getString(R.string.title_searching, search)); - - if (searchCallback == null) - searchCallback = new BoundaryCallbackMessages( - getContext(), FragmentMessages.this, - folder, search, - new BoundaryCallbackMessages.IBoundaryCallbackMessages() { - @Override - public void onLoading() { - pbWait.setVisibility(View.VISIBLE); - } - - @Override - public void onLoaded() { - pbWait.setVisibility(View.GONE); - } - - @Override - public void onError(Context context, Throwable ex) { - Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); - } - }); - - Bundle args = new Bundle(); - args.putLong("folder", folder); - args.putString("search", search); - - new SimpleTask() { - @Override - protected Void onLoad(Context context, Bundle args) { - if (searchState == SearchState.Reset) { - long folder = args.getLong("folder"); - DB.getInstance(context).message().resetFound(folder); - searchState = SearchState.Database; - Log.i(Helper.TAG, "Search reset done"); - } - return null; - } - - @Override - protected void onLoaded(final Bundle args, Void data) { - LivePagedListBuilder builder = new LivePagedListBuilder<>(db.message().pagedFolder(folder, true, false), SEARCH_PAGE_SIZE); - builder.setBoundaryCallback(searchCallback); - LiveData> messages = builder.build(); - messages.observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(PagedList messages) { - Log.i(Helper.TAG, "Submit found messages=" + messages.size()); - adapter.submitList(messages); - grpReady.setVisibility(View.VISIBLE); - } - }); - - new SimpleTask() { - @Override - protected Long onLoad(Context context, Bundle args) throws Throwable { - long last = 0; - if (searchState == SearchState.Database) { - last = new Date().getTime(); - long folder = args.getLong("folder"); - String search = args.getString("search").toLowerCase(); - DB db = DB.getInstance(context); - for (long id : db.message().getMessageIDs(folder)) { - EntityMessage message = db.message().getMessage(id); - if (message != null) { // Message could be removed in the meantime - String from = MessageHelper.getFormattedAddresses(message.from, true); - if (from.toLowerCase().contains(search) || - message.subject.toLowerCase().contains(search) || - message.read(context).toLowerCase().contains(search)) { - Log.i(Helper.TAG, "Search found id=" + id); - db.message().setMessageFound(message.id, true); - last = message.received; - } - } - } - searchState = SearchState.Boundary; - Log.i(Helper.TAG, "Search database done"); - } - return last; - } + case THREAD: + setSubtitle(R.string.title_folder_thread); + break; - @Override - protected void onLoaded(Bundle args, Long last) { - pbWait.setVisibility(View.GONE); - searchCallback.setEnabled(true); - if (last > 0) - searchCallback.load(last); - } - }.load(FragmentMessages.this, args); - } - }.load(this, args); + case SEARCH: + setSubtitle(getString(R.string.title_searching, search)); + break; } + // Messages + loadMessages(); + + // Compose FAB Bundle args = new Bundle(); args.putLong("folder", folder); args.putLong("thread", thread); @@ -650,16 +537,49 @@ public class FragmentMessages extends FragmentEx { @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.menu_search).setVisible(folder >= 0 && search == null); + menu.findItem(R.id.menu_sort_on).setVisible(TextUtils.isEmpty(search)); menu.findItem(R.id.menu_folders).setVisible(primary >= 0); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + String sort = prefs.getString("sort", "time"); + if ("time".equals(sort)) + menu.findItem(R.id.menu_sort_on_time).setChecked(true); + else if ("unread".equals(sort)) + menu.findItem(R.id.menu_sort_on_unread).setChecked(true); + else if ("starred".equals(sort)) + menu.findItem(R.id.menu_sort_on_starred).setChecked(true); + super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + switch (item.getItemId()) { + case R.id.menu_sort_on_time: + prefs.edit().putString("sort", "time").apply(); + item.setChecked(true); + loadMessages(); + return true; + + case R.id.menu_sort_on_unread: + prefs.edit().putString("sort", "unread").apply(); + item.setChecked(true); + loadMessages(); + return true; + + case R.id.menu_sort_on_starred: + prefs.edit().putString("sort", "starred").apply(); + item.setChecked(true); + loadMessages(); + return true; + case R.id.menu_folders: onMenuFolders(); + loadMessages(); return true; + default: return super.onOptionsItemSelected(item); } @@ -679,6 +599,148 @@ public class FragmentMessages extends FragmentEx { fragmentTransaction.commit(); } + private void loadMessages() { + final DB db = DB.getInstance(getContext()); + + // Observe folder/messages/search + if (TextUtils.isEmpty(search)) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + String sort = prefs.getString("sort", "time"); + boolean debug = prefs.getBoolean("debug", false); + + if (messages != null) + messages.removeObservers(getViewLifecycleOwner()); + + switch (viewType) { + case UNIFIED: + messages = new LivePagedListBuilder<>(db.message().pagedUnifiedInbox(sort, debug), MESSAGES_PAGE_SIZE).build(); + break; + case FOLDER: + messages = new LivePagedListBuilder<>(db.message().pagedFolder(folder, sort, false, debug), MESSAGES_PAGE_SIZE).build(); + break; + case THREAD: + messages = new LivePagedListBuilder<>(db.message().pagedThread(thread, sort, debug), MESSAGES_PAGE_SIZE).build(); + break; + } + + messages.observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(@Nullable PagedList messages) { + if (messages == null) { + finish(); + return; + } + + Log.i(Helper.TAG, "Submit messages=" + messages.size()); + adapter.submitList(messages); + + pbWait.setVisibility(View.GONE); + grpReady.setVisibility(View.VISIBLE); + + if (messages.size() == 0) { + tvNoEmail.setVisibility(View.VISIBLE); + rvMessage.setVisibility(View.GONE); + } else { + tvNoEmail.setVisibility(View.GONE); + rvMessage.setVisibility(View.VISIBLE); + } + } + }); + } else { + Log.i(Helper.TAG, "Search state=" + searchState); + + if (searchCallback == null) + searchCallback = new BoundaryCallbackMessages( + getContext(), FragmentMessages.this, + folder, search, + new BoundaryCallbackMessages.IBoundaryCallbackMessages() { + @Override + public void onLoading() { + pbWait.setVisibility(View.VISIBLE); + } + + @Override + public void onLoaded() { + pbWait.setVisibility(View.GONE); + } + + @Override + public void onError(Context context, Throwable ex) { + Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); + } + }); + + Bundle args = new Bundle(); + args.putLong("folder", folder); + args.putString("search", search); + + new SimpleTask() { + @Override + protected Void onLoad(Context context, Bundle args) { + if (searchState == SearchState.Reset) { + long folder = args.getLong("folder"); + DB.getInstance(context).message().resetFound(folder); + searchState = SearchState.Database; + Log.i(Helper.TAG, "Search reset done"); + } + return null; + } + + @Override + protected void onLoaded(final Bundle args, Void data) { + LivePagedListBuilder builder = new LivePagedListBuilder<>(db.message().pagedFolder(folder, "time", true, false), SEARCH_PAGE_SIZE); + builder.setBoundaryCallback(searchCallback); + LiveData> messages = builder.build(); + messages.observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(PagedList messages) { + Log.i(Helper.TAG, "Submit found messages=" + messages.size()); + adapter.submitList(messages); + grpReady.setVisibility(View.VISIBLE); + } + }); + + new SimpleTask() { + @Override + protected Long onLoad(Context context, Bundle args) throws Throwable { + long last = 0; + if (searchState == SearchState.Database) { + last = new Date().getTime(); + long folder = args.getLong("folder"); + String search = args.getString("search").toLowerCase(); + DB db = DB.getInstance(context); + for (long id : db.message().getMessageIDs(folder)) { + EntityMessage message = db.message().getMessage(id); + if (message != null) { // Message could be removed in the meantime + String from = MessageHelper.getFormattedAddresses(message.from, true); + if (from.toLowerCase().contains(search) || + message.subject.toLowerCase().contains(search) || + message.read(context).toLowerCase().contains(search)) { + Log.i(Helper.TAG, "Search found id=" + id); + db.message().setMessageFound(message.id, true); + last = message.received; + } + } + } + searchState = SearchState.Boundary; + Log.i(Helper.TAG, "Search database done"); + } + return last; + } + + @Override + protected void onLoaded(Bundle args, Long last) { + pbWait.setVisibility(View.GONE); + searchCallback.setEnabled(true); + if (last > 0) + searchCallback.load(last); + } + }.load(FragmentMessages.this, args); + } + }.load(this, args); + } + } + void onNewMessages() { rvMessage.scrollToPosition(0); } diff --git a/app/src/main/res/drawable/baseline_sort_24.xml b/app/src/main/res/drawable/baseline_sort_24.xml new file mode 100644 index 00000000..77e99f69 --- /dev/null +++ b/app/src/main/res/drawable/baseline_sort_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/menu_list.xml b/app/src/main/res/menu/menu_list.xml index 34589149..57a11e42 100644 --- a/app/src/main/res/menu/menu_list.xml +++ b/app/src/main/res/menu/menu_list.xml @@ -9,6 +9,26 @@ app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="collapseActionView|always" /> + + + + + + + + + + Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ar-rBH/strings.xml b/app/src/main/res/values-ar-rBH/strings.xml index 73c1f4c5..53b0fd0b 100644 --- a/app/src/main/res/values-ar-rBH/strings.xml +++ b/app/src/main/res/values-ar-rBH/strings.xml @@ -186,6 +186,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ar-rEG/strings.xml b/app/src/main/res/values-ar-rEG/strings.xml index 73c1f4c5..53b0fd0b 100644 --- a/app/src/main/res/values-ar-rEG/strings.xml +++ b/app/src/main/res/values-ar-rEG/strings.xml @@ -186,6 +186,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 73c1f4c5..53b0fd0b 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -186,6 +186,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ar-rYE/strings.xml b/app/src/main/res/values-ar-rYE/strings.xml index 73c1f4c5..53b0fd0b 100644 --- a/app/src/main/res/values-ar-rYE/strings.xml +++ b/app/src/main/res/values-ar-rYE/strings.xml @@ -186,6 +186,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 73c1f4c5..53b0fd0b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -186,6 +186,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 13501732..16360d1c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -178,6 +178,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 335d7655..9a1ae2a4 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -170,6 +170,10 @@ Søg Search sender/subject/text Søger \'%1$s \' + Sort on + Time + Unread + Starred Standard svar Svarnavn Svartekst diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 020bbe30..4f7d4fb0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -170,6 +170,10 @@ Suche Absender/Betreff/Text durchsuchen Suche „%1$s“ + Sort on + Time + Unread + Starred Standardantworten Antwort Name Antworttext diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2395aa5d..06ce9d0a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -170,6 +170,10 @@ Rechercher Rechercher expéditeur / objet / texte Recherche de \'%1$s\' + Sort on + Time + Unread + Starred Réponse standard Nom de la réponse Texte de la réponse diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 64c46741..c0854b65 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -178,6 +178,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a811c5b4..76d5d87f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 64c46741..c0854b65 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -178,6 +178,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 08fc424e..0a1ac5cc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -166,6 +166,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 08fc424e..0a1ac5cc 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -166,6 +166,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-no/strings.xml +++ b/app/src/main/res/values-no/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 9d828206..81f888f9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -77,7 +77,7 @@ Nazwa konta Używany do odróżnienia folderów Tekst podpisu - Color + Kolor IMAP SMTP Dostawca @@ -178,6 +178,10 @@ Szukaj Wyszukaj nadawcę/temat/tekst Szukam \'%1$s\' + Sort on + Time + Unread + Starred Standardowa odpowiedź Nazwa odpowiedzi Tekst odpowiedzi @@ -202,14 +206,14 @@ Jest to funkcja pro Lista funkcji pro Kup - Kupno funkcje pro pozwoli Ci użyć wszystkie obecne i przyszłe funkcje pro i będzie utrzymywać i wspierać aplikację - Please see this FAQ about the price of the pro features + Kupno funkcji pro pozwoli Ci używać wszystkich obecnych i przyszłych funkcji pro oraz będzie utrzymywać i wspierać aplikację + Po więcej informacji nt cen wejdź w ten FAQ Wszystkie funkcje pro są aktywowane Wszystkie funkcje pro aktywne Nieprawidłowa odpowiedź - FairEmail needs your help. Tap to purchase pro features to keep the project going. + FairEmail potrzebuje Twojej pomocy. Dotknij, aby zakupić funkcje pro i utrzymać projekt. Log Info debugowania Opisz proszę problem i wskaż moment jego wystąpienia: - Please describe what you were doing when the app crashed: + Opisz proszę, co robisz, w momencie awarii aplikacji: diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0e283866..11ae6228 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 37f40112..d22eff3b 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -174,6 +174,10 @@ Caută Căutare expeditor/subiect/text Se caută \'%1$s\' + Sort on + Time + Unread + Starred Răspuns standard Titlu răspuns Text răspuns diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 13501732..16360d1c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -178,6 +178,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 0e2dd0d5..fe057188 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -174,6 +174,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index ba61d6fb..7ad4c010 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -170,6 +170,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 11775315..03edea29 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -170,6 +170,10 @@ Ara Gönderen/konu/metin ara \'%1$s\' aranıyor + Sort on + Time + Unread + Starred Standart yanıt Yanıt adı Yanıt metni diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 13501732..16360d1c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -178,6 +178,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 08fc424e..0a1ac5cc 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -166,6 +166,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0c5c98f1..256aad89 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -166,6 +166,10 @@ 搜索 Search sender/subject/text 搜索 “%1$s” + Sort on + Time + Unread + Starred 标准回复 回复名称 回复文本 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 08fc424e..0a1ac5cc 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -166,6 +166,10 @@ Search Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred Standard reply Answer name Answer text diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e297841..894af731 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -198,6 +198,11 @@ Search sender/subject/text Searching \'%1$s\' + Sort on + Time + Unread + Starred + Standard reply Answer name Answer text