imageViewReference;
private AvatarService.Avatarable avatarable = null;
- private @DimenRes int size;
+ private @DimenRes
+ final int size;
public AvatarWorkerTask(ImageView imageView, @DimenRes int size) {
imageViewReference = new WeakReference<>(imageView);
diff --git a/src/main/java/eu/siacs/conversations/ui/util/ConversationMenuConfigurator.java b/src/main/java/eu/siacs/conversations/ui/util/ConversationMenuConfigurator.java
index 24bbdd7c7..900246591 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/ConversationMenuConfigurator.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/ConversationMenuConfigurator.java
@@ -30,17 +30,15 @@
package eu.siacs.conversations.ui.util;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager;
-import android.provider.MediaStore;
-import android.support.annotation.NonNull;
import android.view.Menu;
import android.view.MenuItem;
+import androidx.annotation.NonNull;
+
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.OmemoSetting;
-import eu.siacs.conversations.crypto.axolotl.AxolotlService;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Conversational;
import eu.siacs.conversations.entities.Message;
diff --git a/src/main/java/eu/siacs/conversations/ui/util/DelayedHintHelper.java b/src/main/java/eu/siacs/conversations/ui/util/DelayedHintHelper.java
index 805b8f217..2df162099 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/DelayedHintHelper.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/DelayedHintHelper.java
@@ -30,9 +30,10 @@
package eu.siacs.conversations.ui.util;
import android.os.Handler;
-import android.support.annotation.StringRes;
import android.widget.EditText;
+import androidx.annotation.StringRes;
+
public class DelayedHintHelper {
public static void setHint(@StringRes final int res, EditText editText) {
diff --git a/src/main/java/eu/siacs/conversations/ui/util/GridManager.java b/src/main/java/eu/siacs/conversations/ui/util/GridManager.java
index c84dbd63b..c11e423c5 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/GridManager.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/GridManager.java
@@ -1,12 +1,13 @@
package eu.siacs.conversations.ui.util;
import android.content.Context;
-import android.support.annotation.DimenRes;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.ViewTreeObserver;
+import androidx.annotation.DimenRes;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
import eu.siacs.conversations.Config;
import eu.siacs.conversations.ui.adapter.MediaAdapter;
diff --git a/src/main/java/eu/siacs/conversations/ui/util/JidDialog.java b/src/main/java/eu/siacs/conversations/ui/util/JidDialog.java
index ae5401717..7ac8a6f9c 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/JidDialog.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/JidDialog.java
@@ -1,16 +1,17 @@
package eu.siacs.conversations.ui.util;
import android.content.Context;
-import android.support.annotation.StringRes;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.TypefaceSpan;
+import androidx.annotation.StringRes;
+
public class JidDialog {
public static SpannableString style(Context context, @StringRes int res, String... args) {
- SpannableString spannable = new SpannableString(context.getString(res, (Object[]) args));
+ final SpannableString spannable = new SpannableString(context.getString(res, (Object[]) args));
if (args.length >= 1) {
final String value = args[0];
int start = spannable.toString().indexOf(value);
diff --git a/src/main/java/eu/siacs/conversations/ui/util/LocationHelper.java b/src/main/java/eu/siacs/conversations/ui/util/LocationHelper.java
index 27a6c0837..7922ac369 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/LocationHelper.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/LocationHelper.java
@@ -64,9 +64,6 @@ public final class LocationHelper {
return true;
} else if (isNewer && !isLessAccurate) {
return true;
- } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
- return true;
- }
- return false;
- }
+ } else return isNewer && !isSignificantlyLessAccurate && isFromSameProvider;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java b/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java
index 3f40f714f..3772a851e 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java
@@ -2,7 +2,8 @@ package eu.siacs.conversations.ui.util;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.StringRes;
+
+import androidx.annotation.StringRes;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.MucOptions;
diff --git a/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java b/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java
index 0e848e392..da1ac7a44 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java
@@ -2,7 +2,6 @@ package eu.siacs.conversations.ui.util;
import android.app.Activity;
import android.preference.PreferenceManager;
-import android.support.v7.app.AlertDialog;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.TypefaceSpan;
@@ -11,6 +10,8 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import androidx.appcompat.app.AlertDialog;
+
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
diff --git a/src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java b/src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java
index aa2aeb704..b72c5aa86 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java
@@ -81,9 +81,7 @@ public class MyLinkify {
if (end < cs.length()) {
// Reject strings that were probably matched only because they contain a dot followed by
// by some known TLD (see also comment for WORD_BOUNDARY in Patterns.java)
- if (isAlphabetic(cs.charAt(end-1)) && isAlphabetic(cs.charAt(end))) {
- return false;
- }
+ return !isAlphabetic(cs.charAt(end - 1)) || !isAlphabetic(cs.charAt(end));
}
return true;
diff --git a/src/main/java/eu/siacs/conversations/ui/util/PresenceSelector.java b/src/main/java/eu/siacs/conversations/ui/util/PresenceSelector.java
index 2f29e5b76..6edcf3349 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/PresenceSelector.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/PresenceSelector.java
@@ -31,9 +31,10 @@ package eu.siacs.conversations.ui.util;
import android.app.Activity;
import android.content.Context;
-import android.support.v7.app.AlertDialog;
import android.util.Pair;
+import androidx.appcompat.app.AlertDialog;
+
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
diff --git a/src/main/java/eu/siacs/conversations/ui/util/SoftKeyboardUtils.java b/src/main/java/eu/siacs/conversations/ui/util/SoftKeyboardUtils.java
index bcc25b01e..0b2eaf801 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/SoftKeyboardUtils.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/SoftKeyboardUtils.java
@@ -31,11 +31,12 @@ package eu.siacs.conversations.ui.util;
import android.app.Activity;
import android.content.Context;
-import android.support.annotation.NonNull;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
+import androidx.annotation.NonNull;
+
public class SoftKeyboardUtils {
diff --git a/src/main/java/eu/siacs/conversations/ui/util/StyledAttributes.java b/src/main/java/eu/siacs/conversations/ui/util/StyledAttributes.java
index 2b0b3f6e3..709aa0386 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/StyledAttributes.java
+++ b/src/main/java/eu/siacs/conversations/ui/util/StyledAttributes.java
@@ -31,8 +31,9 @@ package eu.siacs.conversations.ui.util;
import android.content.Context;
import android.content.res.TypedArray;
-import android.support.annotation.AttrRes;
-import android.support.annotation.ColorInt;
+
+import androidx.annotation.AttrRes;
+import androidx.annotation.ColorInt;
public class StyledAttributes {
public static android.graphics.drawable.Drawable getDrawable(Context context, @AttrRes int id) {
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/EditMessage.java b/src/main/java/eu/siacs/conversations/ui/widget/EditMessage.java
index 1a1327ec4..eadd562a7 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/EditMessage.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/EditMessage.java
@@ -1,15 +1,11 @@
package eu.siacs.conversations.ui.widget;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.support.v13.view.inputmethod.EditorInfoCompat;
-import android.support.v13.view.inputmethod.InputConnectionCompat;
-import android.support.v13.view.inputmethod.InputContentInfoCompat;
-
import android.content.Context;
+import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
+import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
@@ -19,6 +15,10 @@ import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
+import androidx.core.view.inputmethod.EditorInfoCompat;
+import androidx.core.view.inputmethod.InputConnectionCompat;
+import androidx.core.view.inputmethod.InputContentInfoCompat;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/ImmediateAutoCompleteTextView.java b/src/main/java/eu/siacs/conversations/ui/widget/ImmediateAutoCompleteTextView.java
index 4e40ff404..71e56d7fa 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/ImmediateAutoCompleteTextView.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/ImmediateAutoCompleteTextView.java
@@ -32,7 +32,7 @@ package eu.siacs.conversations.ui.widget;
import android.content.Context;
import android.util.AttributeSet;
-public class ImmediateAutoCompleteTextView extends android.support.v7.widget.AppCompatAutoCompleteTextView {
+public class ImmediateAutoCompleteTextView extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
public ImmediateAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/MyLocation.java b/src/main/java/eu/siacs/conversations/ui/widget/MyLocation.java
index a48e78f92..f49f3dd79 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/MyLocation.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/MyLocation.java
@@ -1,14 +1,13 @@
package eu.siacs.conversations.ui.widget;
-import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Location;
-import android.os.Build;
-import android.support.v4.content.ContextCompat;
+
+import androidx.core.content.ContextCompat;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.util.TileSystem;
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/ScannerView.java b/src/main/java/eu/siacs/conversations/ui/widget/ScannerView.java
index 4eb25418d..3d7d37170 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/ScannerView.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/ScannerView.java
@@ -17,12 +17,6 @@
package eu.siacs.conversations.ui.widget;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import com.google.zxing.ResultPoint;
-
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -35,6 +29,12 @@ import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
+import com.google.zxing.ResultPoint;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
import eu.siacs.conversations.R;
/**
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/SwipeRefreshListFragment.java b/src/main/java/eu/siacs/conversations/ui/widget/SwipeRefreshListFragment.java
index 5f04647c9..b1ef6165a 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/SwipeRefreshListFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/SwipeRefreshListFragment.java
@@ -18,21 +18,21 @@ package eu.siacs.conversations.ui.widget;
import android.content.Context;
import android.os.Bundle;
-import android.support.v4.app.ListFragment;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
+import androidx.fragment.app.ListFragment;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
import eu.siacs.conversations.R;
import eu.siacs.conversations.ui.util.StyledAttributes;
/**
- * Subclass of {@link android.support.v4.app.ListFragment} which provides automatic support for
+ * Subclass of {@link androidx.fragment.app.ListFragment} which provides automatic support for
* providing the 'swipe-to-refresh' UX gesture by wrapping the the content view in a
- * {@link android.support.v4.widget.SwipeRefreshLayout}.
+ * {@link androidx.swiperefreshlayout.widget.SwipeRefreshLayout}.
*/
public class SwipeRefreshListFragment extends ListFragment {
@@ -80,10 +80,10 @@ public class SwipeRefreshListFragment extends ListFragment {
}
/**
- * Set the {@link android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener} to listen for
+ * Set the {@link androidx.core.widget.SwipeRefreshLayout.OnRefreshListener} to listen for
* initiated refreshes.
*
- * @see android.support.v4.widget.SwipeRefreshLayout#setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener)
+ * @see androidx.core.widget.SwipeRefreshLayout#setOnRefreshListener(androidx.core.widget.SwipeRefreshLayout.OnRefreshListener)
*/
public void setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener) {
onRefreshListener = listener;
@@ -95,10 +95,10 @@ public class SwipeRefreshListFragment extends ListFragment {
}
/**
- * Set whether the {@link android.support.v4.widget.SwipeRefreshLayout} should be displaying
+ * Set whether the {@link androidx.core.widget.SwipeRefreshLayout} should be displaying
* that it is refreshing or not.
*
- * @see android.support.v4.widget.SwipeRefreshLayout#setRefreshing(boolean)
+ * @see androidx.core.widget.SwipeRefreshLayout#setRefreshing(boolean)
*/
public void setRefreshing(boolean refreshing) {
this.refreshing = refreshing;
@@ -109,12 +109,12 @@ public class SwipeRefreshListFragment extends ListFragment {
/**
- * Sub-class of {@link android.support.v4.widget.SwipeRefreshLayout} for use in this
- * {@link android.support.v4.app.ListFragment}. The reason that this is needed is because
- * {@link android.support.v4.widget.SwipeRefreshLayout} only supports a single child, which it
+ * Sub-class of {@link androidx.core.widget.SwipeRefreshLayout} for use in this
+ * {@link androidx.core.app.ListFragment}. The reason that this is needed is because
+ * {@link androidx.core.widget.SwipeRefreshLayout} only supports a single child, which it
* expects to be the one which triggers refreshes. In our case the layout's child is the content
* view returned from
- * {@link android.support.v4.app.ListFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)}
+ * {@link androidx.core.app.ListFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)}
* which is a {@link android.view.ViewGroup}.
*
* To enable 'swipe-to-refresh' support via the {@link android.widget.ListView} we need to
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/TextInputEditText.java b/src/main/java/eu/siacs/conversations/ui/widget/TextInputEditText.java
index 747e59916..c6b9968b3 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/TextInputEditText.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/TextInputEditText.java
@@ -12,7 +12,7 @@ import java.lang.reflect.Field;
* A wrapper class to fix some weird fuck ups on Meizu devices
* credit goes to the people in this thread https://github.com/android-in-china/Compatibility/issues/11
*/
-public class TextInputEditText extends android.support.design.widget.TextInputEditText {
+public class TextInputEditText extends com.google.android.material.textfield.TextInputEditText {
public TextInputEditText(Context context) {
super(context);
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/UnreadCountCustomView.java b/src/main/java/eu/siacs/conversations/ui/widget/UnreadCountCustomView.java
index b61fee1e2..1f622a253 100644
--- a/src/main/java/eu/siacs/conversations/ui/widget/UnreadCountCustomView.java
+++ b/src/main/java/eu/siacs/conversations/ui/widget/UnreadCountCustomView.java
@@ -6,10 +6,11 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
-import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
+import androidx.core.content.ContextCompat;
+
import eu.siacs.conversations.R;
public class UnreadCountCustomView extends View {
diff --git a/src/main/java/eu/siacs/conversations/utils/Android360pFormatStrategy.java b/src/main/java/eu/siacs/conversations/utils/Android360pFormatStrategy.java
index 761eff2a3..a692cc6dc 100644
--- a/src/main/java/eu/siacs/conversations/utils/Android360pFormatStrategy.java
+++ b/src/main/java/eu/siacs/conversations/utils/Android360pFormatStrategy.java
@@ -3,9 +3,10 @@ package eu.siacs.conversations.utils;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
import android.os.Build;
-import android.support.annotation.RequiresApi;
import android.util.Log;
+import androidx.annotation.RequiresApi;
+
import net.ypresto.androidtranscoder.format.MediaFormatExtraConstants;
import net.ypresto.androidtranscoder.format.MediaFormatStrategy;
import net.ypresto.androidtranscoder.format.OutputFormatUnavailableException;
diff --git a/src/main/java/eu/siacs/conversations/utils/Android720pFormatStrategy.java b/src/main/java/eu/siacs/conversations/utils/Android720pFormatStrategy.java
index 981866951..274ebb76f 100644
--- a/src/main/java/eu/siacs/conversations/utils/Android720pFormatStrategy.java
+++ b/src/main/java/eu/siacs/conversations/utils/Android720pFormatStrategy.java
@@ -3,9 +3,10 @@ package eu.siacs.conversations.utils;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
import android.os.Build;
-import android.support.annotation.RequiresApi;
import android.util.Log;
+import androidx.annotation.RequiresApi;
+
import net.ypresto.androidtranscoder.format.MediaFormatExtraConstants;
import net.ypresto.androidtranscoder.format.MediaFormatStrategy;
import net.ypresto.androidtranscoder.format.OutputFormatUnavailableException;
diff --git a/src/main/java/eu/siacs/conversations/utils/AndroidUsingExecLowPriority.java b/src/main/java/eu/siacs/conversations/utils/AndroidUsingExecLowPriority.java
index d06c3afeb..d8c46b08f 100644
--- a/src/main/java/eu/siacs/conversations/utils/AndroidUsingExecLowPriority.java
+++ b/src/main/java/eu/siacs/conversations/utils/AndroidUsingExecLowPriority.java
@@ -11,11 +11,6 @@
package eu.siacs.conversations.utils;
-import de.measite.minidns.dnsserverlookup.AbstractDNSServerLookupMechanism;
-import de.measite.minidns.dnsserverlookup.AndroidUsingReflection;
-import de.measite.minidns.dnsserverlookup.DNSServerLookupMechanism;
-import de.measite.minidns.util.PlatformDetection;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -24,6 +19,11 @@ import java.net.InetAddress;
import java.util.HashSet;
import java.util.logging.Level;
+import de.measite.minidns.dnsserverlookup.AbstractDNSServerLookupMechanism;
+import de.measite.minidns.dnsserverlookup.AndroidUsingReflection;
+import de.measite.minidns.dnsserverlookup.DNSServerLookupMechanism;
+import de.measite.minidns.util.PlatformDetection;
+
/**
* Try to retrieve the list of DNS server by executing getprop.
*/
diff --git a/src/main/java/eu/siacs/conversations/utils/BackupFileHeader.java b/src/main/java/eu/siacs/conversations/utils/BackupFileHeader.java
index 212473ea4..54387a8ee 100644
--- a/src/main/java/eu/siacs/conversations/utils/BackupFileHeader.java
+++ b/src/main/java/eu/siacs/conversations/utils/BackupFileHeader.java
@@ -10,11 +10,11 @@ public class BackupFileHeader {
private static final int VERSION = 1;
- private String app;
- private Jid jid;
- private long timestamp;
- private byte[] iv;
- private byte[] salt;
+ private final String app;
+ private final Jid jid;
+ private final long timestamp;
+ private final byte[] iv;
+ private final byte[] salt;
@Override
diff --git a/src/main/java/eu/siacs/conversations/utils/Compatibility.java b/src/main/java/eu/siacs/conversations/utils/Compatibility.java
index b03ad5454..1ea0d70ea 100644
--- a/src/main/java/eu/siacs/conversations/utils/Compatibility.java
+++ b/src/main/java/eu/siacs/conversations/utils/Compatibility.java
@@ -10,12 +10,12 @@ import android.os.Build;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
-import android.support.annotation.BoolRes;
-import android.support.v4.content.ContextCompat;
import android.util.Log;
+import androidx.annotation.BoolRes;
+import androidx.core.content.ContextCompat;
+
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import eu.siacs.conversations.Config;
diff --git a/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java b/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java
index 8bf36ea1f..4ee842223 100644
--- a/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java
+++ b/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java
@@ -6,7 +6,6 @@ import android.util.Log;
import java.io.File;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Stack;
import java.util.concurrent.Executor;
diff --git a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
index 0a2231389..3174c4198 100644
--- a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
@@ -11,6 +11,7 @@ import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import java.net.MalformedURLException;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -256,7 +257,7 @@ public final class CryptoHelper {
public static String getFingerprint(String value) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
- return bytesToHex(md.digest(value.getBytes("UTF-8")));
+ return bytesToHex(md.digest(value.getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) {
return "";
}
diff --git a/src/main/java/eu/siacs/conversations/utils/EasyOnboardingInvite.java b/src/main/java/eu/siacs/conversations/utils/EasyOnboardingInvite.java
index e4ed8e1b5..37bce5e22 100644
--- a/src/main/java/eu/siacs/conversations/utils/EasyOnboardingInvite.java
+++ b/src/main/java/eu/siacs/conversations/utils/EasyOnboardingInvite.java
@@ -16,9 +16,9 @@ import eu.siacs.conversations.xmpp.XmppConnection;
public class EasyOnboardingInvite implements Parcelable {
- private String domain;
- private String uri;
- private String landingUrl;
+ private final String domain;
+ private final String uri;
+ private final String landingUrl;
protected EasyOnboardingInvite(Parcel in) {
domain = in.readString();
diff --git a/src/main/java/eu/siacs/conversations/utils/Emoticons.java b/src/main/java/eu/siacs/conversations/utils/Emoticons.java
index 26dc205b4..266d9d081 100644
--- a/src/main/java/eu/siacs/conversations/utils/Emoticons.java
+++ b/src/main/java/eu/siacs/conversations/utils/Emoticons.java
@@ -29,9 +29,10 @@
package eu.siacs.conversations.utils;
-import android.support.annotation.NonNull;
import android.util.LruCache;
+import androidx.annotation.NonNull;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
diff --git a/src/main/java/eu/siacs/conversations/utils/ExceptionHandler.java b/src/main/java/eu/siacs/conversations/utils/ExceptionHandler.java
index 68672156b..8a77e04bb 100644
--- a/src/main/java/eu/siacs/conversations/utils/ExceptionHandler.java
+++ b/src/main/java/eu/siacs/conversations/utils/ExceptionHandler.java
@@ -1,7 +1,8 @@
package eu.siacs.conversations.utils;
import android.content.Context;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
import java.io.PrintWriter;
import java.io.StringWriter;
diff --git a/src/main/java/eu/siacs/conversations/utils/ExceptionHelper.java b/src/main/java/eu/siacs/conversations/utils/ExceptionHelper.java
index ca515e8fa..ea272302b 100644
--- a/src/main/java/eu/siacs/conversations/utils/ExceptionHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/ExceptionHelper.java
@@ -6,9 +6,10 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.preference.PreferenceManager;
-import android.support.v7.app.AlertDialog;
import android.util.Log;
+import androidx.appcompat.app.AlertDialog;
+
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
diff --git a/src/main/java/eu/siacs/conversations/utils/FtsUtils.java b/src/main/java/eu/siacs/conversations/utils/FtsUtils.java
index 88959c6b2..6984d20ec 100644
--- a/src/main/java/eu/siacs/conversations/utils/FtsUtils.java
+++ b/src/main/java/eu/siacs/conversations/utils/FtsUtils.java
@@ -37,7 +37,7 @@ import java.util.Locale;
public class FtsUtils {
- private static List KEYWORDS = Arrays.asList("OR", "AND");
+ private static final List KEYWORDS = Arrays.asList("OR", "AND");
public static List parse(String input) {
List term = new ArrayList<>();
diff --git a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java
index 9847236ef..459968f37 100644
--- a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java
@@ -107,7 +107,7 @@ public class GeoHelper {
intents.add(geoIntent(geoPoint, label));
Intent httpIntent = new Intent(Intent.ACTION_VIEW);
- httpIntent.setData(Uri.parse("https://maps.google.com/maps?q=loc:"+String.valueOf(geoPoint.getLatitude()) + "," + String.valueOf(geoPoint.getLongitude()) +label));
+ httpIntent.setData(Uri.parse("https://maps.google.com/maps?q=loc:"+ geoPoint.getLatitude() + "," + geoPoint.getLongitude() +label));
intents.add(httpIntent);
return intents;
}
@@ -120,7 +120,7 @@ public class GeoHelper {
private static Intent geoIntent(GeoPoint geoPoint, String label) {
Intent geoIntent = new Intent(Intent.ACTION_VIEW);
- geoIntent.setData(Uri.parse("geo:" + String.valueOf(geoPoint.getLatitude()) + "," + String.valueOf(geoPoint.getLongitude()) + "?q=" + String.valueOf(geoPoint.getLatitude()) + "," + String.valueOf(geoPoint.getLongitude()) + "("+ label+")"));
+ geoIntent.setData(Uri.parse("geo:" + geoPoint.getLatitude() + "," + geoPoint.getLongitude() + "?q=" + geoPoint.getLatitude() + "," + geoPoint.getLongitude() + "("+ label+")"));
return geoIntent;
}
diff --git a/src/main/java/eu/siacs/conversations/utils/ImStyleParser.java b/src/main/java/eu/siacs/conversations/utils/ImStyleParser.java
index 873ab9f43..d21bfadf1 100644
--- a/src/main/java/eu/siacs/conversations/utils/ImStyleParser.java
+++ b/src/main/java/eu/siacs/conversations/utils/ImStyleParser.java
@@ -53,7 +53,7 @@ public class ImStyleParser {
if (BLOCK_KEYWORDS.contains(c) && isCharRepeatedTwoTimes(text, c, i + 1, end)) {
int to = seekEndBlock(text, c, i + 3, end);
if (to != -1 && (to != i + 5 || ALLOW_EMPTY)) {
- String keyword = String.valueOf(c) + String.valueOf(c) + String.valueOf(c);
+ String keyword = String.valueOf(c) + c + c;
styles.add(new Style(keyword, i, to));
i = to;
continue;
diff --git a/src/main/java/eu/siacs/conversations/utils/IrregularUnicodeDetector.java b/src/main/java/eu/siacs/conversations/utils/IrregularUnicodeDetector.java
index 832e0dc56..d3aade355 100644
--- a/src/main/java/eu/siacs/conversations/utils/IrregularUnicodeDetector.java
+++ b/src/main/java/eu/siacs/conversations/utils/IrregularUnicodeDetector.java
@@ -32,13 +32,14 @@ package eu.siacs.conversations.utils;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
-import android.support.annotation.ColorInt;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.util.LruCache;
+import androidx.annotation.ColorInt;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -229,8 +230,7 @@ public class IrregularUnicodeDetector {
if (pattern != null) {
return pattern;
}
- ;
- pattern = PatternTuple.of(jid);
+ pattern = PatternTuple.of(jid);
CACHE.put(jid, pattern);
return pattern;
}
diff --git a/src/main/java/eu/siacs/conversations/utils/JidHelper.java b/src/main/java/eu/siacs/conversations/utils/JidHelper.java
index c53af65ed..e7443c8bb 100644
--- a/src/main/java/eu/siacs/conversations/utils/JidHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/JidHelper.java
@@ -40,7 +40,7 @@ import eu.siacs.conversations.xmpp.Jid;
public class JidHelper {
- private static List LOCAL_PART_BLACKLIST = Arrays.asList("xmpp", "jabber", "me");
+ private static final List LOCAL_PART_BLACKLIST = Arrays.asList("xmpp", "jabber", "me");
public static String localPartOrFallback(Jid jid) {
if (LOCAL_PART_BLACKLIST.contains(jid.getLocal().toLowerCase(Locale.ENGLISH))) {
diff --git a/src/main/java/eu/siacs/conversations/utils/MessageUtils.java b/src/main/java/eu/siacs/conversations/utils/MessageUtils.java
index e8ae07e68..d8b991894 100644
--- a/src/main/java/eu/siacs/conversations/utils/MessageUtils.java
+++ b/src/main/java/eu/siacs/conversations/utils/MessageUtils.java
@@ -62,8 +62,8 @@ public class MessageUtils {
}
body = nick + " " + message.getBody().substring(Message.ME_COMMAND.length());
} else {
- body = message.getMergedBody().toString();;
- }
+ body = message.getMergedBody().toString();
+ }
for (String line : body.split("\n")) {
if (line.length() <= 0) {
continue;
diff --git a/src/main/java/eu/siacs/conversations/utils/OnPhoneContactsLoadedListener.java b/src/main/java/eu/siacs/conversations/utils/OnPhoneContactsLoadedListener.java
index f18a4ed8e..9ae928812 100644
--- a/src/main/java/eu/siacs/conversations/utils/OnPhoneContactsLoadedListener.java
+++ b/src/main/java/eu/siacs/conversations/utils/OnPhoneContactsLoadedListener.java
@@ -5,5 +5,5 @@ import android.os.Bundle;
import java.util.List;
public interface OnPhoneContactsLoadedListener {
- public void onPhoneContactsLoaded(List phoneContacts);
+ void onPhoneContactsLoaded(List phoneContacts);
}
diff --git a/src/main/java/eu/siacs/conversations/utils/PermissionUtils.java b/src/main/java/eu/siacs/conversations/utils/PermissionUtils.java
index 852dedc00..80b58d8cb 100644
--- a/src/main/java/eu/siacs/conversations/utils/PermissionUtils.java
+++ b/src/main/java/eu/siacs/conversations/utils/PermissionUtils.java
@@ -4,7 +4,8 @@ import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
-import android.support.v4.app.ActivityCompat;
+
+import androidx.core.app.ActivityCompat;
import com.google.common.collect.ImmutableList;
diff --git a/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java b/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java
index e849730b7..0238dc975 100644
--- a/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java
@@ -3,20 +3,13 @@ package eu.siacs.conversations.utils;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
-import android.content.CursorLoader;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
-import android.os.Bundle;
-import android.provider.ContactsContract;
import android.provider.ContactsContract.Profile;
import android.provider.Settings;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.RejectedExecutionException;
-
public class PhoneHelper {
@SuppressLint("HardwareIds")
diff --git a/src/main/java/eu/siacs/conversations/utils/QuickLoader.java b/src/main/java/eu/siacs/conversations/utils/QuickLoader.java
index 34e9e0e97..07d46281d 100644
--- a/src/main/java/eu/siacs/conversations/utils/QuickLoader.java
+++ b/src/main/java/eu/siacs/conversations/utils/QuickLoader.java
@@ -37,7 +37,7 @@ import eu.siacs.conversations.entities.Conversation;
public class QuickLoader {
private static String CONVERSATION_UUID = null;
- private static Object LOCK = new Object();
+ private static final Object LOCK = new Object();
public static void set(final String uuid) {
synchronized (LOCK) {
diff --git a/src/main/java/eu/siacs/conversations/utils/Resolver.java b/src/main/java/eu/siacs/conversations/utils/Resolver.java
index 258fbdac9..22c898f15 100644
--- a/src/main/java/eu/siacs/conversations/utils/Resolver.java
+++ b/src/main/java/eu/siacs/conversations/utils/Resolver.java
@@ -2,9 +2,10 @@ package eu.siacs.conversations.utils;
import android.content.ContentValues;
import android.database.Cursor;
-import android.support.annotation.NonNull;
import android.util.Log;
+import androidx.annotation.NonNull;
+
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.InetAddress;
diff --git a/src/main/java/eu/siacs/conversations/utils/SSLSocketHelper.java b/src/main/java/eu/siacs/conversations/utils/SSLSocketHelper.java
index 13b33570b..53d4f4169 100644
--- a/src/main/java/eu/siacs/conversations/utils/SSLSocketHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/SSLSocketHelper.java
@@ -1,12 +1,14 @@
package eu.siacs.conversations.utils;
import android.os.Build;
-import android.support.annotation.RequiresApi;
import android.util.Log;
+import androidx.annotation.RequiresApi;
+
import org.conscrypt.Conscrypt;
import java.lang.reflect.Method;
+import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Collection;
@@ -70,7 +72,7 @@ public class SSLSocketHelper {
final Method method = socket.getClass().getMethod("setAlpnProtocols", byte[].class);
// the concatenation of 8-bit, length prefixed protocol names, just one in our case...
// http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-04#page-4
- final byte[] protocolUTF8Bytes = protocol.getBytes("UTF-8");
+ final byte[] protocolUTF8Bytes = protocol.getBytes(StandardCharsets.UTF_8);
final byte[] lengthPrefixedProtocols = new byte[protocolUTF8Bytes.length + 1];
lengthPrefixedProtocols[0] = (byte) protocol.length(); // cannot be over 255 anyhow
System.arraycopy(protocolUTF8Bytes, 0, lengthPrefixedProtocols, 1, protocolUTF8Bytes.length);
diff --git a/src/main/java/eu/siacs/conversations/utils/StylingHelper.java b/src/main/java/eu/siacs/conversations/utils/StylingHelper.java
index 4d4339a42..7a18dffbb 100644
--- a/src/main/java/eu/siacs/conversations/utils/StylingHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/StylingHelper.java
@@ -32,8 +32,6 @@ package eu.siacs.conversations.utils;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
-import android.support.annotation.ColorInt;
-import android.support.v4.content.ContextCompat;
import android.text.Editable;
import android.text.ParcelableSpan;
import android.text.Spannable;
@@ -48,6 +46,9 @@ import android.text.style.TypefaceSpan;
import android.widget.EditText;
import android.widget.TextView;
+import androidx.annotation.ColorInt;
+import androidx.core.content.ContextCompat;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -58,7 +59,7 @@ import eu.siacs.conversations.ui.text.QuoteSpan;
public class StylingHelper {
- private static List extends Class extends ParcelableSpan>> SPAN_CLASSES = Arrays.asList(
+ private static final List extends Class extends ParcelableSpan>> SPAN_CLASSES = Arrays.asList(
StyleSpan.class,
StrikethroughSpan.class,
TypefaceSpan.class,
diff --git a/src/main/java/eu/siacs/conversations/utils/TLSSocketFactory.java b/src/main/java/eu/siacs/conversations/utils/TLSSocketFactory.java
index 00bae7b75..8bd737c7e 100644
--- a/src/main/java/eu/siacs/conversations/utils/TLSSocketFactory.java
+++ b/src/main/java/eu/siacs/conversations/utils/TLSSocketFactory.java
@@ -6,6 +6,7 @@ import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
+
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
diff --git a/src/main/java/eu/siacs/conversations/utils/ThemeHelper.java b/src/main/java/eu/siacs/conversations/utils/ThemeHelper.java
index bd50ab0ae..17311cb0c 100644
--- a/src/main/java/eu/siacs/conversations/utils/ThemeHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/ThemeHelper.java
@@ -36,12 +36,14 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Build;
import android.preference.PreferenceManager;
-import android.support.annotation.StyleRes;
-import android.support.design.widget.Snackbar;
-import android.support.v4.content.ContextCompat;
import android.util.TypedValue;
import android.widget.TextView;
+import androidx.annotation.StyleRes;
+import androidx.core.content.ContextCompat;
+
+import com.google.android.material.snackbar.Snackbar;
+
import eu.siacs.conversations.R;
import eu.siacs.conversations.ui.SettingsActivity;
@@ -103,8 +105,8 @@ public class ThemeHelper {
final float size = typedArray.getDimension(0,0f);
typedArray.recycle();
if (size != 0f) {
- final TextView text = snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
- final TextView action = snackbar.getView().findViewById(android.support.design.R.id.snackbar_action);
+ final TextView text = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text);
+ final TextView action = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_action);
if (text != null && action != null) {
text.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
action.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
diff --git a/src/main/java/eu/siacs/conversations/utils/TimeFrameUtils.java b/src/main/java/eu/siacs/conversations/utils/TimeFrameUtils.java
index 6ad1325be..1cb78db0c 100644
--- a/src/main/java/eu/siacs/conversations/utils/TimeFrameUtils.java
+++ b/src/main/java/eu/siacs/conversations/utils/TimeFrameUtils.java
@@ -31,7 +31,8 @@ package eu.siacs.conversations.utils;
import android.content.Context;
import android.os.SystemClock;
-import android.support.annotation.PluralsRes;
+
+import androidx.annotation.PluralsRes;
import java.util.Locale;
diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java
index bf87dd0bd..a686f8697 100644
--- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java
@@ -1,12 +1,15 @@
package eu.siacs.conversations.utils;
import android.content.Context;
-import android.support.annotation.ColorInt;
import android.text.SpannableStringBuilder;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.Pair;
+import androidx.annotation.ColorInt;
+
+import com.google.common.base.Strings;
+
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Arrays;
@@ -18,6 +21,7 @@ import java.util.Locale;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
+import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Conversational;
@@ -32,7 +36,7 @@ import eu.siacs.conversations.xmpp.Jid;
public class UIHelper {
- private static int[] UNSAFE_COLORS = {
+ private static final int[] UNSAFE_COLORS = {
0xFFF44336, //red 500
0xFFE53935, //red 600
0xFFD32F2F, //red 700
@@ -45,7 +49,7 @@ public class UIHelper {
0xFFD84315, //deep orange 800,
};
- private static int[] SAFE_COLORS = {
+ private static final int[] SAFE_COLORS = {
0xFFE91E63, //pink 500
0xFFD81B60, //pink 600
0xFFC2185B, //pink 700
@@ -521,8 +525,15 @@ public class UIHelper {
if (conversation instanceof Conversation && conversation.getMode() == Conversation.MODE_MULTI) {
return ((Conversation) conversation).getMucOptions().getSelf().getName();
} else {
- final Jid jid = conversation.getAccount().getJid();
- return jid.getLocal() != null ? jid.getLocal() : jid.getDomain().toString();
+ final Account account = conversation.getAccount();
+ final Jid jid = account.getJid();
+ final String displayName = account.getDisplayName();
+ if (Strings.isNullOrEmpty(displayName)) {
+ return jid.getLocal() != null ? jid.getLocal() : jid.getDomain().toString();
+ } else {
+ return displayName;
+ }
+
}
}
}
@@ -559,14 +570,16 @@ public class UIHelper {
}
}
- public static boolean receivedLocationQuestion(Message message) {
+ public static boolean receivedLocationQuestion(final Message message) {
if (message == null
|| message.getStatus() != Message.STATUS_RECEIVED
|| message.getType() != Message.TYPE_TEXT) {
return false;
}
- String body = message.getBody() == null ? null : message.getBody().trim().toLowerCase(Locale.getDefault());
- body = body.replace("?", "").replace("¿", "");
+ final String body = Strings.nullToEmpty(message.getBody())
+ .trim()
+ .toLowerCase(Locale.getDefault())
+ .replace("?", "").replace("¿", "");
return LOCATION_QUESTIONS.contains(body);
}
diff --git a/src/main/java/eu/siacs/conversations/utils/XEP0392Helper.java b/src/main/java/eu/siacs/conversations/utils/XEP0392Helper.java
index ee6a90e1e..69c00365e 100644
--- a/src/main/java/eu/siacs/conversations/utils/XEP0392Helper.java
+++ b/src/main/java/eu/siacs/conversations/utils/XEP0392Helper.java
@@ -1,10 +1,10 @@
package eu.siacs.conversations.utils;
import android.graphics.Color;
-import android.util.Log;
import org.hsluv.HUSLColorConverter;
+import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
class XEP0392Helper {
@@ -12,7 +12,7 @@ class XEP0392Helper {
private static double angle(String nickname) {
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
- byte[] digest = sha1.digest(nickname.getBytes("UTF-8"));
+ byte[] digest = sha1.digest(nickname.getBytes(StandardCharsets.UTF_8));
int angle = ((int) (digest[0]) & 0xff) + ((int) (digest[1]) & 0xff) * 256;
return angle / 65536.;
} catch (Exception e) {
diff --git a/src/main/java/eu/siacs/conversations/utils/XmppUri.java b/src/main/java/eu/siacs/conversations/utils/XmppUri.java
index 52f84f24b..f3aa65155 100644
--- a/src/main/java/eu/siacs/conversations/utils/XmppUri.java
+++ b/src/main/java/eu/siacs/conversations/utils/XmppUri.java
@@ -1,7 +1,8 @@
package eu.siacs.conversations.utils;
import android.net.Uri;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
diff --git a/src/main/java/eu/siacs/conversations/xml/Element.java b/src/main/java/eu/siacs/conversations/xml/Element.java
index 1bd11f604..c0ece7f4c 100644
--- a/src/main/java/eu/siacs/conversations/xml/Element.java
+++ b/src/main/java/eu/siacs/conversations/xml/Element.java
@@ -6,8 +6,8 @@ import java.util.List;
import eu.siacs.conversations.utils.XmlHelper;
import eu.siacs.conversations.xmpp.InvalidJid;
-import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
import eu.siacs.conversations.xmpp.Jid;
+import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
public class Element {
private final String name;
diff --git a/src/main/java/eu/siacs/conversations/xml/TagWriter.java b/src/main/java/eu/siacs/conversations/xml/TagWriter.java
index df062b8cf..0e03fc1e8 100644
--- a/src/main/java/eu/siacs/conversations/xml/TagWriter.java
+++ b/src/main/java/eu/siacs/conversations/xml/TagWriter.java
@@ -16,10 +16,10 @@ public class TagWriter {
private OutputStreamWriter outputStream;
private boolean finished = false;
- private LinkedBlockingQueue writeQueue = new LinkedBlockingQueue();
+ private final LinkedBlockingQueue writeQueue = new LinkedBlockingQueue();
private CountDownLatch stanzaWriterCountDownLatch = null;
- private Thread asyncStanzaWriter = new Thread() {
+ private final Thread asyncStanzaWriter = new Thread() {
@Override
public void run() {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/InvalidJid.java b/src/main/java/eu/siacs/conversations/xmpp/InvalidJid.java
index a990dc5c1..f3a21c36f 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/InvalidJid.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/InvalidJid.java
@@ -29,7 +29,7 @@
package eu.siacs.conversations.xmpp;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnAdvancedStreamFeaturesLoaded.java b/src/main/java/eu/siacs/conversations/xmpp/OnAdvancedStreamFeaturesLoaded.java
index e45eba73e..9093076f7 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnAdvancedStreamFeaturesLoaded.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnAdvancedStreamFeaturesLoaded.java
@@ -3,5 +3,5 @@ package eu.siacs.conversations.xmpp;
import eu.siacs.conversations.entities.Account;
public interface OnAdvancedStreamFeaturesLoaded {
- public void onAdvancedStreamFeaturesAvailable(final Account account);
+ void onAdvancedStreamFeaturesAvailable(final Account account);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnBindListener.java b/src/main/java/eu/siacs/conversations/xmpp/OnBindListener.java
index f09cf33dd..2406d8d7f 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnBindListener.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnBindListener.java
@@ -3,5 +3,5 @@ package eu.siacs.conversations.xmpp;
import eu.siacs.conversations.entities.Account;
public interface OnBindListener {
- public void onBind(Account account);
+ void onBind(Account account);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnContactStatusChanged.java b/src/main/java/eu/siacs/conversations/xmpp/OnContactStatusChanged.java
index 20b17f021..afbe21c32 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnContactStatusChanged.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnContactStatusChanged.java
@@ -3,5 +3,5 @@ package eu.siacs.conversations.xmpp;
import eu.siacs.conversations.entities.Contact;
public interface OnContactStatusChanged {
- public void onContactStatusChanged(final Contact contact, final boolean online);
+ void onContactStatusChanged(final Contact contact, final boolean online);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnKeyStatusUpdated.java b/src/main/java/eu/siacs/conversations/xmpp/OnKeyStatusUpdated.java
index e7fc582e4..705782455 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnKeyStatusUpdated.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnKeyStatusUpdated.java
@@ -3,5 +3,5 @@ package eu.siacs.conversations.xmpp;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
public interface OnKeyStatusUpdated {
- public void onKeyStatusUpdated(AxolotlService.FetchStatus report);
+ void onKeyStatusUpdated(AxolotlService.FetchStatus report);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnMessagePacketReceived.java b/src/main/java/eu/siacs/conversations/xmpp/OnMessagePacketReceived.java
index 325e945f0..24acf16e2 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnMessagePacketReceived.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnMessagePacketReceived.java
@@ -4,5 +4,5 @@ import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
public interface OnMessagePacketReceived extends PacketReceived {
- public void onMessagePacketReceived(Account account, MessagePacket packet);
+ void onMessagePacketReceived(Account account, MessagePacket packet);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnPresencePacketReceived.java b/src/main/java/eu/siacs/conversations/xmpp/OnPresencePacketReceived.java
index 95c1acfcc..e1bf839f4 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnPresencePacketReceived.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnPresencePacketReceived.java
@@ -4,5 +4,5 @@ import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
public interface OnPresencePacketReceived extends PacketReceived {
- public void onPresencePacketReceived(Account account, PresencePacket packet);
+ void onPresencePacketReceived(Account account, PresencePacket packet);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnStatusChanged.java b/src/main/java/eu/siacs/conversations/xmpp/OnStatusChanged.java
index ad1d98cb9..262838b51 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnStatusChanged.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnStatusChanged.java
@@ -3,5 +3,5 @@ package eu.siacs.conversations.xmpp;
import eu.siacs.conversations.entities.Account;
public interface OnStatusChanged {
- public void onStatusChanged(Account account);
+ void onStatusChanged(Account account);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/OnUpdateBlocklist.java b/src/main/java/eu/siacs/conversations/xmpp/OnUpdateBlocklist.java
index 92e72cfa8..e4f1a7cbe 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/OnUpdateBlocklist.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/OnUpdateBlocklist.java
@@ -3,11 +3,11 @@ package eu.siacs.conversations.xmpp;
public interface OnUpdateBlocklist {
// Use an enum instead of a boolean to make sure we don't run into the boolean trap
// (`onUpdateBlocklist(true)' doesn't read well, and could be confusing).
- public static enum Status {
+ enum Status {
BLOCKED,
UNBLOCKED
}
@SuppressWarnings("MethodNameSameAsClassName")
- public void OnUpdateBlocklist(final Status status);
+ void OnUpdateBlocklist(final Status status);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/PacketReceived.java b/src/main/java/eu/siacs/conversations/xmpp/PacketReceived.java
index d4502d734..05ddc392f 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/PacketReceived.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/PacketReceived.java
@@ -1,5 +1,5 @@
package eu.siacs.conversations.xmpp;
-public abstract interface PacketReceived {
+public interface PacketReceived {
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/WrappedJid.java b/src/main/java/eu/siacs/conversations/xmpp/WrappedJid.java
index aeee5c6e4..08fb6e6dc 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/WrappedJid.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/WrappedJid.java
@@ -1,11 +1,10 @@
package eu.siacs.conversations.xmpp;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
-import org.jxmpp.jid.parts.Domainpart;
import org.jxmpp.jid.parts.Localpart;
import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.stringprep.XmppStringprepException;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index 70374522a..e58b11b35 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -5,12 +5,13 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.SystemClock;
import android.security.KeyChain;
-import android.support.annotation.NonNull;
import android.util.Base64;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
+import androidx.annotation.NonNull;
+
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/AbstractJingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/AbstractJingleConnection.java
index bd50a22a2..0b1ff4495 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/AbstractJingleConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/AbstractJingleConnection.java
@@ -8,8 +8,8 @@ import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.services.XmppConnectionService;
-import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
import eu.siacs.conversations.xmpp.Jid;
+import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
public abstract class AbstractJingleConnection {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleCandidate.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleCandidate.java
index 0fd0eabaf..78ffb28be 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleCandidate.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleCandidate.java
@@ -13,9 +13,9 @@ public class JingleCandidate {
public static int TYPE_DIRECT = 0;
public static int TYPE_PROXY = 1;
- private boolean ours;
+ private final boolean ours;
private boolean usedByCounterpart = false;
- private String cid;
+ private final String cid;
private String host;
private int port;
private int type;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java
index 178ac659c..27111af35 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java
@@ -14,7 +14,6 @@ import com.google.common.collect.ImmutableSet;
import java.lang.ref.WeakReference;
import java.security.SecureRandom;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -61,7 +60,7 @@ public class JingleConnectionManager extends AbstractConnectionManager {
.expireAfterWrite(24, TimeUnit.HOURS)
.build();
- private HashMap primaryCandidates = new HashMap<>();
+ private final HashMap primaryCandidates = new HashMap<>();
public JingleConnectionManager(XmppConnectionService service) {
super(service);
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java
index 408635f93..8997a5043 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java
@@ -41,6 +41,7 @@ import eu.siacs.conversations.services.AbstractConnectionManager;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
+import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
import eu.siacs.conversations.xmpp.jingle.stanzas.Content;
import eu.siacs.conversations.xmpp.jingle.stanzas.FileTransferDescription;
@@ -50,7 +51,6 @@ import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
import eu.siacs.conversations.xmpp.jingle.stanzas.Reason;
import eu.siacs.conversations.xmpp.jingle.stanzas.S5BTransportInfo;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
-import eu.siacs.conversations.xmpp.Jid;
public class JingleFileTransferConnection extends AbstractJingleConnection implements Transferable {
@@ -70,8 +70,8 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
private int mStatus = Transferable.STATUS_UNKNOWN;
private Message message;
private Jid responder;
- private List candidates = new ArrayList<>();
- private ConcurrentHashMap connections = new ConcurrentHashMap<>();
+ private final List candidates = new ArrayList<>();
+ private final ConcurrentHashMap connections = new ConcurrentHashMap<>();
private String transportId;
private FileTransferDescription description;
@@ -100,7 +100,7 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
private OutputStream mFileOutputStream;
private InputStream mFileInputStream;
- private OnIqPacketReceived responseListener = (account, packet) -> {
+ private final OnIqPacketReceived responseListener = (account, packet) -> {
if (packet.getType() != IqPacket.TYPE.RESULT) {
if (mJingleStatus != JINGLE_STATUS_FAILED && mJingleStatus != JINGLE_STATUS_FINISHED) {
fail(IqParser.extractErrorMessage(packet));
@@ -164,7 +164,7 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
JingleFileTransferConnection.this.fail();
}
};
- private OnTransportConnected onIbbTransportConnected = new OnTransportConnected() {
+ private final OnTransportConnected onIbbTransportConnected = new OnTransportConnected() {
@Override
public void failed() {
Log.d(Config.LOGTAG, "ibb open failed");
@@ -177,7 +177,7 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
JingleFileTransferConnection.this.transport.send(file, onFileTransmissionStatusChanged);
}
};
- private OnProxyActivated onProxyActivated = new OnProxyActivated() {
+ private final OnProxyActivated onProxyActivated = new OnProxyActivated() {
@Override
public void success() {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInBandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInBandTransport.java
index 7be13bedb..c68941928 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInBandTransport.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInBandTransport.java
@@ -18,9 +18,9 @@ import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.services.AbstractConnectionManager;
import eu.siacs.conversations.xml.Element;
+import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
-import eu.siacs.conversations.xmpp.Jid;
public class JingleInBandTransport extends JingleTransport {
@@ -46,7 +46,7 @@ public class JingleInBandTransport extends JingleTransport {
private OnFileTransmissionStatusChanged onFileTransmissionStatusChanged;
- private OnIqPacketReceived onAckReceived = new OnIqPacketReceived() {
+ private final OnIqPacketReceived onAckReceived = new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
if (!connected) {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnTransportConnected.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnTransportConnected.java
index 38f03c5d0..3e397823d 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnTransportConnected.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnTransportConnected.java
@@ -1,7 +1,7 @@
package eu.siacs.conversations.xmpp.jingle;
public interface OnTransportConnected {
- public void failed();
+ void failed();
- public void established();
+ void established();
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java
index 7fad0459a..8a7581f04 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java
@@ -1,5 +1,7 @@
package eu.siacs.conversations.xmpp.jingle;
+import com.google.common.base.Strings;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -14,13 +16,13 @@ import eu.siacs.conversations.xml.Namespace;
public class RtpCapability {
- private static List BASIC_RTP_REQUIREMENTS = Arrays.asList(
+ private static final List BASIC_RTP_REQUIREMENTS = Arrays.asList(
Namespace.JINGLE,
Namespace.JINGLE_TRANSPORT_ICE_UDP,
Namespace.JINGLE_APPS_RTP,
Namespace.JINGLE_APPS_DTLS
);
- private static List VIDEO_REQUIREMENTS = Arrays.asList(
+ private static final List VIDEO_REQUIREMENTS = Arrays.asList(
Namespace.JINGLE_FEATURE_AUDIO,
Namespace.JINGLE_FEATURE_VIDEO
);
@@ -42,7 +44,7 @@ public class RtpCapability {
public static String[] filterPresences(final Contact contact, Capability required) {
final Presences presences = contact.getPresences();
final ArrayList resources = new ArrayList<>();
- for(final Map.Entry presence : presences.getPresencesMap().entrySet()) {
+ for (final Map.Entry presence : presences.getPresencesMap().entrySet()) {
final Capability capability = check(presence.getValue());
if (capability == Capability.NONE) {
continue;
@@ -55,9 +57,16 @@ public class RtpCapability {
}
public static Capability check(final Contact contact) {
+ return check(contact, true);
+ }
+
+ public static Capability check(final Contact contact, final boolean allowFallback) {
final Presences presences = contact.getPresences();
+ if (presences.size() == 0 && allowFallback && contact.getAccount().isEnabled()) {
+ return contact.getRtpCapability();
+ }
Capability result = Capability.NONE;
- for(Presence presence : presences.getPresences()) {
+ for (final Presence presence : presences.getPresences()) {
Capability capability = check(presence);
if (capability == Capability.VIDEO) {
result = capability;
@@ -69,7 +78,18 @@ public class RtpCapability {
}
public enum Capability {
- NONE, AUDIO, VIDEO
+ NONE, AUDIO, VIDEO;
+
+ public static Capability of(String value) {
+ if (Strings.isNullOrEmpty(value)) {
+ return NONE;
+ }
+ try {
+ return valueOf(value);
+ } catch (IllegalArgumentException e) {
+ return NONE;
+ }
+ }
}
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/SessionDescription.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/SessionDescription.java
index 52762407f..7c329089a 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/SessionDescription.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/SessionDescription.java
@@ -88,7 +88,6 @@ public class SessionDescription {
case 'm':
if (currentMediaBuilder == null) {
sessionDescriptionBuilder.setAttributes(attributeMap);
- ;
} else {
currentMediaBuilder.setAttributes(attributeMap);
mediaBuilder.add(currentMediaBuilder.createMedia());
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java
index f27efb1e2..e21c38968 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java
@@ -1,12 +1,11 @@
package eu.siacs.conversations.xmpp.jingle.stanzas;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import com.google.common.base.Preconditions;
import java.util.Locale;
-import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java
index 21b1d5089..0863b29df 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java
@@ -1,6 +1,6 @@
package eu.siacs.conversations.xmpp.jingle.stanzas;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import com.google.common.base.CaseFormat;
import com.google.common.base.Preconditions;
@@ -11,8 +11,8 @@ import java.util.Map;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
-import eu.siacs.conversations.xmpp.stanzas.IqPacket;
import eu.siacs.conversations.xmpp.Jid;
+import eu.siacs.conversations.xmpp.stanzas.IqPacket;
public class JinglePacket extends IqPacket {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java
index 9e4c8d95d..c419045b0 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java
@@ -1,6 +1,6 @@
package eu.siacs.conversations.xmpp.jingle.stanzas;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import com.google.common.base.CaseFormat;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/pep/Avatar.java b/src/main/java/eu/siacs/conversations/xmpp/pep/Avatar.java
index 1e4c1f629..a4397e466 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/pep/Avatar.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/pep/Avatar.java
@@ -7,9 +7,9 @@ import eu.siacs.conversations.xmpp.Jid;
public class Avatar {
- public enum Origin { PEP, VCARD };
+ public enum Origin { PEP, VCARD }
- public String type;
+ public String type;
public String sha1sum;
public String image;
public int height;
diff --git a/src/main/res/drawable/background.xml b/src/main/res/drawable/background.xml
index f9c1fa73a..215c0eae4 100644
--- a/src/main/res/drawable/background.xml
+++ b/src/main/res/drawable/background.xml
@@ -1,11 +1,11 @@
-
+
-
+ android:src="@drawable/splash_logo" />
diff --git a/src/main/res/layout/account_row.xml b/src/main/res/layout/account_row.xml
index 75e3c2e54..914ee1950 100644
--- a/src/main/res/layout/account_row.xml
+++ b/src/main/res/layout/account_row.xml
@@ -44,7 +44,7 @@
android:textAppearance="@style/TextAppearance.Conversations.Body2" />
-
-
-
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_change_password.xml b/src/main/res/layout/activity_change_password.xml
index 03d575f98..51f26920a 100644
--- a/src/main/res/layout/activity_change_password.xml
+++ b/src/main/res/layout/activity_change_password.xml
@@ -13,7 +13,7 @@
android:layout_above="@+id/button_bar"
android:layout_below="@id/toolbar">
-
-
-
+
-
-
+
-
+
-
-
-
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_choose_contact.xml b/src/main/res/layout/activity_choose_contact.xml
index f44ef3509..b937f6d19 100644
--- a/src/main/res/layout/activity_choose_contact.xml
+++ b/src/main/res/layout/activity_choose_contact.xml
@@ -22,7 +22,7 @@
android:divider="@android:color/transparent"
android:dividerHeight="0dp"/>
-
-
-
+
-
-
-
+
-
-
+
diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml
index 8741740ad..4fd8dc3c3 100644
--- a/src/main/res/layout/activity_edit_account.xml
+++ b/src/main/res/layout/activity_edit_account.xml
@@ -24,7 +24,7 @@
android:orientation="vertical">
-
-
-
+
-
-
+
-
-
+
-
-
+
@@ -158,9 +158,9 @@
android:text="@string/register_account"/>
-
+
-
-
+
-
-
+
-
-
+
diff --git a/src/main/res/layout/activity_media_browser.xml b/src/main/res/layout/activity_media_browser.xml
index 4a54e5fd4..57e12be9b 100644
--- a/src/main/res/layout/activity_media_browser.xml
+++ b/src/main/res/layout/activity_media_browser.xml
@@ -11,7 +11,7 @@
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
-
-
-
-
+
-
-
+
@@ -216,9 +216,9 @@
android:layout_marginTop="32dp"
android:textAppearance="@style/TextAppearance.Conversations.Caption"/>
-
+
-
-
-
+
-
-
-
+
-
-
+
diff --git a/src/main/res/layout/activity_muc_users.xml b/src/main/res/layout/activity_muc_users.xml
index c195a0a1a..3fc73d02c 100644
--- a/src/main/res/layout/activity_muc_users.xml
+++ b/src/main/res/layout/activity_muc_users.xml
@@ -14,21 +14,21 @@
layout="@layout/toolbar" />
-
-
-
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_publish_profile_picture.xml b/src/main/res/layout/activity_publish_profile_picture.xml
index 635f49b45..aa9e9dc8f 100644
--- a/src/main/res/layout/activity_publish_profile_picture.xml
+++ b/src/main/res/layout/activity_publish_profile_picture.xml
@@ -8,7 +8,7 @@
-
-
+
-
-
-
+
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-
-
+
+
-
+
+ android:background="?color_background_overlay" />
+ app:backgroundTint="?colorPrimary"
+ app:sdMainFabClosedBackgroundColor="?colorPrimary"
+ app:sdMainFabClosedSrc="@drawable/ic_add_white_24dp"
+ app:sdMainFabOpenedBackgroundColor="?colorPrimaryDark"
+ app:sdOverlayLayout="@id/overlay"
+ app:sdUseReverseAnimationOnClose="true" />
diff --git a/src/main/res/layout/activity_trust_keys.xml b/src/main/res/layout/activity_trust_keys.xml
index 96617702e..03f002149 100644
--- a/src/main/res/layout/activity_trust_keys.xml
+++ b/src/main/res/layout/activity_trust_keys.xml
@@ -21,7 +21,7 @@
android:layout_height="wrap_content"
android:orientation="vertical">
-
-
+
-
-
+
-
-
-
+
diff --git a/src/main/res/layout/create_public_channel_dialog.xml b/src/main/res/layout/create_public_channel_dialog.xml
index 4e458fc3c..048244d0c 100644
--- a/src/main/res/layout/create_public_channel_dialog.xml
+++ b/src/main/res/layout/create_public_channel_dialog.xml
@@ -19,7 +19,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
-
-
-
+
-
+
diff --git a/src/main/res/layout/dialog_join_conference.xml b/src/main/res/layout/dialog_join_conference.xml
index cb8fd313d..e4d4b8000 100644
--- a/src/main/res/layout/dialog_join_conference.xml
+++ b/src/main/res/layout/dialog_join_conference.xml
@@ -22,7 +22,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
-
-
+
-
-
+
\ No newline at end of file
diff --git a/src/main/res/layout/dialog_quickedit.xml b/src/main/res/layout/dialog_quickedit.xml
index f0b71fc1b..0b3219fec 100644
--- a/src/main/res/layout/dialog_quickedit.xml
+++ b/src/main/res/layout/dialog_quickedit.xml
@@ -8,7 +8,7 @@
android:orientation="vertical"
android:padding="?dialogPreferredPadding">
-
-
+
\ No newline at end of file
diff --git a/src/main/res/layout/enter_jid_dialog.xml b/src/main/res/layout/enter_jid_dialog.xml
index b7b7a310f..cacb98a6f 100644
--- a/src/main/res/layout/enter_jid_dialog.xml
+++ b/src/main/res/layout/enter_jid_dialog.xml
@@ -22,7 +22,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
-
-
+
diff --git a/src/main/res/layout/fragment_conversation.xml b/src/main/res/layout/fragment_conversation.xml
index d83dbe0b9..1ffbef68f 100644
--- a/src/main/res/layout/fragment_conversation.xml
+++ b/src/main/res/layout/fragment_conversation.xml
@@ -23,7 +23,7 @@
android:transcriptMode="normal"
tools:listitem="@layout/message_sent">
-
-
-
+
-
-
-
-
+
\ No newline at end of file
diff --git a/src/main/res/layout/keys_card.xml b/src/main/res/layout/keys_card.xml
index e0c385ad5..54eaaabc0 100644
--- a/src/main/res/layout/keys_card.xml
+++ b/src/main/res/layout/keys_card.xml
@@ -1,7 +1,7 @@
-
-
+
\ No newline at end of file
diff --git a/src/main/res/layout/toolbar.xml b/src/main/res/layout/toolbar.xml
index 89b029df5..ebee72b0a 100644
--- a/src/main/res/layout/toolbar.xml
+++ b/src/main/res/layout/toolbar.xml
@@ -1,5 +1,5 @@
-Нов разговор
Управление на профилите
Управление на профила
+ Затваряне на разговора
Подробности за контакта
Подробности за груповия разговор
Подробности за канала
@@ -15,6 +16,8 @@
Деблокиране на контакта
Блокиране на домейна
Деблокиране на домейна
+ Блокиране на участника
+ Деблокиране на участника
Управление на профилите
Настройки
Споделяне в разговора
@@ -36,12 +39,14 @@
Модератор
Участник
Посетител
+ Искате ли да премахнете %s от списъка си с контакти? Разговорите с него няма да бъдат премахнати.
Искате ли да блокирате %s, така че да не може да Ви праща съобщения?
Искате ли да деблокирате %s, така че отново да може да Ви праща съобщения?
Блокиране на всички контакти от %s?
Деблокиране на всички контакти от %s?
Контактът е блокиран
Блокиран
+ Искате ли да премахнете отметката за %s? Разговорите, свързани с тази отметка, няма да бъдат премахнати.
Регистриране на нов профил на сървъра
Промяна на паролата в сървъра
Споделяне с…
diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml
index 2749e83d9..9093a6f2f 100644
--- a/src/main/res/values-ca/strings.xml
+++ b/src/main/res/values-ca/strings.xml
@@ -4,8 +4,10 @@
Nova conversa
Gestiona els comptes
Administrar compte
+ Conversa pròxima
Detalls del contacte
Detalls del xat de grup
+ Detalls del canal
Afegeix un compte
Edita el nom
Afegeix a la llibreta d\'adreces
@@ -14,6 +16,8 @@
Desbloqueja el contacte
Bloqueja el domini
Desbloqueja el domini
+ Bloquejar participant
+ Desbloquejar participant
Gestiona els comptes
Configuració
Compartir amb Conversations
@@ -25,6 +29,10 @@
Ara
fa 1 min
fa %d mins
+
+ - %dconverses no llegides
+ - %d converses no llegides
+
enviant…
Desxifrant el missatge. Espereu…
Missatge xifrat amb OpenPGP
@@ -35,12 +43,14 @@
Moderador
Participant
Visitant
+ Vols eliminar a %s de la teva llista de contactes? Les converses amb aquest contacte no seran eliminades.
Voleu impedir que %s us pugui enviar missatges?
Us agradaria desbloquejar %s i permetre que us enviï missatges?
Voleu bloquejar tots els contactes de %s?
Voleu desbloquejar tots el contactes de %s?
Contacte bloquejat
Bloquejats
+ Vols esborrar %s com a marcador? Les converses amb aquest marcador no seran eliminades.
Registra un compte nou al servidor
Canvia la contrasenya al servidor
Comparteix amb…
@@ -59,14 +69,22 @@
Desa
D\'acord
El Conversations s\'ha aturat
+ Usar el teu compte XMPP per a enviar seguiments de pila ajuda al desenvolupament continu de Conversations.
Envia ara
No preguntis de nou
+ No es va poder connectar al compte
+ No es va poder connectar-se a múltiples comptes
+ Prem per a administrar els teus comptes
Envia un fitxer
+ Afegir aquest contacte perdut a la teva llista de contactes?
Afegeix un contacte
L\'enviament ha fallat
+ Preparant-se per a enviar la imatge
+ Preparant-se per a enviar la imatge
S\'estan compartint els fitxers. Espereu…
Neteja l\'historial
Neteja l\'historial de la conversa
+ Vols esborrar tots els missatges d\'aquesta conversa?\n\n Advertiment: Això no influirà en els missatges emmagatzemats en altres dispositius o servidors.
Eliminar fitxer
Estàs segur que vols esborrar aquest fitxer?\n\n Advertiment: Això no eliminarà les còpies d\'aquest fitxer que estiguin emmagatzemades en altres dispositius o servidors.
Tanca aquesta conversa després
@@ -77,16 +95,20 @@
Envia un missatge xifrat amb OMEMO
Envia un missatge xifrat amb v\\OMEMO
Envia un missatge xifrat amb OpenPGP
+ Nou sobrenom en ús
Envia sense xifrar
El desxiframent ha fallat. Potser no teniu la clau privada apropiada.
OpenKeychain
+ Conversations usa OpenKeychain per a xifrar i desxifrar missatges i gestionar les seves claus públiques.\n\n Està llicenciat baix GPLv3+ i disponible en F-Droid i Google Play.\n\n (Si us plau, reiniciï Conversations després.)
Reinicia
Instal·la
Instal·leu l\'OpenKeychain
s\'està oferint…
s\'està esperant…
No s\'ha trobat cap clau OpenPGP
+ No es va poder xifrar el teu missatge perquè el teu contacte no està anunciant la seva clau pública.\n\n Si us plau, demana-li al seu contacte que configuri OpenPGP.
No s\'ha trobat cap clau OpenPGP
+ No es pot encriptar el teu missatge perquè els teus contactes no anuncien les seves claus públiques. Si us plau, demana\'ls que configurin OpenPGP.
General
Accepta els fitxers
Accepta fitxers automàticament amb una mida menor a…
@@ -96,12 +118,19 @@
Vibra quan arribi un missatge nou
Notificació LED
Fes que la notificació lumínica parpellegi quan arribi un missatge nou
+ To de trucada
+ So de notificació
+ So de notificació per als nous missatges
+ To de trucada entrant
Període de gràcia
+ La durada de les notificacions se silencia després de detectar activitat en un dels seus altres dispositius.
Avançat
Mai enviïs informes d\'errors
+ En enviar els rastres de la pila estàs ajudant al desenvolupament
Confirma els missatges
Feu saber als vostres contactes quan heu rebut i llegit els seus missatges
UI
+ OpenKeychain va produir un error.
Clau dolenta per encriptar.
Accepta
S\'ha produït un error
@@ -114,8 +143,10 @@
Fes una fotografia
Accepta les peticions de subscripció preventivament
El fitxer triat no és una imatge
+ No es va poder convertir l\'arxiu d\'imatge
No s\'ha trobat el fitxer
Error d\'E/S general. Pot ser que us hagueu quedat sense espai d\'emmagatzematge.
+ L\'aplicació que vas usar per a seleccionar aquesta imatge no va proporcionar suficients permisos per a llegir l\'arxiu.\n\nUtilitza un gestor d\'arxius diferent per a triar una imatge.
Desconegut
Inhabilitat temporalment
En línia
@@ -127,6 +158,8 @@
El registre ha fallat
El nom d\'usuari ja està en ús
S\'ha completat el registre
+ El registre no està suportat pel servidor
+ Token de registre invàlid
S\'ha produït un error en la negociació de TLS
Violació de la política
Servidor incompatible
@@ -142,12 +175,17 @@
Publica la clau pública d\'OpenPGP
Elimina la clau pública d\'OpenPGP
Esteu segur que voleu eliminar la vostra clau pública d\'OpenPGP de l\'anunci de la vostra presència?\nEls vostres contactes ja no podran enviar missatges xifrats amb OpenPGP.
+ S\'ha publicat la clau pública de OpenPGP.
Habilita el compte
N\'esteu segur?
+ En esborrar el teu compte s\'esborra tot l\'historial de converses
Enregistra veu
Adreça XMPP
+ Bloquejar la direcció XMPP
username@example.com
Contrasenya
+ Aquesta no és una direcció XMPP vàlida
+ Fora de la memòria. Imatge massa gran
Voleu afegir a %s a la vostra llibreta d\'adreces?
Informació del servidor
XEP-0313: Gestió d\'arxivat de missatges
@@ -156,6 +194,7 @@
XEP-0191: Ordre de bloqueig
XEP-0237: Versionat de la llista de contactes
XEP-0198: Gestió del flux de dades
+ XEP-0215: Descobriment de servei extern
XEP-0163: Protocol d\'esdeveniments personals (Avatars / OMEMO)
XEP-0363: Pujada de fitxers per HTTP
XEP-0357: Notificacions de tramesa automàtica
@@ -163,9 +202,14 @@
No disponible
No es troben anuncis de clau pública
darrera connexió: ara mateix
+ vist per última vegada fa un minut
darrera connexió: fa %d minuts
+ vist per última vegada fa una hora
darrera connexió: fa %d hores
+ vist per última vegada fa un dia
darrera connexió: fa %d dies
+ Missatge encriptat. Si us plau, instal·la OpenKeychain per a desencriptar-ho.
+ S\'han trobat nous missatges xifrats OpenPGP
Identificador de la clau d\'OpenPGP
Empremta digital OMEMO
Empremta digital v\\OMEMO
@@ -176,6 +220,7 @@
S\'estan obtenint les claus…
Fet
Desxifra
+ Marcadors
Cerca
Introduïu un contacte
Suprimeix el contacte
@@ -186,10 +231,16 @@
Seleccioneu
El contacte ja existeix
Entra
+ channel@conference.example.com/nick
+ channel@conference.example.com
Desa com a marcador
Elimina dels marcadors
Destrueix el xat en grup
Destrueix el canal
+ Estàs segur que vols destruir aquest xat en grup?\n\nAdvertiment: El xat de grup serà eliminat per complet en el servidor.
+ Estàs segur que vols destruir aquest canal públic?\n\nAdvertiment: El canal serà completament eliminat en el servidor.
+ No es va poder destruir el xat del grup
+ No es va poder destruir el canal
Edita el tema del xat de grup
Assumpte
S\'està unint al xat de grup…
@@ -198,25 +249,32 @@
Afegeix de nou
%s ha llegit fins aquí
%s han llegit fins aquí
+ %1$s +%2$d uns altres han llegit fins a aquest punt
Tothom ha llegit fins a aquí
Publica
+ Premi l\'avatar per a seleccionar una imatge de la galeria
S\'està publicant…
El servidor ha rebutjat la vostra publicació
+ No s\'ha pogut convertir la imatge
No s\'ha pogut desar l\'avatar al disc
(O feu un toc llarg per restablir al valor predeterminat)
+ El seu servidor no suporta la publicació d\'avatars
xiuxiuejat
a %s
Envia un missatge privat a %s
Connecta
Aquest compte ja existeix
Següent
+ Sessió establerta
Salta
Inhabilita les notificacions
Habilita
El xat de grup requereix contrasenya
Introduïu la contrasenya
+ Si us plau, sol·liciti primer les actualitzacions de presència al seu contacte.\n\nAixò s\'usarà per a determinar quina aplicació de xat està usant el teu contacte.
Sol·licita ara
Ignora
+ Advertiment:: Enviar això sense actualitzacions de presència mútua podria causar problemes inesperats.\n\n Vagi a \"Dades de contacte\" per a verificar les seves subscripcions de presència.
Seguretat
Permet la correcció de missatges
Permet que els contactes editin de manera retroactiva els missatges
@@ -229,6 +287,9 @@
Habilitar hores de silenci
Les notificacions seràn silenciades a les hores de silenci
Altres
+ Sincronitzar als marcadors
+ Unir-se als xats de grup automàticament si el marcador l\'indica
+ Empremta digital de OMEMO copiada en el portapapers
Estàs prohibit en aquest xat de grup
Aquest xat en grup només és de membres
Limitació de recursos
@@ -236,6 +297,7 @@
S\'ha tancat el xat de grup
Ja no ets en aquest xat de grup
Utlitzant el compte %s
+ allotjat en %s
S\'està verificant %s al host HTTP
No estàs connectat. Intenta-ho més tard
Verificació de la mida de %s
@@ -247,6 +309,7 @@
Envia una altra vegada
URL del fitxer
URL copiada al portapapers
+ Adreça XMPP copiada en el porta-retalls
Missatge d\'error copiat al portapapers
Adreça Web
Escaneja el codi de barres 2D
@@ -255,11 +318,16 @@
Detalls del compte
Confirmar
Intenta una altra vegada
+ Servei de primer pla
Evitar que el sistema operatiu desconnecti la connexió
Crea una còpia de seguretat
+ Els arxius de suport s\'emmagatzemaran en %s
+ Creant arxius de còpia de seguretat
La còpia de seguretat s\'ha creat
+ Els arxius de suport han estat emmagatzemats en %s
Restaurant la còpia de seguretat
La còpia de seguretat s\'ha restaurat
+ No oblidis habilitar el compte.
Tria un fitxer
Rebent %1$s (%2$d%% completat)
Descargat %s
@@ -267,16 +335,27 @@
Fitxer
Obert %s
Enviant (%1$d%% completat)
+ Preparant-se per a compartir l\'arxiu
%s ofert per descarregar
Transmissió cancelada
+ no es va poder compartir l\'arxiu
+ transmissió d\'arxius cancel·lada
+ Arxius eliminats
+ No s\'ha trobat cap aplicació per a obrir l\'arxiu
+ No s\'ha trobat cap aplicació per a obrir l\'enllaç
+ No s\'ha trobat cap aplicació per a veure el contacte
Etiquetes dinàmiques
Mostra etiquetes de nomès lectura per sota dels noms dels contactes
Habilitar notificació
No s\'ha trobat cap servidor de xat de grup
+ No s\'ha pogut crear un xat de grup
Avatar del compte
Copieu l\'empremta digital OMEMO al porta-retalls
Regenerar la clau OMEMO
Esborra els dispositius
+ Estàs segur que vols esborrar tots els altres dispositius de l\'anunci de OMEMO? La pròxima vegada que els teus dispositius es connectin, tornaran a anunciar-se, però pot ser que no rebin els missatges enviats mentrestant.
+ No hi ha claus disponibles per a aquest contacte.\nNo s\'han pogut obtenir noves claus del servidor. Potser hi ha algun problema amb el servidor del teu contacte?
+ No hi ha claus utilitzables per a aquest contacte.\NAsseguri\'s que tots dos tenen subscripció de presència.
Alguna cosa ha anat malament
Anar a cercar la història als servidors
No hi ha més histories al servidor
@@ -286,6 +365,7 @@
Cambiar contrasenya
Contrasenya actual
Nova contrasenya
+ La contrasenya no pot estar buida
Habilitar tots els comptes
Deshabilitar tots els comptes
Realitzar l\'acció amb…
@@ -294,14 +374,25 @@
Outcast
Membre
Mode avançat
+ Concedir privilegis als membres
+ Revocar els privilegis dels membres
Admetre privilegis d\'administrador
Rebocar privilegis d\'administrador
+ Concedir privilegis al propietari
+ Revocar els privilegis del propietari
Suprimeix del xat de grup
+ Eliminar del canal
No s\'ha pogut canviar l\'afiliació del %s
Prohibició del xat en grup
+ Prohibició del canal
+ Estàs intentant eliminar a %s d\'un canal públic. L\'única manera de fer-ho és prohibir a aquest usuari per sempre.
Banejat ara
No s\'ha pogut canviar les regles de %s
+ Configuració del xat de grup privat
+ Configuració del canal públic
Privat, només membres
+ Fer que les direccions XMPP siguin visibles per a qualsevol
+ Fer que el canal sigui moderat
No esteu participant
S\'han modificat les opcions de xat en grup.
No s\'han pogut modificar les opcions de xat de grup
@@ -312,6 +403,7 @@
Marcar com llegit
Entrada
Entra per enviar
+ Utilitzi la tecla Intro per a enviar el missatge. Sempre pots usar Ctrl+Intro per a enviar un missatge, fins i tot si aquesta opció està desactivada.
Mostra el botó enter
Canviar la clau dels emoticones per un botó d\'entrada
audio
@@ -332,8 +424,11 @@
Feu saber als vostres contactes quan els escriviu missatges
Enviar localització
Mostrar localització
+ No s\'ha trobat cap aplicació per a mostrar la ubicació
Localització
Conversa tancada
+ Deixar el xat de grup privat
+ Canal públic de l\'esquerra
No confiar en les CAs del sistema
Tots els certificats han de ser aprovats manualment
Eliminar certificats
@@ -346,12 +441,15 @@
- %d certificat esborrat
- %d certificats esborrats
+ Substituir el botó \"Enviar\" per una acció ràpida
Acció ràpida
Cap
Ús més recent
Trieu una acció ràpida
Buscar contactes
+ Buscar favorits
Envia un missatge privat
+ %1$s ha abandonat el xat de grup
Nom d\'usuari
Nom d\'usuari
Aquest no és un nom d\'usuari vàlid
@@ -361,17 +459,28 @@
S\'ha produït un error en la baixada: no s\'ha pogut escriure el fitxer
La xarxa Tor no està disponible
Vincular el error
+ El servidor no és responsable d\'aquest domini
Trencat
Disponibilitat
Fora quan la pantalla està apagada
+ Mostrar com a Absent quan la pantalla està apagada
+ Ocupat en manera silenciosa
+ Mostrar com ocupat quan el dispositiu està en manera silenciosa
Tracteu de vibrar al modo silenciós
+ Mostrar com ocupat quan el dispositiu està en vibració
Configuració de connexió estesa
Mostra el nom de la màquina i la configuració del port quan configureu un compte
xmpp.example.com
+ Inici de sessió amb certificat
+ No s\'ha pogut analitzar el certificat
Arxivant preferències
Preferències d\'arxivat al servidor
S\'estan obtenint les preferències d\'arxivat. Espereu…
+ No s\'han pogut recuperar les preferències d\'arxiu
+ Es requereix CAPTCHA
Introduïu el text de la imatge de dalt
+ Cadena de certificats no fiable
+ La direcció XMPP no coincideix amb el certificat
Renova el certificat
S\'ha produït un error en obtenir la clau OMEMO!.
Clau OMEMO verificada amb certificat!
@@ -381,6 +490,7 @@
Tunelar totes les connexions a través de la xarxa Tor. Requereix Orbot
Nom del \"Host\"
Port
+ Servidor- or .onion-address
Aquest no és un número de port vàlid
Aquest no és un nom de host vàlid
%1$d of %2$d comptes connectats
@@ -389,28 +499,41 @@
- %d messages
Carregueu més missatges
+ Arxiu compartit amb %s
+ Imatge compartida amb %s
+ Imatges compartides amb %s
+ Text compartit amb %s
+ Concedir a Conversations accés a l\'emmagatzematge extern
+ Concedir accés a la càmera a Conversations
Sincronitza amb contactes
+ Converses vol permís per a accedir als teus contactes per a aparellar la teva llista de contactes XMPP amb els teus contactes per a mostrar els seus noms complets i avatars.\nNomés llegirà els teus contactes i els aparellarà localment sense pujar-los al teu servidor.
No guardarem una còpia d\'aquests números de telèfon.\n\nPer a més informació llegeixi la nostra política de privadesa
Ara se us demanarà que concediu permís per accedir als vostres contactes.]]>
Notifica a tots els missatges
Notifica només quan s\'esmenta
S\'han desactivat les notificacions
S\'han pausat les notificacions
Compressió d\'imatge
+ Suggeriment: Utilitzi \"Triar arxiu\" en lloc de \"Triar imatge\" per a enviar imatges individuals sense comprimir, independentment d\'aquesta configuració.
Sempre
+ Només imatges grans
Optimitzacions de la bateria habilitades
+ El seu dispositiu està emprant fortes optimitzacions de la bateria per a les Converses, la qual cosa pot provocar retards en les notificacions o fins i tot la pèrdua de missatges.\nEs recomana desactivar-les.
+ El seu dispositiu està emprant fortes optimitzacions de la bateria per a les Converses, la qual cosa pot provocar retards en les notificacions o fins i tot la pèrdua de missatges.\nEs recomana desactivar-les.
Desactivar
L\'àrea seleccionada és massa gran
(Sense comptes activats)
Aquest camp és obligatori
Corregeix el missatge
Envia el missatge corregit
+ Ja has validat l\'empremta digital d\'aquesta persona de manera segura per a confirmar la seva confiança. En seleccionar \"Fet\" només estàs confirmant que %s forma part d\'aquest xat de grup.
Heu desactivat aquest compte
+ Error de seguretat: Accés invàlid a un arxiu!
+ No s\'ha trobat cap aplicació per a compartir URI
Comparteix l\'URI amb…
-
Vostè es registra amb el seu número de telèfon i Quicksy es basarà automàticament en els números de telèfon de la seva llibreta d\'adreces per suggerir-li possibles contactes.
En registrar-se vostè accepta la nostra política de privadesa . ]]>
- Us guiarem pel procés de creació d\'un compte a chat.sum7.eu.\nQuan
-trieu chat.sum7.eu com a proveïdor, podreu comunicar-vos amb els usuaris
-d\'altres proveïdors donant-los la vostra ID Jabber completa.
- La vostra Jabber ID completa serà: %s
+
Si es registra amb el seu número de telèfon i Quicksy,--basant-se en els números de telèfon de la seva agenda--li suggereix automàticament possibles contactes.
En inscriure\'s, accepta nostra política de privacitat.]]>
+ Acceptar i continuar
+ S\'ha establert una guia per a la creació de comptes en chat.sum7.eu.\nEn triar chat.sum7.eu com a proveïdor podràs comunicar-te amb usuaris d\'altres proveïdors donant-los la teva adreça XMPP completa.
+ La seva adreça XMPP completa serà: %s
Crear compte
Utilitza el meu propi proveïdor
Tria el teu nom d\'usuari
@@ -433,9 +556,17 @@ d\'altres proveïdors donant-los la vostra ID Jabber completa.
Curt
Mitjà
Llarg
+ Ús de la radiodifusió
+ Permetre que els seus contactes sàpiguen quan usa Conversations
Privadesa
Tema
Seleccioneu la paleta de colors
+ Automàtic
+ Clar
+ Fosc
+ Fons verd
+ Utilitzeu fons verd per als missatges rebuts
+ No s\'ha pogut connectar amb OpenKeychain
Aquest dispositiu ja no està en ús
Ordinador
Telèfon mòbil
@@ -443,20 +574,29 @@ d\'altres proveïdors donant-los la vostra ID Jabber completa.
Navegador web
Consola
Cal fer pagament
+ Concedir el permís d\'ús d\'Internet
Jo
El contacte demana la subscripció a la presència
Permetre
No hi ha permís per accedir %s
El servidor remot no s\'ha trobat
+ Temps d\'espera del servidor remot
+ No s\'ha pogut actualitzar el compte
+ Denunciar aquesta adreça XMPP per spam.
Elimineu les identitats OMEMO
+ Regenera les teves claus OMEMO. Tots els teus contactes hauran de verificar-te de nou. Utilitza això només com a últim recurs.
Elimineu les tecles seleccionades
Cal que us connecteu per publicar el vostre avatar.
Mostra el missatge d\'error
Missatge d\'error
S\'ha activat el protector de dades
+ El seu sistema operatiu està restringint l\'accés de Converses a Internet quan està en segon pla. Per a rebre notificacions de nous missatges ha de permetre l\'accés sense restriccions de Converses quan l\'\"Estalvi de dades\" està activat.\nConversations continuarà fent un esforç per estalviar dades quan sigui possible.
El vostre dispositiu no suporta desactivar el protector de dades de Conversations
+ No s\'ha pogut crear l\'arxiu temporal
S\'ha verificat aquest dispositiu
Copieu l\'empremta digital
+ S\'han verificat totes les claus OMEMO que tens en el teu poder
+ El codi de barres no conté empremtes dactilars per a aquesta conversa.
Empremtes digitals verificades
Utilitzeu la càmera per escanejar el codi de barres d\'un contacte
Espereu que es puguin obtenir les claus
@@ -464,8 +604,11 @@ d\'altres proveïdors donant-los la vostra ID Jabber completa.
Comparteix com a XMPP URI
Comparteix com a enllaç HTTP
Confiança cega abans de la verificació
+ Confiar en els nous dispositius dels contactes no verificats, però sol·licitar la confirmació manual dels nous dispositius per als contactes verificats.
+ Confiar cegament en les claus de OMEMO, la qual cosa significa que podria ser una altra persona o que algú podria haver intervingut.
No confiable
Codi de barres 2D no vàlid
+ Netejar la carpeta de caixet (utilitzada per l\'aplicació de la cambra)
Netejar la memòria cache
Netejar l\'emmagatzematge privat
Netejar emmagatzematge privat on es mantenen els fitxers (es poden tornar a descarregar del servidor)
@@ -475,6 +618,7 @@ d\'altres proveïdors donant-los la vostra ID Jabber completa.
Mostra inactiu
Amaga inactiu
Dispositiu no confiable
+ Està segur que vol eliminar la verificació d\'aquest dispositiu?\nAquest dispositiu i els missatges que provinguin d\'ell es marcaran com \"No fiable\".
- 1%d segons
- %d segons
@@ -507,6 +651,7 @@ d\'altres proveïdors donant-los la vostra ID Jabber completa.
S\'han tancat les converses corresponents.
Contacte bloquejat.
Notificacions d\'estranys
+ Notificar per a missatges i trucades rebudes d\'estranys.
S\'ha rebut un missatge de un desconegut
Bloqueja al desconegut
Bloqueja tot el domini
@@ -516,11 +661,14 @@ d\'altres proveïdors donant-los la vostra ID Jabber completa.
Mecanisme SASL degradat
El servidor requereix el registre al lloc web
Obre la pàgina web
+ No s\'ha trobat cap aplicació per a obrir el lloc web
Notificacions \"cap amunt\"
+ Mostrar les notificacions dels caps de fila
Avui
Ahir
Valideu el nom del servidor amb DNSSEC
Els certificats de servidor que contenen el nom de host validat es consideren verificats
+ El certificat no conté una direcció XMPP
parcial
Grava vídeo
Copiar al portapapers
@@ -544,6 +692,8 @@ d\'afegir Converses a la llista d\'aplicacions protegides.
Edita el missatge d\'estat
Desactiva el xifratge
Les converses no poden enviar missatges xifrats a 1%1$s . Això pot ser degut al vostre contacte mitjançant un servidor o client obsolet que no pot gestionar OMEMO.
+ No s\'ha pogut obtenir la llista de dispositius
+ No s\'han pogut obtenir les claus d\'encriptació
Suggeriment: en alguns casos això es pot resoldre afegint les vostres llistes de contactes.
Estàs segur que vols desactivar el xifratge OMEMO per a aquesta conversa?\nAixò permetrà
que l\'administrador del servidor llegeixi els missatges, però pot ser l\'única forma de comunicar-se amb persones que utilitzin clients obsolets.
@@ -562,6 +712,7 @@ que l\'administrador del servidor llegeixi els missatges, però pot ser l\'únic
Mitjana
Gran
El missatge no està xifrat per a aquest dispositiu.
+ No s\'ha pogut desxifrar el missatge OMEMO.
desfer
L\'ús compartit d\'ubicacions està desactivat
Posició fixa
@@ -572,12 +723,16 @@ que l\'administrador del servidor llegeixi els missatges, però pot ser l\'únic
Compartir ubicació
Mostrar ubicació
Compartir
+ No s\'ha pogut iniciar l\'enregistrament
Si us plau, esperi…
+ Concedir accés al micròfon a Conversations
Buscar missatges
GIF
Veure conversa
Plugin per Compartir Ubicació
+ Utilitzar el plugin de compartir ubicació en lloc del mapa incorporat
Copiar adreça web
+ Copiar la adeça XMPP
Ús compartit de fitxers HTTP per a S3
Recerca directa
En la pantalla \'Iniciar conversa\' obri el teclat i col·loqui el cursor en el camp de recerca
@@ -590,4 +745,216 @@ que l\'administrador del servidor llegeixi els missatges, però pot ser l\'únic
Proporcionar un nom és opcional
Nom del xat en grup
Aquest xat en grup ha estat destruït
+ No s\'ha pogut guardar l\'enregistrament
+ Servei de primer pla
+ Aquesta categoria de notificació s\'utilitza per a mostrar una notificació permanent que indica que les Converses s\'estan executant.
+ Informació d\'estat
+ Problemes de connectivitat
+ Aquesta categoria de notificació s\'utilitza per a mostrar una notificació en cas que hi hagi un problema de connexió a un compte.
+ Missatges
+ Tracades
+ Missatges
+ Trucades entrants
+ Trucades en curs
+ Missatges silenciosos
+ Aquest grup de notificacions s\'utilitza per a mostrar notificacions que no han d\'activar cap so. Per exemple, quan estan actives en un altre dispositiu (període de gràcia).
+ Lliuraments fallits
+ Configuració de la notificació de missatges
+ Configuració de la notificació de trucades entrants
+ Importància, So, Vibració
+ Compressió de vídeo
+ Veure mitjans
+ Participants
+ Navegador de mitjans
+ Arxiu omès per violació de seguretat.
+ Qualitat del vídeo
+ Una menor qualitat significa arxius més petits
+ Mitjà (360p)
+ Alt (720p)
+ cancel·lat
+ Ja està redactant un missatge.
+ Funció no implementada
+ Codi de país invàlid
+ Triï un país
+ número de telèfon
+ Verifiqui el seu número de telèfon
+ Quicksy enviarà un missatge SMS (poden aplicar-se càrrecs de l\'operador) per a verificar el teu número de telèfon. Introdueix el codi del teu país i el número de telèfon:
+
%s
Està bé, o vol editar el número?]]>
+ %s no és un número de telèfon vàlid.
+ Si us plau, introdueixi el seu número de telèfon.
+ Buscar països
+ Verificar %s
+ %s.]]>
+ Li hem enviat un altre SMS amb un codi de 6 dígits.
+ Si us plau, introdueixi el pin de 6 dígits a continuació.
+ Reexpedir SMS
+ Reexpedir SMS (%s)
+ Si us plau, esperi (%s)
+ tornar
+ Pegar automàticament un possible pin des del portapapers.
+ Si us plau, introdueixi el seu pin de 6 dígits.
+ Està segur que vol avortar el procediment de registre?
+ Si
+ No
+ Verificant...
+ Sol·licitud de SMS...
+ El pin que has introduït és incorrecte.
+ El pin que li hem enviat ha caducat.
+ Error de xarxa desconegut.
+ Resposta desconeguda del servidor.
+ No s\'ha pogut connectar amb el servidor.
+ No s\'ha pogut establir una connexió segura.
+ No s\'ha pogut trobar el servidor.
+ Alguna cosa va sortir malament en processar la seva sol·licitud.
+ Entrada d\'usuari no vàlida
+ No està disponible temporalment. Torna a intentar-ho més tard.
+ No hi ha connexió a la xarxa.
+ Si us plau, intenti-ho de nou en %s
+ La seva velocitat està limitada
+ Massa intents
+ Estàs utilitzant una versió desactualizada d\'aquesta aplicació.
+ Actualitzar
+ Aquest número de telèfon està actualment connectat amb un altre dispositiu.
+ Si us plau, introdueixi el seu nom perquè la gent, que no li té en la seva llibreta d\'adreces, sàpiga qui és vostè.
+ El seu nom
+ Introdueixi el seu nom
+ Utilitzi el botó d\'edició per a establir el seu nom.
+ Rebutjar la sol·licitud
+ Instal·lar Orbot
+ Iniciar Orbot
+ No hi ha cap aplicació de venda instal·lada.
+ Aquest canal farà pública la seva adreça XMPP
+ Llibre electrònic
+ Original (sense comprimir)
+ Obrir amb...
+ Foto de perfil de Conversations
+ Triï el compte
+ Restaurar còpia de seguretat
+ Restaurar
+ Introdueixi la contrasenya del compte %s per a restaurar la còpia de seguretat.
+ No utilitzi la funció de restauració de la còpia de seguretat per a intentar clonar (executar simultàniament) una instal·lació. La restauració d\'una còpia de seguretat només està pensada per a migracions o en cas que hagis perdut el dispositiu original.
+ No s\'ha pogut restaurar la còpia de seguretat.
+ No s\'ha pogut desxifrar la còpia de seguretat. La contrasenya és correcta?
+ Còpia de seguretat i restauració
+ Introdueixi la direcció XMPP
+ Crear un xat de grup
+ Unir-se a un canal públic
+ Crear un xat de grup privat
+ Crear un canal públic
+ Nom del canal
+ Adreça XMPP
+ Indiqui un nom per al canal
+ Indiqui una direcció XMPP
+ Aquesta és una direcció XMPP. Si us plau, proporcioni un nom.
+ Creant un canal públic...
+ Aquest canal ja existeix
+ T\'has unit a un canal existent
+ No s\'ha pogut guardar la configuració del canal
+ Permetre que qualsevol pugui editar el tema
+ Permetre que qualsevol convidi a uns altres
+ Qualsevol pot editar el tema.
+ Els propietaris poden editar el tema.
+ Els administradors poden editar el tema.
+ Els propietaris poden convidar a uns altres.
+ Qualsevol pot convidar a uns altres.
+ Les adreces XMPP són visibles per als administradors.
+ Les adreces XMPP són visibles per a qualsevol.
+ Aquest canal públic no té participants. Convida als teus contactes o utilitza el botó de compartir per a distribuir la seva adreça XMPP.
+ Aquest xat de grup privat no té participants.
+ Gestionar els privilegis
+ Buscar participants
+ Arxiu massa gran
+ Adjuntar
+ Descobreix canals
+ Buscar canals
+ Possible violació de la privacitat.
+ search.jabber.network.
L\'ús d\'aquesta funció transmetrà la seva adreça IP i els termes de cerca a aquest servei. Consulti la seva Política de Privacitat per a obtenir més informació.]]>
+ Ja tinc un compte
+ Afegir compte existent
+ Registrar un nou compte
+ Això sembla una direcció de domini
+ Afegir de totes maneres
+ Això sembla una direcció de canal
+ Compartir arxius de còpia de seguretat
+ Còpia de seguretat de Conversations
+ Esdeveniment
+ Obrir la còpia de seguretat
+ L\'arxiu seleccionat no és un arxiu de còpia de seguretat de Conversations
+ Aquest compte ja està configurada
+ Si us plau, introdueixi la contrasenya d\'aquest compte
+ No s\'ha pogut realitzar aquesta acció
+ Unir-se al canal públic...
+ L\'aplicació per a compartir no va donar permís per a accedir a aquest arxiu.
+
+ jabber.network
+ Servidor local
+ La majoria dels usuaris haurien de triar \'jabber.network\' per a obtenir millors suggeriments de tot l\'ecosistema públic de XMPP.
+ Mètode de descobriment de canals
+ Còpia de seguretat
+ Sobre
+ Si us plau, habiliti un compte
+ Fer una trucada
+ Trucada entrant
+ Trucada de vídeo entrant
+ Connectant
+ Connectat
+ Acceptant la trucada
+ Finalitzant la trucada
+ Resposta
+ Descartar
+ Descobrir dispositius
+ Sonant
+ Ocupat
+ No es va poder establir la trucada
+ Connexió perduda
+ Trucada rebutjada
+ Fallada de l\'aplicació
+ Penjar
+ Trucada en curs
+ Trucada de vídeo en curs
+ Desactivar Tor per a fer trucades
+ Trucada entrant
+ Trucada entrant · %s
+ Trucada sortint
+ Trucada sortint · %s
+ Trucada perduda
+ Trucada de veu
+ Trucada de vídeo
+ Ajuda
+ Passar a la conversa
+ El seu micròfon no està disponible
+ Només pots tenir una trucada alhora.
+ Tornar a la trucada en curs
+ No es pot canviar de càmera
+ Enclavar en la part superior
+ Desenclavar de dalt
+ Ruta GPX
+ No s\'ha pogut corregir el missatge
+ Totes les converses
+ Aquesta conversa
+ El seu avatar
+ Avatar per a %s
+ Encriptat amb OMEMO
+ Encriptat amb OpenPGP
+ No encriptat
+ Sortir
+ Gravar la bústia de veu
+ Reproduir àudio
+ Pausar l\'àudio
+ Afegir contacte, crear o unir-se a un xat de grup, o descobrir canals
+
+ - View %1$d Participant
+ - Veure %1$d Participants
+
+
+ - Alguns missatges no han pogut ser lliurats
+ - Alguns missatges no han pogut ser lliurats
+
+ Lliuraments fallits
+ Més opcions
+ No s\'ha trobat cap aplicació
+ Convidar a Conversations
+ No es pot processar la invitació
+ El servidor no admet la generació d\'invitacions
+ Cap compte actiu admet aquesta funció
diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml
index dd2a09c53..f446dc120 100644
--- a/src/main/res/values-cs/strings.xml
+++ b/src/main/res/values-cs/strings.xml
@@ -7,6 +7,7 @@
Zavřít konverzaci
Detaily kontaktu
Detaily skupinového chatu
+ Detaily kanálu
Přidat účet
Upravit jméno
Přidat do adresáře
@@ -20,6 +21,8 @@
Sdílet s konverzací
Začít konverzaci
Vybrat kontakt
+ Vybrat kontakty
+ Sdílet pomocí účtu
Seznam blokovaných
právě teď
před minutou
@@ -39,13 +42,16 @@
Zablokovat všechny kontakty z %s?
Odblokovat všechny kontakty z %s?
Kontakty zablokovány
+ Zablokovaný
Přejete si odstranit %s ze záložek? Předešlé rozhovory pod záložkou nebudou odstraněny.
Registrovat nový účet na serveru
Změnit heslo na serveru
Sdílet s...
Začít konverzaci
Pozvat kontakt
+ Pozvat
Kontakty
+ Kontakt
Zrušit
Nastavit
Přidat
@@ -58,14 +64,22 @@
Aplikace Konverzace přestala reagovat
Odeslat teď
Již se neptat
+ Nelze se připojit k účtu
Přiložit soubor
+ Přidat chybějící kontakt do seznamu kontaktů?
Přidat kontakt
doručení selhalo
+ Připravuji odeslání obrázku
+ Připravuji odeslání obrázků
Sdílení souborů. Chvíli strpení...
Smazat historii
Smaže historii konverzací
+ Opravdu chcete smazat všechny zprávy v této konverzace?\n\nVarováníToto neovlivní zprávy uložené na jiných zařízeních či serverech.
+ Smazat soubor
+ Opravdu chcete smazat tento soubor?\n\nVarováníToto neovlivní kopie uložené na jiných zařízeních či serverech.
Vybrat přístroj
Odeslat nešifrovanou zprávu
+ Odeslat zprávu
Odeslat zprávu pro %s
Poslat OMEMO šifrovanou zprávu
Odeslat v\\OMEMO šifrovanou zprávu
@@ -89,7 +103,10 @@
Vibrovat při přijetí nové zprávy
LED upozornění
Blikat při přijetí nové zprávy
+ Vyzváněcí tón
+ Vyzváněcí tón pro příchozí hovor
Časová lhůta
+ Časová lhůta po kterou bude Conversations v tichém režimu při zaznamenání aktivity na jiném přístroji
Rozšířené
Neodesílat detaily o pádu aplikace
Potvrzovat zprávy
@@ -97,6 +114,7 @@
UI
Přijmout
Došlo k chybě
+ Chyba
Váš účet
Zasílat změny stavu
Přijímat změny stavu
@@ -129,6 +147,7 @@
Dočasně vypnout
Zveřejnit avatar
Zveřejnit OpenPGP klíč
+ OpenPGP veřejný klíč zveřejněn.
Povolit účet
Jste si jisti?
Nahrát hlas
@@ -183,6 +202,7 @@
kanál@konference.server.cz
Uložit jako záložku
Smazat záložku
+ Zrušit kanál
Odejít
Kontakt přidán do seznamu
Opět přidat
@@ -353,6 +373,7 @@
- %d zpráv
Načíst více zpráv
+ Povolit Conversations přístup ke kameře
Synchronizovat s kontakty
Upozorňovat na všechny zprávy
Upozornění vypnuta
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index ba44d4438..60f6187d3 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -29,7 +29,10 @@
gerade
vor einer Minute
vor %d Minuten
- %d ungelesene Unterhaltungen
+
+ - %d ungelesene Unterhaltung
+ - %d ungelesene Unterhaltungen
+
senden…
Nachricht wird entschlüsselt. Bitte warten…
OpenPGP-verschlüsselte Nachricht
diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml
index 2f9c58e51..03ba2915f 100644
--- a/src/main/res/values-el/strings.xml
+++ b/src/main/res/values-el/strings.xml
@@ -29,7 +29,6 @@
μόλις τώρα
πριν από 1 λεπτό
πριν από %d λεπτά
- %d αδιάβαστες συζητήσεις
αποστολή...
Αποκρυπτογράφηση μηνύματος. Παρακαλώ περιμένετε...
Κρυπτογραφημένο μήνυμα OpenPGP
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 2a70dccea..eee2de1c5 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -29,7 +29,10 @@
ahora
hace 1 min
hace %d min
- %dconversaciones sin leer
+
+ - %d conversación sin leer
+ - %dconversaciones sin leer
+
enviando…
Descifrando mensaje. Por favor, espera...
Mensaje cifrado con OpenPGP
@@ -948,4 +951,8 @@
Envíos fallidos
Más opciones
No se ha encontrado aplicación
+ Invitar a Conversations
+ No se ha podido leer la invitación
+ El servidor no soporta la creación de invitaciones
+ Ninguna cuenta activa soporta esta característica
diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml
index e3dc29fb4..2ca7339fd 100644
--- a/src/main/res/values-eu/strings.xml
+++ b/src/main/res/values-eu/strings.xml
@@ -28,7 +28,6 @@
orain
min 1 lehenago
%d min lehenago
- Irakurrik gabeko %d elkarrizketa
bidaltzen…
Mezua desenkriptatzen. Mesedez itxaron…
OpenPGPz enkriptatutako mezua
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index e8918029b..8e12440eb 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -29,7 +29,6 @@
À l\'instant
Il y a 1 minute
Il y a %d minutes
- %d conversations non lues
Envoi…
Déchiffrement du message. Veuillez patienter…
Message chiffré avec OpenPGP
diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml
index dc20afeb2..b8d38cade 100644
--- a/src/main/res/values-gl/strings.xml
+++ b/src/main/res/values-gl/strings.xml
@@ -29,7 +29,10 @@
agora
Hai 1 min
hai %d minutos
- %d conversas non lidas
+
+ - %d conversa sen ler
+ - %d conversas sen ler
+
enviando…
Descifrando a mensaxe. Por favor agarde...
Mensaxe cifrado con OpenPGP
@@ -254,7 +257,7 @@
O servidor rexeitou a túa publicación
Non se puido converter a imaxe
Non se puido salvar o avatar no disco
- (ou pulsación longa para voltar ao valor por omisión)
+ (ou pulsación longa para volver ao valor por defecto)
O servidor non soporta a publicación de avatares
murmurado
a %s
diff --git a/src/main/res/values-hu/strings.xml b/src/main/res/values-hu/strings.xml
index d1c193856..6f50fc62a 100644
--- a/src/main/res/values-hu/strings.xml
+++ b/src/main/res/values-hu/strings.xml
@@ -29,7 +29,6 @@
éppen most
1 perce
%d perce
- %d olvasatlan beszélgetés
küldés…
Üzenet visszafejtése. Kérem várjon…
OpenPGP-vel titkosított üzenet
diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml
index 08fb2bc34..282b0e455 100644
--- a/src/main/res/values-id/strings.xml
+++ b/src/main/res/values-id/strings.xml
@@ -3,7 +3,11 @@
Pengaturan
Percakapan Baru
Pengaturan Akun
+ Pengaturan akun
+ Tutup percakapan
Detil Kontak
+ Detil grup chat
+ Detil channel
Tambah Akun
Ubah Nama
Tambahkan ke daftar kontak
@@ -12,10 +16,15 @@
Batal blokir kontak
Blokir domain
Batal blokir domain
+ Blok partisipan
+ Buka blok partisipan
Pengaturan Akun
Pengaturan
Bagikan dengan Conversation
Mulai Percakapan
+ Pilih kontak
+ Pilih beberapa kontak
+ Bagikan melalui akun
Daftar blokir
sekarang
1 min lalu
@@ -24,6 +33,7 @@
Mendekripsi pesan. Mohon tunggu…
Pesan terenkripsi OpenPGP
Nickname ini sudah digunakan
+ Alias tidak valid
Administrator
Pemilik
Moderator
@@ -34,10 +44,15 @@
Blokir semua kontak dari %s?
Batalkan blokir semua kontak dari %s?
Kontak terblokir
+ Diblok
Daftarkan akun baru di server
Ganti password di server
Bagikan dengan...
+ Mulai percakapan
+ Undang kontak
+ Undang
Kontak
+ Kontak
Batal
Atur
Tambah
@@ -50,13 +65,25 @@
Percakapan terhenti
Kirim sekarang
Jangan tanya lagi
+ Tidak dapat terhubung ke akun
+ Tidak dapat terhubung ke multi akun
+ Klik untuk mengatur akun anda
Sisipkan berkas
+ Tambah kontak ini ke daftar kontak anda?
Tambah kontak
pengiriman gagal
+ Mempersiapkan pengiriman gambar
+ Mempersiapkan pengiriman beberapa gambar
Membagikan berkas. Mohon tunggu…
Bersihkan riwayat
Hapus Riwayat Percakapan
+ Hapus file
+ Lanjutkan dengan menutup percakapan
+ Pilih perangkat
Kirim pesan tak-terenkripsi
+ Kirim pesan
+ Kirimkan pesan ke %s
+ Kirim pesan terenkripsi OMEMO
Kirim pesan terenskripsi OpenPGP
Kirim tidak terenkripsi
Dekripsi gagal. Mungkin Anda tidak memiliki kunci pribadi yang tepat.
@@ -76,12 +103,19 @@
Getar
Aktifkan getar ketika pesan masuk
Notifikasi LED
+ Nada dering
+ Notifikasi suara
+ Notifikasi suara untuk pesan baru
+ Nada dering untuk panggilan masuk
Lanjutan
Jangan kirim laporan kerusakan
Konfirmasi Pesan
UI
+ OpenKeychain menghasilkan kesalahan.
+ Kunci untuk enkripsi cacat
Terima
Sebuah kesalahan terjadi
+ Kesalahan
Akun anda
Kirim pembaruan kehadiran
Terima pembaruan kehadiran
@@ -90,6 +124,7 @@
Ambil gambar
Ijinkan permintaan berlangganan
Berkas yang anda pilih bukan gambar
+ Tidak bisa mengkonversi file gambar
Berkas tidak ditemukan
Kesalahan Umum I/O. Mungkin Anda kehabisan ruang penyimpanan?
Tidak diketahui
@@ -103,7 +138,12 @@
Registrasi gagal
Username telah digunakan
Registrasi berhasil
+ Server tidak mendukung registrasi
+ Token registrasi salah
+ Kegagalan negosiasi TLS
+ Pelanggaran kebijakan
Server tidak cocok
+ Tidak terenkripsi
OTR
OpenPGP
OMEMO
@@ -111,11 +151,19 @@
Sementara dimatikan
Publikasikan avatar
Publikasikan kunci OpenPGP
+ Hapus kunci publik OpenPGP
+ Kunci publik OpenPGP diumumkan
Aktifkan Akun
Apakah Anda yakin.?
+ Menghapus akun akan menghilangkan semua riwayat percakapan
Rekam suara
+ alamat XMPP
+ Blok alamat XMPP
username@example.com
Password
+ Alamat XMPP salah
+ Memori habis. Gambar terlalu besar
+ Anda ingin menambahkan %s ke daftar kontak?
Info Server
XEP-0313: MAM
XEP-0280: Message Carbons
@@ -130,13 +178,18 @@
tidak tersedia
Pemberitahuan kunci publik tidak ditemukan
terakhir terlihat sekarang
+ Muncul satu menit yang lalu
terlihat %d menit lalu
+ Muncul satu jam yang lalu
terlihat %d jam lalu
+ Muncul satu hari yang lalu
terlihat %d hari lalu
Perangkat lainnya
Selesai
Deskripsi
Cari
+ Masukkan kontak
+ Hapus kontak
Lihat detil kontak
Blokir kontak
Lepas blokir kontak
@@ -146,11 +199,18 @@
Gabung
Simpan sebagai bookmark
Hapus bookmark
+ Hapus grup chat
+ Hapus channel
+ Tidak dapat menghapus grup chat
+ Tidak dapat menghapus channel
+ Edit subyek grup chat
+ Topik
Tinggalkan
Kontak ditambahkan ke daftar anda
Tambah kembali
%s telah membaca hingga disini
Publikasi
+ Klik avatar untuk memilih gambar dari galeri
Mempublikasi...
Server tidak mengijinkan publikasi Anda
Tidak dapat menyimpan Avatar ke memori
@@ -164,9 +224,12 @@
Lewati
Nonaktifkan notifikasi
Aktifkan
+ Grup chat memerlukan kata kunci
Masukan password
Request sekarang
Abaikan
+ Keamanan
+ Ijinkan mengedit pesan
Harap berhati-hati dengan ini
Waktu sunyi
Waktu mulai
@@ -174,10 +237,13 @@
Aktifkan waktu sunyi
Pemberitahuan akan disunyukan ketika jam sunyi.
Lainnya
+ Anda terlarang dari grup chat ini
menggunakan akun %s
Anda tidak terhubung. Coba lagi nanti
Cek %s ukuran
Opsi pesan
+ Kutipan
+ Tempel sebagai kutipan
Salin URL asli
Kirim lagi
URL Berkas
@@ -305,4 +371,22 @@
Tema
Latar Hijau
Gunakan latar hijau untuk pesan masuk
+ Kecil
+ Sedang
+ Besar
+ Bagikan
+ Silahkan menunggu…
+ Ijinkan Conversations mengakses mikrofon
+ Cari pesan
+ Kopi alamat website
+ Kopi alamat XMPP
+ Pencarian langsung
+ Nama kontak
+ Panggilan
+ Nama
+ Pesan
+ Telepon
+ Pesan
+ Telepon masuk
+ Telepon keluar
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 00aa0dccb..e89be2864 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -29,7 +29,6 @@
adesso
1 min fa
%d min fa
- %d conversazioni non lette
invio…
Decifrazione messaggio. Attendere prego...
Messaggio cifrato con OpenPGP
@@ -951,4 +950,5 @@
Invita su Conversations
Impossibile analizzare l\'invito
Il server non supporta la generazione di inviti
+ Nessun account attivo supporta questa funzione
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index f4a6a59dd..2cd4cada3 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -29,7 +29,6 @@
ちょうど今
1 分前
%d 分前
- 未読%d件
送信中…
メッセージを復号化しています。しばらくお待ちください…
OpenPGP 暗号化メッセージ
diff --git a/src/main/res/values-night/colors.xml b/src/main/res/values-night/colors.xml
new file mode 100644
index 000000000..7275c9cbe
--- /dev/null
+++ b/src/main/res/values-night/colors.xml
@@ -0,0 +1,5 @@
+
+
+ #ff424242
+ #ff282828
+
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index 2f2b64cab..45c7f5ea1 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -28,7 +28,6 @@
zojuist
1 min. geleden
%d min. geleden
- %d ongelezen gesprekken
versturen…
Bericht aan het ontsleutelen. Even geduld…
OpenPGP-versleuteld bericht
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 9275587aa..951ffd5ff 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -29,7 +29,12 @@
przed chwilą
minutę temu
%d minut temu
- %d nieprzeczytanych konwersacji
+
+ - %d nieprzeczytana konwersacja
+ - %d nieprzeczytane konwersacje
+ - %d nieprzeczytanych konwersacji
+ - %d nieprzeczytanych konwersacji
+
wysyłanie...
Odszyfrowywanie wiadomości. To zajmie tylko chwilę...
Wiadomość zaszyfrowana OpenPGP
diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml
index 9c2e272ea..01cdeb64b 100644
--- a/src/main/res/values-pt-rBR/strings.xml
+++ b/src/main/res/values-pt-rBR/strings.xml
@@ -29,7 +29,10 @@
agora
1 minuto atrás
%d minutos atrás
- %d conversas não lidas
+
+ - %d conversa não lida
+ - %d conversas não lidas
+
enviando...
Descriptografando a mensagem. Por favor, aguarde...
Mensagem criptografada via OpenPGP
diff --git a/src/main/res/values-ro-rRO/strings.xml b/src/main/res/values-ro-rRO/strings.xml
index 322e9ecd6..21880baf3 100644
--- a/src/main/res/values-ro-rRO/strings.xml
+++ b/src/main/res/values-ro-rRO/strings.xml
@@ -29,7 +29,11 @@
acum
acum un minut
acum %d minute
- %d conversații necitite
+
+ - %d conversație necitită
+ - %d conversații necitite
+ - %d de conversații necitite
+
trimitere...
Decriptez mesaj. Te rog așteaptă...
Mesaj criptat cu OpenPGP
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 19f9eb716..1ac1ebe8f 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -29,7 +29,6 @@
только что
1 минуту назад
%d мин. назад
- %d непрочитанных бесед
отправка…
Расшифровка сообщения. Подождите…
OpenPGP зашифр. сообщение
diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml
index 0c5ef2675..74948c5af 100644
--- a/src/main/res/values-sr/strings.xml
+++ b/src/main/res/values-sr/strings.xml
@@ -3,8 +3,11 @@
Поставке
Нова преписка
Управљај налозима
+ Управљај налогом
+ Затвори преписку
Детаљи контакта
Детаљи групног ћаскања
+ Детаљи канала
Додај налог
Уреди име
Додај у именик
@@ -13,6 +16,8 @@
Одблокирај контакт
Блокирај домен
Одблокирај домен
+ Блокирај учесника
+ Одблокирај учесника
Управљање налозима
Поставке
Подели у преписци
@@ -24,6 +29,11 @@
управо сад
пре минут
пре %d минута
+
+ - %d непрочитана порука
+ - %d непрочитане поруке
+ - %d непрочитаних порука
+
шаљем…
Дешифрујем поруку, сачекајте…
ОпенПГП шифрована порука
@@ -34,17 +44,20 @@
Модератор
Учесник
Посетилац
+ Да ли желите да уклоните %s са вашег списка контаката? Преписке са овим контактом неће бити уклоњене.
Желите ли да блокирате поруке од %s?
Желите ли да одблокирате %s и допустите им да вам шаљу поруке?
Блокирати све контакте од %s?
Одблокирати све контакте од %s?
Контакт блокиран
Блокиран
+ Да ли желите да уклоните %s са обележивача? Преписке са овим контактом неће бити уклоњене.
Региструј нови налог на серверу
Промени лозинку на серверу
Подели помоћу…
Почни преписку
Позови контакт
+ Позови
Контакти
Контакт
Одустани
@@ -57,14 +70,25 @@
Сачувај
У реду
Конверзација се срушила
+ Слањем контратрага путем свог ИксМПП налога помажете развоју Конверзација.
Пошаљи одмах
Не питај више
+ Не могу да се повежем са налогом
+ Не могу да се повежем са више налога
+ Тапните овде да бисте управљали вашим налозима
Приложи фајл
+ Контакт није на вашем списку контаката. Желите ли да га додате?
Додај контакт
испорука није успела
+ Припремам слику за пренос
+ Припремам слике за пренос
Делим фајлове, сачекајте…
Очисти историјат
Брисање историјата преписки
+ Желите ли да обришете све поруке из ове преписке?\n\nУпозорење: Ово неће утицати на поруке складиштене на осталим уређајима или серверима.
+ Обриши датотеку
+ Желите ли да обришете ову датотеку?\n\nУпозорење: Ово неће утицати на копије ове датотеке складиштене на осталим уређајима или серверима.
+ Затвори ову преписку након тога
Изаберите уређај
Пошаљи нешифровану поруку
Пошаљи поруку
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index 0f371f3ef..c2947af07 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -28,7 +28,6 @@
just nu
1 min sedan
%d min sedan
- %d olästa konversationer
skickar…
Avkrypterar meddelande. Vänta…
OpenPGP-krypterat meddelande
diff --git a/src/main/res/values-tr-rTR/strings.xml b/src/main/res/values-tr-rTR/strings.xml
index 1868d2dc5..9bf017f74 100644
--- a/src/main/res/values-tr-rTR/strings.xml
+++ b/src/main/res/values-tr-rTR/strings.xml
@@ -29,7 +29,6 @@
şimdi
1 dakika önce
%d dakika önc
- %d okunmamış konuşma
gönderiyor…
İleti deşifre ediliyor. Lütfen bekleyin…
OpenPGP şifreli ileti
diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml
index 34361619d..1b613aac8 100644
--- a/src/main/res/values-uk/strings.xml
+++ b/src/main/res/values-uk/strings.xml
@@ -28,7 +28,6 @@
щойно
1 хвилину тому
%d хвилин тому
- %d непрочитаних розмов
відправляю…
Розшифровую повідомлення. Зачекайте, будь ласка…
Повідомлення зашифроване OpenPGP
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 8b9b114aa..eec076f2c 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -29,7 +29,9 @@
刚刚
1分钟前
%d分钟前
- %d条未读消息
+
+ - %d 未读会话
+
发送中…
正在解密信息。请稍候……
OpenPGP加密的信息
@@ -941,4 +943,5 @@
邀请到 Conversations
无法解析邀请
服务器不支持生成邀请
+ 没有活跃帐户支持此功能
diff --git a/src/main/res/values/about.xml b/src/main/res/values/about.xml
index bf3c227b9..5953d543d 100644
--- a/src/main/res/values/about.xml
+++ b/src/main/res/values/about.xml
@@ -31,7 +31,7 @@
Conversations • the very last word in instant messaging.
- \n\nCopyright © 2014-2020 Daniel Gultsch
+ \n\nCopyright © 2014-2021 Daniel Gultsch
\n\nThis program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
@@ -44,6 +44,7 @@
along with this program. If not, see https://www.gnu.org/licenses
\n\nDownload the full source code at https://github.com/iNPUTmice/Conversations
\n\n\nLibraries
+ \n\nhttps://webrtc.org\nCopyright (c) 2011, The WebRTC project authors. All rights reserved. (https://webrtc.org/support/license)
\n\nhttps://github.com/ypresto/android-transcoder\n(Apache License, Version 2.0)
\n\nhttps://www.bouncycastle.org\n(The MIT License (MIT))
\n\nhttps://www.gnu.org/software/libidn\n(Apache License, Version 2.0)
diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml
index 37a8fe124..21fb04feb 100644
--- a/src/main/res/values/colors.xml
+++ b/src/main/res/values/colors.xml
@@ -40,5 +40,8 @@
#c04CAF50
+ #fffafafa
+ #ffe0e0e0
+
#ff2196f3
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 226d4dcc4..78c130ac4 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -29,7 +29,11 @@
just now
1 min ago
%d mins ago
- %d unread conversations
+
+ - %d unread conversation
+ - %d unread conversations
+
+
sending…
Decrypting message. Please wait…
OpenPGP encrypted message
diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml
index 881a21037..50cda5b34 100644
--- a/src/main/res/values/themes.xml
+++ b/src/main/res/values/themes.xml
@@ -363,8 +363,8 @@
- @color/black
-
diff --git a/src/playstore/java/eu/siacs/conversations/services/MaintenanceReceiver.java b/src/playstore/java/eu/siacs/conversations/services/MaintenanceReceiver.java
index 6eb5172c2..24212cf34 100644
--- a/src/playstore/java/eu/siacs/conversations/services/MaintenanceReceiver.java
+++ b/src/playstore/java/eu/siacs/conversations/services/MaintenanceReceiver.java
@@ -3,7 +3,6 @@ package eu.siacs.conversations.services;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.support.v4.content.ContextCompat;
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java
index ae883f524..db1ad6586 100644
--- a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java
+++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java
@@ -4,8 +4,7 @@ import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
-import com.google.firebase.iid.FirebaseInstanceId;
-import com.google.firebase.iid.InstanceIdResult;
+import com.google.firebase.messaging.FirebaseMessaging;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
@@ -55,7 +54,7 @@ public class PushManagementService {
e.printStackTrace();
}
} else {
- Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": failed to enable push. invalid response from app server "+response);
+ Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": failed to enable push. invalid response from app server " + response);
}
});
});
@@ -73,18 +72,18 @@ public class PushManagementService {
}
private void retrieveFcmInstanceToken(final OnGcmInstanceTokenRetrieved instanceTokenRetrieved) {
- final FirebaseInstanceId firebaseInstanceId;
+ final FirebaseMessaging firebaseMessaging;
try {
- firebaseInstanceId = FirebaseInstanceId.getInstance();
+ firebaseMessaging = FirebaseMessaging.getInstance();
} catch (IllegalStateException e) {
- Log.d(Config.LOGTAG, "unable to get firebase instance token ",e);
+ Log.d(Config.LOGTAG, "unable to get firebase instance token ", e);
return;
}
- firebaseInstanceId.getInstanceId().addOnCompleteListener(task -> {
+ firebaseMessaging.getToken().addOnCompleteListener(task -> {
if (!task.isSuccessful()) {
Log.d(Config.LOGTAG, "unable to get Firebase instance token", task.getException());
}
- final InstanceIdResult result;
+ final String result;
try {
result = task.getResult();
} catch (Exception e) {
@@ -92,7 +91,7 @@ public class PushManagementService {
return;
}
if (result != null) {
- instanceTokenRetrieved.onGcmInstanceTokenRetrieved(result.getToken());
+ instanceTokenRetrieved.onGcmInstanceTokenRetrieved(result);
}
});
diff --git a/src/playstore/java/eu/siacs/conversations/services/PushMessageReceiver.java b/src/playstore/java/eu/siacs/conversations/services/PushMessageReceiver.java
index eb6bdf905..f060747a5 100644
--- a/src/playstore/java/eu/siacs/conversations/services/PushMessageReceiver.java
+++ b/src/playstore/java/eu/siacs/conversations/services/PushMessageReceiver.java
@@ -1,7 +1,6 @@
package eu.siacs.conversations.services;
import android.content.Intent;
-import android.support.v4.content.ContextCompat;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
diff --git a/src/playstoreCompat/java/eu/siacs/conversations/ui/service/EmojiService.java b/src/playstoreCompat/java/eu/siacs/conversations/ui/service/EmojiService.java
index 106d08204..5ed8c100a 100644
--- a/src/playstoreCompat/java/eu/siacs/conversations/ui/service/EmojiService.java
+++ b/src/playstoreCompat/java/eu/siacs/conversations/ui/service/EmojiService.java
@@ -2,11 +2,12 @@ package eu.siacs.conversations.ui.service;
import android.content.Context;
import android.os.Build;
-import android.support.text.emoji.EmojiCompat;
-import android.support.text.emoji.FontRequestEmojiCompatConfig;
-import android.support.v4.provider.FontRequest;
import android.util.Log;
+import androidx.core.provider.FontRequest;
+import androidx.emoji.text.EmojiCompat;
+import androidx.emoji.text.FontRequestEmojiCompatConfig;
+
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
diff --git a/src/quicksy/AndroidManifest.xml b/src/quicksy/AndroidManifest.xml
index ed68582b3..1c30d2f28 100644
--- a/src/quicksy/AndroidManifest.xml
+++ b/src/quicksy/AndroidManifest.xml
@@ -32,5 +32,14 @@
android:label="@string/enter_your_name"
android:launchMode="singleTask" />
+
+
+
+
+
+
diff --git a/src/quicksy/java/eu/siacs/conversations/android/PhoneNumberContact.java b/src/quicksy/java/eu/siacs/conversations/android/PhoneNumberContact.java
index 4515ec299..6afb5a0d7 100644
--- a/src/quicksy/java/eu/siacs/conversations/android/PhoneNumberContact.java
+++ b/src/quicksy/java/eu/siacs/conversations/android/PhoneNumberContact.java
@@ -9,6 +9,8 @@ import android.os.Build;
import android.provider.ContactsContract;
import android.util.Log;
+import com.google.common.collect.ImmutableMap;
+
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -20,7 +22,7 @@ import io.michaelrocks.libphonenumber.android.NumberParseException;
public class PhoneNumberContact extends AbstractPhoneContact {
- private String phoneNumber;
+ private final String phoneNumber;
public String getPhoneNumber() {
return phoneNumber;
@@ -29,15 +31,15 @@ public class PhoneNumberContact extends AbstractPhoneContact {
private PhoneNumberContact(Context context, Cursor cursor) throws IllegalArgumentException {
super(cursor);
try {
- this.phoneNumber = PhoneNumberUtilWrapper.normalize(context,cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
+ this.phoneNumber = PhoneNumberUtilWrapper.normalize(context, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
} catch (NumberParseException | NullPointerException e) {
throw new IllegalArgumentException(e);
}
}
- public static Map load(Context context) {
+ public static ImmutableMap load(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
- return Collections.emptyMap();
+ return ImmutableMap.of();
}
final String[] PROJECTION = new String[]{ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME,
@@ -47,8 +49,8 @@ public class PhoneNumberContact extends AbstractPhoneContact {
final Cursor cursor;
try {
cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null);
- } catch (Exception e) {
- return Collections.emptyMap();
+ } catch (final Exception e) {
+ return ImmutableMap.of();
}
final HashMap contacts = new HashMap<>();
while (cursor != null && cursor.moveToNext()) {
@@ -58,18 +60,18 @@ public class PhoneNumberContact extends AbstractPhoneContact {
if (preexisting == null || preexisting.rating() < contact.rating()) {
contacts.put(contact.getPhoneNumber(), contact);
}
- } catch (IllegalArgumentException e) {
- Log.d(Config.LOGTAG, "unable to create phone contact");
+ } catch (final IllegalArgumentException e) {
+ Log.d(Config.LOGTAG, e.getMessage());
}
}
if (cursor != null) {
cursor.close();
}
- return contacts;
+ return ImmutableMap.copyOf(contacts);
}
public static PhoneNumberContact findByUri(Collection haystack, Uri needle) {
- for(PhoneNumberContact contact : haystack) {
+ for (PhoneNumberContact contact : haystack) {
if (needle.equals(contact.getLookupUri())) {
return contact;
}
diff --git a/src/quicksy/java/eu/siacs/conversations/services/QuickConversationsService.java b/src/quicksy/java/eu/siacs/conversations/services/QuickConversationsService.java
index f8e73b447..05b076424 100644
--- a/src/quicksy/java/eu/siacs/conversations/services/QuickConversationsService.java
+++ b/src/quicksy/java/eu/siacs/conversations/services/QuickConversationsService.java
@@ -1,12 +1,16 @@
package eu.siacs.conversations.services;
+import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
+import android.os.Bundle;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.util.Log;
+import com.google.common.collect.ImmutableMap;
+
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
@@ -22,6 +26,7 @@ import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -47,6 +52,7 @@ import eu.siacs.conversations.utils.AccountUtils;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
import eu.siacs.conversations.utils.SerialSingleThreadExecutor;
+import eu.siacs.conversations.utils.SmsRetrieverWrapper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
import eu.siacs.conversations.xmpp.Jid;
@@ -122,6 +128,7 @@ public class QuickConversationsService extends AbstractQuickConversationsService
public void requestVerification(Phonenumber.PhoneNumber phoneNumber) {
final String e164 = PhoneNumberUtilWrapper.normalize(service, phoneNumber);
if (mVerificationRequestInProgress.compareAndSet(false, true)) {
+ SmsRetrieverWrapper.start(service);
new Thread(() -> {
try {
final URL url = new URL(BASE_URL + "/authentication/" + e164);
@@ -322,10 +329,36 @@ public class QuickConversationsService extends AbstractQuickConversationsService
});
}
+ @Override
+ public void handleSmsReceived(final Intent intent) {
+ final Bundle extras = intent.getExtras();
+ final String pin = SmsRetrieverWrapper.extractPin(extras);
+ if (pin == null) {
+ Log.d(Config.LOGTAG, "unable to extract Pin from received SMS");
+ return;
+ }
+ final Account account = AccountUtils.getFirst(service);
+ if (account == null) {
+ Log.d(Config.LOGTAG, "no account configured to process PIN received by SMS");
+ return;
+ }
+ verify(account, pin);
+ synchronized (mOnVerification) {
+ for (OnVerification onVerification : mOnVerification) {
+ onVerification.startBackgroundVerification(pin);
+ }
+ }
+
+ }
+
private void considerSync(boolean forced) {
- Map contacts = PhoneNumberContact.load(service);
- for (Account account : service.getAccounts()) {
+ final ImmutableMap allContacts = PhoneNumberContact.load(service);
+ for (final Account account : service.getAccounts()) {
+ final Map contacts = filtered(allContacts, account.getJid().getLocal());
+ if (contacts.size() < allContacts.size()) {
+ Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": found own phone number in address book. ignoring...");
+ }
refresh(account, contacts.values());
if (!considerSync(account, contacts, forced)) {
service.syncRoster(account);
@@ -333,6 +366,15 @@ public class QuickConversationsService extends AbstractQuickConversationsService
}
}
+ @SafeVarargs
+ private static Map filtered(final Map input, final A... filters) {
+ final HashMap result = new HashMap<>(input);
+ for (final A filtered : filters) {
+ result.remove(filtered);
+ }
+ return result;
+ }
+
private void refresh(Account account, Collection contacts) {
for (Contact contact : account.getRoster().getWithSystemAccounts(PhoneNumberContact.class)) {
final Uri uri = contact.getSystemAccount();
@@ -353,7 +395,7 @@ public class QuickConversationsService extends AbstractQuickConversationsService
}
}
- private boolean considerSync(Account account, final Map contacts, final boolean forced) {
+ private boolean considerSync(final Account account, final Map contacts, final boolean forced) {
final int hash = contacts.keySet().hashCode();
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": consider sync of " + hash);
if (!mLastSyncAttempt.retry(hash) && !forced) {
@@ -363,14 +405,14 @@ public class QuickConversationsService extends AbstractQuickConversationsService
mRunningSyncJobs.incrementAndGet();
final Jid syncServer = Jid.of(API_DOMAIN);
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": sending phone list to " + syncServer);
- List entries = new ArrayList<>();
- for (PhoneNumberContact c : contacts.values()) {
+ final List entries = new ArrayList<>();
+ for (final PhoneNumberContact c : contacts.values()) {
entries.add(new Element("entry").setAttribute("number", c.getPhoneNumber()));
}
- IqPacket query = new IqPacket(IqPacket.TYPE.GET);
+ final IqPacket query = new IqPacket(IqPacket.TYPE.GET);
query.setTo(syncServer);
- Element book = new Element("phone-book", Namespace.SYNCHRONIZATION).setChildren(entries);
- String statusQuo = Entry.statusQuo(contacts.values(), account.getRoster().getWithSystemAccounts(PhoneNumberContact.class));
+ final Element book = new Element("phone-book", Namespace.SYNCHRONIZATION).setChildren(entries);
+ final String statusQuo = Entry.statusQuo(contacts.values(), account.getRoster().getWithSystemAccounts(PhoneNumberContact.class));
book.setAttribute("ver", statusQuo);
query.addChild(book);
mLastSyncAttempt = Attempt.create(hash);
@@ -378,14 +420,14 @@ public class QuickConversationsService extends AbstractQuickConversationsService
if (response.getType() == IqPacket.TYPE.RESULT) {
final Element phoneBook = response.findChild("phone-book", Namespace.SYNCHRONIZATION);
if (phoneBook != null) {
- List withSystemAccounts = account.getRoster().getWithSystemAccounts(PhoneNumberContact.class);
+ final List withSystemAccounts = account.getRoster().getWithSystemAccounts(PhoneNumberContact.class);
for (Entry entry : Entry.ofPhoneBook(phoneBook)) {
- PhoneNumberContact phoneContact = contacts.get(entry.getNumber());
+ final PhoneNumberContact phoneContact = contacts.get(entry.getNumber());
if (phoneContact == null) {
continue;
}
- for (Jid jid : entry.getJids()) {
- Contact contact = account.getRoster().getContact(jid);
+ for (final Jid jid : entry.getJids()) {
+ final Contact contact = account.getRoster().getContact(jid);
final boolean needsCacheClean = contact.setPhoneContact(phoneContact);
if (needsCacheClean) {
service.getAvatarService().clear(contact);
@@ -393,7 +435,7 @@ public class QuickConversationsService extends AbstractQuickConversationsService
withSystemAccounts.remove(contact);
}
}
- for (Contact contact : withSystemAccounts) {
+ for (final Contact contact : withSystemAccounts) {
final boolean needsCacheClean = contact.unsetPhoneContact(PhoneNumberContact.class);
if (needsCacheClean) {
service.getAvatarService().clear(contact);
@@ -429,11 +471,13 @@ public class QuickConversationsService extends AbstractQuickConversationsService
void onVerificationSucceeded();
void onVerificationRetryAt(long timestamp);
+
+ void startBackgroundVerification(String pin);
}
private static class Attempt {
private final long timestamp;
- private int hash;
+ private final int hash;
private static final Attempt NULL = new Attempt(0, 0);
diff --git a/src/quicksy/java/eu/siacs/conversations/services/SMSReceiver.java b/src/quicksy/java/eu/siacs/conversations/services/SMSReceiver.java
new file mode 100644
index 000000000..f68d51e8c
--- /dev/null
+++ b/src/quicksy/java/eu/siacs/conversations/services/SMSReceiver.java
@@ -0,0 +1,22 @@
+package eu.siacs.conversations.services;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import com.google.common.base.Strings;
+
+import eu.siacs.conversations.Config;
+import eu.siacs.conversations.utils.Compatibility;
+
+public class SMSReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(final Context context, final Intent intent) {
+ intent.setClass(context, XmppConnectionService.class);
+ Compatibility.startService(context, intent);
+ }
+}
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/ChooseCountryActivity.java b/src/quicksy/java/eu/siacs/conversations/ui/ChooseCountryActivity.java
index c17776554..3e1d39db0 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/ChooseCountryActivity.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/ChooseCountryActivity.java
@@ -2,10 +2,10 @@ package eu.siacs.conversations.ui;
import android.content.Context;
import android.content.Intent;
-import android.databinding.DataBindingUtil;
+import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.Toolbar;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.appcompat.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/EnterNameActivity.java b/src/quicksy/java/eu/siacs/conversations/ui/EnterNameActivity.java
index 136cb8e31..a15419eba 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/EnterNameActivity.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/EnterNameActivity.java
@@ -1,9 +1,9 @@
package eu.siacs.conversations.ui;
import android.content.Intent;
-import android.databinding.DataBindingUtil;
+import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
-import android.support.v7.widget.Toolbar;
+import androidx.appcompat.widget.Toolbar;
import android.view.View;
import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/EnterPhoneNumberActivity.java b/src/quicksy/java/eu/siacs/conversations/ui/EnterPhoneNumberActivity.java
index 270be018c..e146ab3be 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/EnterPhoneNumberActivity.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/EnterPhoneNumberActivity.java
@@ -2,9 +2,9 @@ package eu.siacs.conversations.ui;
import android.app.AlertDialog;
import android.content.Intent;
-import android.databinding.DataBindingUtil;
+import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
-import android.support.v7.widget.Toolbar;
+import androidx.appcompat.widget.Toolbar;
import android.text.Editable;
import android.text.Html;
import android.text.TextUtils;
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/TosActivity.java b/src/quicksy/java/eu/siacs/conversations/ui/TosActivity.java
index d38bab7ce..eb2b77d9c 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/TosActivity.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/TosActivity.java
@@ -5,18 +5,14 @@ import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.preference.PreferenceManager;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.widget.Button;
import android.widget.TextView;
-import java.util.List;
+import androidx.appcompat.app.ActionBar;
import eu.siacs.conversations.R;
-import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.utils.XmppUri;
public class TosActivity extends XmppActivity {
@@ -41,6 +37,7 @@ public class TosActivity extends XmppActivity {
@Override
public void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
if (intent != null) {
setIntent(intent);
}
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/VerifyActivity.java b/src/quicksy/java/eu/siacs/conversations/ui/VerifyActivity.java
index 7dc59845e..1e388ce8f 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/VerifyActivity.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/VerifyActivity.java
@@ -6,12 +6,12 @@ import android.content.ClipDescription;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
-import android.databinding.DataBindingUtil;
+import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
-import android.support.design.widget.Snackbar;
-import android.support.v7.widget.Toolbar;
+import com.google.android.material.snackbar.Snackbar;
+import androidx.appcompat.widget.Toolbar;
import android.text.Html;
import android.view.View;
@@ -246,6 +246,8 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
public void onResume() {
super.onResume();
if (pinEntryWrapper.isEmpty()) {
+ //starting with Android P we need input focus
+ pinEntryWrapper.requestFocus();
pastePinFromClipboard();
}
}
@@ -314,6 +316,12 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
runOnUiThread(VERIFICATION_TIMEOUT_UPDATER);
}
+ @Override
+ public void startBackgroundVerification(String pin) {
+ pinEntryWrapper.setPin(pin);
+ setVerifyingState(true);
+ }
+
//send sms again button callback
@Override
public void onVerificationRequestFailed(int code) {
@@ -327,6 +335,7 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
@Override
public void onVerificationRequested() {
runOnUiThread(() -> {
+ pinEntryWrapper.clear();
setRequestingVerificationState(false);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.we_have_sent_you_another_sms);
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/adapter/CountryAdapter.java b/src/quicksy/java/eu/siacs/conversations/ui/adapter/CountryAdapter.java
index 266f9e631..adbd07f82 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/adapter/CountryAdapter.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/adapter/CountryAdapter.java
@@ -1,8 +1,8 @@
package eu.siacs.conversations.ui.adapter;
-import android.databinding.DataBindingUtil;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
+import androidx.databinding.DataBindingUtil;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/util/ApiDialogHelper.java b/src/quicksy/java/eu/siacs/conversations/ui/util/ApiDialogHelper.java
index 9bd7b2514..6deca9c5b 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/util/ApiDialogHelper.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/util/ApiDialogHelper.java
@@ -7,7 +7,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.SystemClock;
-import android.support.annotation.StringRes;
+import androidx.annotation.StringRes;
import eu.siacs.conversations.R;
import eu.siacs.conversations.services.QuickConversationsService;
diff --git a/src/quicksy/java/eu/siacs/conversations/ui/util/PinEntryWrapper.java b/src/quicksy/java/eu/siacs/conversations/ui/util/PinEntryWrapper.java
index 8e91f659d..b0eef9af6 100644
--- a/src/quicksy/java/eu/siacs/conversations/ui/util/PinEntryWrapper.java
+++ b/src/quicksy/java/eu/siacs/conversations/ui/util/PinEntryWrapper.java
@@ -14,7 +14,7 @@ import java.util.regex.Pattern;
public class PinEntryWrapper {
- private static Pattern PIN_STRING_PATTERN = Pattern.compile("^[0-9]{6}$");
+ private static final Pattern PIN_STRING_PATTERN = Pattern.compile("^[0-9]{6}$");
private final List digits = new ArrayList<>();
@@ -152,4 +152,8 @@ public class PinEntryWrapper {
digits.get(i).getText().clear();
}
}
+
+ public void requestFocus() {
+ digits.get(0).requestFocus();
+ }
}
\ No newline at end of file
diff --git a/src/quicksy/java/eu/siacs/conversations/utils/PhoneNumberUtilWrapper.java b/src/quicksy/java/eu/siacs/conversations/utils/PhoneNumberUtilWrapper.java
index 5f68c2a06..4bc18b886 100644
--- a/src/quicksy/java/eu/siacs/conversations/utils/PhoneNumberUtilWrapper.java
+++ b/src/quicksy/java/eu/siacs/conversations/utils/PhoneNumberUtilWrapper.java
@@ -37,7 +37,7 @@ public class PhoneNumberUtilWrapper {
public static String normalize(Context context, String input) throws IllegalArgumentException, NumberParseException {
final Phonenumber.PhoneNumber number = getInstance(context).parse(input, LocationProvider.getUserCountry(context));
if (!getInstance(context).isValidNumber(number)) {
- throw new IllegalArgumentException("Not a valid phone number");
+ throw new IllegalArgumentException(String.format("%s is not a valid phone number", input));
}
return normalize(context, number);
}
diff --git a/src/quicksy/res/layout/activity_choose_country.xml b/src/quicksy/res/layout/activity_choose_country.xml
index 640923c4f..47ba167b1 100644
--- a/src/quicksy/res/layout/activity_choose_country.xml
+++ b/src/quicksy/res/layout/activity_choose_country.xml
@@ -11,7 +11,7 @@
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
-
-
\ No newline at end of file
+
diff --git a/src/quicksy/res/layout/activity_enter_number.xml b/src/quicksy/res/layout/activity_enter_number.xml
index b76faba19..d54ead3bf 100644
--- a/src/quicksy/res/layout/activity_enter_number.xml
+++ b/src/quicksy/res/layout/activity_enter_number.xml
@@ -10,7 +10,7 @@
android:id="@+id/toolbar"
layout="@layout/toolbar" />
-
@@ -108,6 +108,6 @@
android:textColor="?colorAccent" />
-
+
diff --git a/src/quicksy/res/layout/activity_verify.xml b/src/quicksy/res/layout/activity_verify.xml
index b46aa0910..4ecc349c1 100644
--- a/src/quicksy/res/layout/activity_verify.xml
+++ b/src/quicksy/res/layout/activity_verify.xml
@@ -11,7 +11,7 @@
android:id="@+id/toolbar"
layout="@layout/toolbar" />
-
@@ -188,6 +188,6 @@
android:layout_centerHorizontal="true" />
-
+
-
\ No newline at end of file
+
diff --git a/src/quicksy/res/values-bg/strings.xml b/src/quicksy/res/values-bg/strings.xml
index 6e03fbf87..a923200e4 100644
--- a/src/quicksy/res/values-bg/strings.xml
+++ b/src/quicksy/res/values-bg/strings.xml
@@ -9,6 +9,8 @@
Изпращайки проследявания на стека, Вие помагате за непрекъснатото развитие на Quicksy
Quicksy се нуждае от достъп до външно място за съхранение
Quicksy се нуждае от достъп до камерата
+ Устройството Ви прилага сериозни оптимизации за използването на батерията върху Quicksy, които може да доведат до забавени известия и дори пропуснати съобщения.\nПрепоръчително е да ги изключите.
+ Устройството Ви прилага сериозни оптимизации за използването на батерията върху Quicksy, които може да доведат до забавени известия и дори пропуснати съобщения.\nСега ще бъдете помолен(а) да ги изключите.
Така всичките Ви контакти ще знаят кога използвате Quicksy
Операционната Ви система не позволява на Quicksy да се свързва с Интернет когато работи на заден фон. За да получавате известия за новите съобщения, трябва да дадете на Quicksy неограничен достъп когато съхранението на данни е включено.\nQuicksy ще продължи да се опитва да записва данните когато е възможно.
Устройството Ви не поддържа изключването на съхранението на данни за Quicksy.
@@ -18,4 +20,7 @@
Тази категория известия се използва за показване на постоянно известие, което показва, че Quicksy работи.
Профилна снимка за Quicksy
Quicksy не може да се използва във Вашата страна.
-
+ Идентичността на сървъра не може да бъде потвърдена.
+ Неизвестна грешка в сигурността.
+ Времето за изчакване на сървъра изтече.
+
diff --git a/src/quicksy/res/values-ca/strings.xml b/src/quicksy/res/values-ca/strings.xml
index 28975a804..ec2414dbf 100644
--- a/src/quicksy/res/values-ca/strings.xml
+++ b/src/quicksy/res/values-ca/strings.xml
@@ -9,6 +9,8 @@
En enviar les traces de les piles, vostè està ajudant al desenvolupament continu de Quicksy
Quicksy necessita accés a emmagatzematge extern
Quicksy necessita accés a la càmera
+ El teu dispositiu està emprant optimitzacions de bateria pesada per a Quicksy que poden portar a notificacions retardades o fins i tot a la pèrdua de missatges\nEs recomana desactivar-los.
+ El teu dispositiu està emprant optimitzacions de bateria pesada per a Quicksy, la qual cosa pot portar a notificacions retardades o fins i tot a la pèrdua de missatges.\n\nAra se\'t demanarà que els desactivis.
Avisi a tots els seus contactes quan utilitzi Quicksy
El seu sistema operatiu està restringint l\'accés a Internet a Quicksy quan està en segon pla. Per rebre notificacions de nous missatges, ha de permetre l\'accés sense restriccions de Quicksy quan el protector de dades està activat.\nQuicksy farà un esforç per guardar les dades quan sigui possible.
El seu dispositiu no és compatible amb la desactivació del protector de dades per Quicksy.
@@ -17,4 +19,8 @@
Quicksy necessita accés al micròfon
Aquest tipus de notificació s\'utilitza per mostrar una notificació permanent que indica que Quicksy s\'està executant.
Imatge de perfil en Quicksy
-
+ Quicksy no està disponible al teu país.
+ No es pot verificar la identitat del servidor.
+ Error de seguretat desconegut.
+ Temps d\'espera mentre es connecta al servidor.
+
diff --git a/src/quicksy/res/values-id/strings.xml b/src/quicksy/res/values-id/strings.xml
new file mode 100644
index 000000000..5d336777b
--- /dev/null
+++ b/src/quicksy/res/values-id/strings.xml
@@ -0,0 +1,26 @@
+
+
+ Quicksy mengalami kegagalan sistem
+ Dengan mengirimkan data log, Anda membantu pengembangan Quicksy \nPeringatan: Ini akan menggunakan akun XMPP Anda untuk mengirim data log ke pengembang.
+ Quicksy menggunakan aplikasi pihak ketiga bernama OpenKeychain untuk mengenkripsi dan mendekripsi pesan dan untuk mengelola kunci publik Anda.\n\nOpenKeychain dilisensikan di bawah GPLv3 dan tersedia di F-Droid dan Google Play.\n\n (Harap restart Quicksy instalasi.)
+ Quicksy tidak dapat mengenkripsi pesan Anda karena kontak Anda tidak mengumumkan kunci publiknya.\n\nMinta kontak Anda untuk setting OpenPGP.
+ Quicksy tidak dapat mengenkripsi pesan Anda karena kontak-kontak Anda tidak mengumumkan kunci publiknya.\n\nMinta mereka untuk setting OpenPGP.
+ Durasi Quicksy tetap diam setelah melihat aktivitas di perangkat lain
+ Dengan mengirimkan data log, Anda sedang membantu pengembangan Quicksy
+ Quicksy memerlukan akses ke penyimpanan data
+ Quicksy memerlukan akses ke kamera
+ Perangkat Anda mengaktifkan fitur pengoptimalan baterai maksimal untuk Quicksy yang dapat menyebabkan notifikasi tertunda atau bahkan kehilangan pesan. \nDisarankan untuk menonaktifkan fiturnya.
+ Perangkat Anda menggunakan pengoptimalan baterai maksimal untuk Quicksy yang dapat menyebabkan notifikasi tertunda atau bahkan kehilangan pesan. \n\nAnda akan diminta untuk menonaktifkannya.
+ Ijinkan kontak anda mengetahui kapan anda menggunakan Quicksy
+ OS Anda membatasi Quicksy untuk mengakses Internet saat berada di latar belakang. Untuk menerima pemberitahuan pesan baru, Anda harus mengizinkan akses tak terbatas Quicksy saat Penghemat data aktif.\nQuicksy berusaha untuk menghemat data jika memungkinkan.
+ Perangkat Anda tidak mendukung penonaktifan Penghemat data untuk Quicksy.
+ Untuk tetap menerima notifikasi, bahkan saat layar mati, Anda perlu menambahkan Quicksy ke daftar aplikasi yang dilindungi.
+ Quicksy tidak dapat mengirim pesan terenkripsi ke %1$s. Ini mungkin karena kontak Anda menggunakan server atau aplikasi usang yang tidak dapat menggunakan OMEMO.
+ Quicksy memerlukan akses ke mikrofon
+ Kategori notifikasi ini digunakan untuk menampilkan notifikasi permanen yang menunjukkan bahwa Quicksy sedang berjalan.
+ Gambar profil Quicksy
+ Quicksy tidak tersedia di negara anda.
+ Gagal memverifikasi identitas server
+ Error keamanan tidak dikenal.
+ Waktu habis saat menghubungi server.
+
diff --git a/src/quicksyFree/java/eu/siacs/conversations/utils/SmsRetrieverWrapper.java b/src/quicksyFree/java/eu/siacs/conversations/utils/SmsRetrieverWrapper.java
new file mode 100644
index 000000000..e3e6f5a43
--- /dev/null
+++ b/src/quicksyFree/java/eu/siacs/conversations/utils/SmsRetrieverWrapper.java
@@ -0,0 +1,16 @@
+package eu.siacs.conversations.utils;
+
+import android.os.Bundle;
+
+import eu.siacs.conversations.services.XmppConnectionService;
+
+public class SmsRetrieverWrapper {
+
+ public static void start(XmppConnectionService service) {
+ //nop
+ }
+
+ public static String extractPin(Bundle extras) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/quicksyPlaystore/java/eu/siacs/conversations/utils/SmsRetrieverWrapper.java b/src/quicksyPlaystore/java/eu/siacs/conversations/utils/SmsRetrieverWrapper.java
new file mode 100644
index 000000000..3aa38ab5f
--- /dev/null
+++ b/src/quicksyPlaystore/java/eu/siacs/conversations/utils/SmsRetrieverWrapper.java
@@ -0,0 +1,40 @@
+package eu.siacs.conversations.utils;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.google.android.gms.auth.api.phone.SmsRetriever;
+import com.google.android.gms.auth.api.phone.SmsRetrieverClient;
+import com.google.android.gms.common.api.CommonStatusCodes;
+import com.google.android.gms.common.api.Status;
+import com.google.android.gms.tasks.Task;
+import com.google.common.base.Strings;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import eu.siacs.conversations.Config;
+
+public class SmsRetrieverWrapper {
+
+ public static void start(final Context context) {
+ final SmsRetrieverClient client = SmsRetriever.getClient(context);
+ final Task task = client.startSmsRetriever();
+ task.addOnSuccessListener(aVoid -> Log.d(Config.LOGTAG, "successfully started SMS retriever"));
+ task.addOnFailureListener(e -> Log.d(Config.LOGTAG, "unable to start SMS retriever", e));
+ }
+
+ public static String extractPin(Bundle extras) {
+ final Status status = extras == null ? null : (Status) extras.get(SmsRetriever.EXTRA_STATUS);
+ if (status != null && status.getStatusCode() == CommonStatusCodes.SUCCESS) {
+ Log.d(Config.LOGTAG, "Verification SMS received with status success");
+ final String message = extras.getString(SmsRetriever.EXTRA_SMS_MESSAGE);
+ final Matcher m = Pattern.compile("(?