Browse Source

Added sort

Fixes #101
main
M66B 6 years ago
parent
commit
9f2af6a6ff
41 changed files with 421 additions and 168 deletions
  1. +18
    -6
      app/src/main/java/eu/faircode/email/DaoMessage.java
  2. +219
    -157
      app/src/main/java/eu/faircode/email/FragmentMessages.java
  3. +10
    -0
      app/src/main/res/drawable/baseline_sort_24.xml
  4. +20
    -0
      app/src/main/res/menu/menu_list.xml
  5. +4
    -0
      app/src/main/res/values-af/strings.xml
  6. +4
    -0
      app/src/main/res/values-ar-rBH/strings.xml
  7. +4
    -0
      app/src/main/res/values-ar-rEG/strings.xml
  8. +4
    -0
      app/src/main/res/values-ar-rSA/strings.xml
  9. +4
    -0
      app/src/main/res/values-ar-rYE/strings.xml
  10. +4
    -0
      app/src/main/res/values-ar/strings.xml
  11. +4
    -0
      app/src/main/res/values-ca/strings.xml
  12. +4
    -0
      app/src/main/res/values-cs/strings.xml
  13. +4
    -0
      app/src/main/res/values-da/strings.xml
  14. +4
    -0
      app/src/main/res/values-de/strings.xml
  15. +4
    -0
      app/src/main/res/values-el/strings.xml
  16. +4
    -0
      app/src/main/res/values-en/strings.xml
  17. +4
    -0
      app/src/main/res/values-es-rES/strings.xml
  18. +4
    -0
      app/src/main/res/values-fi/strings.xml
  19. +4
    -0
      app/src/main/res/values-fr/strings.xml
  20. +4
    -0
      app/src/main/res/values-he/strings.xml
  21. +4
    -0
      app/src/main/res/values-hu/strings.xml
  22. +4
    -0
      app/src/main/res/values-it/strings.xml
  23. +4
    -0
      app/src/main/res/values-iw/strings.xml
  24. +4
    -0
      app/src/main/res/values-ja/strings.xml
  25. +4
    -0
      app/src/main/res/values-ko/strings.xml
  26. +4
    -0
      app/src/main/res/values-nb/strings.xml
  27. +4
    -0
      app/src/main/res/values-nl/strings.xml
  28. +4
    -0
      app/src/main/res/values-no/strings.xml
  29. +9
    -5
      app/src/main/res/values-pl/strings.xml
  30. +4
    -0
      app/src/main/res/values-pt-rBR/strings.xml
  31. +4
    -0
      app/src/main/res/values-pt-rPT/strings.xml
  32. +4
    -0
      app/src/main/res/values-ro/strings.xml
  33. +4
    -0
      app/src/main/res/values-ru/strings.xml
  34. +4
    -0
      app/src/main/res/values-sr/strings.xml
  35. +4
    -0
      app/src/main/res/values-sv-rSE/strings.xml
  36. +4
    -0
      app/src/main/res/values-tr/strings.xml
  37. +4
    -0
      app/src/main/res/values-uk/strings.xml
  38. +4
    -0
      app/src/main/res/values-vi/strings.xml
  39. +4
    -0
      app/src/main/res/values-zh-rCN/strings.xml
  40. +4
    -0
      app/src/main/res/values-zh-rTW/strings.xml
  41. +5
    -0
      app/src/main/res/values/strings.xml

+ 18
- 6
app/src/main/java/eu/faircode/email/DaoMessage.java View File

@ -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<Integer, TupleMessageEx> 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<Integer, TupleMessageEx> 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<Integer, TupleMessageEx> 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<Integer, TupleMessageEx> 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<Integer, TupleMessageEx> 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<Integer, TupleMessageEx> pagedThread(long msgid, String sort, boolean debug);
@Query("SELECT *" +
" FROM message" +


+ 219
- 157
app/src/main/java/eu/faircode/email/FragmentMessages.java View File

@ -80,6 +80,9 @@ public class FragmentMessages extends FragmentEx {
private long primary = -1;
private AdapterMessage adapter;
private AdapterMessage.ViewType viewType;
private LiveData<PagedList<TupleMessageEx>> 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<EntityAccount>() {
@Override
public void onChanged(EntityAccount account) {
@ -392,170 +394,55 @@ public class FragmentMessages extends FragmentEx {
}
});
LiveData<PagedList<TupleMessageEx>> messages;
// Folder
switch (viewType) {
case UNIFIED:
db.folder().liveUnified().observe(getViewLifecycleOwner(), new Observer<List<TupleFolderEx>>() {
@Override
public void onChanged(List<TupleFolderEx> 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<List<TupleFolderEx>>() {
@Override
public void onChanged(List<TupleFolderEx> 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<TupleFolderEx>() {
@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<TupleFolderEx>() {
@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<PagedList<TupleMessageEx>>() {
@Override
public void onChanged(@Nullable PagedList<TupleMessageEx> 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<Void>() {
@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<Integer, TupleMessageEx> builder = new LivePagedListBuilder<>(db.message().pagedFolder(folder, true, false), SEARCH_PAGE_SIZE);
builder.setBoundaryCallback(searchCallback);
LiveData<PagedList<TupleMessageEx>> messages = builder.build();
messages.observe(getViewLifecycleOwner(), new Observer<PagedList<TupleMessageEx>>() {
@Override
public void onChanged(PagedList<TupleMessageEx> messages) {
Log.i(Helper.TAG, "Submit found messages=" + messages.size());
adapter.submitList(messages);
grpReady.setVisibility(View.VISIBLE);
}
});
new SimpleTask<Long>() {
@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<PagedList<TupleMessageEx>>() {
@Override
public void onChanged(@Nullable PagedList<TupleMessageEx> 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<Void>() {
@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<Integer, TupleMessageEx> builder = new LivePagedListBuilder<>(db.message().pagedFolder(folder, "time", true, false), SEARCH_PAGE_SIZE);
builder.setBoundaryCallback(searchCallback);
LiveData<PagedList<TupleMessageEx>> messages = builder.build();
messages.observe(getViewLifecycleOwner(), new Observer<PagedList<TupleMessageEx>>() {
@Override
public void onChanged(PagedList<TupleMessageEx> messages) {
Log.i(Helper.TAG, "Submit found messages=" + messages.size());
adapter.submitList(messages);
grpReady.setVisibility(View.VISIBLE);
}
});
new SimpleTask<Long>() {
@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);
}


+ 10
- 0
app/src/main/res/drawable/baseline_sort_24.xml View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z"/>
</vector>

+ 20
- 0
app/src/main/res/menu/menu_list.xml View File

@ -9,6 +9,26 @@
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|always" />
<item
android:id="@+id/menu_sort_on"
android:icon="@drawable/baseline_sort_24"
android:title="@string/title_sort_on"
app:showAsAction="ifRoom">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/menu_sort_on_time"
android:title="@string/title_sort_on_time" />
<item
android:id="@+id/menu_sort_on_unread"
android:title="@string/title_sort_on_unread" />
<item
android:id="@+id/menu_sort_on_starred"
android:title="@string/title_sort_on_starred" />
</group>
</menu>
</item>
<item
android:id="@+id/menu_folders"
android:icon="@drawable/baseline_folder_24"


+ 4
- 0
app/src/main/res/values-af/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ar-rBH/strings.xml View File

@ -186,6 +186,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ar-rEG/strings.xml View File

@ -186,6 +186,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ar-rSA/strings.xml View File

@ -186,6 +186,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ar-rYE/strings.xml View File

@ -186,6 +186,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ar/strings.xml View File

@ -186,6 +186,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ca/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-cs/strings.xml View File

@ -178,6 +178,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-da/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Søg</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Søger \'%1$s \'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard svar</string>
<string name="title_answer_name">Svarnavn</string>
<string name="title_answer_text">Svartekst</string>


+ 4
- 0
app/src/main/res/values-de/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Suche</string>
<string name="title_search_hint">Absender/Betreff/Text durchsuchen</string>
<string name="title_searching">Suche „%1$s“</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standardantworten</string>
<string name="title_answer_name">Antwort Name</string>
<string name="title_answer_text">Antworttext</string>


+ 4
- 0
app/src/main/res/values-el/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-en/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-es-rES/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-fi/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-fr/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Rechercher</string>
<string name="title_search_hint">Rechercher expéditeur / objet / texte</string>
<string name="title_searching">Recherche de \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Réponse standard</string>
<string name="title_answer_name">Nom de la réponse</string>
<string name="title_answer_text">Texte de la réponse</string>


+ 4
- 0
app/src/main/res/values-he/strings.xml View File

@ -178,6 +178,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-hu/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-it/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-iw/strings.xml View File

@ -178,6 +178,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ja/strings.xml View File

@ -166,6 +166,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ko/strings.xml View File

@ -166,6 +166,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-nb/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-nl/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-no/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 9
- 5
app/src/main/res/values-pl/strings.xml View File

@ -77,7 +77,7 @@
<string name="title_account_name">Nazwa konta</string>
<string name="title_account_name_hint">Używany do odróżnienia folderów</string>
<string name="title_account_signature">Tekst podpisu</string>
<string name="title_account_color">Color</string>
<string name="title_account_color">Kolor</string>
<string name="title_imap">IMAP</string>
<string name="title_smtp">SMTP</string>
<string name="title_provider">Dostawca</string>
@ -178,6 +178,10 @@
<string name="title_search">Szukaj</string>
<string name="title_search_hint">Wyszukaj nadawcę/temat/tekst</string>
<string name="title_searching">Szukam \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standardowa odpowiedź</string>
<string name="title_answer_name">Nazwa odpowiedzi</string>
<string name="title_answer_text">Tekst odpowiedzi</string>
@ -202,14 +206,14 @@
<string name="title_pro_feature">Jest to funkcja pro</string>
<string name="title_pro_list">Lista funkcji pro</string>
<string name="title_pro_purchase">Kup</string>
<string name="title_pro_hint">Kupno funkcje pro pozwoli Ci użyć wszystkie obecne i przyszłe funkcje pro i będzie utrzymywać i wspierać aplikację</string>
<string name="title_pro_price">Please see <a href="https://github.com/M66B/open-source-email/blob/master/FAQ.md#FAQ19">this FAQ</a> about the price of the pro features</string>
<string name="title_pro_hint">Kupno funkcji pro pozwoli Ci używać wszystkich obecnych i przyszłych funkcji pro oraz będzie utrzymywać i wspierać aplikację</string>
<string name="title_pro_price">Po więcej informacji nt cen wejdź <a href="https://github.com/M66B/open-source-email/blob/master/FAQ.md#FAQ19">w ten FAQ</a></string>
<string name="title_pro_activated">Wszystkie funkcje pro są aktywowane</string>
<string name="title_pro_valid">Wszystkie funkcje pro aktywne</string>
<string name="title_pro_invalid">Nieprawidłowa odpowiedź</string>
<string name="title_pro_support">FairEmail needs your help. Tap to purchase pro features to keep the project going.</string>
<string name="title_pro_support">FairEmail potrzebuje Twojej pomocy. Dotknij, aby zakupić funkcje pro i utrzymać projekt.</string>
<string name="title_log">Log</string>
<string name="title_debug_info">Info debugowania</string>
<string name="title_debug_info_remark">Opisz proszę problem i wskaż moment jego wystąpienia:</string>
<string name="title_crash_info_remark">Please describe what you were doing when the app crashed:</string>
<string name="title_crash_info_remark">Opisz proszę, co robisz, w momencie awarii aplikacji:</string>
</resources>

+ 4
- 0
app/src/main/res/values-pt-rBR/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-pt-rPT/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-ro/strings.xml View File

@ -174,6 +174,10 @@
<string name="title_search">Caută</string>
<string name="title_search_hint">Căutare expeditor/subiect/text</string>
<string name="title_searching">Se caută \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Răspuns standard</string>
<string name="title_answer_name">Titlu răspuns</string>
<string name="title_answer_text">Text răspuns</string>


+ 4
- 0
app/src/main/res/values-ru/strings.xml View File

@ -178,6 +178,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-sr/strings.xml View File

@ -174,6 +174,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-sv-rSE/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-tr/strings.xml View File

@ -170,6 +170,10 @@
<string name="title_search">Ara</string>
<string name="title_search_hint">Gönderen/konu/metin ara</string>
<string name="title_searching">\'%1$s\' aranıyor</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standart yanıt</string>
<string name="title_answer_name">Yanıt adı</string>
<string name="title_answer_text">Yanıt metni</string>


+ 4
- 0
app/src/main/res/values-uk/strings.xml View File

@ -178,6 +178,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-vi/strings.xml View File

@ -166,6 +166,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 4
- 0
app/src/main/res/values-zh-rCN/strings.xml View File

@ -166,6 +166,10 @@
<string name="title_search">搜索</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">搜索 “%1$s”</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">标准回复</string>
<string name="title_answer_name">回复名称</string>
<string name="title_answer_text">回复文本</string>


+ 4
- 0
app/src/main/res/values-zh-rTW/strings.xml View File

@ -166,6 +166,10 @@
<string name="title_search">Search</string>
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


+ 5
- 0
app/src/main/res/values/strings.xml View File

@ -198,6 +198,11 @@
<string name="title_search_hint">Search sender/subject/text</string>
<string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string>
<string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string>
<string name="title_answer_reply">Standard reply</string>
<string name="title_answer_name">Answer name</string>
<string name="title_answer_text">Answer text</string>


Loading…
Cancel
Save