Merge branch 'master' into android-12

pull/196/head
M66B 3 years ago
commit 5b73fb8403

@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
apply plugin: 'com.bugsnag.android.gradle'
def getVersionCode = { -> return 1539 }
def getVersionCode = { -> return 1540 }
def getReleaseName = { -> return "\"Nullotitan\"" }
// https://en.wikipedia.org/wiki/List_of_dinosaur_genera

@ -101,6 +101,7 @@
android:name=".ApplicationEx"
android:allowBackup="false"
android:appCategory="productivity"
android:forceDarkAllowed="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"

@ -101,6 +101,7 @@
android:name=".ApplicationEx"
android:allowBackup="false"
android:appCategory="productivity"
android:forceDarkAllowed="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"

@ -101,6 +101,7 @@
android:name=".ApplicationEx"
android:allowBackup="false"
android:appCategory="productivity"
android:forceDarkAllowed="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"

@ -820,6 +820,7 @@ public class SMTPTransport extends Transport {
* the mechanism and we have an authenticator for the mechanism,
* and it hasn't been disabled, use it.
*/
MessagingException mex = null;
StringTokenizer st = new StringTokenizer(mechs);
while (st.hasMoreTokens()) {
String m = st.nextToken();
@ -855,7 +856,17 @@ public class SMTPTransport extends Transport {
// only the first supported and enabled mechanism is used
logger.log(Level.FINE, "Using mechanism {0}", m);
return a.authenticate(host, authzid, user, passwd);
try {
return a.authenticate(host, authzid, user, passwd);
} catch (MessagingException ex) {
eu.faircode.email.Log.w(ex);
mex = ex;
}
}
if (mex != null) {
closeConnection();
throw mex;
}
// if no authentication mechanism found, fail
@ -933,7 +944,7 @@ public class SMTPTransport extends Transport {
(resp == 235 ? "succeeded" : "failed"));
resumeTracing();
if (resp != 235) {
closeConnection();
//closeConnection();
if (thrown != null) {
if (thrown instanceof Error)
throw (Error)thrown;

@ -432,13 +432,13 @@ public class ActivityEML extends ActivityBase {
}
EntityOperation.sync(context, inbox.id, true);
ServiceSynchronize.eval(context, "EML");
return account.name + "/" + inbox.name;
}
@Override
protected void onExecuted(Bundle args, String name) {
ServiceSynchronize.eval(ActivityEML.this, "EML");
ToastEx.makeText(ActivityEML.this, name, Toast.LENGTH_LONG).show();
}

@ -1086,6 +1086,7 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac
db.endTransaction();
}
ServiceSynchronize.eval(context, "import");
Log.i("Imported data");
return null;
@ -1093,7 +1094,6 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(ActivitySetup.this, "import");
ToastEx.makeText(ActivitySetup.this, R.string.title_setup_imported, Toast.LENGTH_LONG).show();
}

@ -96,10 +96,7 @@ public class ActivityWidget extends ActivityBase {
cbSemiTransparent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
btnColor.setColor(Color.TRANSPARENT);
setBackground();
}
setBackground();
}
});
@ -119,7 +116,6 @@ public class ActivityWidget extends ActivityBase {
.setPositiveButton(android.R.string.ok, new ColorPickerClickListener() {
@Override
public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) {
cbSemiTransparent.setChecked(false);
btnColor.setColor(selectedColor);
setBackground();
}
@ -127,7 +123,6 @@ public class ActivityWidget extends ActivityBase {
.setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cbSemiTransparent.setChecked(false);
btnColor.setColor(Color.TRANSPARENT);
setBackground();
}
@ -224,15 +219,19 @@ public class ActivityWidget extends ActivityBase {
}
private void setBackground() {
if (cbSemiTransparent.isChecked()) {
boolean semi = cbSemiTransparent.isChecked();
int background = btnColor.getColor();
if (background == Color.TRANSPARENT) {
inOld.setBackgroundResource(R.drawable.widget_background);
inNew.setBackgroundResource(R.drawable.widget_background);
} else {
int background = btnColor.getColor();
inOld.setBackgroundColor(background);
inNew.setBackgroundColor(background);
float lum = (float) ColorUtils.calculateLuminance(background);
int color = (lum > 0.7 ? Color.BLACK : getResources().getColor(R.color.colorWidgetForeground));
if (semi)
background = ColorUtils.setAlphaComponent(background, 127);
inOld.setBackgroundColor(background);
inNew.setBackgroundColor(background);
((ImageView) inOld.findViewById(R.id.ivMessage)).setColorFilter(color);
((TextView) inOld.findViewById(R.id.tvCount)).setTextColor(color);

@ -28,7 +28,6 @@ import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import androidx.preference.PreferenceManager;
@ -66,14 +65,6 @@ public class ActivityWidgetSync extends ActivityBase {
final Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
cbSemiTransparent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
btnColor.setColor(Color.TRANSPARENT);
}
});
btnColor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -90,14 +81,12 @@ public class ActivityWidgetSync extends ActivityBase {
.setPositiveButton(android.R.string.ok, new ColorPickerClickListener() {
@Override
public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) {
cbSemiTransparent.setChecked(false);
btnColor.setColor(selectedColor);
}
})
.setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cbSemiTransparent.setChecked(false);
btnColor.setColor(Color.TRANSPARENT);
}
})

@ -32,7 +32,6 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Spinner;
import android.widget.TextView;
@ -100,14 +99,6 @@ public class ActivityWidgetUnified extends ActivityBase {
final Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
cbSemiTransparent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
btnColor.setColor(Color.TRANSPARENT);
}
});
btnColor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -124,14 +115,12 @@ public class ActivityWidgetUnified extends ActivityBase {
.setPositiveButton(android.R.string.ok, new ColorPickerClickListener() {
@Override
public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) {
cbSemiTransparent.setChecked(false);
btnColor.setColor(selectedColor);
}
})
.setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cbSemiTransparent.setChecked(false);
btnColor.setColor(Color.TRANSPARENT);
}
})

@ -370,18 +370,24 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
boolean sync = args.getBoolean("sync");
DB db = DB.getInstance(context);
if (!sync) {
db.account().setAccountWarning(id, null);
db.account().setAccountError(id, null);
}
db.account().setAccountSynchronize(id, sync);
try {
db.beginTransaction();
return sync;
}
if (!sync) {
db.account().setAccountWarning(id, null);
db.account().setAccountError(id, null);
}
db.account().setAccountSynchronize(id, sync);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
@Override
protected void onExecuted(Bundle args, Boolean sync) {
ServiceSynchronize.eval(context, "account sync=" + sync);
return sync;
}
@Override

@ -236,7 +236,7 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
}
public void set(@NonNull List<EntityAnswer> answers) {
Log.i("Set answers=" + answers.size());
Log.i("Set answers=" + answers.size() + " search=" + search);
all = answers;
@ -283,6 +283,7 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
}
public void search(String query) {
Log.i("Answers query=" + query);
search = query;
set(all);
}

@ -309,12 +309,9 @@ public class AdapterAttachment extends RecyclerView.Adapter<AdapterAttachment.Vi
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "attachment");
return null;
}
@Override

@ -363,7 +363,7 @@ public class AdapterContact extends RecyclerView.Adapter<AdapterContact.ViewHold
}
public void set(@NonNull List<TupleContactEx> contacts) {
Log.i("Set contacts=" + contacts.size());
Log.i("Set contacts=" + contacts.size() + " search=" + search);
all = contacts;
@ -408,6 +408,7 @@ public class AdapterContact extends RecyclerView.Adapter<AdapterContact.ViewHold
}
public void search(String query) {
Log.i("Contacts query=" + query);
search = query;
set(all);
}

@ -663,11 +663,6 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
args.putBoolean("childs", childs);
new SimpleTask<Void>() {
@Override
protected void onPostExecute(Bundle args) {
ServiceSynchronize.eval(context, "refresh/folder");
}
@Override
protected Void onExecute(Context context, Bundle args) {
long fid = args.getLong("folder");
@ -709,6 +704,8 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
db.endTransaction();
}
ServiceSynchronize.eval(context, "refresh/folder");
if (!now)
throw new IllegalArgumentException(context.getString(R.string.title_no_connection));
@ -839,15 +836,11 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
boolean subscribed = args.getBoolean("subscribed");
EntityOperation.subscribe(context, id, subscribed);
ServiceSynchronize.eval(context, "subscribed=" + subscribed);
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "subscribed");
}
@Override
protected void onException(Bundle args, Throwable ex) {
Log.unexpectedError(parentFragment.getParentFragmentManager(), ex);

@ -134,12 +134,9 @@ public class AdapterImage extends RecyclerView.Adapter<AdapterImage.ViewHolder>
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "attachment");
return null;
}
@Override

@ -3197,12 +3197,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "doubletap");
return null;
}
@Override
@ -3397,12 +3394,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "flag");
return null;
}
@Override
@ -3703,12 +3697,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "attachment");
return null;
}
@Override
@ -4472,13 +4463,13 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
ServiceSynchronize.eval(context, "seen");
return null;
}
@Override
protected void onExecuted(Bundle args, Void ignored) {
ServiceSynchronize.eval(context, "seen");
long id = args.getLong("id");
TupleMessageEx amessage = getMessage();
if (amessage == null || !amessage.id.equals(id))
@ -4632,12 +4623,13 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
ServiceSynchronize.eval(context, "resync");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "resync");
ToastEx.makeText(context, R.string.title_fetching_again, Toast.LENGTH_LONG).show();
}
@ -4940,12 +4932,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "headers");
return null;
}
@Override
@ -5017,12 +5006,13 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
ServiceSynchronize.eval(context, "raw");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "raw");
ToastEx.makeText(context, R.string.title_download_message, Toast.LENGTH_LONG).show();
}
@ -6905,12 +6895,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
db.endTransaction();
}
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
ServiceSynchronize.eval(context, "keyword=" + keyword);
return null;
}
@Override

@ -325,14 +325,14 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
db.endTransaction();
}
if (applied > 0)
ServiceSynchronize.eval(context, "rules/manual");
return applied;
}
@Override
protected void onExecuted(Bundle args, Integer applied) {
if (applied > 0)
ServiceSynchronize.eval(context, "rules/manual");
Snackbar.make(
parentFragment.getView(),
context.getString(R.string.title_rule_applied, applied), Snackbar.LENGTH_LONG)
@ -425,7 +425,7 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
public void set(int protocol, @NonNull List<TupleRuleEx> rules) {
this.protocol = protocol;
Log.i("Set protocol=" + protocol + " rules=" + rules.size());
Log.i("Set protocol=" + protocol + " rules=" + rules.size() + " search=" + search);
all = rules;
@ -484,6 +484,7 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
}
public void search(String query) {
Log.i("Rules query=" + query);
search = query;
set(protocol, all);
}

@ -251,6 +251,15 @@ public class EntityRule {
return false;
}
// Date
JSONObject jdate = jcondition.optJSONObject("date");
if (jdate != null) {
long after = jdate.optLong("after", 0);
long before = jdate.optLong("before", 0);
if ((after != 0 && message.received < after) || (before != 0 && message.received > before))
return false;
}
// Schedule
JSONObject jschedule = jcondition.optJSONObject("schedule");
if (jschedule != null) {
@ -274,6 +283,7 @@ public class EntityRule {
jsubject == null &&
!jcondition.optBoolean("attachments") &&
jheader == null &&
jdate == null &&
jschedule == null)
return false;
} catch (JSONException ex) {

@ -1242,6 +1242,8 @@ public class FragmentAccount extends FragmentBase {
db.endTransaction();
}
ServiceSynchronize.eval(context, "save account");
if (!synchronize) {
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel("receive:" + account.id, 1);
@ -1263,10 +1265,8 @@ public class FragmentAccount extends FragmentBase {
fragment.show(getParentFragmentManager(), "account:save");
} else {
Context context = getContext();
if (context != null) {
ServiceSynchronize.eval(context, "save account");
if (context != null)
WidgetUnified.updateData(context); // Update color stripe
}
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
getParentFragmentManager().popBackStack();
@ -1636,15 +1636,13 @@ public class FragmentAccount extends FragmentBase {
DB db = DB.getInstance(context);
db.account().setAccountTbd(id);
ServiceSynchronize.eval(context, "delete account");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "delete account");
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getParentFragmentManager().popBackStack();
}

@ -342,20 +342,6 @@ public class FragmentAccounts extends FragmentBase {
@Override
protected void onPostExecute(Bundle args) {
swipeRefresh.setRefreshing(false);
Context context = getContext();
if (context != null) {
boolean force = args.getBoolean("force");
boolean outbox = args.getBoolean("outbox");
if (force)
ServiceSynchronize.reload(context, null, true, "refresh");
else
ServiceSynchronize.eval(context, "refresh");
if (outbox)
ServiceSend.start(context);
}
}
@Override
@ -397,8 +383,13 @@ public class FragmentAccounts extends FragmentBase {
db.endTransaction();
}
args.putBoolean("force", force);
args.putBoolean("outbox", outbox);
if (force)
ServiceSynchronize.reload(context, null, true, "refresh");
else
ServiceSynchronize.eval(context, "refresh");
if (outbox)
ServiceSend.start(context);
if (!now)
throw new IllegalArgumentException(context.getString(R.string.title_no_connection));

@ -128,10 +128,9 @@ public class FragmentAnswers extends FragmentBase {
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
if (savedInstanceState != null)
searching = savedInstanceState.getString("fair:searching");
adapter.search(searching);
}
adapter.search(searching);
DB db = DB.getInstance(getContext());
db.answer().liveAnswers().observe(getViewLifecycleOwner(), new Observer<List<EntityAnswer>>() {
@ -164,8 +163,10 @@ public class FragmentAnswers extends FragmentBase {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
searching = newText;
adapter.search(newText);
if (getView() != null) {
searching = newText;
adapter.search(newText);
}
return true;
}

@ -3680,6 +3680,9 @@ public class FragmentCompose extends FragmentBase {
"list".equals(action) ||
"dsn".equals(action) ||
"participation".equals(action)) {
// https://tools.ietf.org/html/rfc5322#section-3.6.4
// The "References:" field will contain the contents of the parent's "References:" field (if any)
// followed by the contents of the parent's "Message-ID:" field (if any).
data.draft.references = (ref.references == null ? "" : ref.references + " ") + ref.msgid;
data.draft.inreplyto = ref.msgid;
data.draft.thread = ref.thread;
@ -4192,6 +4195,8 @@ public class FragmentCompose extends FragmentBase {
db.endTransaction();
}
ServiceSynchronize.eval(context, "compose/draft");
return data;
}
@ -4200,10 +4205,6 @@ public class FragmentCompose extends FragmentBase {
final String action = getArguments().getString("action");
Log.i("Loaded draft id=" + data.draft.id + " action=" + action);
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "compose/draft");
working = data.draft.id;
encrypt = data.draft.ui_encrypt;
getActivity().invalidateOptionsMenu();
@ -5007,12 +5008,16 @@ public class FragmentCompose extends FragmentBase {
db.endTransaction();
}
args.putBoolean("dirty", dirty);
if (dirty)
ServiceSynchronize.eval(context, "compose/action");
if (action == R.id.action_send && draft.ui_snoozed != null) {
Log.i("Delayed send id=" + draft.id + " at " + new Date(draft.ui_snoozed));
EntityMessage.snooze(context, draft.id, draft.ui_snoozed);
}
if (action == R.id.action_send)
if (draft.ui_snoozed == null)
ServiceSend.start(context);
else {
Log.i("Delayed send id=" + draft.id + " at " + new Date(draft.ui_snoozed));
EntityMessage.snooze(context, draft.id, draft.ui_snoozed);
}
return draft;
}
@ -5022,21 +5027,10 @@ public class FragmentCompose extends FragmentBase {
if (draft == null)
return;
int action = args.getInt("action");
boolean dirty = args.getBoolean("dirty");
boolean needsEncryption = args.getBoolean("needsEncryption");
int action = args.getInt("action");
Log.i("Loaded action id=" + draft.id +
" action=" + getActionName(action) +
" dirty=" + dirty +
" encryption=" + needsEncryption);
Context context = getContext();
if (context != null) {
if (dirty)
ServiceSynchronize.eval(context, "compose/action");
if (action == R.id.action_send && draft.ui_snoozed == null)
ServiceSend.start(context);
}
" action=" + getActionName(action) + " encryption=" + needsEncryption);
etTo.setText(MessageHelper.formatAddressesCompose(draft.to));
etCc.setText(MessageHelper.formatAddressesCompose(draft.cc));

@ -92,10 +92,9 @@ public class FragmentContacts extends FragmentBase {
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
if (savedInstanceState != null)
searching = savedInstanceState.getString("fair:searching");
adapter.search(searching);
}
adapter.search(searching);
DB db = DB.getInstance(getContext());
db.contact().liveContacts().observe(getViewLifecycleOwner(), new Observer<List<TupleContactEx>>() {
@ -130,8 +129,10 @@ public class FragmentContacts extends FragmentBase {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
searching = newText;
adapter.search(newText);
if (getView() != null) {
searching = newText;
adapter.search(newText);
}
return true;
}

@ -44,7 +44,7 @@ import static android.app.Activity.RESULT_CANCELED;
import static android.app.Activity.RESULT_OK;
public class FragmentDialogDuration extends FragmentDialogBase {
private Calendar cal = Calendar.getInstance();
private final Calendar cal = Calendar.getInstance();
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
@ -55,7 +55,10 @@ public class FragmentDialogDuration extends FragmentDialogBase {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
String title = getArguments().getString("title");
Bundle args = getArguments();
String title = args.getString("title");
boolean day = args.getBoolean("day");
long time = args.getLong("time", 0);
final View dview = LayoutInflater.from(getContext()).inflate(R.layout.dialog_duration, null);
final TextView tvDuration = dview.findViewById(R.id.tvDuration);
@ -65,9 +68,16 @@ public class FragmentDialogDuration extends FragmentDialogBase {
final TimePicker timePicker = dview.findViewById(R.id.timePicker);
final DatePicker datePicker = dview.findViewById(R.id.datePicker);
if (savedInstanceState == null)
cal.setTimeInMillis((new Date().getTime() / (3600 * 1000L) + 1) * (3600 * 1000L));
else
if (savedInstanceState == null) {
if (time == 0) {
cal.setTimeInMillis(new Date().getTime());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.HOUR_OF_DAY, day ? 0 : cal.get(Calendar.HOUR_OF_DAY) + 1);
} else
cal.setTimeInMillis(time);
} else
cal.setTimeInMillis(savedInstanceState.getLong("fair:time"));
Log.i("Set init=" + new Date(cal.getTimeInMillis()));
@ -107,6 +117,7 @@ public class FragmentDialogDuration extends FragmentDialogBase {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Bundle args = getArguments();
args.putBoolean("reset", true);
args.putLong("duration", 0);
args.putLong("time", new Date().getTime());

@ -79,12 +79,12 @@ public class FragmentDialogSearch extends FragmentDialogBase {
View dview = LayoutInflater.from(context).inflate(R.layout.dialog_search, null);
final AutoCompleteTextView etQuery = dview.findViewById(R.id.etQuery);
final ImageButton ibNotes = dview.findViewById(R.id.ibNotes);
final ImageButton ibAttachment = dview.findViewById(R.id.ibAttachment);
final ImageButton ibEvent = dview.findViewById(R.id.ibInvite);
final ImageButton ibUnseen = dview.findViewById(R.id.ibUnseen);
final ImageButton ibFlagged = dview.findViewById(R.id.ibFlagged);
final ImageButton ibInfo = dview.findViewById(R.id.ibInfo);
final ImageButton ibFlagged = dview.findViewById(R.id.ibFlagged);
final ImageButton ibUnseen = dview.findViewById(R.id.ibUnseen);
final ImageButton ibInvite = dview.findViewById(R.id.ibInvite);
final ImageButton ibAttachment = dview.findViewById(R.id.ibAttachment);
final ImageButton ibNotes = dview.findViewById(R.id.ibNotes);
final ImageButton ibMore = dview.findViewById(R.id.ibMore);
final TextView tvMore = dview.findViewById(R.id.tvMore);
final CheckBox cbSearchIndex = dview.findViewById(R.id.cbSearchIndex);
@ -389,17 +389,17 @@ public class FragmentDialogSearch extends FragmentDialogBase {
BoundaryCallbackMessages.SearchCriteria criteria = new BoundaryCallbackMessages.SearchCriteria();
int id = v.getId();
if (id == R.id.ibNotes)
criteria.with_notes = true;
else if (id == R.id.ibAttachment)
criteria.with_attachments = true;
if (id == R.id.ibFlagged)
criteria.with_flagged = true;
else if (id == R.id.ibUnseen)
criteria.with_unseen = true;
else if (id == R.id.ibInvite) {
criteria.with_attachments = true;
criteria.with_types = new String[]{"text/calendar"};
} else if (id == R.id.ibUnseen)
criteria.with_unseen = true;
else if (id == R.id.ibFlagged)
criteria.with_flagged = true;
} else if (id == R.id.ibAttachment)
criteria.with_attachments = true;
else if (id == R.id.ibNotes)
criteria.with_notes = true;
FragmentMessages.search(
context, getViewLifecycleOwner(), getParentFragmentManager(),
@ -409,7 +409,7 @@ public class FragmentDialogSearch extends FragmentDialogBase {
ibNotes.setOnClickListener(onClick);
ibAttachment.setOnClickListener(onClick);
ibEvent.setOnClickListener(onClick);
ibInvite.setOnClickListener(onClick);
ibUnseen.setOnClickListener(onClick);
ibFlagged.setOnClickListener(onClick);

@ -116,14 +116,9 @@ public class FragmentDialogSync extends FragmentDialogBase {
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "folder:months");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "folder:months");
return null;
}
@Override

@ -631,23 +631,16 @@ public class FragmentFolder extends FragmentBase {
db.endTransaction();
}
args.putBoolean("reload", reload);
if (reload)
ServiceSynchronize.reload(context, aid, false, "save folder");
else
ServiceSynchronize.eval(context, "save folder");
return false;
}
@Override
protected void onExecuted(Bundle args, Boolean dirty) {
Context context = getContext();
if (context != null) {
long aid = args.getLong("account");
boolean reload = args.getBoolean("reload");
if (reload)
ServiceSynchronize.reload(context, aid, false, "save folder");
else
ServiceSynchronize.eval(context, "save folder");
}
if (dirty) {
Bundle aargs = new Bundle();
aargs.putString("question", getString(R.string.title_ask_save));

@ -321,20 +321,6 @@ public class FragmentFolders extends FragmentBase {
new SimpleTask<Void>() {
@Override
protected void onPostExecute(Bundle args) {
Context context = getContext();
if (context != null) {
boolean force = args.getBoolean("force");
boolean outbox = args.getBoolean("outbox");
if (force)
ServiceSynchronize.reload(context, null, true, "refresh");
else
ServiceSynchronize.eval(context, "refresh");
if (outbox)
ServiceSend.start(context);
}
swipeRefresh.setRefreshing(false);
}
@ -389,8 +375,13 @@ public class FragmentFolders extends FragmentBase {
db.endTransaction();
}
args.putBoolean("force", force);
args.putBoolean("outbox", outbox);
if (force)
ServiceSynchronize.reload(context, null, true, "refresh");
else
ServiceSynchronize.eval(context, "refresh");
if (outbox)
ServiceSend.start(context);
if (!now)
throw new IllegalArgumentException(context.getString(R.string.title_no_connection));
@ -700,14 +691,9 @@ public class FragmentFolders extends FragmentBase {
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "purge");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "purge");
return null;
}
@Override

@ -497,19 +497,16 @@ public class FragmentGmail extends FragmentBase {
db.endTransaction();
}
ServiceSynchronize.eval(context, "Gmail");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "Gmail");
if (args.getLong("account") < 0) {
finish();
if (context != null)
ToastEx.makeText(context, R.string.title_setup_oauth_updated, Toast.LENGTH_LONG).show();
ToastEx.makeText(getContext(), R.string.title_setup_oauth_updated, Toast.LENGTH_LONG).show();
} else {
FragmentReview fragment = new FragmentReview();
fragment.setArguments(args);

@ -270,6 +270,10 @@ public class FragmentIdentity extends FragmentBase {
spProvider.setTag(0);
spProvider.setSelection(0);
setProvider((EmailProvider) spProvider.getItemAtPosition(0));
if (account.host == null || account.host.startsWith("imap"))
etHost.setText(null);
else
etHost.setText(account.host);
grpAdvanced.setVisibility(View.VISIBLE);
}

@ -1452,19 +1452,6 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
args.putString("type", type);
new SimpleTask<Void>() {
@Override
protected void onPostExecute(Bundle args) {
Context context = getContext();
if (context != null) {
boolean force = args.getBoolean("force");
if (force)
ServiceSynchronize.reload(context, null, true, "refresh");
else
ServiceSynchronize.eval(context, "refresh");
}
}
@Override
protected Void onExecute(Context context, Bundle args) {
long fid = args.getLong("folder");
@ -1516,7 +1503,10 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
args.putBoolean("force", force);
if (force)
ServiceSynchronize.reload(context, null, true, "refresh");
else
ServiceSynchronize.eval(context, "refresh");
if (!now)
throw new IllegalArgumentException(context.getString(R.string.title_no_connection));
@ -2986,14 +2976,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "seen");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "seen");
return null;
}
@Override
@ -3130,14 +3115,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "flag");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "flag");
return null;
}
@Override
@ -3708,6 +3688,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
ServiceSynchronize.eval(context, "outbox/drafts");
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel("send:" + id, 1);
@ -3716,13 +3698,11 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
@Override
protected void onExecuted(Bundle args, EntityMessage draft) {
if (draft != null) {
ServiceSynchronize.eval(context, "outbox/drafts");
if (draft != null)
context.startActivity(
new Intent(context, ActivityCompose.class)
.putExtra("action", "edit")
.putExtra("id", draft.id));
}
}
@Override
@ -4930,7 +4910,10 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
autoExpanded = false;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
boolean expand_first = prefs.getBoolean("expand_first", true);
boolean expand_all = prefs.getBoolean("expand_all", false);
long download = prefs.getInt("download", MessageHelper.DEFAULT_DOWNLOAD_SIZE);
if (download == 0)
download = Long.MAX_VALUE;
@ -4984,7 +4967,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
expand = messages.get(0);
else if (messages.size() > 0) {
TupleMessageEx first = messages.get(adapter.getAscending() ? messages.size() - 1 : 0);
if (first != null && EntityFolder.OUTBOX.equals(first.folderType))
if (first != null &&
((expand_first && unseen == 0) || EntityFolder.OUTBOX.equals(first.folderType)))
expand = first;
}
@ -4994,7 +4978,6 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
}
// Auto expand all seen messages
boolean expand_all = prefs.getBoolean("expand_all", false);
if (expand_all)
for (TupleMessageEx message : messages)
if (message != null &&
@ -5227,14 +5210,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "expand");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "expand");
return null;
}
@Override
@ -5431,15 +5409,13 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
ServiceSynchronize.eval(context, "move");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "move");
if (viewType == AdapterMessage.ViewType.THREAD) {
PagedList<TupleMessageEx> messages = adapter.getCurrentList();
if (messages != null && result.size() > 0) {
@ -5530,14 +5506,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "move");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "move");
return null;
}
@Override
@ -7209,6 +7180,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
ServiceSynchronize.eval(context, "delete");
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel("send:" + id, 1);
@ -7217,10 +7190,6 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "delete");
if (viewType == AdapterMessage.ViewType.THREAD) {
PagedList<TupleMessageEx> messages = adapter.getCurrentList();
if (messages != null) {
@ -7263,15 +7232,13 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
ServiceSynchronize.eval(context, "delete");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "delete");
if (viewType == AdapterMessage.ViewType.THREAD) {
long[] ids = args.getLongArray("ids");
PagedList<TupleMessageEx> messages = adapter.getCurrentList();
@ -7333,14 +7300,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "junk");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "junk");
return null;
}
@Override
@ -7409,14 +7371,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
}
});
return null;
}
ServiceSynchronize.eval(context, "flag");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "flag");
return null;
}
@Override
@ -7599,19 +7556,18 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
if (copy)
ServiceSynchronize.eval(context, "copy");
return result;
}
@Override
protected void onExecuted(Bundle args, ArrayList<MessageTarget> result) {
boolean copy = args.getBoolean("copy");
if (copy) {
Context context = getContext();
if (context != null) {
ServiceSynchronize.eval(context, "copy");
ToastEx.makeText(context, R.string.title_completed, Toast.LENGTH_LONG).show();
}
} else
if (copy)
ToastEx.makeText(getContext(), R.string.title_completed, Toast.LENGTH_LONG).show();
else
moveAsk(result, false, !autoclose && onclose == null);
}
@ -7924,14 +7880,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
db.endTransaction();
}
return null;
}
ServiceSynchronize.eval(context, "purge");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "purge");
return null;
}
@Override

@ -608,6 +608,8 @@ public class FragmentOAuth extends FragmentBase {
db.endTransaction();
}
ServiceSynchronize.eval(context, "OAuth");
return null;
}
@ -615,14 +617,9 @@ public class FragmentOAuth extends FragmentBase {
protected void onExecuted(Bundle args, Void data) {
pbOAuth.setVisibility(View.GONE);
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "OAuth");
if (args.getLong("account") < 0) {
finish();
if (context != null)
ToastEx.makeText(context, R.string.title_setup_oauth_updated, Toast.LENGTH_LONG).show();
ToastEx.makeText(getContext(), R.string.title_setup_oauth_updated, Toast.LENGTH_LONG).show();
} else {
FragmentReview fragment = new FragmentReview();
fragment.setArguments(args);

@ -362,8 +362,8 @@ public class FragmentOptions extends FragmentBase {
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
View dview = LayoutInflater.from(getContext()).inflate(R.layout.dialog_setup, null);
CheckBox cbNotAgain = dview.findViewById(R.id.cbNotAgain);
Group grp2 = dview.findViewById(R.id.grp2);
Group grp3 = dview.findViewById(R.id.grp3);
Group grp4 = dview.findViewById(R.id.grp4);
cbNotAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
@ -376,8 +376,8 @@ public class FragmentOptions extends FragmentBase {
boolean hasPermissions = Helper.hasPermission(getContext(), Manifest.permission.READ_CONTACTS);
Boolean isIgnoring = Helper.isIgnoringOptimizations(getContext());
grp3.setVisibility(hasPermissions ? View.GONE : View.VISIBLE);
grp4.setVisibility(isIgnoring == null || isIgnoring ? View.GONE : View.VISIBLE);
grp2.setVisibility(hasPermissions ? View.GONE : View.VISIBLE);
grp3.setVisibility(isIgnoring == null || isIgnoring ? View.GONE : View.VISIBLE);
return new AlertDialog.Builder(getContext())
.setView(dview)

@ -74,6 +74,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe
private SwitchCompat swSwipeClose;
private SwitchCompat swSwipeMove;
private SwitchCompat swAutoExpand;
private SwitchCompat swExpandFirst;
private SwitchCompat swExpandAll;
private SwitchCompat swExpandOne;
private SwitchCompat swAutoClose;
@ -92,7 +93,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe
"default_snooze",
"pull", "autoscroll", "quick_filter", "quick_scroll",
"doubletap", "swipenav", "volumenav", "reversed", "swipe_close", "swipe_move",
"autoexpand", "expand_all", "expand_one", "collapse_multiple",
"autoexpand", "expand_first", "expand_all", "expand_one", "collapse_multiple",
"autoclose", "onclose", "undo_timeout",
"autoread", "flag_snoozed", "autounflag", "auto_important", "reset_importance"
};
@ -125,6 +126,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe
swSwipeClose = view.findViewById(R.id.swSwipeClose);
swSwipeMove = view.findViewById(R.id.swSwipeMove);
swAutoExpand = view.findViewById(R.id.swAutoExpand);
swExpandFirst = view.findViewById(R.id.swExpandFirst);
swExpandAll = view.findViewById(R.id.swExpandAll);
swExpandOne = view.findViewById(R.id.swExpandOne);
swCollapseMultiple = view.findViewById(R.id.swCollapseMultiple);
@ -288,6 +290,14 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("autoexpand", checked).apply();
swExpandFirst.setEnabled(checked);
}
});
swExpandFirst.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("expand_first", checked).apply();
}
});
@ -459,6 +469,8 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe
swSwipeMove.setChecked(prefs.getBoolean("swipe_move", false));
swAutoExpand.setChecked(prefs.getBoolean("autoexpand", true));
swExpandFirst.setChecked(prefs.getBoolean("expand_first", true));
swExpandFirst.setEnabled(swAutoExpand.isChecked());
swExpandAll.setChecked(prefs.getBoolean("expand_all", false));
swExpandOne.setChecked(prefs.getBoolean("expand_one", true));
swExpandOne.setEnabled(!swExpandAll.isChecked());

@ -873,6 +873,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_default) {
FragmentOptions.reset(getContext(), RESET_OPTIONS);
setNavigationBarColor(Color.BLACK);
return true;
}
return super.onOptionsItemSelected(item);

@ -506,14 +506,9 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr
DB db = DB.getInstance(context);
db.account().setAccountPollExempted(id, exempted);
return null;
}
ServiceSynchronize.eval(context, "exempted");
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "exempted");
return null;
}
@Override

@ -611,6 +611,8 @@ public class FragmentPop extends FragmentBase {
db.endTransaction();
}
ServiceSynchronize.eval(context, "POP3");
if (!synchronize) {
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel("receive:" + account.id, 1);
@ -632,10 +634,8 @@ public class FragmentPop extends FragmentBase {
fragment.show(getParentFragmentManager(), "account:save");
} else {
Context context = getContext();
if (context != null) {
ServiceSynchronize.eval(context, "POP3");
if (context != null)
WidgetUnified.updateData(context); // Update color stripe
}
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
getParentFragmentManager().popBackStack();
@ -879,15 +879,13 @@ public class FragmentPop extends FragmentBase {
DB db = DB.getInstance(context);
db.account().setAccountTbd(id);
ServiceSynchronize.eval(context, "delete account");
return null;
}
@Override
protected void onExecuted(Bundle args, Void data) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "delete account");
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getParentFragmentManager().popBackStack();
}

@ -452,15 +452,13 @@ public class FragmentQuickSetup extends FragmentBase {
db.endTransaction();
}
ServiceSynchronize.eval(context, "quick setup");
return null;
}
@Override
protected void onExecuted(Bundle args, EmailProvider result) {
Context context = getContext();
if (context != null)
ServiceSynchronize.eval(context, "quick setup");
boolean check = args.getBoolean("check");
if (check) {
tvImap.setText(result == null ? null

@ -30,7 +30,6 @@ import android.os.Bundle;
import android.provider.ContactsContract;
import android.speech.tts.TextToSpeech;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@ -66,6 +65,7 @@ import com.google.android.material.snackbar.Snackbar;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@ -104,6 +104,11 @@ public class FragmentRule extends FragmentBase {
private EditText etHeader;
private CheckBox cbHeader;
private TextView tvDateAfter;
private TextView tvDateBefore;
private Button btnDateAfter;
private Button btnDateBefore;
private Spinner spScheduleDayStart;
private Spinner spScheduleDayEnd;
private TextView tvScheduleHourStart;
@ -165,6 +170,8 @@ public class FragmentRule extends FragmentBase {
private int protocol = -1;
private long folder = -1;
private DateFormat DF;
private final static int MAX_CHECK = 10;
private static final int REQUEST_SENDER = 1;
@ -176,6 +183,8 @@ public class FragmentRule extends FragmentBase {
private static final int REQUEST_TO = 7;
private final static int REQUEST_TTS_CHECK = 8;
private final static int REQUEST_TTS_DATA = 9;
private final static int REQUEST_DATE_AFTER = 10;
private final static int REQUEST_DATE_BEFORE = 11;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -190,6 +199,8 @@ public class FragmentRule extends FragmentBase {
account = args.getLong("account", -1);
protocol = args.getInt("protocol", EntityAccount.TYPE_IMAP);
folder = args.getLong("folder", -1);
DF = Helper.getDateTimeInstance(getContext(), DateFormat.SHORT, DateFormat.SHORT);
}
@Override
@ -228,6 +239,11 @@ public class FragmentRule extends FragmentBase {
etHeader = view.findViewById(R.id.etHeader);
cbHeader = view.findViewById(R.id.cbHeader);
tvDateAfter = view.findViewById(R.id.tvDateAfter);
tvDateBefore = view.findViewById(R.id.tvDateBefore);
btnDateAfter = view.findViewById(R.id.btnDateAfter);
btnDateBefore = view.findViewById(R.id.btnDateBefore);
spScheduleDayStart = view.findViewById(R.id.spScheduleDayStart);
spScheduleDayEnd = view.findViewById(R.id.spScheduleDayEnd);
tvScheduleHourStart = view.findViewById(R.id.tvScheduleHourStart);
@ -309,6 +325,45 @@ public class FragmentRule extends FragmentBase {
}
});
tvDateAfter.setText("-");
tvDateBefore.setText("-");
btnDateAfter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle args = new Bundle();
args.putString("title", getString(R.string.title_rule_date_after));
args.putBoolean("day", true);
Object time = tvDateAfter.getTag();
if (time != null)
args.putLong("time", (long) time);
FragmentDialogDuration fragment = new FragmentDialogDuration();
fragment.setArguments(args);
fragment.setTargetFragment(FragmentRule.this, REQUEST_DATE_AFTER);
fragment.show(getParentFragmentManager(), "date:after");
}
});
btnDateBefore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle args = new Bundle();
args.putString("title", getString(R.string.title_rule_date_before));
args.putBoolean("day", true);
Object time = tvDateBefore.getTag();
if (time != null)
args.putLong("time", (long) time);
FragmentDialogDuration fragment = new FragmentDialogDuration();
fragment.setArguments(args);
fragment.setTargetFragment(FragmentRule.this, REQUEST_DATE_BEFORE);
fragment.show(getParentFragmentManager(), "date:before");
}
});
adapterDay = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList<String>());
adapterDay.setDropDownViewResource(R.layout.spinner_item1_dropdown);
spScheduleDayStart.setAdapter(adapterDay);
@ -678,6 +733,14 @@ public class FragmentRule extends FragmentBase {
break;
case REQUEST_TTS_DATA:
break;
case REQUEST_DATE_AFTER:
if (resultCode == RESULT_OK && data != null)
onDateAfter(data.getBundleExtra("args"));
break;
case REQUEST_DATE_BEFORE:
if (resultCode == RESULT_OK && data != null)
onDateBefore(data.getBundleExtra("args"));
break;
}
} catch (Throwable ex) {
Log.e(ex);
@ -748,6 +811,24 @@ public class FragmentRule extends FragmentBase {
cbScheduleEnd.setChecked(true);
}
private void onDateAfter(Bundle args) {
boolean reset = args.getBoolean("reset");
long time = args.getLong("time");
if (reset)
time = 0;
tvDateAfter.setTag(time);
tvDateAfter.setText(time == 0 ? "-" : DF.format(time));
}
private void onDateBefore(Bundle args) {
boolean reset = args.getBoolean("reset");
long time = args.getLong("time");
if (reset)
time = 0;
tvDateBefore.setTag(time);
tvDateBefore.setText(time == 0 ? "-" : DF.format(time));
}
private void loadRule(final Bundle savedInstanceState) {
Bundle rargs = new Bundle();
rargs.putLong("id", copy < 0 ? id : copy);
@ -788,6 +869,7 @@ public class FragmentRule extends FragmentBase {
JSONObject jrecipient = jcondition.optJSONObject("recipient");
JSONObject jsubject = jcondition.optJSONObject("subject");
JSONObject jheader = jcondition.optJSONObject("header");
JSONObject jdate = jcondition.optJSONObject("date");
JSONObject jschedule = jcondition.optJSONObject("schedule");
etName.setText(rule == null ? args.getString("subject") : rule.name);
@ -815,6 +897,15 @@ public class FragmentRule extends FragmentBase {
etHeader.setText(jheader == null ? null : jheader.getString("value"));
cbHeader.setChecked(jheader != null && jheader.getBoolean("regex"));
long after = (jdate != null && jdate.has("after") ? jdate.getLong("after") : 0);
long before = (jdate != null && jdate.has("before") ? jdate.getLong("before") : 0);
tvDateAfter.setTag(after);
tvDateAfter.setText(after == 0 ? "-" : DF.format(after));
tvDateBefore.setTag(before);
tvDateBefore.setText(before == 0 ? "-" : DF.format(before));
int start = (jschedule != null && jschedule.has("start") ? jschedule.getInt("start") : 0);
int end = (jschedule != null && jschedule.has("end") ? jschedule.getInt("end") : 0);
@ -1126,6 +1217,21 @@ public class FragmentRule extends FragmentBase {
jcondition.put("header", jheader);
}
Object hafter = tvDateAfter.getTag();
Object hbefore = tvDateBefore.getTag();
long after = (hafter == null ? 0 : (long) hafter);
long before = (hbefore == null ? 0 : (long) hbefore);
if (after != before) {
JSONObject jdate = new JSONObject();
if (after != 0)
jdate.put("after", after);
if (before != 0)
jdate.put("before", before);
jcondition.put("date", jdate);
}
int dstart = spScheduleDayStart.getSelectedItemPosition();
int dend = spScheduleDayEnd.getSelectedItemPosition();
Object hstart = tvScheduleHourStart.getTag();
@ -1264,7 +1370,7 @@ public class FragmentRule extends FragmentBase {
return new TimePickerDialog(getContext(), this,
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
DateFormat.is24HourFormat(getContext()));
android.text.format.DateFormat.is24HourFormat(getContext()));
}
public void onTimeSet(TimePicker view, int hour, int minute) {
@ -1341,14 +1447,14 @@ public class FragmentRule extends FragmentBase {
db.endTransaction();
}
if (applied > 0)
ServiceSynchronize.eval(context, "rules/manual");
return applied;
}
@Override
protected void onExecuted(Bundle args, Integer applied) {
if (applied > 0)
ServiceSynchronize.eval(getContext(), "rules/manual");
dismiss();
ToastEx.makeText(getContext(), getString(R.string.title_rule_applied, applied), Toast.LENGTH_LONG).show();
}

@ -172,10 +172,9 @@ public class FragmentRules extends FragmentBase {
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
if (savedInstanceState != null)
searching = savedInstanceState.getString("fair:searching");
adapter.search(searching);
}
adapter.search(searching);
DB db = DB.getInstance(getContext());
db.rule().liveRules(folder).observe(getViewLifecycleOwner(), new Observer<List<TupleRuleEx>>() {
@ -236,8 +235,10 @@ public class FragmentRules extends FragmentBase {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
searching = newText;
adapter.search(newText);
if (getView() != null) {
searching = newText;
adapter.search(newText);
}
return true;
}

@ -868,8 +868,8 @@ public class Helper {
static boolean isNight(Context context) {
// https://developer.android.com/guide/topics/ui/look-and-feel/darktheme#configuration_changes
int uiMode = context.getResources().getConfiguration().uiMode;
Log.i("UI mode=" + uiMode);
return ((uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES);
Log.i("UI mode=" + Integer.toHexString(uiMode));
return ((uiMode & Configuration.UI_MODE_NIGHT_YES) != 0);
}
static boolean isDarkTheme(Context context) {

@ -197,8 +197,19 @@ public class MessageHelper {
}
// References
if (message.references != null)
imessage.addHeader("References", message.references);
if (message.references != null) {
// https://tools.ietf.org/html/rfc5322#section-2.1.1
// Each line of characters MUST be no more than 998 characters
String references = message.references;
int hlen = "References: ".length();
int sp = references.indexOf(' ');
while (references.length() > 998 - hlen && sp > 0) {
Log.i("Dropping reference=" + references.substring(0, sp));
references = references.substring(sp);
sp = references.indexOf(' ');
}
imessage.addHeader("References", references);
}
if (message.inreplyto != null)
imessage.addHeader("In-Reply-To", message.inreplyto);
imessage.addHeader(HEADER_CORRELATION_ID, message.msgid);

@ -2023,16 +2023,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
prefs.edit().putInt("poll_interval", OPTIMIZE_POLL_INTERVAL).apply();
} else if (pollInterval <= 60 && account.poll_exempted) {
db.account().setAccountPollExempted(account.id, false);
ApplicationEx.getMainHandler().post(new Runnable() {
@Override
public void run() {
try {
onEval(new Intent().putExtra("account", account.id));
} catch (Throwable ex) {
Log.e(ex);
}
}
});
ServiceSynchronize.eval(this, "Optimize=" + reason);
}
}
@ -2441,13 +2432,12 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
private static void start(Context context, Intent intent) {
if (isBackgroundService(context))
context.startService(intent);
else {
else
try {
ContextCompat.startForegroundService(context, intent);
} catch (Throwable ex) {
Log.e(ex);
}
}
}
private static boolean isBackgroundService(Context context) {

@ -100,9 +100,6 @@ public class Widget extends AppWidgetProvider {
views.setOnClickPendingIntent(R.id.widget, pi);
if (!semi)
views.setInt(R.id.widget, "setBackgroundColor", background);
if (layout == 1)
views.setImageViewResource(R.id.ivMessage, unseen == 0
? R.drawable.baseline_mail_outline_widget_24
@ -119,8 +116,14 @@ public class Widget extends AppWidgetProvider {
views.setViewVisibility(R.id.tvAccount, ViewStripe.VISIBLE);
}
if (!semi && background != Color.TRANSPARENT) {
if (background != Color.TRANSPARENT) {
float lum = (float) ColorUtils.calculateLuminance(background);
if (semi)
background = ColorUtils.setAlphaComponent(background, 127);
views.setInt(R.id.widget, "setBackgroundColor", background);
if (lum > 0.7f) {
views.setInt(R.id.ivMessage, "setColorFilter", Color.BLACK);
views.setTextColor(R.id.tvCount, Color.BLACK);

@ -49,11 +49,14 @@ public class WidgetSync extends AppWidgetProvider {
views.setOnClickPendingIntent(R.id.ivSync, pi);
views.setImageViewResource(R.id.ivSync, enabled ? R.drawable.twotone_sync_24 : R.drawable.twotone_sync_disabled_24);
if (!semi)
if (background != Color.TRANSPARENT) {
float lum = (float) ColorUtils.calculateLuminance(background);
if (semi)
background = ColorUtils.setAlphaComponent(background, 127);
views.setInt(R.id.widget, "setBackgroundColor", background);
if (!semi && background != Color.TRANSPARENT) {
float lum = (float) ColorUtils.calculateLuminance(background);
if (lum > 0.7f)
views.setInt(R.id.ivSync, "setColorFilter", Color.BLACK);
}

@ -59,9 +59,6 @@ public class WidgetUnified extends AppWidgetProvider {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_unified);
if (!semi)
views.setInt(R.id.widget, "setBackgroundColor", background);
if (font > 0)
views.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, getFontSizeSp(font));
@ -70,10 +67,6 @@ public class WidgetUnified extends AppWidgetProvider {
views.setViewPadding(R.id.title, px, px, px, px);
}
float lum = (float) ColorUtils.calculateLuminance(background);
if (lum > 0.7f)
views.setTextColor(R.id.title, Color.BLACK);
if (name == null)
views.setTextViewText(R.id.title, context.getString(R.string.title_folder_unified));
else
@ -99,6 +92,18 @@ public class WidgetUnified extends AppWidgetProvider {
views.setPendingIntentTemplate(R.id.lv, piItem);
if (background != Color.TRANSPARENT) {
float lum = (float) ColorUtils.calculateLuminance(background);
if (semi)
background = ColorUtils.setAlphaComponent(background, 127);
views.setInt(R.id.widget, "setBackgroundColor", background);
if (lum > 0.7f)
views.setTextColor(R.id.title, Color.BLACK);
}
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}

@ -55,7 +55,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:background="@color/lightBluePrimary"
android:background="@android:color/darker_gray"
android:padding="24dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnColor">

@ -1,6 +1,7 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fadeScrollbars="false"
@ -13,95 +14,100 @@
<eu.faircode.email.FixedTextView
android:id="@+id/tvCaption"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/title_search"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toStartOf="@+id/ibInfo"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/ibNotes"
android:id="@+id/ibInfo"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_search_flag_notes"
android:contentDescription="@string/title_info"
android:padding="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/title_search_flag_notes"
app:layout_constraintEnd_toStartOf="@+id/ibAttachment"
app:layout_constraintTop_toBottomOf="@id/tvCaption"
app:srcCompat="@drawable/twotone_sticky_note_2_24" />
android:tooltipText="@string/title_info"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twotone_info_24" />
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/ibFlow"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:constraint_referenced_ids="ibFlagged,ibUnseen,ibInvite,ibAttachment,ibNotes"
app:flow_horizontalBias="0"
app:flow_horizontalGap="12dp"
app:flow_horizontalStyle="packed"
app:flow_wrapMode="chain"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvCaption" />
<ImageButton
android:id="@+id/ibAttachment"
android:id="@+id/ibFlagged"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_search_flag_attachments"
android:contentDescription="@string/title_search_flag_flagged"
android:padding="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/title_search_flag_attachments"
app:layout_constraintEnd_toStartOf="@+id/ibInvite"
app:layout_constraintTop_toBottomOf="@id/tvCaption"
app:srcCompat="@drawable/twotone_attachment_24" />
android:tooltipText="@string/title_search_flag_flagged"
app:srcCompat="@drawable/twotone_star_24"
tools:ignore="MissingConstraints" />
<ImageButton
android:id="@+id/ibInvite"
android:id="@+id/ibUnseen"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_search_flag_invite"
android:contentDescription="@string/title_search_flag_unseen"
android:padding="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/title_search_flag_invite"
app:layout_constraintEnd_toStartOf="@+id/ibUnseen"
app:layout_constraintTop_toBottomOf="@id/tvCaption"
app:srcCompat="@drawable/twotone_event_24" />
android:tooltipText="@string/title_search_flag_unseen"
app:srcCompat="@drawable/twotone_mail_24"
tools:ignore="MissingConstraints" />
<ImageButton
android:id="@+id/ibUnseen"
android:id="@+id/ibInvite"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_search_flag_unseen"
android:contentDescription="@string/title_search_flag_invite"
android:padding="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/title_search_flag_unseen"
app:layout_constraintEnd_toStartOf="@+id/ibFlagged"
app:layout_constraintTop_toBottomOf="@id/tvCaption"
app:srcCompat="@drawable/twotone_mail_24" />
android:tooltipText="@string/title_search_flag_invite"
app:srcCompat="@drawable/twotone_event_24"
tools:ignore="MissingConstraints" />
<ImageButton
android:id="@+id/ibFlagged"
android:id="@+id/ibAttachment"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_search_flag_flagged"
android:contentDescription="@string/title_search_flag_attachments"
android:padding="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/title_search_flag_flagged"
app:layout_constraintEnd_toStartOf="@+id/ibInfo"
app:layout_constraintTop_toBottomOf="@id/tvCaption"
app:srcCompat="@drawable/twotone_star_24" />
android:tooltipText="@string/title_search_flag_attachments"
app:srcCompat="@drawable/twotone_attachment_24"
tools:ignore="MissingConstraints" />
<ImageButton
android:id="@+id/ibInfo"
android:id="@+id/ibNotes"
android:layout_width="36dp"
android:layout_height="36dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/title_info"
android:contentDescription="@string/title_search_flag_notes"
android:padding="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/title_info"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvCaption"
app:srcCompat="@drawable/twotone_info_24" />
android:tooltipText="@string/title_search_flag_notes"
app:srcCompat="@drawable/twotone_sticky_note_2_24"
tools:ignore="MissingConstraints" />
<eu.faircode.email.TextViewAutoCompleteClearable
android:id="@+id/etQuery"
@ -115,7 +121,7 @@
android:maxLines="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ibInfo" />
app:layout_constraintTop_toBottomOf="@id/ibFlow" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvHint"

@ -34,14 +34,12 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/title_setup_permissions"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/two"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/two" />
app:layout_constraintStart_toEndOf="@id/two"
app:layout_constraintTop_toTopOf="@id/two" />
<ImageView
android:id="@+id/three"
@ -50,7 +48,7 @@
android:layout_marginTop="24dp"
android:contentDescription="3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/two"
app:layout_constraintTop_toBottomOf="@id/title2"
app:srcCompat="@drawable/twotone_looks_3_24" />
<eu.faircode.email.FixedTextView
@ -58,15 +56,12 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginTop="12dp"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/title_setup_doze"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/three"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/three" />
app:layout_constraintStart_toEndOf="@id/three"
app:layout_constraintTop_toTopOf="@+id/three" />
<CheckBox
android:id="@+id/cbNotAgain"
@ -76,16 +71,16 @@
android:text="@string/title_no_ask_again"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/three" />
app:layout_constraintTop_toBottomOf="@id/title3" />
<androidx.constraintlayout.widget.Group
android:id="@+id/grp3"
android:id="@+id/grp2"
android:layout_width="0dp"
android:layout_height="0dp"
app:constraint_referenced_ids="two,title2" />
<androidx.constraintlayout.widget.Group
android:id="@+id/grp4"
android:id="@+id/grp3"
android:layout_width="0dp"
android:layout_height="0dp"
app:constraint_referenced_ids="three,title3" />

@ -334,6 +334,18 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swAutoExpand" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swExpandFirst"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:checked="true"
android:text="@string/title_advanced_expand_first"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAutoExpandHint"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swExpandAll"
android:layout_width="0dp"
@ -342,7 +354,7 @@
android:text="@string/title_advanced_expand_all"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAutoExpandHint"
app:layout_constraintTop_toBottomOf="@id/swExpandFirst"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat

@ -408,13 +408,95 @@
app:layout_constraintTop_toBottomOf="@+id/etHeader" />
<View
android:id="@+id/vSeparatorSchedule"
android:id="@+id/vSeparatorDate"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorSeparator"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAndHeader" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvDate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/title_rule_date"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/vSeparatorDate" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvDateAfter"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:ellipsize="end"
android:singleLine="true"
android:text="Jan 1, 2021"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="?android:attr/textColorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/btnDateAfter"
app:layout_constraintEnd_toStartOf="@id/btnDateAfter"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/btnDateAfter" />
<Button
android:id="@+id/btnDateAfter"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_select"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvDate" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvDateBefore"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:ellipsize="end"
android:singleLine="true"
android:text="Jan 1, 2021"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="?android:attr/textColorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/btnDateBefore"
app:layout_constraintEnd_toStartOf="@id/btnDateBefore"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/btnDateBefore" />
<Button
android:id="@+id/btnDateBefore"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_select"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnDateAfter" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvAndDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_rule_and"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="?android:attr/textColorPrimary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnDateBefore" />
<View
android:id="@+id/vSeparatorSchedule"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorSeparator"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAndDate" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvSchedule"
android:layout_width="0dp"

@ -12,7 +12,6 @@
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/title_widget_title_sync"
android:padding="3dp"
android:scaleType="fitXY"
android:src="@drawable/twotone_sync_disabled_24"
android:tint="@color/colorWidgetForeground" />

@ -1081,8 +1081,8 @@
<string name="title_debug_info">Инфо за отстраняване на грешки</string>
<string name="title_debug_info_remark">Моля, опишете проблема и отбележете часа на възникването му:</string>
<string name="title_crash_info_remark">Моля, опишете какво правихте, когато приложението се срина:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Брой нови съобщения</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Списък на съобщенията</string>
<string name="title_widget_title_count">Брой нови съобщения</string>
<string name="title_widget_title_list">Списък на съобщенията</string>
<string name="title_widget_account">Профил</string>
<string name="title_widget_account_all">Всички</string>
<string name="title_widget_folder">Папка</string>

@ -1111,8 +1111,8 @@ La creació i l\'ús de regles és una característica professional. </string
<string name="title_debug_info">Informació de depuració</string>
<string name="title_debug_info_remark">Per favor descriu el problema i indica quan en el que va ocorre:</string>
<string name="title_crash_info_remark">Per favor descriu què estaves fent quan l\'aplicació va fallar:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Nou recompte de missatges</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Llista de missatges</string>
<string name="title_widget_title_count">Nou recompte de missatges</string>
<string name="title_widget_title_list">Llista de missatges</string>
<string name="title_widget_account">Compte</string>
<string name="title_widget_account_all">Tots</string>
<string name="title_widget_folder">Carpeta</string>

@ -1352,9 +1352,9 @@
<string name="title_debug_info_remark">Prosím, popište problém a uveďte čas, kdy k němu došlo:</string>
<string name="title_crash_info_remark">Popište prosím, co jste dělali, když došlo k pádu aplikace:</string>
<string name="title_unexpected_info_remark">Popište prosím, co jste dělali, když došlo k chybě:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Počet nových zpráv</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Seznam zpráv</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Synch. zap/vyp</string>
<string name="title_widget_title_count">Počet nových zpráv</string>
<string name="title_widget_title_list">Seznam zpráv</string>
<string name="title_widget_title_sync">Synch. zap/vyp</string>
<string name="title_widget_account">Účet</string>
<string name="title_widget_account_all">Všechny</string>
<string name="title_widget_folder">Složka</string>

@ -1322,9 +1322,9 @@
<string name="title_debug_info_remark">Beskriv venligst problemet og angiv tidspunktet for problemet:</string>
<string name="title_crash_info_remark">Beskriv venligst, hvad du foretog dig, da app\'en gik ned:</string>
<string name="title_unexpected_info_remark">Beskriv, hvad du foretog dig, da fejlen opstod:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Ny besked-tæller</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Beskedliste</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Synk til/fra</string>
<string name="title_widget_title_count">Ny besked-tæller</string>
<string name="title_widget_title_list">Beskedliste</string>
<string name="title_widget_title_sync">Synk til/fra</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Mappe</string>

@ -366,6 +366,7 @@
<string name="title_advanced_swipe_close">Zum Schließen der Unterhaltung nach unten wischen</string>
<string name="title_advanced_swipe_move">Zum Verschieben der Unterhaltung nach oben wischen</string>
<string name="title_advanced_autoexpand">Nachrichten automatisch erweitern</string>
<string name="title_advanced_expand_first">Automatisch die erste Nachricht erweitern, wenn die Unterhaltung gelesen wurde</string>
<string name="title_advanced_expand_all">Alle gelesenen Nachrichten automatisch erweitern</string>
<string name="title_advanced_expand_one">Jeweils nur eine Nachricht erweitern</string>
<string name="title_advanced_collapse_multiple">Nachrichten, in einer Unterhaltung mit mehreren Nachrichten, bei »Zurück« zusammenfassen</string>
@ -1085,6 +1086,9 @@
<string name="title_rule_subject">Betreff enthält</string>
<string name="title_rule_attachments">Anhang vorhanden</string>
<string name="title_rule_header">Kopfzeile enthält</string>
<string name="title_rule_date">Datumsbereich</string>
<string name="title_rule_date_after">Datum ist nach</string>
<string name="title_rule_date_before">Datum ist vor</string>
<string name="title_rule_time">Zeit zwischen</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">UND</string>
@ -1334,9 +1338,9 @@ Zur Erinnerung daran zeigt FairEmail einen kleinen Hinweis an, dieser verschwind
<string name="title_debug_info_remark">Bitte beschreiben Sie das Problem und zu welchem Zeitpunkt es aufgetreten ist:</string>
<string name="title_crash_info_remark">Bitte beschreiben Sie, was Sie getan haben, während die App abgestürzt ist:</string>
<string name="title_unexpected_info_remark">Bitte beschreiben Sie, was Sie getan haben, als Sie den Fehler erhielten:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Anzahl neuer Nachrichten</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Nachrichtenliste</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Sync ein/aus</string>
<string name="title_widget_title_count">Anzahl neuer Nachrichten</string>
<string name="title_widget_title_list">Nachrichtenliste</string>
<string name="title_widget_title_sync">Sync ein/aus</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Ordner</string>

@ -366,6 +366,7 @@
<string name="title_advanced_swipe_close">Zum Schließen der Unterhaltung nach unten wischen</string>
<string name="title_advanced_swipe_move">Zum Verschieben der Unterhaltung nach oben wischen</string>
<string name="title_advanced_autoexpand">Nachrichten automatisch erweitern</string>
<string name="title_advanced_expand_first">Automatisch die erste Nachricht erweitern, wenn die Unterhaltung gelesen wurde</string>
<string name="title_advanced_expand_all">Alle gelesenen Nachrichten automatisch erweitern</string>
<string name="title_advanced_expand_one">Jeweils nur eine Nachricht erweitern</string>
<string name="title_advanced_collapse_multiple">Nachrichten, in einer Unterhaltung mit mehreren Nachrichten, bei »Zurück« zusammenfassen</string>
@ -1085,6 +1086,9 @@
<string name="title_rule_subject">Betreff enthält</string>
<string name="title_rule_attachments">Anhang vorhanden</string>
<string name="title_rule_header">Kopfzeile enthält</string>
<string name="title_rule_date">Datumsbereich</string>
<string name="title_rule_date_after">Datum ist nach</string>
<string name="title_rule_date_before">Datum ist vor</string>
<string name="title_rule_time">Zeit zwischen</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">UND</string>
@ -1334,9 +1338,9 @@ Zur Erinnerung daran zeigt FairEmail einen kleinen Hinweis an, dieser verschwind
<string name="title_debug_info_remark">Bitte beschreiben Sie das Problem und zu welchem Zeitpunkt es aufgetreten ist:</string>
<string name="title_crash_info_remark">Bitte beschreiben Sie, was Sie getan haben, während die App abgestürzt ist:</string>
<string name="title_unexpected_info_remark">Bitte beschreiben Sie, was Sie getan haben, als Sie den Fehler erhielten:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Anzahl neuer Nachrichten</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Nachrichtenliste</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Sync ein/aus</string>
<string name="title_widget_title_count">Anzahl neuer Nachrichten</string>
<string name="title_widget_title_list">Nachrichtenliste</string>
<string name="title_widget_title_sync">Sync ein/aus</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Ordner</string>

@ -366,6 +366,7 @@
<string name="title_advanced_swipe_close">Zum Schließen der Unterhaltung nach unten wischen</string>
<string name="title_advanced_swipe_move">Zum Verschieben der Unterhaltung nach oben wischen</string>
<string name="title_advanced_autoexpand">Nachrichten automatisch erweitern</string>
<string name="title_advanced_expand_first">Automatisch die erste Nachricht erweitern, wenn die Unterhaltung gelesen wurde</string>
<string name="title_advanced_expand_all">Alle gelesenen Nachrichten automatisch erweitern</string>
<string name="title_advanced_expand_one">Jeweils nur eine Nachricht erweitern</string>
<string name="title_advanced_collapse_multiple">Nachrichten, in einer Unterhaltung mit mehreren Nachrichten, bei »Zurück« zusammenfassen</string>
@ -1085,6 +1086,9 @@
<string name="title_rule_subject">Betreff enthält</string>
<string name="title_rule_attachments">Anhang vorhanden</string>
<string name="title_rule_header">Kopfzeile enthält</string>
<string name="title_rule_date">Datumsbereich</string>
<string name="title_rule_date_after">Datum ist nach</string>
<string name="title_rule_date_before">Datum ist vor</string>
<string name="title_rule_time">Zeit zwischen</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">UND</string>
@ -1334,9 +1338,9 @@ Zur Erinnerung daran zeigt FairEmail einen kleinen Hinweis an, dieser verschwind
<string name="title_debug_info_remark">Bitte beschreiben Sie das Problem und zu welchem Zeitpunkt es aufgetreten ist:</string>
<string name="title_crash_info_remark">Bitte beschreiben Sie, was Sie getan haben, während die App abgestürzt ist:</string>
<string name="title_unexpected_info_remark">Bitte beschreiben Sie, was Sie getan haben, als Sie den Fehler erhielten:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Anzahl neuer Nachrichten</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Nachrichtenliste</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Sync ein/aus</string>
<string name="title_widget_title_count">Anzahl neuer Nachrichten</string>
<string name="title_widget_title_list">Nachrichtenliste</string>
<string name="title_widget_title_sync">Sync ein/aus</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Ordner</string>

@ -365,6 +365,7 @@
<string name="title_advanced_swipe_close">Σύρετε προς τα κάτω για να κλείσετε μια συζήτηση</string>
<string name="title_advanced_swipe_move">Σύρετε προς τα πάνω για να μετακινήσετε μια συζήτηση</string>
<string name="title_advanced_autoexpand">Αυτόματη ανάπτυξη των μηνυμάτων</string>
<string name="title_advanced_expand_first">Αυτόματη επέκταση του πρώτου μηνύματος όταν η συνομιλία έχει διαβαστεί</string>
<string name="title_advanced_expand_all">Αυτόματη ανάπτυξη όλων των αναγνωσμένων μηνυμάτων</string>
<string name="title_advanced_expand_one">Ανάπτυξη μόνο ενός μηνύματος κάθε φορά</string>
<string name="title_advanced_collapse_multiple">Σύμπτυξη των μηνυμάτων σε μια συζήτηση με πολλαπλά μηνύματα, πατώντας \"πίσω\"</string>
@ -1085,6 +1086,9 @@
<string name="title_rule_subject">Το θέμα περιέχει</string>
<string name="title_rule_attachments">Έχει συνημμένα</string>
<string name="title_rule_header">Η κεφαλίδα περιέχει</string>
<string name="title_rule_date">Χρονική περίοδος</string>
<string name="title_rule_date_after">Ημερομηνία μετά από</string>
<string name="title_rule_date_before">Ημερομηνία πριν από</string>
<string name="title_rule_time">Χρονικό διάστημα μεταξύ</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">ΚΑΙ</string>
@ -1334,9 +1338,9 @@
<string name="title_debug_info_remark">Παρακαλούμε, περιγράψτε το πρόβλημα καθώς και τον χρόνο εμφάνισής του:</string>
<string name="title_crash_info_remark">Παρακαλούμε, περιγράψτε τι κάνατε τη στιγμή που η εφαρμογή σταμάτησε να λειτουργεί:</string>
<string name="title_unexpected_info_remark">Παρακαλούμε, περιγράψτε τι κάνατε όταν λάβατε το μήνυμα σφάλματος:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Αριθμός νέων μηνυμάτων</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Λίστα μηνυμάτων</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Συγχ. Εν./Ανεν.</string>
<string name="title_widget_title_count">Αριθμός νέων μηνυμάτων</string>
<string name="title_widget_title_list">Λίστα μηνυμάτων</string>
<string name="title_widget_title_sync">Συγχ. Εν./Ανεν.</string>
<string name="title_widget_account">Λογαριασμός</string>
<string name="title_widget_account_all">Όλοι</string>
<string name="title_widget_folder">Φάκελος</string>

@ -1336,8 +1336,9 @@
<string name="title_debug_info_remark">Por favor describa el problema e indique el momento del mismo:</string>
<string name="title_crash_info_remark">Por favor describa que estaba haciendo cuando la app falló:</string>
<string name="title_unexpected_info_remark">Por favor describa lo que estaba haciendo cuando obtuvo el error:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Recuento de mensajes</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Lista de mensajes</string>
<string name="title_widget_title_count">Recuento de mensajes</string>
<string name="title_widget_title_list">Lista de mensajes</string>
<string name="title_widget_title_sync">Sincr. on/off</string>
<string name="title_widget_account">Cuenta</string>
<string name="title_widget_account_all">Todas</string>
<string name="title_widget_folder">Carpeta</string>

@ -1138,8 +1138,8 @@
<string name="title_debug_info_remark">Azaldu arazoa eta esan noiz gertatu den:</string>
<string name="title_crash_info_remark">Zaldu zer egiten ari zinen aplikazioak kraskatu duenean:</string>
<string name="title_unexpected_info_remark">Azaldu zer egiten ari zinen errorea jasotzean:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Mezu berrien kopurua</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Mezuen zerrenda</string>
<string name="title_widget_title_count">Mezu berrien kopurua</string>
<string name="title_widget_title_list">Mezuen zerrenda</string>
<string name="title_widget_account">Kontua</string>
<string name="title_widget_account_all">Denak</string>
<string name="title_widget_folder">Karpeta</string>

@ -995,8 +995,8 @@
<string name="title_debug_info">اطلاعات اشکال زدایی</string>
<string name="title_debug_info_remark">لطفاً مشکل را شرح داده و به زمان مشکل نیز اشاره کنید:</string>
<string name="title_crash_info_remark">لطفاً توضیح دهید که در هنگام کرش برنامه درحال انجام چه کاری بودید:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">شمار پیام جدید</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">لیست پیام‌ها</string>
<string name="title_widget_title_count">شمار پیام جدید</string>
<string name="title_widget_title_list">لیست پیام‌ها</string>
<string name="title_widget_account">حساب</string>
<string name="title_widget_account_all">همه</string>
<string name="title_widget_folder">پوشه</string>

@ -1332,8 +1332,8 @@
<string name="title_debug_info_remark">Kuvaile ongelmatilanne ja milloin se ilmenee:</string>
<string name="title_crash_info_remark">Kuvaile mitä olit tekemässä, kun sovellus kaatui:</string>
<string name="title_unexpected_info_remark">Kuvaile mitä olit tekemässä, kun sait virheen:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Uusien viestien lukumäärä</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Viestilista</string>
<string name="title_widget_title_count">Uusien viestien lukumäärä</string>
<string name="title_widget_title_list">Viestilista</string>
<string name="title_widget_account">Tili</string>
<string name="title_widget_account_all">Kaikki</string>
<string name="title_widget_folder">Kansio</string>

@ -365,6 +365,7 @@
<string name="title_advanced_swipe_close">Balayer vers le bas pour fermer la conversation</string>
<string name="title_advanced_swipe_move">Balayer vers le haut pour déplacer la conversation</string>
<string name="title_advanced_autoexpand">Développer automatiquement les messages</string>
<string name="title_advanced_expand_first">Développer automatiquement le premier message lorsque la conversation a été lue</string>
<string name="title_advanced_expand_all">Développer automatiquement tous les messages lus</string>
<string name="title_advanced_expand_one">Ne développer quun seul message à la fois</string>
<string name="title_advanced_collapse_multiple">Replier les multiples messages dune conversation en faisant « Retour »</string>
@ -1087,6 +1088,9 @@
<string name="title_rule_subject">Lobjet contient</string>
<string name="title_rule_attachments">A des pièces jointes</string>
<string name="title_rule_header">Len-tête contient</string>
<string name="title_rule_date">Période</string>
<string name="title_rule_date_after">Date postérieure à</string>
<string name="title_rule_date_before">Date antérieure à</string>
<string name="title_rule_time">Heure comprise entre</string>
<string name="title_rule_regex">Expression régulière</string>
<string name="title_rule_and">ET</string>
@ -1336,9 +1340,9 @@
<string name="title_debug_info_remark">Veuillez décrire le problème et indiquer l\'heure à laquelle il est survenu :</string>
<string name="title_crash_info_remark">Veuillez décrire ce que vous faisiez lorsque lapplication sest arrêtée :</string>
<string name="title_unexpected_info_remark">Veuillez décrire ce que vous faisiez lorsque vous avez eu l\'erreur :</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Nombre de nouveaux messages</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Liste des messages</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Synchro. oui/non</string>
<string name="title_widget_title_count">Nombre de nouveaux messages</string>
<string name="title_widget_title_list">Liste des messages</string>
<string name="title_widget_title_sync">Sync. oui/non</string>
<string name="title_widget_account">Compte</string>
<string name="title_widget_account_all">Tous</string>
<string name="title_widget_folder">Dossier</string>

@ -365,6 +365,7 @@
<string name="title_advanced_swipe_close">Balayer vers le bas pour fermer la conversation</string>
<string name="title_advanced_swipe_move">Balayer vers le haut pour déplacer la conversation</string>
<string name="title_advanced_autoexpand">Déplier automatiquement les messages</string>
<string name="title_advanced_expand_first">Développer automatiquement le premier message lorsque la conversation a été lue</string>
<string name="title_advanced_expand_all">Déplier automatiquement tous les messages lus</string>
<string name="title_advanced_expand_one">Ne déplier quun seul message à la fois</string>
<string name="title_advanced_collapse_multiple">Replier les multiples messages dune conversation en faisant « Retour »</string>
@ -1087,6 +1088,9 @@
<string name="title_rule_subject">Lobjet contient</string>
<string name="title_rule_attachments">A des pièces jointes</string>
<string name="title_rule_header">Len-tête contient</string>
<string name="title_rule_date">Période</string>
<string name="title_rule_date_after">Date postérieure à</string>
<string name="title_rule_date_before">Date antérieure à</string>
<string name="title_rule_time">Heure comprise entre</string>
<string name="title_rule_regex">Expression régulière</string>
<string name="title_rule_and">ET</string>
@ -1336,9 +1340,9 @@
<string name="title_debug_info_remark">Veuillez décrire le problème et indiquer l\'heure à laquelle il est survenu :</string>
<string name="title_crash_info_remark">Veuillez décrire ce que vous faisiez lorsque lapplication sest arrêtée :</string>
<string name="title_unexpected_info_remark">Veuillez décrire ce que vous faisiez lorsque vous avez eu l\'erreur :</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Nombre de nouveaux messages</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Liste des messages</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Synchro. oui/non</string>
<string name="title_widget_title_count">Nombre de nouveaux messages</string>
<string name="title_widget_title_list">Liste des messages</string>
<string name="title_widget_title_sync">Sync. oui/non</string>
<string name="title_widget_account">Compte</string>
<string name="title_widget_account_all">Tous</string>
<string name="title_widget_folder">Dossier</string>

@ -1248,8 +1248,8 @@
<string name="title_debug_info_remark">Beskriuw it probleem asjebleaft en jouwe de tiid fan it probleem oan:</string>
<string name="title_crash_info_remark">Beskriuw asjebleaft wat jo diene doe\'t de app ferûngelokke:</string>
<string name="title_unexpected_info_remark">Beskriuw asjebleaft wat jo dien doe\'t de app ferûngelokke:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Nij berjochten tellen</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Berjochtlist</string>
<string name="title_widget_title_count">Nij berjochten tellen</string>
<string name="title_widget_title_list">Berjochtlist</string>
<string name="title_widget_account">Akkount</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Map</string>

@ -1306,8 +1306,8 @@
<string name="title_debug_info_remark">Por favor, describa o problema e indique o tempo do problema:</string>
<string name="title_crash_info_remark">Por favor, describa que estaba a facer cando a aplicación se detivo:</string>
<string name="title_unexpected_info_remark">Por favor, describa que estaba a facer cando apareceu o erro:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Número de novas mensaxes</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Lista de mensaxes</string>
<string name="title_widget_title_count">Número de novas mensaxes</string>
<string name="title_widget_title_list">Lista de mensaxes</string>
<string name="title_widget_account">Conta</string>
<string name="title_widget_account_all">Todo</string>
<string name="title_widget_folder">Cartafol</string>

@ -951,8 +951,8 @@
<string name="title_debug_info">Informacije o otklanjanju pogrešaka</string>
<string name="title_debug_info_remark">Opišite problem i navedite vrijeme problema:</string>
<string name="title_crash_info_remark">Opišite što ste radili kada je aplikacija pala:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Broj novih poruka</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Popis poruka</string>
<string name="title_widget_title_count">Broj novih poruka</string>
<string name="title_widget_title_list">Popis poruka</string>
<string name="title_widget_account">Račun</string>
<string name="title_widget_account_all">Sve</string>
<string name="title_widget_folder">Mapa</string>

@ -1325,8 +1325,8 @@
<string name="title_debug_info_remark">Kérlek jellemezd a problémát és jelezd az idejét a problémának:</string>
<string name="title_crash_info_remark">Kérlek magyarázd el mit csináltál amikor az alkalmazás összeomlott:</string>
<string name="title_unexpected_info_remark">Kérem írja le, mit csinált amikor az alkalmazás összeomlott:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Új üzenetek számláló</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Üzenet lista</string>
<string name="title_widget_title_count">Új üzenetek számláló</string>
<string name="title_widget_title_list">Üzenet lista</string>
<string name="title_widget_account">Fiók</string>
<string name="title_widget_account_all">Mind</string>
<string name="title_widget_folder">Mappa</string>

@ -1142,7 +1142,7 @@
<string name="title_pro_invalid">Respon tidak valid</string>
<string name="title_auto_scroll">Gulir otomatis</string>
<string name="title_log_clear">Bersihkan</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Daftar pesan</string>
<string name="title_widget_title_list">Daftar pesan</string>
<string name="title_widget_account">Akun</string>
<string name="title_widget_account_all">Semua</string>
<string name="title_widget_folder">Folder</string>

@ -1336,8 +1336,9 @@
<string name="title_debug_info_remark">Si prega di descrivere il problema ed indicare il momento in cui è avvenuto:</string>
<string name="title_crash_info_remark">Descrivi cosa stavi facendo quando l\'app si è interrotta:</string>
<string name="title_unexpected_info_remark">Descrivi cosa stavi facendo quando l\'errore è successo:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Nuovo conteggio dei messaggi</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Elenco messaggi</string>
<string name="title_widget_title_count">Nuovo conteggio dei messaggi</string>
<string name="title_widget_title_list">Elenco messaggi</string>
<string name="title_widget_title_sync">Sincro sì/no</string>
<string name="title_widget_account">Account</string>
<string name="title_widget_account_all">Tutti</string>
<string name="title_widget_folder">Cartella</string>

@ -9,7 +9,7 @@
<string name="app_cake">空き容量が足りません</string>
<string name="channel_service">受信</string>
<string name="channel_send">送信</string>
<string name="channel_notification">Eメール</string>
<string name="channel_notification">電子メール</string>
<string name="channel_update">更新</string>
<string name="channel_warning">警告</string>
<string name="channel_error">エラー</string>
@ -1283,8 +1283,8 @@
<string name="title_debug_info_remark">問題を説明し問題の時刻を記述下さい(英語のみ):</string>
<string name="title_crash_info_remark">アプリがクラッシュした時に何をしていたかを説明してください(英語のみ):</string>
<string name="title_unexpected_info_remark">エラーが発生したときに何をしていたか説明してください:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">新しいメッセージ数</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">メッセージリスト</string>
<string name="title_widget_title_count">新しいメッセージ数</string>
<string name="title_widget_title_list">メッセージリスト</string>
<string name="title_widget_account">アカウント</string>
<string name="title_widget_account_all">全て</string>
<string name="title_widget_folder">フォルダー</string>

@ -1087,6 +1087,9 @@
<string name="title_rule_subject">Onderwerp bevat</string>
<string name="title_rule_attachments">Heeft bijlagen</string>
<string name="title_rule_header">De kop bevat</string>
<string name="title_rule_date">Datumbereik</string>
<string name="title_rule_date_after">Datum na</string>
<string name="title_rule_date_before">Datum voor</string>
<string name="title_rule_time">Tijd tussen</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">EN</string>
@ -1335,9 +1338,9 @@
<string name="title_debug_info_remark">Beschrijf alstublieft het probleem en de tijd van het probleem:</string>
<string name="title_crash_info_remark">Beschrijf alstublieft wat u aan het doen was toen de app crashte:</string>
<string name="title_unexpected_info_remark">Beschrijf alstublieft wat u aan het doen was toen de foutmelding kwam:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Aantal nieuwe berichten</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Berichtenlijst</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Sync aan/uit</string>
<string name="title_widget_title_count">Aantal nieuwe berichten</string>
<string name="title_widget_title_list">Berichtenlijst</string>
<string name="title_widget_title_sync">Sync aan/uit</string>
<string name="title_widget_account">Account</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Map</string>

@ -1252,8 +1252,8 @@
<string name="title_debug_info_remark">Vennligst beskriv problemet og angi tidspunktet for problemet:</string>
<string name="title_crash_info_remark">Beskriv hva du gjorde da appen krasjet:</string>
<string name="title_unexpected_info_remark">Vennligst beskriv hva du gjorde når du fikk feilen:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Ny melding teller</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Meldingsliste</string>
<string name="title_widget_title_count">Ny melding teller</string>
<string name="title_widget_title_list">Meldingsliste</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Mappe</string>

@ -1252,8 +1252,8 @@
<string name="title_debug_info_remark">Vennligst beskriv problemet og angi tidspunktet for problemet:</string>
<string name="title_crash_info_remark">Beskriv hva du gjorde da appen krasjet:</string>
<string name="title_unexpected_info_remark">Vennligst beskriv hva du gjorde når du fikk feilen:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Ny melding teller</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Meldingsliste</string>
<string name="title_widget_title_count">Ny melding teller</string>
<string name="title_widget_title_list">Meldingsliste</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alle</string>
<string name="title_widget_folder">Mappe</string>

@ -10,7 +10,7 @@
<string name="app_updated">Ostatnia aktualizacja: %1$s</string>
<string name="channel_service">Odbierz</string>
<string name="channel_send">Wyślij</string>
<string name="channel_notification">Email</string>
<string name="channel_notification">E-mail</string>
<string name="channel_update">Aktualizacje</string>
<string name="channel_warning">Ostrzeżenia</string>
<string name="channel_error">Błędy</string>
@ -386,6 +386,7 @@
<string name="title_advanced_swipe_close">Przesuń palcem w dół, aby zamknąć rozmowę</string>
<string name="title_advanced_swipe_move">Przesuń w górę, aby przenieść konwersację</string>
<string name="title_advanced_autoexpand">Automatycznie rozwijaj wiadomości</string>
<string name="title_advanced_expand_first">Automatycznie rozwiń pierwszą wiadomość, gdy konwersacja została przeczytana</string>
<string name="title_advanced_expand_all">Automatycznie rozwiń wszystkie przeczytane wiadomości</string>
<string name="title_advanced_expand_one">Rozwiń tylko jedną wiadomość na raz</string>
<string name="title_advanced_collapse_multiple">Zwiń wiadomości w rozmowie z wieloma wiadomościami przy \'wstecz\'</string>
@ -1108,6 +1109,9 @@
<string name="title_rule_subject">Tytuł zawiera</string>
<string name="title_rule_attachments">Zawiera załącznik</string>
<string name="title_rule_header">Nagłówek zawiera</string>
<string name="title_rule_date">Zakres dat</string>
<string name="title_rule_date_after">Data po</string>
<string name="title_rule_date_before">Data przed</string>
<string name="title_rule_time">Czas pomiędzy</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">I</string>
@ -1356,9 +1360,9 @@
<string name="title_debug_info_remark">Opisz proszę problem i wskaż moment jego wystąpienia:</string>
<string name="title_crash_info_remark">Opisz proszę, co robisz, w momencie awarii aplikacji:</string>
<string name="title_unexpected_info_remark">Opisz proszę, co robiłeś, w momencie awarii aplikacji:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Liczba nowych wiadomości</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Lista wiadomości</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Synchronizacja wł/wył</string>
<string name="title_widget_title_count">Liczba nowych wiadomości</string>
<string name="title_widget_title_list">Lista wiadomości</string>
<string name="title_widget_title_sync">Synchronizacja wł/wył</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Wszystkie</string>
<string name="title_widget_folder">Folder</string>

@ -9,7 +9,7 @@
<string name="app_cake">Espaço de armazenamento insuficiente</string>
<string name="channel_service">Receber</string>
<string name="channel_send">Enviar</string>
<string name="channel_notification">Email</string>
<string name="channel_notification">E-mail</string>
<string name="channel_update">Atualizações</string>
<string name="channel_warning">Avisos</string>
<string name="channel_error">Erros</string>
@ -1239,8 +1239,8 @@
<string name="title_debug_info_remark">Por favor, descreva o problema e indique o momento em que ocorrera:</string>
<string name="title_crash_info_remark">Por favor, descreva o que você estava fazendo quando o aplicativo falhou:</string>
<string name="title_unexpected_info_remark">Por favor, descreva o que você estava fazendo quando recebeu o erro:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Nova contagem de mensagens</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Lista de mensagem</string>
<string name="title_widget_title_count">Nova contagem de mensagens</string>
<string name="title_widget_title_list">Lista de mensagem</string>
<string name="title_widget_account">Conta</string>
<string name="title_widget_account_all">Todos</string>
<string name="title_widget_folder">Pasta</string>

@ -8,7 +8,7 @@
<string name="app_cake">Espaço insuficiente</string>
<string name="channel_service">Receber</string>
<string name="channel_send">Enviar</string>
<string name="channel_notification">Email</string>
<string name="channel_notification">E-mail</string>
<string name="channel_update">Atualizações</string>
<string name="channel_warning">Avisos</string>
<string name="channel_error">Erros</string>

@ -1343,8 +1343,8 @@
<string name="title_debug_info_remark">Va rog sa descrieți problema și să indicați momentul când s-a produs:</string>
<string name="title_crash_info_remark">Vă rugăm să descrieți ce făceați atunci când aplicația s-a oprit:</string>
<string name="title_unexpected_info_remark">Vă rugăm să descrieți ce faceți atunci când ați primit eroarea:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Contor mesaje noi</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Listă mesaje</string>
<string name="title_widget_title_count">Contor mesaje noi</string>
<string name="title_widget_title_list">Listă mesaje</string>
<string name="title_widget_account">Cont</string>
<string name="title_widget_account_all">Toate</string>
<string name="title_widget_folder">Dosar</string>

@ -1358,9 +1358,9 @@
<string name="title_debug_info_remark">Пожалуйста, опишите проблему и укажите момент её возникновения:</string>
<string name="title_crash_info_remark">Пожалуйста, опишите, что вы делали, когда в приложении произошёл сбой:</string>
<string name="title_unexpected_info_remark">Пожалуйста, опишите, что вы делали, когда получили ошибку:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Количество новых сообщений</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Список сообщений</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Синхронизация вкл/выкл</string>
<string name="title_widget_title_count">Количество новых сообщений</string>
<string name="title_widget_title_list">Список сообщений</string>
<string name="title_widget_title_sync">Синхронизация вкл/выкл</string>
<string name="title_widget_account">Учётная запись</string>
<string name="title_widget_account_all">Все</string>
<string name="title_widget_folder">Папка</string>

@ -1347,8 +1347,8 @@ Nastavenie vždy toto kompenzuje neustálym sledovaním zmien.</string>
<string name="title_debug_info_remark">Prosím popíšte problém a uveďte čas výskytu:</string>
<string name="title_crash_info_remark">Prosím vysvetlite, čo ste robili pred pádom aplikácie:</string>
<string name="title_unexpected_info_remark">Prosím vysvetlite, čo ste robili pred zobrazením chyby:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Počet nových správ</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Zoznam správ</string>
<string name="title_widget_title_count">Počet nových správ</string>
<string name="title_widget_title_list">Zoznam správ</string>
<string name="title_widget_account">Účet</string>
<string name="title_widget_account_all">Všetko</string>
<string name="title_widget_folder">Priečinok</string>

@ -1024,8 +1024,8 @@
<string name="title_debug_info">Podatki o razhrošč.</string>
<string name="title_debug_info_remark">Opišite težavo in označite čas težave:</string>
<string name="title_crash_info_remark">Opišite, kaj ste počeli, ko se je program sesul:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Število novih sporočil</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Seznam sporočil</string>
<string name="title_widget_title_count">Število novih sporočil</string>
<string name="title_widget_title_list">Seznam sporočil</string>
<string name="title_widget_account">Račun</string>
<string name="title_widget_account_all">Vsi</string>
<string name="title_widget_folder">Mapa</string>

@ -868,8 +868,8 @@
<string name="title_debug_info">Отклањање грешака</string>
<string name="title_debug_info_remark">Опишите проблем и назначите време када се десио проблем:</string>
<string name="title_crash_info_remark">Опишите шта сте радили када се апликација срушила:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Број нових порука</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Листа порука</string>
<string name="title_widget_title_count">Број нових порука</string>
<string name="title_widget_title_list">Листа порука</string>
<string name="title_widget_account">Налог</string>
<string name="title_widget_account_all">Све</string>
<string name="title_widget_folder">Фасцикла</string>

@ -1265,8 +1265,8 @@
<string name="title_debug_info_remark">Beskriv problemet och ange tidpunkten för problemet:</string>
<string name="title_crash_info_remark">Beskriv vad du gjorde när appen kraschade:</string>
<string name="title_unexpected_info_remark">Vänligen beskriv vad du gjorde när du fick felet:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Antal nya meddelanden</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Meddelandelista</string>
<string name="title_widget_title_count">Antal nya meddelanden</string>
<string name="title_widget_title_list">Meddelandelista</string>
<string name="title_widget_account">Konto</string>
<string name="title_widget_account_all">Alla</string>
<string name="title_widget_folder">Mapp</string>

@ -1220,8 +1220,8 @@
<string name="title_debug_info">Hata ayıklama bilgisi</string>
<string name="title_debug_info_remark">Lütfen sorunu açıklayın ve sorunun zamanını belirtin:</string>
<string name="title_crash_info_remark">Lütfen uygulama çöktüğü sırada ne yaptığınızııklayın:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Yeni mesaj sayısı</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Mesaj listesi</string>
<string name="title_widget_title_count">Yeni mesaj sayısı</string>
<string name="title_widget_title_list">Mesaj listesi</string>
<string name="title_widget_account">Hesap</string>
<string name="title_widget_account_all">Tümü</string>
<string name="title_widget_folder">Klasör</string>

@ -1345,9 +1345,9 @@
<string name="title_debug_info_remark">Опишіть проблему й зазначте момент її виникнення:</string>
<string name="title_crash_info_remark">Будь ласка, опишіть, що ви робили, коли додаток зазнав краху:</string>
<string name="title_unexpected_info_remark">Будь ласка, опишіть, що ви робили, коли додаток зазнав краху:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Кількість нових повідомлень</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Список повідомлень</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">Синхронізацію увімк/вимк</string>
<string name="title_widget_title_count">Кількість нових повідомлень</string>
<string name="title_widget_title_list">Список повідомлень</string>
<string name="title_widget_title_sync">Синхронізацію увімк/вимк</string>
<string name="title_widget_account">Обліковий запис</string>
<string name="title_widget_account_all">Усі</string>
<string name="title_widget_folder">Тека</string>

@ -299,6 +299,8 @@
<string name="title_advanced_only_name">Chỉ hiển thị tên danh bạ</string>
<string name="title_advanced_distinguish_contacts">Gạch chân người gửi khi người gửi được biết đến là liên hệ \'đến\'</string>
<string name="title_advanced_show_recipients">Hiện người nhận ở tiêu đề thư</string>
<string name="title_advanced_font_size_sender">Cỡ chữ người gửi</string>
<string name="title_advanced_font_size_subject">Cỡ chữ chủ đề</string>
<string name="title_advanced_subject_top">Hiện chủ đề trên người gửi</string>
<string name="title_advanced_subject_italic">Hiện chủ đề bằng chữ nghiêng</string>
<string name="title_advanced_subject_elipsed">Rút ngắn chủ đề nếu cần</string>
@ -477,6 +479,7 @@
<string name="title_advanced_parse_classes_hint">Cái này sẽ hiển thị thư chính xác hơn, nhưng có thể có độ trễ</string>
<string name="title_advanced_language_detection_hint">Việc hỗ trợ dò tìm ngôn ngữ phụ thuộc vào nhà sản xuất thiết bị</string>
<string name="title_advanced_autoexpand_hint">Tự động mở thư khi chỉ cỏ một thư hoặc một thư chưa đọc trong một cuộc hội thoại</string>
<string name="title_advanced_autoseen_hint">Việc tự động đánh dấu thư là đã đọc khi mở rộng có thể được tắt trong cài đặt tài khoản nâng cao của mỗi tài khoản</string>
<string name="title_advanced_autoclose_hint">Tự động đóng cuộc hội thoại khi tất cả thư được lưu trữ, gửi hoặc cho vào thùng rác</string>
<string name="title_advanced_sender_hint">Đa số nhà cung cấp không cho phép các địa chỉ người gửi đã sửa đổi</string>
<string name="title_advanced_bcc_hint">Địa chỉ sẽ không được hiện, nhưng sẽ được thêm khi gửi</string>
@ -590,6 +593,8 @@
<string name="title_identity_delete">Xóa danh tính này vĩnh viễn?</string>
<string name="title_edit_html">Chỉnh sửa dưới dạng HTML</string>
<string name="title_last_connected">Lần cuối kết nối: %1$s</string>
<string name="title_backoff_until">Đang đợi sau khi thất bại cho đến: %1$s</string>
<string name="title_storage_quota">Sử dụng kho lưu trữ của máy chủ: %1$s/%2$s</string>
<string name="title_pop_support">Giao thức POP3 chỉ hỗ trợ việc tải xuống và xoá thư khỏi hộp thư đến. POP3 không thể đánh dấu thư là đã đọc, di chuyển thư, v.v. POP3 sẽ sử dụng nhiều pin và dữ liệu hơn IMAP. Vậy nên hãy cân nhắc việc sử dụng giao thức IMAP bất cứ khi nào có thể.</string>
<string name="title_oauth_support">OAuth không được hỗ trợ</string>
<string name="title_service_auth">Máy chủ email nói: \'%1$s\'</string>
@ -718,6 +723,7 @@
<string name="title_download_all">Tải về tất cả</string>
<string name="title_save_all">Lưu tất cả</string>
<string name="title_save_eml">Lưu tập tin thư thô</string>
<string name="title_ask_raw">Để chuyển tiếp thư, thư thô (thư gốc) cần được tải xuống từ máy chủ. Điều này yêu cầu kết nối internet.</string>
<string name="title_buttons">Chọn các nút</string>
<string name="title_configure_buttons">Thiết lập các nút &#8230;</string>
<string name="title_trash">Thùng rác</string>
@ -949,6 +955,7 @@
<string name="title_search_flag_hidden">ẩn</string>
<string name="title_search_flag_encrypted">đã mã hóa</string>
<string name="title_search_flag_attachments">tệp đính kèm</string>
<string name="title_search_flag_notes">ghi chú</string>
<string name="title_search_flag_invite">lời mời</string>
<string name="title_search_flag_size">kích cỡ &gt; %1$s</string>
<string name="title_search_device">Tìm kiếm trên thiết bị</string>
@ -1267,8 +1274,9 @@
<string name="title_debug_info_remark">Hãy mô tả vấn đề và cho biết thời gian của vấn đề:</string>
<string name="title_crash_info_remark">Hãy mô tả điều bạn đang làm khi ứng dụng bị văng ra:</string>
<string name="title_unexpected_info_remark">Hãy mô tả điều bạn đang làm khi bạn gặp lỗi đó:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">Số thư mới</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">Danh sách thư</string>
<string name="title_widget_title_count">Số thư mới</string>
<string name="title_widget_title_list">Danh sách thư</string>
<string name="title_widget_title_sync">Bật/tắt đồng bộ</string>
<string name="title_widget_account">Tài khoản</string>
<string name="title_widget_account_all">Tất cả</string>
<string name="title_widget_folder">Thư mục</string>

@ -353,6 +353,7 @@
<string name="title_advanced_swipe_close">向下滑动关闭对话</string>
<string name="title_advanced_swipe_move">向上滑动以移动对话</string>
<string name="title_advanced_autoexpand">自动展开消息</string>
<string name="title_advanced_expand_first">自动展开已读会话的第一条消息</string>
<string name="title_advanced_expand_all">自动展开所有已读消息</string>
<string name="title_advanced_expand_one">每次仅展开一个消息</string>
<string name="title_advanced_collapse_multiple">按返回时折叠会话中的多条消息</string>
@ -500,7 +501,7 @@
<string name="title_advanced_parse_classes_hint">这将更准确地显示消息,但可能会有延迟</string>
<string name="title_advanced_language_detection_hint">是否支持语言检测取决于设备制造商</string>
<string name="title_advanced_autoexpand_hint">当对话中只有一条消息或只是一条未读消息时,自动打开该消息</string>
<string name="title_advanced_autoseen_hint">在每个帐户的高级帐户设置中可以禁用展开时自动标记消息为已读</string>
<string name="title_advanced_autoseen_hint">在每个帐户的高级帐户设置中可以禁用展开消息时自动将其标记为已读</string>
<string name="title_advanced_autoclose_hint">在所有邮件存档、发送或丢弃时自动关闭对话线程</string>
<string name="title_advanced_sender_hint">大多数提供商不允许修改发件人地址</string>
<string name="title_advanced_bcc_hint">地址不会显示,但会在发送时添加</string>
@ -1075,6 +1076,9 @@
<string name="title_rule_subject">主题包含</string>
<string name="title_rule_attachments">含附件</string>
<string name="title_rule_header">邮件头包含</string>
<string name="title_rule_date">日期范围</string>
<string name="title_rule_date_after">始于</string>
<string name="title_rule_date_before">止于</string>
<string name="title_rule_time">时间间隔</string>
<string name="title_rule_regex">正则表达式</string>
<string name="title_rule_and">AND</string>
@ -1323,9 +1327,9 @@
<string name="title_debug_info_remark">请描述问题及问题发生的时间:</string>
<string name="title_crash_info_remark">请描述应用崩溃时您的操作</string>
<string name="title_unexpected_info_remark">请描述应用出错时您的操作:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">新消息计数</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">消息列表</string>
<string name="title_widget_title_sync" comment="title_widget_title_sync&#10;Title for widget, needs to be as short as possible.&#10;">同步开/关</string>
<string name="title_widget_title_count">新消息计数</string>
<string name="title_widget_title_list">消息列表</string>
<string name="title_widget_title_sync">同步开/关</string>
<string name="title_widget_account">账户</string>
<string name="title_widget_account_all">全部</string>
<string name="title_widget_folder">文件夹</string>

@ -1289,8 +1289,8 @@
<string name="title_debug_info_remark">請描述問題並指出問題發生的時間:</string>
<string name="title_crash_info_remark">請描述應用程序崩潰時您在做什麼:</string>
<string name="title_unexpected_info_remark">請描述出現錯誤時的操作:</string>
<string name="title_widget_title_count" comment="title_widget_title_count&#10;Title for widget, needs to be as short as possible.">新郵件數</string>
<string name="title_widget_title_list" comment="title_widget_title_list&#10;Title for widget, needs to be as short as possible.">留言清單</string>
<string name="title_widget_title_count">新郵件數</string>
<string name="title_widget_title_list">留言清單</string>
<string name="title_widget_account">帳戶</string>
<string name="title_widget_account_all">所有</string>
<string name="title_widget_folder">資料夾</string>

@ -429,6 +429,7 @@
<string name="title_advanced_swipe_close">Swipe down to close conversation</string>
<string name="title_advanced_swipe_move">Swipe up to move conversation</string>
<string name="title_advanced_autoexpand">Automatically expand messages</string>
<string name="title_advanced_expand_first">Automatically expand the first message when the conversation has been read</string>
<string name="title_advanced_expand_all">Automatically expand all read messages</string>
<string name="title_advanced_expand_one">Expand only one message at a time</string>
<string name="title_advanced_collapse_multiple">Collapse messages in a conversation with multiple messages on \'back\'</string>
@ -1238,6 +1239,9 @@
<string name="title_rule_attachments">Has attachments</string>
<string name="title_rule_mime_type" translatable="false">Mime type</string>
<string name="title_rule_header">Header contains</string>
<string name="title_rule_date">Date range</string>
<string name="title_rule_date_after">Date after</string>
<string name="title_rule_date_before">Date before</string>
<string name="title_rule_time">Time between</string>
<string name="title_rule_regex">Regex</string>
<string name="title_rule_and">AND</string>

@ -101,6 +101,7 @@
android:name=".ApplicationEx"
android:allowBackup="false"
android:appCategory="productivity"
android:forceDarkAllowed="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"

Loading…
Cancel
Save