diff --git a/app/build.gradle b/app/build.gradle
index 0dc518ac3..b2876f5d5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -80,8 +80,8 @@ protobuf {
}
}
-def canonicalVersionCode = 704
-def canonicalVersionName = "4.71.1"
+def canonicalVersionCode = 705
+def canonicalVersionName = "4.71.2"
def postFixSize = 10
def abiPostFix = ['universal' : 0,
@@ -122,7 +122,7 @@ android {
buildConfigField "String", "CONTENT_PROXY_HOST", "\"contentproxy.signal.org\""
buildConfigField "int", "CONTENT_PROXY_PORT", "443"
buildConfigField "String", "SIGNAL_AGENT", "\"OWA\""
- buildConfigField "String", "CDS_MRENCLAVE", "\"a3bfdf9717e35ce4f6fd3888133d65a71a880cd6a26c41d1e47647ed3e7704fa\""
+ buildConfigField "String", "CDS_MRENCLAVE", "\"c98e00a4e3ff977a56afefe7362a27e4961e4f19e211febfbb19b897e6b80b15\""
buildConfigField "String", "KBS_ENCLAVE_NAME", "\"fe7c1bfae98f9b073d220366ea31163ee82f6d04bead774f71ca8e5c40847bfe\""
buildConfigField "String", "KBS_SERVICE_ID", "\"fe7c1bfae98f9b073d220366ea31163ee82f6d04bead774f71ca8e5c40847bfe\""
buildConfigField "String", "KBS_MRENCLAVE", "\"a3baab19ef6ce6f34ab9ebb25ba722725ae44a8872dc0ff08ad6d83a9489de87\""
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a93978503..298775a11 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -523,6 +523,11 @@
+
+
diff --git a/app/src/main/java/org/signal/glide/apng/decode/APNGParser.java b/app/src/main/java/org/signal/glide/apng/decode/APNGParser.java
index 79dff419d..04d52757a 100644
--- a/app/src/main/java/org/signal/glide/apng/decode/APNGParser.java
+++ b/app/src/main/java/org/signal/glide/apng/decode/APNGParser.java
@@ -96,9 +96,7 @@ public class APNGParser {
}
}
} catch (IOException e) {
- if (!(e instanceof FormatException)) {
- e.printStackTrace();
- }
+ return false;
}
return false;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
index b6b7ffa05..b1a13a1eb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
@@ -48,6 +48,7 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob;
import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
import org.thoughtcrime.securesms.jobs.RefreshPreKeysJob;
import org.thoughtcrime.securesms.jobs.RetrieveProfileJob;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.logging.AndroidLogger;
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger;
import org.thoughtcrime.securesms.logging.Log;
@@ -70,6 +71,7 @@ import org.thoughtcrime.securesms.service.UpdateApkRefreshListener;
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
+import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper;
import org.webrtc.voiceengine.WebRtcAudioManager;
@@ -157,6 +159,7 @@ public class ApplicationContext extends MultiDexApplication implements DefaultLi
KeyCachingService.onAppForegrounded(this);
ApplicationDependencies.getFrameRateTracker().begin();
ApplicationDependencies.getMegaphoneRepository().onAppForegrounded();
+ checkBuildExpiration();
}
@Override
@@ -192,6 +195,13 @@ public class ApplicationContext extends MultiDexApplication implements DefaultLi
return persistentLogger;
}
+ public void checkBuildExpiration() {
+ if (Util.getTimeUntilBuildExpiry() <= 0 && !SignalStore.misc().isClientDeprecated()) {
+ Log.w(TAG, "Build expired!");
+ SignalStore.misc().markClientDeprecated();
+ }
+ }
+
private void initializeSecurityProvider() {
try {
Class.forName("org.signal.aesgcmprovider.AesGcmCipher");
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java
index b418155ed..b5089cf4b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java
@@ -2,16 +2,25 @@ package org.thoughtcrime.securesms.components.reminder;
import android.content.Context;
-import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.util.PlayStoreUtil;
-import org.thoughtcrime.securesms.util.Util;
+import androidx.annotation.NonNull;
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
+import org.thoughtcrime.securesms.util.PlayStoreUtil;
+
+import java.util.List;
+
+/**
+ * Showed when a build has fully expired (either via the compile-time constant, or remote
+ * deprecation).
+ */
public class ExpiredBuildReminder extends Reminder {
public ExpiredBuildReminder(final Context context) {
- super(context.getString(R.string.reminder_header_expired_build),
- context.getString(R.string.reminder_header_expired_build_details));
+ super(null, context.getString(R.string.ExpiredBuildReminder_this_version_of_signal_has_expired));
+
setOkListener(v -> PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(context));
+ addAction(new Action(context.getString(R.string.ExpiredBuildReminder_update_now), R.id.reminder_action_update_now));
}
@Override
@@ -19,8 +28,17 @@ public class ExpiredBuildReminder extends Reminder {
return false;
}
- public static boolean isEligible() {
- return Util.getDaysTillBuildExpiry() <= 0;
+ @Override
+ public List getActions() {
+ return super.getActions();
}
+ @Override
+ public @NonNull Importance getImportance() {
+ return Importance.TERMINAL;
+ }
+
+ public static boolean isEligible() {
+ return SignalStore.misc().isClientDeprecated();
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java
index 28477d003..93d4853d4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java
@@ -6,20 +6,24 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.PlayStoreUtil;
import org.thoughtcrime.securesms.util.Util;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Reminder that is shown when a build is getting close to expiry (either because of the
+ * compile-time constant, or remote deprecation).
+ */
public class OutdatedBuildReminder extends Reminder {
public OutdatedBuildReminder(final Context context) {
- super(context.getString(R.string.reminder_header_outdated_build),
- getPluralsText(context));
+ super(null, getPluralsText(context));
+
setOkListener(v -> PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(context));
+ addAction(new Action(context.getString(R.string.OutdatedBuildReminder_update_now), R.id.reminder_action_update_now));
}
private static CharSequence getPluralsText(final Context context) {
- int days = Util.getDaysTillBuildExpiry() - 1;
- if (days == 0) {
- return context.getString(R.string.reminder_header_outdated_build_details_today);
- }
- return context.getResources().getQuantityString(R.plurals.reminder_header_outdated_build_details, days, days);
+ int days = getDaysUntilExpiry() - 1;
+ return context.getResources().getQuantityString(R.plurals.OutdatedBuildReminder_your_version_of_signal_will_expire_in_n_days, days, days);
}
@Override
@@ -28,7 +32,10 @@ public class OutdatedBuildReminder extends Reminder {
}
public static boolean isEligible() {
- return Util.getDaysTillBuildExpiry() <= 10;
+ return getDaysUntilExpiry() <= 10;
}
+ private static int getDaysUntilExpiry() {
+ return (int) TimeUnit.MILLISECONDS.toDays(Util.getTimeUntilBuildExpiry());
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java
index 109d9f449..df3c946fc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java
@@ -58,7 +58,7 @@ public abstract class Reminder {
return Importance.NORMAL;
}
- public void addAction(@NonNull Action action) {
+ protected void addAction(@NonNull Action action) {
actions.add(action);
}
@@ -71,7 +71,7 @@ public abstract class Reminder {
}
public enum Importance {
- NORMAL, ERROR
+ NORMAL, ERROR, TERMINAL
}
public final class Action {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java
index 2ea65728d..a87d49985 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java
@@ -1,8 +1,6 @@
package org.thoughtcrime.securesms.components.reminder;
-import android.annotation.TargetApi;
import android.content.Context;
-import android.os.Build.VERSION_CODES;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -19,7 +17,6 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.List;
@@ -48,7 +45,6 @@ public final class ReminderView extends FrameLayout {
initialize();
}
- @TargetApi(VERSION_CODES.HONEYCOMB)
public ReminderView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize();
@@ -56,14 +52,14 @@ public final class ReminderView extends FrameLayout {
private void initialize() {
LayoutInflater.from(getContext()).inflate(R.layout.reminder_header, this, true);
- progressBar = ViewUtil.findById(this, R.id.reminder_progress);
- progressText = ViewUtil.findById(this, R.id.reminder_progress_text);
- container = ViewUtil.findById(this, R.id.container);
- closeButton = ViewUtil.findById(this, R.id.cancel);
- title = ViewUtil.findById(this, R.id.reminder_title);
- text = ViewUtil.findById(this, R.id.reminder_text);
- space = ViewUtil.findById(this, R.id.reminder_space);
- actionsRecycler = ViewUtil.findById(this, R.id.reminder_actions);
+ progressBar = findViewById(R.id.reminder_progress);
+ progressText = findViewById(R.id.reminder_progress_text);
+ container = findViewById(R.id.container);
+ closeButton = findViewById(R.id.cancel);
+ title = findViewById(R.id.reminder_title);
+ text = findViewById(R.id.reminder_text);
+ space = findViewById(R.id.reminder_space);
+ actionsRecycler = findViewById(R.id.reminder_actions);
}
public void showReminder(final Reminder reminder) {
@@ -76,9 +72,26 @@ public final class ReminderView extends FrameLayout {
title.setVisibility(GONE);
space.setVisibility(VISIBLE);
}
+
+ if (!reminder.isDismissable()) {
+ space.setVisibility(GONE);
+ }
+
text.setText(reminder.getText());
- container.setBackgroundResource(reminder.getImportance() == Reminder.Importance.ERROR ? R.drawable.reminder_background_error
- : R.drawable.reminder_background_normal);
+
+ switch (reminder.getImportance()) {
+ case NORMAL:
+ container.setBackgroundResource(R.drawable.reminder_background_normal);
+ break;
+ case ERROR:
+ container.setBackgroundResource(R.drawable.reminder_background_error);
+ break;
+ case TERMINAL:
+ container.setBackgroundResource(R.drawable.reminder_background_terminal);
+ break;
+ default:
+ throw new IllegalStateException();
+ }
setOnClickListener(reminder.getOkListener());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PictureInPictureGestureHelper.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PictureInPictureGestureHelper.java
index 2c64a7a54..45bbec70a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PictureInPictureGestureHelper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PictureInPictureGestureHelper.java
@@ -98,12 +98,12 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu
}
public void clearVerticalBoundaries() {
- setVerticalBoundaries(0, parent.getMeasuredHeight());
+ setVerticalBoundaries(parent.getTop(), parent.getMeasuredHeight() + parent.getTop());
}
public void setVerticalBoundaries(int topBoundary, int bottomBoundary) {
- extraPaddingTop = topBoundary;
- extraPaddingBottom = parent.getMeasuredHeight() - bottomBoundary;
+ extraPaddingTop = topBoundary - parent.getTop();
+ extraPaddingBottom = parent.getMeasuredHeight() + parent.getTop() - bottomBoundary;
if (isAnimating) {
fling();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java
index e03e970d9..8cd3ab718 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java
@@ -216,6 +216,8 @@ public class DirectoryHelper {
return;
}
+ Stopwatch stopwatch = new Stopwatch("refresh");
+
DirectoryResult result;
if (FeatureFlags.cds()) {
@@ -224,6 +226,8 @@ public class DirectoryHelper {
result = ContactDiscoveryV1.getDirectoryResult(databaseNumbers, systemNumbers);
}
+ stopwatch.split("network");
+
if (result.getNumberRewrites().size() > 0) {
Log.i(TAG, "[getDirectoryResult] Need to rewrite some numbers.");
recipientDatabase.updatePhoneNumbers(result.getNumberRewrites());
@@ -238,10 +242,16 @@ public class DirectoryHelper {
.map(recipientDatabase::getOrInsertFromE164)
.collect(Collectors.toSet());
+ stopwatch.split("process-cds");
+
recipientDatabase.bulkUpdatedRegisteredStatus(uuidMap, inactiveIds);
+ stopwatch.split("update-registered");
+
updateContactsDatabase(context, activeIds, true, result.getNumberRewrites());
+ stopwatch.split("contacts-db");
+
if (TextSecurePreferences.isMultiDevice(context)) {
ApplicationDependencies.getJobManager().add(new MultiDeviceContactUpdateJob());
}
@@ -258,6 +268,8 @@ public class DirectoryHelper {
} else {
TextSecurePreferences.setHasSuccessfullyRetrievedDirectory(context, true);
}
+
+ stopwatch.stop(TAG);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java
index b33b619ed..f59a7aa03 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java
@@ -240,6 +240,7 @@ import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.IdentityUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.MessageUtil;
+import org.thoughtcrime.securesms.util.PlayStoreUtil;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.TextSecurePreferences.MediaKeyboardMode;
@@ -1685,6 +1686,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
reminderView.get().showReminder(new UnauthorizedReminder(this));
} else if (ExpiredBuildReminder.isEligible()) {
reminderView.get().showReminder(new ExpiredBuildReminder(this));
+ reminderView.get().setOnActionClickListener(this::handleReminderAction);
} else if (ServiceOutageReminder.isEligible(this)) {
ApplicationDependencies.getJobManager().add(new ServiceOutageDetectionJob());
reminderView.get().showReminder(new ServiceOutageReminder(this));
@@ -1710,6 +1712,9 @@ public class ConversationActivity extends PassphraseRequiredActivity
case R.id.reminder_action_view_insights:
InsightsLauncher.showInsightsDashboard(getSupportFragmentManager());
break;
+ case R.id.reminder_action_update_now:
+ PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(this);
+ break;
default:
throw new IllegalArgumentException("Unknown ID: " + reminderActionId);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java
index e8021604f..b200b3055 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java
@@ -56,6 +56,7 @@ import androidx.appcompat.widget.TooltipCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.view.ViewCompat;
import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.lifecycle.ViewModelProviders;
@@ -117,6 +118,7 @@ import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.util.AvatarUtil;
+import org.thoughtcrime.securesms.util.PlayStoreUtil;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.SnapToTopDataObserver;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
@@ -176,6 +178,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
private ViewGroup megaphoneContainer;
private SnapToTopDataObserver snapToTopDataObserver;
private Drawable archiveDrawable;
+ private LifecycleObserver visibilityLifecycleObserver;
public static ConversationListFragment newInstance() {
return new ConversationListFragment();
@@ -214,6 +217,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
cameraFab.show();
reminderView.setOnDismissListener(this::updateReminders);
+ reminderView.setOnActionClickListener(this::onReminderAction);
list.setLayoutManager(new LinearLayoutManager(requireActivity()));
list.setItemAnimator(new DeleteItemAnimator());
@@ -272,6 +276,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
public void onStart() {
super.onStart();
ConversationFragment.prepare(requireContext());
+ ProcessLifecycleOwner.get().getLifecycle().addObserver(visibilityLifecycleObserver);
}
@Override
@@ -283,6 +288,12 @@ public class ConversationListFragment extends MainFragment implements ActionMode
EventBus.getDefault().unregister(this);
}
+ @Override
+ public void onStop() {
+ super.onStop();
+ ProcessLifecycleOwner.get().getLifecycle().removeObserver(visibilityLifecycleObserver);
+ }
+
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
@@ -412,6 +423,12 @@ public class ConversationListFragment extends MainFragment implements ActionMode
viewModel.onMegaphoneCompleted(event);
}
+ private void onReminderAction(@IdRes int reminderActionId) {
+ if (reminderActionId == R.id.reminder_action_update_now) {
+ PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(requireContext());
+ }
+ }
+
private void hideKeyboard() {
InputMethodManager imm = ServiceUtil.getInputMethodManager(requireContext());
imm.hideSoftInputFromWindow(requireView().getWindowToken(), 0);
@@ -508,12 +525,12 @@ public class ConversationListFragment extends MainFragment implements ActionMode
viewModel.getConversationList().observe(getViewLifecycleOwner(), this::onSubmitList);
viewModel.hasNoConversations().observe(getViewLifecycleOwner(), this::updateEmptyState);
- ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() {
+ visibilityLifecycleObserver = new DefaultLifecycleObserver() {
@Override
public void onStart(@NonNull LifecycleOwner owner) {
viewModel.onVisible();
}
- });
+ };
}
private void onSearchResultChanged(@Nullable SearchResult result) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java
index fe8893cc9..41cd65058 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java
@@ -15,6 +15,7 @@ import com.google.android.gms.common.util.ArrayUtils;
import net.sqlcipher.database.SQLiteConstraintException;
import net.sqlcipher.database.SQLiteDatabase;
+import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.zkgroup.InvalidInputException;
import org.signal.zkgroup.groups.GroupMasterKey;
import org.signal.zkgroup.profiles.ProfileKey;
@@ -28,8 +29,9 @@ import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.v2.ProfileKeySet;
+import org.thoughtcrime.securesms.groups.v2.processing.GroupsV2StateProcessor;
import org.thoughtcrime.securesms.jobs.RefreshAttributesJob;
-import org.thoughtcrime.securesms.jobs.WakeGroupV2Job;
+import org.thoughtcrime.securesms.jobs.RequestGroupV2InfoJob;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.profiles.ProfileName;
@@ -860,7 +862,17 @@ public class RecipientDatabase extends Database {
GroupId.V2 groupId = GroupId.v2(insert.getMasterKey());
Recipient recipient = Recipient.externalGroup(context, groupId);
- ApplicationDependencies.getJobManager().add(new WakeGroupV2Job(insert.getMasterKey()));
+ Log.i(TAG, "Creating restore placeholder for " + groupId);
+
+ DatabaseFactory.getGroupDatabase(context)
+ .create(insert.getMasterKey(),
+ DecryptedGroup.newBuilder()
+ .setRevision(GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION)
+ .build());
+
+ Log.i(TAG, "Scheduling request for latest group info for " + groupId);
+
+ ApplicationDependencies.getJobManager().add(new RequestGroupV2InfoJob(groupId));
threadDatabase.setArchived(recipient.getId(), insert.isArchived());
needsRefresh.add(recipient.getId());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java
index 77588d49d..7edcc1e0e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java
@@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri;
import org.thoughtcrime.securesms.stickers.BlessedPacks;
import org.thoughtcrime.securesms.stickers.StickerPackInstallEvent;
import org.thoughtcrime.securesms.util.CursorUtil;
+import org.thoughtcrime.securesms.util.SqlUtil;
import org.thoughtcrime.securesms.util.Util;
import java.io.Closeable;
@@ -105,6 +106,12 @@ public class StickerDatabase extends Database {
contentValues.put(FILE_RANDOM, fileInfo.getRandom());
long id = databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, contentValues);
+ if (id == -1) {
+ String selection = PACK_ID + " = ? AND " + STICKER_ID + " = ? AND " + COVER + " = ?";
+ String[] args = SqlUtil.buildArgs(sticker.getPackId(), sticker.getStickerId(), (sticker.isCover() ? 1 : 0));
+
+ id = databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, selection, args);
+ }
if (id > 0) {
notifyStickerListeners();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java
index 8b2901577..5b8b26a7a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java
@@ -21,8 +21,9 @@ final class GroupStateMapper {
private static final String TAG = Log.tag(GroupStateMapper.class);
- static final int LATEST = Integer.MAX_VALUE;
- static final int PLACEHOLDER_REVISION = -1;
+ static final int LATEST = Integer.MAX_VALUE;
+ static final int PLACEHOLDER_REVISION = -1;
+ static final int RESTORE_PLACEHOLDER_REVISION = -2;
private static final Comparator BY_REVISION = (o1, o2) -> Integer.compare(o1.getRevision(), o2.getRevision());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java
index 3af96db4a..38276b4cc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java
@@ -65,9 +65,20 @@ public final class GroupsV2StateProcessor {
private static final String TAG = Log.tag(GroupsV2StateProcessor.class);
- public static final int LATEST = GroupStateMapper.LATEST;
+ public static final int LATEST = GroupStateMapper.LATEST;
+
+ /**
+ * Used to mark a group state as a placeholder when there is partial knowledge (title and avater)
+ * gathered from a group join link.
+ */
public static final int PLACEHOLDER_REVISION = GroupStateMapper.PLACEHOLDER_REVISION;
+ /**
+ * Used to mark a group state as a placeholder when you have no knowledge at all of the group
+ * e.g. from a group master key from a storage service restore.
+ */
+ public static final int RESTORE_PLACEHOLDER_REVISION = GroupStateMapper.RESTORE_PLACEHOLDER_REVISION;
+
private final Context context;
private final JobManager jobManager;
private final RecipientDatabase recipientDatabase;
@@ -176,7 +187,8 @@ public final class GroupsV2StateProcessor {
if (inputGroupState == null) {
try {
- inputGroupState = queryServer(localState, revision == LATEST && localState == null);
+ boolean latestRevisionOnly = revision == LATEST && (localState == null || localState.getRevision() == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION);
+ inputGroupState = queryServer(localState, latestRevisionOnly);
} catch (GroupNotAMemberException e) {
if (localState != null && signedGroupChange != null) {
try {
@@ -212,7 +224,12 @@ public final class GroupsV2StateProcessor {
updateLocalDatabaseGroupState(inputGroupState, newLocalState);
determineProfileSharing(inputGroupState, newLocalState);
- insertUpdateMessages(timestamp, advanceGroupStateResult.getProcessedLogEntries());
+ if (localState != null && localState.getRevision() == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION) {
+ Log.i(TAG, "Inserting single update message for restore placeholder");
+ insertUpdateMessages(timestamp, Collections.singleton(new LocalGroupLogEntry(newLocalState, null)));
+ } else {
+ insertUpdateMessages(timestamp, advanceGroupStateResult.getProcessedLogEntries());
+ }
persistLearnedProfileKeys(inputGroupState);
GlobalGroupState remainingWork = advanceGroupStateResult.getNewGlobalGroupState();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
index 668b3578b..5e51c4b63 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
@@ -101,7 +101,6 @@ public final class JobManagerFactories {
put(StorageAccountRestoreJob.KEY, new StorageAccountRestoreJob.Factory());
put(RequestGroupV2InfoWorkerJob.KEY, new RequestGroupV2InfoWorkerJob.Factory());
put(RequestGroupV2InfoJob.KEY, new RequestGroupV2InfoJob.Factory());
- put(WakeGroupV2Job.KEY, new WakeGroupV2Job.Factory());
put(GroupV2UpdateSelfProfileKeyJob.KEY, new GroupV2UpdateSelfProfileKeyJob.Factory());
put(RetrieveProfileAvatarJob.KEY, new RetrieveProfileAvatarJob.Factory());
put(RetrieveProfileJob.KEY, new RetrieveProfileJob.Factory());
@@ -153,6 +152,7 @@ public final class JobManagerFactories {
put("Argon2TestJob", new FailingJob.Factory());
put("Argon2TestMigrationJob", new PassingMigrationJob.Factory());
put("StorageKeyRotationMigrationJob", new PassingMigrationJob.Factory());
+ put("WakeGroupV2Job", new FailingJob.Factory());
}};
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java
index ae773ef7e..1ce3aee3f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java
@@ -8,9 +8,8 @@ import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.jobmanager.Job;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.logging.Log;
-import org.thoughtcrime.securesms.mms.MediaConstraints;
-import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
import org.thoughtcrime.securesms.util.Util;
import java.util.List;
@@ -26,7 +25,7 @@ public abstract class SendJob extends BaseJob {
@Override
public final void onRun() throws Exception {
- if (Util.getDaysTillBuildExpiry() <= 0) {
+ if (SignalStore.misc().isClientDeprecated()) {
throw new TextSecureExpiredException(String.format("TextSecure expired (build %d, now %d)",
BuildConfig.BUILD_TIMESTAMP,
System.currentTimeMillis()));
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java
index 37a30a024..a8c8ba682 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java
@@ -5,15 +5,18 @@ import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.StickerDatabase;
import org.thoughtcrime.securesms.database.model.IncomingSticker;
+import org.thoughtcrime.securesms.database.model.StickerRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.logging.Log;
+import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.util.Hex;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
+import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;
@@ -76,9 +79,16 @@ public class StickerDownloadJob extends BaseJob {
protected void onRun() throws Exception {
StickerDatabase db = DatabaseFactory.getStickerDatabase(context);
- if (db.getSticker(sticker.getPackId(), sticker.getStickerId(), sticker.isCover()) != null) {
- Log.w(TAG, "Sticker already downloaded.");
- return;
+ StickerRecord stickerRecord = db.getSticker(sticker.getPackId(), sticker.getStickerId(), sticker.isCover());
+ if (stickerRecord != null) {
+ try (InputStream stream = PartAuthority.getAttachmentStream(context, stickerRecord.getUri())) {
+ if (stream != null) {
+ Log.w(TAG, "Sticker already downloaded.");
+ return;
+ }
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "Sticker file no longer exists, downloading again.");
+ }
}
if (!db.isPackInstalled(sticker.getPackId()) && !sticker.isCover()) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java
deleted file mode 100644
index 108795842..000000000
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.thoughtcrime.securesms.jobs;
-
-import androidx.annotation.NonNull;
-
-import org.signal.zkgroup.InvalidInputException;
-import org.signal.zkgroup.groups.GroupMasterKey;
-import org.thoughtcrime.securesms.database.DatabaseFactory;
-import org.thoughtcrime.securesms.database.GroupDatabase;
-import org.thoughtcrime.securesms.database.MessageDatabase;
-import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context;
-import org.thoughtcrime.securesms.groups.GroupChangeBusyException;
-import org.thoughtcrime.securesms.groups.GroupId;
-import org.thoughtcrime.securesms.groups.GroupManager;
-import org.thoughtcrime.securesms.groups.GroupNotAMemberException;
-import org.thoughtcrime.securesms.groups.GroupProtoUtil;
-import org.thoughtcrime.securesms.groups.v2.processing.GroupsV2StateProcessor;
-import org.thoughtcrime.securesms.jobmanager.Data;
-import org.thoughtcrime.securesms.jobmanager.Job;
-import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
-import org.thoughtcrime.securesms.logging.Log;
-import org.thoughtcrime.securesms.mms.MmsException;
-import org.thoughtcrime.securesms.mms.OutgoingGroupUpdateMessage;
-import org.thoughtcrime.securesms.recipients.Recipient;
-import org.thoughtcrime.securesms.util.Hex;
-import org.whispersystems.libsignal.util.guava.Optional;
-import org.whispersystems.signalservice.api.groupsv2.NoCredentialForRedemptionTimeException;
-import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Use to create and show a thread for an unknown GV2 group.
- */
-public final class WakeGroupV2Job extends BaseJob {
-
- public static final String KEY = "WakeGroupV2Job";
-
- private static final String TAG = Log.tag(WakeGroupV2Job.class);
-
- private static final String KEY_GROUP_MASTER_KEY = "group_id";
-
- private final GroupMasterKey groupMasterKey;
-
- public WakeGroupV2Job(@NonNull GroupMasterKey groupMasterKey) {
- this(new Parameters.Builder()
- .setQueue("RequestGroupV2InfoJob::" + GroupId.v2(groupMasterKey))
- .addConstraint(NetworkConstraint.KEY)
- .setLifespan(TimeUnit.DAYS.toMillis(1))
- .setMaxAttempts(Parameters.UNLIMITED)
- .build(),
- groupMasterKey);
- }
-
- private WakeGroupV2Job(@NonNull Parameters parameters, @NonNull GroupMasterKey groupMasterKey) {
- super(parameters);
-
- this.groupMasterKey = groupMasterKey;
- }
-
- @Override
- public @NonNull Data serialize() {
- return new Data.Builder().putString(KEY_GROUP_MASTER_KEY, Hex.toStringCondensed(groupMasterKey.serialize()))
- .build();
- }
-
- @Override
- public @NonNull String getFactoryKey() {
- return KEY;
- }
-
- @Override
- public void onRun() throws IOException, GroupNotAMemberException, GroupChangeBusyException {
- Log.i(TAG, "Waking group");
-
- GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
- GroupId.V2 groupId = GroupId.v2(groupMasterKey);
-
- if (groupDatabase.findGroup(groupId)) {
- Log.w(TAG, "Group already exists " + groupId);
- return;
- } else {
- GroupManager.updateGroupFromServer(context, groupMasterKey, GroupsV2StateProcessor.LATEST, System.currentTimeMillis(), null);
- Log.i(TAG, "Group created " + groupId);
- }
-
- Optional group = groupDatabase.getGroup(groupId);
- if (!group.isPresent()) {
- Log.w(TAG, "Failed to create group from server " + groupId);
- return;
- }
-
- Log.i(TAG, "Waking group " + groupId);
- try {
- Recipient groupRecipient = Recipient.externalGroup(context, groupId);
- long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient);
- GroupDatabase.V2GroupProperties v2GroupProperties = group.get().requireV2GroupProperties();
- DecryptedGroupV2Context decryptedGroupV2Context = GroupProtoUtil.createDecryptedGroupV2Context(v2GroupProperties.getGroupMasterKey(), v2GroupProperties.getDecryptedGroup(), null, null);
- MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
- OutgoingGroupUpdateMessage outgoingMessage = new OutgoingGroupUpdateMessage(groupRecipient, decryptedGroupV2Context, null, System.currentTimeMillis(), 0, false, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
-
- long messageId = mmsDatabase.insertMessageOutbox(outgoingMessage, threadId, false, null);
-
- mmsDatabase.markAsSent(messageId, true);
- } catch (MmsException e) {
- Log.w(TAG, e);
- }
- }
-
- @Override
- public boolean onShouldRetry(@NonNull Exception e) {
- return e instanceof PushNetworkException ||
- e instanceof NoCredentialForRedemptionTimeException ||
- e instanceof GroupChangeBusyException;
- }
-
- @Override
- public void onFailure() {
- }
-
- public static final class Factory implements Job.Factory {
-
- @Override
- public @NonNull WakeGroupV2Job create(@NonNull Parameters parameters, @NonNull Data data) {
- try {
- return new WakeGroupV2Job(parameters,
- new GroupMasterKey(Hex.fromStringCondensed(data.getString(KEY_GROUP_MASTER_KEY))));
- } catch (InvalidInputException | IOException e) {
- throw new AssertionError(e);
- }
- }
- }
-}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
index 58df4c97d..1a49d01f6 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
@@ -8,6 +8,7 @@ public final class MiscellaneousValues extends SignalStoreValues {
private static final String MESSAGE_REQUEST_ENABLE_TIME = "message_request_enable_time";
private static final String LAST_PROFILE_REFRESH_TIME = "misc.last_profile_refresh_time";
private static final String USERNAME_SHOW_REMINDER = "username.show.reminder";
+ private static final String CLIENT_DEPRECATED = "misc.client_deprecated";
MiscellaneousValues(@NonNull KeyValueStore store) {
super(store);
@@ -45,4 +46,16 @@ public final class MiscellaneousValues extends SignalStoreValues {
public boolean shouldShowUsernameReminder() {
return getBoolean(USERNAME_SHOW_REMINDER, true);
}
+
+ public boolean isClientDeprecated() {
+ return getBoolean(CLIENT_DEPRECATED, false);
+ }
+
+ public void markClientDeprecated() {
+ putBoolean(CLIENT_DEPRECATED, true);
+ }
+
+ public void clearClientDeprecated() {
+ putBoolean(CLIENT_DEPRECATED, false);
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java
index 57274988b..4b47c4cf1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java
@@ -17,6 +17,7 @@ import com.google.android.collect.Sets;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.stickers.StickerUrl;
+import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.util.OptionalUtil;
@@ -203,18 +204,11 @@ public final class LinkPreviewUtil {
@SuppressLint("ObsoleteSdkInt")
public long getDate() {
- SimpleDateFormat format;
- if (Build.VERSION.SDK_INT == 0 || Build.VERSION.SDK_INT >= 24) {
- format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.getDefault());
- } else {
- format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
- }
-
return Stream.of(values.get(KEY_PUBLISHED_TIME_1),
values.get(KEY_PUBLISHED_TIME_2),
values.get(KEY_MODIFIED_TIME_1),
values.get(KEY_MODIFIED_TIME_2))
- .map(dateString -> parseDate(format, dateString))
+ .map(DateUtils::parseIso8601)
.filter(time -> time > 0)
.findFirst()
.orElse(0L);
@@ -223,19 +217,6 @@ public final class LinkPreviewUtil {
public @NonNull Optional getDescription() {
return OptionalUtil.absentIfEmpty(values.get(KEY_DESCRIPTION_URL));
}
-
- private static long parseDate(DateFormat dateFormat, String dateString) {
- if (Util.isEmpty(dateString)) {
- return 0;
- }
-
- try {
- return dateFormat.parse(dateString).getTime();
- } catch (ParseException e) {
- Log.w(TAG, "Failed to parse date.", e);
- return 0;
- }
- }
}
public interface HtmlDecoder {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java
new file mode 100644
index 000000000..7ab4bd66d
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java
@@ -0,0 +1,62 @@
+package org.thoughtcrime.securesms.megaphone;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AlertDialog;
+
+import org.thoughtcrime.securesms.PassphraseRequiredActivity;
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
+import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
+import org.thoughtcrime.securesms.util.DynamicTheme;
+import org.thoughtcrime.securesms.util.PlayStoreUtil;
+import org.thoughtcrime.securesms.util.Util;
+
+/**
+ * Shown when a users build fully expires. Controlled by {@link Megaphones.Event#CLIENT_DEPRECATED}.
+ */
+public class ClientDeprecatedActivity extends PassphraseRequiredActivity {
+
+ private final DynamicTheme theme = new DynamicNoActionBarTheme();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState, boolean ready) {
+ setContentView(R.layout.client_deprecated_activity);
+
+ findViewById(R.id.client_deprecated_update_button).setOnClickListener(v -> onUpdateClicked());
+ findViewById(R.id.client_deprecated_dont_update_button).setOnClickListener(v -> onDontUpdateClicked());
+ }
+
+ @Override
+ protected void onPreCreate() {
+ theme.onCreate(this);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ theme.onResume(this);
+ }
+
+ @Override
+ public void onBackPressed() {
+ // Disabled
+ }
+
+ private void onUpdateClicked() {
+ PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(this);
+ }
+
+ private void onDontUpdateClicked() {
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.ClientDeprecatedActivity_warning)
+ .setMessage(R.string.ClientDeprecatedActivity_your_version_of_signal_has_expired_you_can_view_your_message_history)
+ .setPositiveButton(R.string.ClientDeprecatedActivity_dont_update, (dialog, which) -> {
+ ApplicationDependencies.getMegaphoneRepository().markFinished(Megaphones.Event.CLIENT_DEPRECATED, () -> {
+ Util.runOnMain(this::finish);
+ });
+ })
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
+ .show();
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java
index 1b6094229..a001cb3e3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java
@@ -20,7 +20,7 @@ public class Megaphone {
private final Event event;
private final Style style;
- private final boolean mandatory;
+ private final Priority priority;
private final boolean canSnooze;
private final int titleRes;
private final int bodyRes;
@@ -33,7 +33,7 @@ public class Megaphone {
private Megaphone(@NonNull Builder builder) {
this.event = builder.event;
this.style = builder.style;
- this.mandatory = builder.mandatory;
+ this.priority = builder.priority;
this.canSnooze = builder.canSnooze;
this.titleRes = builder.titleRes;
this.bodyRes = builder.bodyRes;
@@ -48,8 +48,8 @@ public class Megaphone {
return event;
}
- public boolean isMandatory() {
- return mandatory;
+ public @NonNull Priority getPriority() {
+ return priority;
}
public boolean canSnooze() {
@@ -97,7 +97,7 @@ public class Megaphone {
private final Event event;
private final Style style;
- private boolean mandatory;
+ private Priority priority;
private boolean canSnooze;
private int titleRes;
private int bodyRes;
@@ -111,13 +111,14 @@ public class Megaphone {
public Builder(@NonNull Event event, @NonNull Style style) {
this.event = event;
this.style = style;
+ this.priority = Priority.DEFAULT;
}
/**
* Prioritizes this megaphone over others that do not set this flag.
*/
- public @NonNull Builder setMandatory(boolean mandatory) {
- this.mandatory = mandatory;
+ public @NonNull Builder setPriority(@NonNull Priority priority) {
+ this.priority = priority;
return this;
}
@@ -192,6 +193,20 @@ public class Megaphone {
POPUP
}
+ enum Priority {
+ DEFAULT(0), HIGH(1), CLIENT_EXPIRATION(1000);
+
+ int priorityValue;
+
+ Priority(int priorityValue) {
+ this.priorityValue = priorityValue;
+ }
+
+ public int getPriorityValue() {
+ return priorityValue;
+ }
+ }
+
public interface EventListener {
void onEvent(@NonNull Megaphone megaphone, @NonNull MegaphoneActionController listener);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java
index 95ff61eba..a0d4c73c8 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java
@@ -5,6 +5,7 @@ import android.content.Context;
import androidx.annotation.AnyThread;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
@@ -100,6 +101,11 @@ public class MegaphoneRepository {
@AnyThread
public void markFinished(@NonNull Event event) {
+ markFinished(event, null);
+ }
+
+ @AnyThread
+ public void markFinished(@NonNull Event event, @Nullable Runnable onComplete) {
executor.execute(() -> {
MegaphoneRecord record = databaseCache.get(event);
if (record != null && record.isFinished()) {
@@ -108,6 +114,10 @@ public class MegaphoneRepository {
database.markFinished(event);
resetDatabaseCache();
+
+ if (onComplete != null) {
+ onComplete.run();
+ }
});
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java
index 0721ae3b0..4f5766a62 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java
@@ -34,12 +34,12 @@ import java.util.Objects;
* Creating a new megaphone:
* - Add an enum to {@link Event}
* - Return a megaphone in {@link #forRecord(Context, MegaphoneRecord)}
- * - Include the event in {@link #buildDisplayOrder()}
+ * - Include the event in {@link #buildDisplayOrder(Context)}
*
* Common patterns:
* - For events that have a snooze-able recurring display schedule, use a {@link RecurringSchedule}.
* - For events guarded by feature flags, set a {@link ForeverSchedule} with false in
- * {@link #buildDisplayOrder()}.
+ * {@link #buildDisplayOrder(Context)}.
* - For events that change, return different megaphones in {@link #forRecord(Context, MegaphoneRecord)}
* based on whatever properties you're interested in.
*/
@@ -65,15 +65,9 @@ public final class Megaphones {
.map(Map.Entry::getKey)
.map(records::get)
.map(record -> Megaphones.forRecord(context, record))
+ .sortBy(m -> -m.getPriority().getPriorityValue())
.toList();
- boolean hasOptional = Stream.of(megaphones).anyMatch(m -> !m.isMandatory());
- boolean hasMandatory = Stream.of(megaphones).anyMatch(Megaphone::isMandatory);
-
- if (hasOptional && hasMandatory) {
- megaphones = Stream.of(megaphones).filter(Megaphone::isMandatory).toList();
- }
-
if (megaphones.size() > 0) {
return megaphones.get(0);
} else {
@@ -93,6 +87,7 @@ public final class Megaphones {
put(Event.MESSAGE_REQUESTS, shouldShowMessageRequestsMegaphone() ? ALWAYS : NEVER);
put(Event.MENTIONS, shouldShowMentionsMegaphone() ? ALWAYS : NEVER);
put(Event.LINK_PREVIEWS, shouldShowLinkPreviewsMegaphone(context) ? ALWAYS : NEVER);
+ put(Event.CLIENT_DEPRECATED, SignalStore.misc().isClientDeprecated() ? ALWAYS : NEVER);
}};
}
@@ -110,6 +105,8 @@ public final class Megaphones {
return buildMentionsMegaphone();
case LINK_PREVIEWS:
return buildLinkPreviewsMegaphone();
+ case CLIENT_DEPRECATED:
+ return buildClientDeprecatedMegaphone(context);
default:
throw new IllegalArgumentException("Event not handled!");
}
@@ -117,14 +114,14 @@ public final class Megaphones {
private static @NonNull Megaphone buildReactionsMegaphone() {
return new Megaphone.Builder(Event.REACTIONS, Megaphone.Style.REACTIONS)
- .setMandatory(false)
+ .setPriority(Megaphone.Priority.DEFAULT)
.build();
}
private static @NonNull Megaphone buildPinsForAllMegaphone(@NonNull MegaphoneRecord record) {
if (PinsForAllSchedule.shouldDisplayFullScreen(record.getFirstVisible(), System.currentTimeMillis())) {
return new Megaphone.Builder(Event.PINS_FOR_ALL, Megaphone.Style.FULLSCREEN)
- .setMandatory(true)
+ .setPriority(Megaphone.Priority.HIGH)
.enableSnooze(null)
.setOnVisibleListener((megaphone, listener) -> {
if (new NetworkConstraint.Factory(ApplicationDependencies.getApplication()).create().isMet()) {
@@ -134,7 +131,7 @@ public final class Megaphones {
.build();
} else {
return new Megaphone.Builder(Event.PINS_FOR_ALL, Megaphone.Style.BASIC)
- .setMandatory(true)
+ .setPriority(Megaphone.Priority.HIGH)
.setImage(R.drawable.kbs_pin_megaphone)
.setTitle(R.string.KbsMegaphone__create_a_pin)
.setBody(R.string.KbsMegaphone__pins_keep_information_thats_stored_with_signal_encrytped)
@@ -184,7 +181,7 @@ public final class Megaphones {
private static @NonNull Megaphone buildMessageRequestsMegaphone(@NonNull Context context) {
return new Megaphone.Builder(Event.MESSAGE_REQUESTS, Megaphone.Style.FULLSCREEN)
.disableSnooze()
- .setMandatory(true)
+ .setPriority(Megaphone.Priority.HIGH)
.setOnVisibleListener(((megaphone, listener) -> {
listener.onMegaphoneNavigationRequested(new Intent(context, MessageRequestMegaphoneActivity.class),
ConversationListFragment.MESSAGE_REQUESTS_REQUEST_CODE_CREATE_NAME);
@@ -202,7 +199,17 @@ public final class Megaphones {
private static @NonNull Megaphone buildLinkPreviewsMegaphone() {
return new Megaphone.Builder(Event.LINK_PREVIEWS, Megaphone.Style.LINK_PREVIEWS)
- .setMandatory(true)
+ .setPriority(Megaphone.Priority.HIGH)
+ .build();
+ }
+
+ private static @NonNull Megaphone buildClientDeprecatedMegaphone(@NonNull Context context) {
+ return new Megaphone.Builder(Event.CLIENT_DEPRECATED, Megaphone.Style.FULLSCREEN)
+ .disableSnooze()
+ .setPriority(Megaphone.Priority.HIGH)
+ .setOnVisibleListener((megaphone, listener) -> {
+ listener.onMegaphoneNavigationRequested(new Intent(context, ClientDeprecatedActivity.class));
+ })
.build();
}
@@ -224,7 +231,8 @@ public final class Megaphones {
PIN_REMINDER("pin_reminder"),
MESSAGE_REQUESTS("message_requests"),
MENTIONS("mentions"),
- LINK_PREVIEWS("link_previews");
+ LINK_PREVIEWS("link_previews"),
+ CLIENT_DEPRECATED("client_deprecated");
private final String key;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java
index 47df39184..5f8ab8703 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java
@@ -75,6 +75,7 @@ public class ApplicationMigrations {
if (!isUpdate(context)) {
Log.d(TAG, "Not an update. Skipping.");
+ VersionTracker.updateLastSeenVersion(context);
return;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/DeprecatedClientPreventionInterceptor.java b/app/src/main/java/org/thoughtcrime/securesms/net/DeprecatedClientPreventionInterceptor.java
new file mode 100644
index 000000000..cadf5427b
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/net/DeprecatedClientPreventionInterceptor.java
@@ -0,0 +1,41 @@
+package org.thoughtcrime.securesms.net;
+
+import androidx.annotation.NonNull;
+
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
+import org.thoughtcrime.securesms.logging.Log;
+import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.MediaType;
+import okhttp3.Protocol;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+/**
+ * Disallows network requests when your client has been deprecated. When the client is deprecated,
+ * we simply fake a 499 response.
+ */
+public final class DeprecatedClientPreventionInterceptor implements Interceptor {
+
+ private static final String TAG = Log.tag(DeprecatedClientPreventionInterceptor.class);
+
+ @Override
+ public @NonNull Response intercept(@NonNull Chain chain) throws IOException {
+ if (SignalStore.misc().isClientDeprecated()) {
+ Log.w(TAG, "Preventing request because client is deprecated.");
+ return new Response.Builder()
+ .request(chain.request())
+ .protocol(Protocol.HTTP_1_1)
+ .receivedResponseAtMillis(System.currentTimeMillis())
+ .message("")
+ .body(ResponseBody.create(null, ""))
+ .code(499)
+ .build();
+ } else {
+ return chain.proceed(chain.request());
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/RemoteDeprecationDetectorInterceptor.java b/app/src/main/java/org/thoughtcrime/securesms/net/RemoteDeprecationDetectorInterceptor.java
new file mode 100644
index 000000000..ff5b542ba
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/net/RemoteDeprecationDetectorInterceptor.java
@@ -0,0 +1,31 @@
+package org.thoughtcrime.securesms.net;
+
+import androidx.annotation.NonNull;
+
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
+import org.thoughtcrime.securesms.logging.Log;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Response;
+
+/**
+ * Marks the client as remotely-deprecated when it receives a 499 response.
+ */
+public final class RemoteDeprecationDetectorInterceptor implements Interceptor {
+
+ private static final String TAG = Log.tag(RemoteDeprecationDetectorInterceptor.class);
+
+ @Override
+ public @NonNull Response intercept(@NonNull Chain chain) throws IOException {
+ Response response = chain.proceed(chain.request());
+
+ if (response.code() == 499 && !SignalStore.misc().isClientDeprecated()) {
+ Log.w(TAG, "Received 499. Client version is deprecated.");
+ SignalStore.misc().markClientDeprecated();
+ }
+
+ return response;
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/StandardUserAgentInterceptor.java b/app/src/main/java/org/thoughtcrime/securesms/net/StandardUserAgentInterceptor.java
index 0150b46a9..7b17fa1a8 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/net/StandardUserAgentInterceptor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/net/StandardUserAgentInterceptor.java
@@ -10,6 +10,6 @@ import org.thoughtcrime.securesms.BuildConfig;
public class StandardUserAgentInterceptor extends UserAgentInterceptor {
public StandardUserAgentInterceptor() {
- super("Signal-Android " + BuildConfig.VERSION_NAME + " (API " + Build.VERSION.SDK_INT + ")");
+ super("Signal-Android/" + BuildConfig.VERSION_NAME + " Android/" + Build.VERSION.SDK_INT);
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java b/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java
index d9d4e2146..6942dce11 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java
@@ -7,6 +7,8 @@ import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.net.CustomDns;
+import org.thoughtcrime.securesms.net.RemoteDeprecationDetectorInterceptor;
+import org.thoughtcrime.securesms.net.DeprecatedClientPreventionInterceptor;
import org.thoughtcrime.securesms.net.SequentialDns;
import org.thoughtcrime.securesms.net.StandardUserAgentInterceptor;
import org.thoughtcrime.securesms.util.Base64;
@@ -21,6 +23,7 @@ import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl;
import org.whispersystems.signalservice.internal.configuration.SignalStorageUrl;
import java.io.IOException;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -161,7 +164,7 @@ public class SignalServiceNetworkAccess {
final SignalStorageUrl omanGoogleStorage = new SignalStorageUrl("https://www.google.com.om/storage", SERVICE_REFLECTOR_HOST, trustStore, GMAIL_CONNECTION_SPEC);
final SignalStorageUrl qatarGoogleStorage = new SignalStorageUrl("https://www.google.com.qa/storage", SERVICE_REFLECTOR_HOST, trustStore, GMAIL_CONNECTION_SPEC);
- final List interceptors = Collections.singletonList(new StandardUserAgentInterceptor());
+ final List interceptors = Arrays.asList(new StandardUserAgentInterceptor(), new RemoteDeprecationDetectorInterceptor(), new DeprecatedClientPreventionInterceptor());
final Optional dns = Optional.of(DNS);
final byte[] zkGroupServerPublicParams;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java
index 7f8bf1ff6..adc0dd8eb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java
@@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit;
public class DirectoryRefreshListener extends PersistentAlarmManagerListener {
- private static final long INTERVAL = TimeUnit.HOURS.toMillis(6);
+ private static final long INTERVAL = TimeUnit.HOURS.toMillis(24);
@Override
protected long getNextScheduledExecutionTime(Context context) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java
index 3e193f302..5e355866a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java
@@ -16,13 +16,18 @@
*/
package org.thoughtcrime.securesms.util;
+import android.annotation.SuppressLint;
import android.content.Context;
+import android.os.Build;
import android.text.format.DateFormat;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.logging.Log;
+import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@@ -170,4 +175,33 @@ public class DateUtils extends android.text.format.DateUtils {
private static String getLocalizedPattern(String template, Locale locale) {
return DateFormat.getBestDateTimePattern(locale, template);
}
+
+ /**
+ * e.g. 2020-09-04T19:17:51Z
+ * https://www.iso.org/iso-8601-date-and-time-format.html
+ *
+ * Note: SDK_INT == 0 check needed to pass unit tests due to JVM date parser differences.
+ *
+ * @return The timestamp if able to be parsed, otherwise -1.
+ */
+ @SuppressLint("ObsoleteSdkInt")
+ public static long parseIso8601(@Nullable String date) {
+ SimpleDateFormat format;
+ if (Build.VERSION.SDK_INT == 0 || Build.VERSION.SDK_INT >= 24) {
+ format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.getDefault());
+ } else {
+ format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
+ }
+
+ if (Util.isEmpty(date)) {
+ return -1;
+ }
+
+ try {
+ return format.parse(date).getTime();
+ } catch (ParseException e) {
+ Log.w(TAG, "Failed to parse date.", e);
+ return -1;
+ }
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
index 792d47412..6f2dc9e70 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
@@ -64,6 +64,7 @@ public final class FeatureFlags {
private static final String MENTIONS = "android.mentions";
private static final String VERIFY_V2 = "android.verifyV2";
private static final String PHONE_NUMBER_PRIVACY_VERSION = "android.phoneNumberPrivacyVersion";
+ private static final String CLIENT_EXPIRATION = "android.clientExpiration";
/**
* We will only store remote values for flags in this set. If you want a flag to be controllable
@@ -82,7 +83,8 @@ public final class FeatureFlags {
INTERNAL_USER,
USERNAMES,
MENTIONS,
- VERIFY_V2
+ VERIFY_V2,
+ CLIENT_EXPIRATION
);
/**
@@ -107,7 +109,8 @@ public final class FeatureFlags {
GROUPS_V2_CREATE_VERSION,
GROUPS_V2_JOIN_VERSION,
VERIFY_V2,
- CDS_VERSION
+ CDS_VERSION,
+ CLIENT_EXPIRATION
);
/**
@@ -280,6 +283,11 @@ public final class FeatureFlags {
return getBoolean(VERIFY_V2, false);
}
+ /** The raw client expiration JSON string. */
+ public static String clientExpiration() {
+ return getString(CLIENT_EXPIRATION, null);
+ }
+
/**
* Whether the user can choose phone number privacy settings, and;
* Whether to fetch and store the secondary certificate
@@ -463,6 +471,20 @@ public final class FeatureFlags {
return defaultValue;
}
+ private static String getString(@NonNull String key, String defaultValue) {
+ String forced = (String) FORCED_VALUES.get(key);
+ if (forced != null) {
+ return forced;
+ }
+
+ Object remote = REMOTE_VALUES.get(key);
+ if (remote instanceof String) {
+ return (String) remote;
+ }
+
+ return defaultValue;
+ }
+
private static Map parseStoredConfig(String stored) {
Map parsed = new HashMap<>();
@@ -511,14 +533,11 @@ public final class FeatureFlags {
}
}
- private static final class MissingFlagRequirementError extends Error {
- }
-
@VisibleForTesting
static final class UpdateResult {
private final Map memory;
private final Map disk;
- private final Map memoryChanges;
+ private final Map memoryChanges;
UpdateResult(@NonNull Map memory, @NonNull Map disk, @NonNull Map memoryChanges) {
this.memory = memory;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java
new file mode 100644
index 000000000..864687674
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java
@@ -0,0 +1,89 @@
+package org.thoughtcrime.securesms.util;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.annimon.stream.Stream;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import org.thoughtcrime.securesms.BuildConfig;
+import org.thoughtcrime.securesms.logging.Log;
+
+import java.io.IOException;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+public final class RemoteDeprecation {
+
+ private static final String TAG = Log.tag(RemoteDeprecation.class);
+
+ private RemoteDeprecation() { }
+
+ /**
+ * @return The amount of time (in milliseconds) until this client version expires, or -1 if
+ * there's no pending expiration.
+ */
+ public static long getTimeUntilDeprecation() {
+ return getTimeUntilDeprecation(FeatureFlags.clientExpiration(), System.currentTimeMillis(), BuildConfig.VERSION_NAME);
+ }
+
+ /**
+ * @return The amount of time (in milliseconds) until this client version expires, or -1 if
+ * there's no pending expiration.
+ */
+ @VisibleForTesting
+ static long getTimeUntilDeprecation(String json, long currentTime, @NonNull String currentVersion) {
+ if (Util.isEmpty(json)) {
+ return -1;
+ }
+
+ try {
+ SemanticVersion ourVersion = Objects.requireNonNull(SemanticVersion.parse(currentVersion));
+ ClientExpiration[] expirations = JsonUtils.fromJson(json, ClientExpiration[].class);
+
+ ClientExpiration expiration = Stream.of(expirations)
+ .filter(c -> c.getVersion() != null && c.getExpiration() != -1)
+ .filter(c -> c.requireVersion().compareTo(ourVersion) > 0)
+ .sortBy(ClientExpiration::getExpiration)
+ .findFirst()
+ .orElse(null);
+
+ if (expiration != null) {
+ return Math.max(expiration.getExpiration() - currentTime, 0);
+ }
+ } catch (IOException e) {
+ Log.w(TAG, e);
+ }
+
+ return -1;
+ }
+
+ private static final class ClientExpiration {
+ @JsonProperty
+ private final String minVersion;
+
+ @JsonProperty
+ private final String iso8601;
+
+ ClientExpiration(@Nullable @JsonProperty("minVersion") String minVersion,
+ @Nullable @JsonProperty("iso8601") String iso8601)
+ {
+ this.minVersion = minVersion;
+ this.iso8601 = iso8601;
+ }
+
+ public @Nullable SemanticVersion getVersion() {
+ return SemanticVersion.parse(minVersion);
+ }
+
+ public @NonNull SemanticVersion requireVersion() {
+ return Objects.requireNonNull(getVersion());
+ }
+
+ public long getExpiration() {
+ return DateUtils.parseIso8601(iso8601);
+ }
+ }
+
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SemanticVersion.java b/app/src/main/java/org/thoughtcrime/securesms/util/SemanticVersion.java
new file mode 100644
index 000000000..a34db6b0c
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/SemanticVersion.java
@@ -0,0 +1,70 @@
+package org.thoughtcrime.securesms.util;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.annimon.stream.ComparatorCompat;
+
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public final class SemanticVersion implements Comparable {
+
+ private static final Pattern VERSION_PATTERN = Pattern.compile("^([0-9]+)\\.([0-9]+)\\.([0-9]+)$");
+
+ private static final Comparator MAJOR_COMPARATOR = (s1, s2) -> Integer.compare(s1.major, s2.major);
+ private static final Comparator MINOR_COMPARATOR = (s1, s2) -> Integer.compare(s1.minor, s2.minor);
+ private static final Comparator PATCH_COMPARATOR = (s1, s2) -> Integer.compare(s1.patch, s2.patch);
+ private static final Comparator COMPARATOR = ComparatorCompat.chain(MAJOR_COMPARATOR)
+ .thenComparing(MINOR_COMPARATOR)
+ .thenComparing(PATCH_COMPARATOR);
+
+ private final int major;
+ private final int minor;
+ private final int patch;
+
+ public SemanticVersion(int major, int minor, int patch) {
+ this.major = major;
+ this.minor = minor;
+ this.patch = patch;
+ }
+
+ public static @Nullable SemanticVersion parse(@Nullable String value) {
+ if (value == null) {
+ return null;
+ }
+
+ Matcher matcher = VERSION_PATTERN.matcher(value);
+ if (Util.isEmpty(value) || !matcher.matches()) {
+ return null;
+ }
+
+ int major = Integer.parseInt(matcher.group(1));
+ int minor = Integer.parseInt(matcher.group(2));
+ int patch = Integer.parseInt(matcher.group(3));
+
+ return new SemanticVersion(major, minor, patch);
+ }
+
+ @Override
+ public int compareTo(SemanticVersion other) {
+ return COMPARATOR.compare(this, other);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SemanticVersion that = (SemanticVersion) o;
+ return major == that.major &&
+ minor == that.minor &&
+ patch == that.patch;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(major, minor, patch);
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java
index 583e0c9d8..cec591636 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java
@@ -49,6 +49,7 @@ import com.google.i18n.phonenumbers.Phonenumber;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.components.ComposeText;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.OutgoingLegacyMmsConnection;
import org.whispersystems.libsignal.util.guava.Optional;
@@ -77,6 +78,8 @@ import java.util.concurrent.TimeUnit;
public class Util {
private static final String TAG = Util.class.getSimpleName();
+ private static final long BUILD_LIFESPAN = TimeUnit.DAYS.toMillis(90);
+
private static volatile Handler handler;
public static List asList(T... elements) {
@@ -458,9 +461,25 @@ public class Util {
return secret;
}
- public static int getDaysTillBuildExpiry() {
- int age = (int) TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis() - BuildConfig.BUILD_TIMESTAMP);
- return 90 - age;
+ /**
+ * @return The amount of time (in ms) until this build of Signal will be considered 'expired'.
+ * Takes into account both the build age as well as any remote deprecation values.
+ */
+ public static long getTimeUntilBuildExpiry() {
+ if (SignalStore.misc().isClientDeprecated()) {
+ return 0;
+ }
+
+ long buildAge = System.currentTimeMillis() - BuildConfig.BUILD_TIMESTAMP;
+ long timeUntilBuildDeprecation = BUILD_LIFESPAN - buildAge;
+ long timeUntilRemoteDeprecation = RemoteDeprecation.getTimeUntilDeprecation();
+
+ if (timeUntilRemoteDeprecation != -1) {
+ long timeUntilDeprecation = Math.min(timeUntilBuildDeprecation, timeUntilRemoteDeprecation);
+ return Math.max(timeUntilDeprecation, 0);
+ } else {
+ return Math.max(timeUntilBuildDeprecation, 0);
+ }
}
@TargetApi(VERSION_CODES.LOLLIPOP)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java b/app/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java
index 4c9a6ba97..e94710c02 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java
@@ -3,10 +3,15 @@ package org.thoughtcrime.securesms.util;
import android.content.Context;
import androidx.annotation.NonNull;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
+import org.thoughtcrime.securesms.logging.Log;
+
import java.io.IOException;
public class VersionTracker {
+ private static final String TAG = Log.tag(VersionTracker.class);
+
public static int getLastSeenVersion(@NonNull Context context) {
return TextSecurePreferences.getLastVersionCode(context);
}
@@ -14,7 +19,13 @@ public class VersionTracker {
public static void updateLastSeenVersion(@NonNull Context context) {
try {
int currentVersionCode = Util.getCanonicalVersionCode();
- TextSecurePreferences.setLastVersionCode(context, currentVersionCode);
+ int lastVersionCode = TextSecurePreferences.getLastVersionCode(context);
+
+ if (currentVersionCode != lastVersionCode) {
+ Log.i(TAG, "Upgraded from " + lastVersionCode + " to " + currentVersionCode);
+ SignalStore.misc().clearClientDeprecated();
+ TextSecurePreferences.setLastVersionCode(context, currentVersionCode);
+ }
} catch (IOException ioe) {
throw new AssertionError(ioe);
}
diff --git a/app/src/main/res/drawable/ic_signal_logo_large.xml b/app/src/main/res/drawable/ic_signal_logo_large.xml
new file mode 100644
index 000000000..cab7595e1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_signal_logo_large.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/reminder_background_terminal.xml b/app/src/main/res/drawable/reminder_background_terminal.xml
new file mode 100644
index 000000000..795dc3c25
--- /dev/null
+++ b/app/src/main/res/drawable/reminder_background_terminal.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/client_deprecated_activity.xml b/app/src/main/res/layout/client_deprecated_activity.xml
new file mode 100644
index 000000000..31dbbba4f
--- /dev/null
+++ b/app/src/main/res/layout/client_deprecated_activity.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/conversation_item_received_multimedia.xml b/app/src/main/res/layout/conversation_item_received_multimedia.xml
index 61ed8c838..22ef259d5 100644
--- a/app/src/main/res/layout/conversation_item_received_multimedia.xml
+++ b/app/src/main/res/layout/conversation_item_received_multimedia.xml
@@ -22,7 +22,7 @@
android:clipToPadding="false"
android:clipChildren="false">
-
-
-
-
+ app:layout_goneMarginTop="16dp"
+ tools:text="Take your conversation with Otto Octavius to the next level." />
نسخ إلى الحافظةقارن مع الحافظة
- لقد انتهت صلاحية هذه النسخة من Signal.
-
+
+
+
+
+
الاستخدام كالتطبيق الافتراضي لرسائل SMSانقر لجعل Signal التطبيق الافتراضي لرسائل SMS.استيراد رسائل SMS من النظام
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 412a4326b..5cec9d6aa 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -1209,14 +1209,14 @@
Mübadilə buferinə köçürMübadilə buferi ilə müqayisə et
- Sənin Signal-ının vaxtı ötüb
-
+
+
+
+
+
Əsas SMS aplikasiyası kimi istifadə etSignal-ı əsas SMS aplikasiyası etmək üçün kliklə.Sistem SMS-ni daxil et
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index d625e7664..f5e059618 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -1250,14 +1250,14 @@
КопиранеСравняване с копирани
- Вашата версия на Signal е стара
-
+
+
+
+
+
Използване като SMS програма по подразбиранеНатисни, за да направиш Signal своята SMS програма по подразбиране.Внасяне на системните SMS-и
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 975716571..6bc24a53f 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -1653,14 +1653,14 @@
ক্লিপবোর্ডে অনুলিপি করুনক্লিপবোর্ডের সাথে তুলনা করুন
- আপনার Signal সংস্করণটি পুরানো
-
+
+
+
+
+
ডিফল্ট এসএমএস অ্যাপ হিসাবে ব্যবহার করুনSignal কে আপনার ডিফল্ট এসএমএস অ্যাপ করতে আলতো চাপুন।সিস্টেম এসএমএস আমদানি করুন
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index 1a398fc27..ff9feafe7 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -467,6 +467,7 @@
Zahtjevi za članstvo na čekanjuNema zahtjeva za članstvo.
+ Osobe s ovog popisa pokušavaju pristupiti grupi putem linka za grupu.Uvršten/a \"%1$s\"Odbijen/a \"%1$s\"
@@ -637,6 +638,7 @@
Uskoro: linkovi za grupeAžurirajte Signal da biste mogli koristiti grupne linkovePristupanje grupi putem linka nije još podržano u Signalu. To će biti moguće u jednoj od narednih verzija.
+ Verzija Signala koju koristite ne podržava linkove za grupu. Instalirajte zadnju verziju da biste se mogli priključiti ovoj grupi putem linka.Ažurirajte SignalLink za grupu nije ispravan
@@ -884,10 +886,25 @@
%1$s je promijenio/la ovlasti za upravljanje članstvom u grupi na \"%2$s\".Ko može upravljati članstvom u grupi promijenjeno je u \"%1$s\".
+ Aktivirali ste link za grupu bez administratorskog odobrenja.
+ Aktivirali ste link za grupu sa administratorskim odobrenjem.
+ Isključili ste link za grupu.
+ %1$s je aktivirao/la link za grupu bez administratorskog odobrenja.
+ %1$s je aktivirao/la link za grupu sa administratorskim odobrenjem.
+ %1$s je isključio/la link za grupu.
+ Link za grupu aktiviran je bez administratorskog odobrenja.
+ Link za grupu aktiviran je sa administratorskim odobrenjem.
+ Link za grupu je isključen.
+ Kreirali ste iznova link za grupu.
+ %1$s je iznova kreirao/la link za grupu.
+ Link za grupu iznova je kreiran.
+ Pristupili ste grupi putem linka za grupu.
+ %1$s je pristupio/la grupi putem linka za grupu.Poslali ste zahtjev za pristupanje grupi.
+ %1$s traži odobrenje da pristupi grupi putem linka za grupu.%1$s odobrio/la je Vaš zahtjev za pristupanje grupi.%1$s odobrio/la je zahtjev za pristupanje grupi koji je uputio/la %2$s.
@@ -1476,6 +1493,7 @@
Promjene sigurnosnog brojaSvakako pošalji
+ Svakako nazoviOve su osobe možda iznova instalirale Signal ili promijenile uređaj. Potvrdite svoj sigurnosni broj s njima da osigurate privatnost.PregledRanije potvrđeno
@@ -1777,6 +1795,7 @@
SporaPomoćNapredno
+ Donirajte za SignalPrivatnostMMS User AgentRučna MMS podešavanja
@@ -1790,6 +1809,8 @@
Poruke i datotekeMemorijaMaksimalni broj poruka
+ Zadrži poruke
+ Izbriši historiju porukaPovezani uređajiSvijetlaTamna
@@ -1819,17 +1840,34 @@
Prilikom korištenja Wi-Fi konekcijePrilikom roamingaAutomatsko preuzimanje datoteka
+ Historija porukaKorištenje memorijeSlikeVideozapisiDatotekeZvukProvjerite memoriju
+ Izbrisati starije poruke?
+ Izbrisati historiju poruka?
+ Ovo će bespovratno izbrisati svu historiju poruka i datoteke s Vašeg uređaja koji su stariji od %1$s.
+ Ovo će bespovratno svesti sve konverzacije na %1$s posljednjih poruka.
+ Ovo će bespovratno izbrisati svu historiju poruka i datoteke s Vašeg uređaja.
+ Jeste li sigurni da želite izbrisati historiju poruka?
+ Cijela historija poruka bit će bespovratno uklonjena. Ova se akcija ne može opozvati.
+ Izbriši sve odmah
+ Zauvijek
+ 1 godina
+ 6 mjeseci
+ 30 danaNijedno
+ %1$s poruka
+ Ostalo
+ Maksimalni broj porukaKoristi sistemske emoji sličiceOnemogući Signalovu ugrađenu podršku za emoji sličicePreusmjeri sve pozive na Signal server kako bi Vaša IP adresa bila skrivena od sagovornika. Aktiviranjem ove opcije smanjit će se kvalitet poziva.Uvijek preusmjeri pozive
+ Ko može…Pristup aplikacijiKomunikacijaRazgovori
@@ -1854,6 +1892,7 @@
Obavijesti mePrimiti obavještenja kad Vas neko spomene u prigušenim konverzacijamaPodesite korisničko ime
+ Prilagodi
@@ -1943,15 +1982,15 @@
Kopiraj u međuspremnikUporedi sa međuspremnikom
- Vaša je verzija Signala stara
-
+
+
+
+
+
Koristi kao glavnu aplikaciju za SMSPritisnite da Signal učinite svojom glavnom aplikacijom za slanje SMS porukaUnesi sistemske SMS poruke
@@ -2160,6 +2199,14 @@
Signal registracija – potvrda kōda za AndroidNikadNepoznato
+ Vidi moj telefonski broj
+ Pronađi me putem telefonskog broja
+ Svako
+ Moji kontakti
+ Niko
+ Vaš telefonski broj bit će dostupan svim osobama i grupama s kojima razmijenite poruke.
+ Svako ko ima Vaš telefonski broj zabilježen među kontaktima vidjet će Vas i među svojim kontaktima na Signalu. Drugi će Vas moći pronaći pomoću pretrage.
+ Samo Vaši kontakti moći će vidjeti Vaš telefonski broj na Signalu.Zaključavanje ekranaZaključaj pristup Signalu pomoću Androidovog zaključavanja ekrana ili otiska prstaZaključavanje ekrana nakon neaktivnosti
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 3a0066603..a00f7bd4d 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -1717,6 +1717,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
LentAjudaAvançat
+ Feu una donació a SignalPrivadesaAgent usuari dels MMSConfiguració manual dels MMS
@@ -1884,14 +1885,14 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
Copia al porta-retallsCompara amb el porta-retalls
- La vostra versió del Signal és obsoleta
-
+
+
+
+
+
Usa-la com a aplicació d\'SMS predeterminadaPremeu per establir el Signal com a aplicació predeterminada per a SMS.Importació dels SMS del sistema
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index e08a592e2..736f872d6 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -485,6 +485,7 @@
Čekající žádosti o členstvíŽdáné žádosti o členství k zobrazení
+ Lidé na tomto seznamu se pokouší připojit k této skupině pomocí skupinového odkazu.Přidán \"%1$s\"Odmítnut \"%1$s\"
@@ -664,6 +665,7 @@
Těšte se na skupinové odkazyAktualizujte Signal pro používání skupinových odkazůPřipojení ke skupině pomocí odkazu ještě není v Signalu podporováno. Tato funkce bude zahrnuta v nadcházející aktualizaci.
+ Verze Signalu, kterou používáte, nepodporuje skupinové odkazy. Aktualizujte na nejnovější verzi pro připojení k této skupině pomocí odkazu.Aktualizovat SignalSkupinový odkaz je neplatný
@@ -923,10 +925,25 @@
%1$s změnil, kdo může upravovat členství ve skupině, na \"%2$s\".Osoba oprávněná upravovat členství ve skupině byla změněna na \"%1$s\".
+ Zapnuli jste skupinový odkaz bez schvalování správcem.
+ Zapnuli jste skupinový odkaz se schvalováním správcem.
+ Vypnuli jste skupinový odkaz.
+ %1$s zapnul skupinový odkaz bez schvalování správcem.
+ %1$s zapnul skupinový odkaz se schvalováním správcem.
+ %1$s vypnul skupinový odkaz.
+ Skupinový odkaz bez schvalování správcem byl zapnut.
+ Skupinový odkaz se schvalováním správcem byl zapnut.
+ Skupinový odkaz byl vypnut.
+ Obnovili jste skupinový odkaz.
+ %1$s obnovil skupinový odkaz.
+ Skupinový odkaz byl obnoven.
+ Připojili jste se ke skupině pomocí skupinového odkazu.
+ %1$s se připojil ke skupině pomocí skupinového odkazu.Odeslali jste požadavek na vstup do skupiny.
+ %1$s požádal o připojení pomocí skupinového odkazu.%1$s schválil váš požadavek na připojení ke skupině.%1$s schválil požadavek na připojení ke skupině od %2$s.
@@ -1521,6 +1538,7 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
Změny bezpečnostního číslaPřesto poslat
+ Přesto zavolatNásledující lidé možná přeinstalovali nebo změnili zařízení. Ověřte s nimi své bezpečnostní číslo pro zajištění soukromí.ZobrazitPředchozí ověřeno
@@ -1830,6 +1848,7 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
PomaluNápovědaRozšířené možnosti
+ Podpořte Signal finančněSoukromíMMS User AgentManuální nastavení MMS
@@ -1843,6 +1862,8 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
Konverzace a médiaÚložištěLimit délky konverzací
+ Zachovat zprávy
+ Vyčistit historii zprávPropojená zařízeníSvětlýTmavý
@@ -1872,17 +1893,32 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
Při použití WiFiPři roaminguAutomatické stahování multimédií
+ Historie zprávVyužití úložištěFotografieVideaSouboryAudioZkontrolovat úložiště
+ Smazat starší zprávy?
+ Smazat historii zpráv?
+ Tímto trvale zkrátíte všechny konverzace na %1$s nejnovějších zpráv.
+ Jste si jistí, že chcete smazat celou historii zpráv?
+ Celá historie zpráv bude trvale odstraněna. Tuto akci nelze vrátit zpět.
+ Vše nyní smazat
+ Navždy
+ 1 rok
+ 6 měsíců
+ 30 dníNic
+ %1$s zpráv
+ Vlastní
+ Vlastní limit délky konverzacePoužít systémové smajlíkyZakázat použití interních smajlíků aplikace Signal Přenášet všechna volání přes servery Signal, aby nedošlo k odhalení vaší IP adresy volanému. Povolením dojde ke zhoršení kvality hovoru.Vždy předávat hovory
+ Kdo může…Přístup aplikaceKomunikaceKonverzace
@@ -1907,6 +1943,7 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
Upozornit mnePřijmout upozornění při zmínce ve ztišených rozhovorechNastavit uživatelské jméno
+ Nastavit předvolbu
@@ -1996,16 +2033,16 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
Zkopírovat do schránkyPorovnat se schránkou
- Vaše verze aplikace Signal je zastaralá
-
+
+
+
+
+
Nastavit jako výchozí aplikaci pro SMSKlepnutím nastavíte Signal jako výchozí SMS aplikaci.Importovat SMS ze systému
@@ -2221,6 +2258,14 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
Registrace Signalu - ověřovací kód pro AndroidNikdyNeznámý
+ Vidět mé telefonní číslo
+ Najít mé telefonní číslo
+ Všichni
+ Moje kontakty
+ Nikdo
+ Vaše telefonní číslo bude viditelné pro všechny lidi a skupiny, kterým pošlete zprávu.
+ Kdokoli, kdo má vaše telefonní číslo ve svých kontaktech, vás bude vidět jako kontakt v Signalu. Ostatní vás budou schopni najít vyhledáváním.
+ Pouze vaše kontakty budou v Signalu vidět vaše telefonní číslo.Zámek obrazovkyZamknout přístup k Signalu zámkem obrazovky Androidu nebo otiskem prstuČasový limit neaktivity zámku obrazovky
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 362654d37..b052451d8 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -1931,16 +1931,16 @@ Send neges heb ei ddiogelu?Copïo i\'r clipfwrddCymharu â\'r clipfwrdd
- Mae\'ch fersiwn o Signal yn hen
-
+
+
+
+
+
Defnyddio fel yr ap SMS rhagosodedigTapio i wneud Signal eich ap SMS.Mewnforio SMS y system
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 564899d0a..f05cea782 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -860,7 +860,7 @@
Du nulstiller gruppelinket.%1$s nulstiller gruppelinket.
- Gruppelink blev nulstillet.
+ Gruppelinket blev nulstillet.Du deltager i gruppen via gruppelinket.%1$s deltager i gruppen via gruppelinket.
@@ -1741,6 +1741,7 @@ Modtog en nøgle besked, for en ugyldig protokol-version
LangsomHjælpAvanceret
+ Doner til SignalPrivatlivMMS brugeragentManuelle MMS indstillinger
@@ -1794,9 +1795,7 @@ Modtog en nøgle besked, for en ugyldig protokol-version
Vis hukommelseSlet ældre beskeder?Ryd beskedhistorik?
- Dette sletter al beskedhistorik og medier permanent fra din enhed, der er ældre end %1$s.Dette vil reducere alle samtaler permanent til de %1$s seneste beskeder.
- Dette sletter al beskedhistorik og medier permanent fra din enhed.Er du sikker på, du vil slette al beskedhistorik?Al beskedhistorik fjernes permanent. Denne handling kan ikke fortrydes.Slet det hele nu
@@ -1927,14 +1926,14 @@ Modtog en nøgle besked, for en ugyldig protokol-version
Kopiér til udklipsholderSammenlign med udklipsholder
- Din version af Signal er forældet
-
+
+
+
+
+
Anvend som standard SMS appTap for at gøre Signal til din standard SMS appImportér system SMS\'er
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 2a194a47e..d2acfa336 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -284,7 +284,7 @@
Nachrichten werden gelöscht …Für mich löschenFür jeden löschen
- Diese Nachricht wird für jeden Teilnehmer der Unterhaltung dauerhaft gelöscht. Gruppenmitglieder werden sehen können, dass du eine Nachricht gelöscht hast.
+ Diese Nachricht wird für jeden Teilnehmer der Unterhaltung unwiderruflich gelöscht. Gruppenmitglieder werden sehen können, dass du eine Nachricht gelöscht hast.Originalnachricht nicht gefundenOriginalnachricht nicht mehr verfügbarNachricht konnte nicht geöffnet werden
@@ -586,7 +586,7 @@
QR-CodePersonen, die diesen Code einscannen, können deiner Gruppe beitreten. Neue Mitglieder müssen jedoch von einem Admin bestätigt werden, falls du diese Einstellung eingeschaltet hast.
- Code teilen
+ QR-Code teilenMöchtest du deine an %1$s versendete Einladung widerrufen?
@@ -847,14 +847,14 @@
%1$s hat die Bearbeitungsberechtigten für die Gruppenmitgliedschaft zu »%2$s« geändert.Die Bearbeitungsberechtigten für die Gruppenmitgliedschaft wurden zu »%1$s« geändert.
- Du hast den Gruppen-Link ohne Admin-Bestätigung aktiviert.
- Du hast den Gruppen-Link mit Admin-Bestätigung aktiviert.
+ Du hast den Gruppen-Link mit ausgeschalteter Admin-Bestätigung aktiviert.
+ Du hast den Gruppen-Link mit eingeschalteter Admin-Bestätigung aktiviert.Du hast den Gruppen-Link deaktiviert.
- »%1$s« hat den Gruppen-Link ohne Admin-Bestätigung aktiviert.
- »%1$s« hat den Gruppen-Link mit Admin-Bestätigung aktiviert.
+ »%1$s« hat den Gruppen-Link mit ausgeschalteter Admin-Bestätigung aktiviert.
+ »%1$s« hat den Gruppen-Link mit eingeschalteter Admin-Bestätigung aktiviert.»%1$s« hat den Gruppen-Link deaktiviert.
- Der Gruppen-Link ohne Admin-Bestätigung wurde aktiviert.
- Der Gruppen-Link mit Admin-Bestätigung wurde aktiviert.
+ Der Gruppen-Link wurde mit ausgeschalteter Admin-Bestätigung aktiviert.
+ Der Gruppen-Link wurde mit eingeschalteter Admin-Bestätigung aktiviert.Der Gruppen-Link wurde deaktiviert.Du hast den Gruppen-Link zurückgesetzt.
@@ -1569,7 +1569,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenVerifiziere deine RufnummerBitte gib deine Rufnummer ein, um einen Verifikationscode zu erhalten. Dabei können Mobilfunkgebühren anfallen.
- Name/Rufnummer eingeben
+ Name/Nummer eingebenMitglieder hinzufügenDer Absender ist nicht in deiner Kontaktliste
@@ -1730,6 +1730,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenLangsamHilfeWeitere Einstellungen
+ An Signal spendenDatenschutzMMS-Benutzer-AgentManuelle MMS-Einstellungen
@@ -1783,9 +1784,9 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenSpeicherinhalte überprüfenÄltere Nachrichten löschen?Nachrichtenverlauf löschen?
- Dies wird alle Nachrichtenverläufe und Medien, die älter als %1$s sind, dauerhaft von deinem Gerät löschen.
- Dies löscht sofort alle Nachrichten bis auf die letzten %1$s Nachrichten je Unterhaltung.
- Dies wird alle Nachrichtenverläufe und Medien dauerhaft von deinem Gerät löschen.
+ Dies wird alle Nachrichtenverläufe und Medieninhalte, die älter als %1$s sind, unwiderruflich von deinem Gerät löschen.
+ Dies wird alle Nachrichten bis auf die letzten %1$s Nachrichten je Unterhaltung unwiderruflich löschen.
+ Dies wird alle Nachrichtenverläufe und Medieninhalte unwiderruflich von deinem Gerät löschen.Möchtest du wirklich alle Nachrichtenverläufe löschen?Alle Nachrichtenverläufe werden dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.Alle jetzt löschen
@@ -1796,12 +1797,12 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenKeine%1$s NachrichtenPersonalisiert
- personalisierte Höchstzahl an Nachrichten
+ Höchstzahl an NachrichtenSystem-Emojis verwendenIntegrierte Emojis deaktivieren und stattdessen System-Emojis verwendenAlle Anrufe über den Signal-Server leiten, um die eigene IP-Adresse gegenüber Kontakten nicht offenzulegen. Dies verringert die Anrufqualität.Anrufe immer indirekt
- Wer kann…
+ Wer kann …App-ZugriffKommunikationUnterhaltungen
@@ -1826,7 +1827,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenMich benachrichtigenBenachrichtigungen erhalten, wenn du in stummgeschalteten Unterhaltungen erwähnt wirstBenutzername einrichten
- Einstellungen anpassen
+ Option anpassen
@@ -1871,7 +1872,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenSuchenAngeheftetUnterhaltungen
- Du kannst nur bis zu %1$d Unterhaltungen anheften
+ Du kannst maximal %1$d Unterhaltungen anheftenKontaktbildArchiviert
@@ -1916,14 +1917,14 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenIn Zwischenablage kopierenMit Zwischenablage vergleichen
- Deine Signal-Version ist veraltet
-
+
+
+
+
+
Als Standard-SMS-App verwendenAntippen, um Signal als Standard-SMS-App zu verwenden.System-SMS importieren
@@ -2125,14 +2126,14 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenSignal-Registrierung – Verifikationscode für AndroidNieUnbekannt
- meine Telefonnummer sehen
- mich über die Telefonnummer finden
+ meine Rufnummer sehen
+ mich über die Rufnummer findenJederMeine KontakteNiemand
- Deine Telefonnummer ist sichtbar für alle Personen und Gruppen, mit denen du dich unterhälst.
- Jeder, der deine Telefonnummer in seinen Kontakten hat, sieht dich als Kontakt in Signal. Andere können dich per Suche finden.
- Nur deine Kontakte sehen deine Telefonnummer in Signal.
+ Deine Rufnummer ist sichtbar für alle Personen und Gruppen, mit denen du dich unterhälst.
+ Jeder, der deine Rufnummer in seinen Kontakten gespeichert hat, sieht dich als Kontakt in Signal. Alle anderen können dich per Suche finden.
+ Nur deine Kontakte sehen deine Rufnummer in Signal.BildschirmsperreZugriff auf Signal mit Android-Bildschirmsperre oder Fingerabdruck sperrenAutom. Sperre bei Inaktivität
@@ -2141,7 +2142,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenPIN ändern
PIN-ErinnerungenPINs halten deine bei Signal gespeicherten Informationen verschlüsselt, sodass nur du auf sie zugreifen kannst. Falls du Signal erneut installierst, werden so dein Profil und deine Einstellungen und Kontakte wiederhergestellt.
- Als zusätzliches Sicherheitsmerkmal deine Signal-PIN erforderlich machen, sobald du deine Telefonnummer erneut bei Signal registrierst.
+ Als zusätzliches Sicherheitsmerkmal deine Signal-PIN erforderlich machen, sobald du deine Rufnummer erneut bei Signal registrierst.Erinnerungen helfen dir beim Merken deiner PIN, da diese nicht wiederhergestellt werden kann. Sie wird mit der Zeit seltener abgefragt.AusschaltenPIN bestätigen
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 7f2347106..747782c3b 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -879,7 +879,7 @@
Ακύρωσες το αίτημά σου για είσοδο στην ομάδα.Ο/Η %1$s ακύρωσε το αίτημά του/της για είσοδο στην ομάδα.
- Ο αριθμός ασφαλείας σπυ με τον/την %s έχει αλλάξει.
+ Ο αριθμός ασφαλείας σου με τον/την %s έχει αλλάξει.Σημείωσες τον αριθμό ασφαλείας σου με τον/την %s ως επιβεβαιωμένοΣημείωσες τον αριθμό ασφαλείας σου με τον/την %s ως επιβεβαιωμένο από άλλη συσκευήΣημείωσες τον αριθμό ασφαλείας σου με τον/την %s ως μη επιβεβαιωμένο
@@ -1736,6 +1736,7 @@
ΑργόΒοήθειαΓια προχωρημένους
+ Κάνε μια δωρεά στο SignalΙδιωτικότηταMMS User AgentΡυθμίσεις MMS
@@ -1923,14 +1924,14 @@
Αντιγραφή στο πρόχειροΣύγκριση με το πρόχειρο
- Η έκδοση του Signal σου είναι παλιά
-
+
+
+
+
+
Χρήση ως προκαθορισμένη εφαρμογή για τα SMSΠάτα για να κάνεις το Signal την προκαθορισμένη εφαρμογή για τα SMS.Εισαγωγή SMS συστήματος
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index e0ed6934a..14c13fa16 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -1888,14 +1888,14 @@ Ricevis mesaĝon pri interŝanĝo de ŝlosiloj por nevalida protokola versio.
Kopii al tondujoKompari kun la tondujo
- Via Signal-versio estas neĝisdata
-
+
+
+
+
+
Uzi kiel defaŭltan SMS-aplikaĵonTuŝetu, por ke Signal estu via defaŭlta SMS-aplikaĵo.Importi SMS-ojn el la sistemo
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 9dd7f46f1..dbf01509b 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1741,6 +1741,7 @@ Se recibió un mensaje de intercambio de claves para una versión no válida del
LentoAyudaAvanzado
+ Donar a SignalPrivacidadAgente de usuari* de MMSConfiguración manual de MMS
@@ -1880,7 +1881,7 @@ Se recibió un mensaje de intercambio de claves para una versión no válida del
Atajo a ajustesBuscar
- Fijado
+ Chat(s) fijado(s)ChatsPuedes fijar hasta %1$d chats destacados
@@ -1928,14 +1929,14 @@ Se recibió un mensaje de intercambio de claves para una versión no válida del
Copiar al portapapelesComparar con el portapapeles
- Tu versión de Signal está obsoleta
-
+
+
+
+
+
Usar como aplicación de SMS predeterminadaToca para hacer de Signal tu aplicación de SMS predeterminada.Importar SMS del sistema
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 87c2587ba..b4770d522 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -1660,6 +1660,7 @@
AeglaneAbiTäpsem
+ Anneta Signal-ilePrivaatsusMMS kasutajaagentKäsitsi määratud MMS-seaded
@@ -1826,14 +1827,14 @@
Kopeeri lõikelaualeVõrdle lõikelauaga
- Sinu Signali versioon on aegunud
-
+
+
+
+
+
Kasuta vaikimisi SMS-rakendusenaKoputa, et teha Signal SMSi vaikerakenduseks.Impordi süsteemi SMSid
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index fc3038a98..3a38e7a11 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -1773,14 +1773,14 @@ Inportatu \'SMSBackup and Restorekin\' bateragarria den enkriptatu gabeko babesk
Kopiatu arbeleraArbelarekin konparatu
- Zure Signal bertsioa zaharkitua dago
-
+
+
+
+
+
Lehenetsitako SMS aplikazio gisa erabiliUkitu Signal zure SMS aplikazio lehenetsia bihurtzekoImportatu sistemaren SMS mezuak
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 44a37f623..ec1068764 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -1841,14 +1841,14 @@
کپی به کلیپ بوردمقایسه با کلیپ بورد
- نسخه Signal شما قدیمی است.
-
+
+
+
+
+
استفاده به صورت برنامهٔ پیشفرض پیامکبرای تبدیل Signal به برنامهٔ پیشفرض پیامک خود ضربه بزنید.وارد کردن پیامکهای سیستم
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index e3e78351d..e190c8b0c 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -449,6 +449,7 @@
Odottavat jäsenpyynnötEi odottavia jäsenpyyntöjä.
+ Tässä luettelossa olevat henkilöt yrittävät liittyä ryhmään ryhmälinkin kautta.Lisäsi \"%1$s\"Hylkäsi \"%1$s\"
@@ -610,6 +611,7 @@
Ryhmälinkit tulossa pianPäivitä Signal käyttääksesi ryhmälinkkejäSignal ei vielä tue ryhmään liittymistä linkin kautta. Tämä ominaisuus julkaistaan tulevassa päivityksessä.
+ Käyttämäsi versio Signalista ei tue ryhmälinkkejä. Päivitä uusimpaan versioon liittyäksesi tähän ryhmään linkin kautta.Päivitä SignalRyhmälinkki ei ole kelvollinen
@@ -845,10 +847,19 @@
%1$s muutti kuka voi muokata ryhmän jäsenyyttä käyttäjiin \"%2$s\".Ryhmän jäsenyyttä voi nyt muokata \"%1$s\".
+ Poistit ryhmälinkin käytöstä.
+ %1$s poisti ryhmälinkin käytöstä.
+ Ryhmälinkki on poistettu käytöstä.
+ Sinä uudelleenasetit ryhmälinkin.
+ %1$s uudelleenasetti ryhmälinkin.
+ Ryhmälinkki on asetettu uudelleen.
+ Liityit ryhmään ryhmälinkin kautta.
+ %1$s liittyi ryhmään ryhmälinkin kautta.Lähetit pyynnön liittyä ryhmään.
+ %1$s pyytää liittyä ryhmään ryhmälinkin kautta.%1$s hyväksyi pyyntösi liittyä ryhmään.%1$s hyväksyi henkilön %2$s pyynnön liittyä ryhmään.
@@ -1424,6 +1435,7 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
Turvanumeroiden vaihdotLähetä joka tapauksessa
+ Soita joka tapauksessaSeuraavat henkilöt ovat saattaneet uudelleenasentaa tai vaihtaneet laitteita. Varmenna turvanumerosi heidän kanssaan yksityisyyden takaamiseksi.NäytäAikaisemmin varmennettu
@@ -1717,6 +1729,7 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
HidasTuki Lisäasetukset
+ Lahjoita SignalilleYksityisyysMMS User AgentManuaaliset MMS-asetukset
@@ -1730,6 +1743,8 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
Keskustelut ja liitetiedostotTallennustilaKeskustelun pituusraja
+ Säilytä viestit
+ Tyhjennä viestihistoriaYhdistetyt laitteetVaaleaTumma
@@ -1759,18 +1774,34 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
Wi-Fi-verkossaRoaming-tilassaLiitetiedostojen automaattinen lataus
+ ViestihistoriaTallennustilan käyttöKuvatVideotTiedostotÄänitiedostoTarkista tallennustila
+ Poistetaanko vanhemmat viestit?
+ Tyhjennetäänkö viestihistoria?
+ Tämä poistaa pysyvästi kaikki viestit ja mediatiedostot laitteeltasi, jotka ovat vanhempia kuin %1$s.
+ Tämä rajaa kaikki keskustelut pysyvästi %1$s viimeisimpään viestiin.
+ Tämä poistaa pysyvästi kaikki viestit ja mediatiedostot laitteeltasi.
+ Haluatko varmasti poistaa kaiken viestihistorian?
+ Kaikki viestihistoria poistetaan pysyvästi. Tätä toimintoa ei voi kumota.
+ Poista kaikki nyt
+ Ikuisesti
+ 1 vuosi
+ 6 kuukautta
+ 30 päivääEi mitään
+ %1$s viestiäMukautettu
+ Mukautettu keskustelun pituusrajaKäytä järjestelmän hymiöitäOta Signalin oletushymiöt pois käytöstäVälitä kaikki puhelut Signal-palvelimen kautta välttääksesi IP-osoitteesi paljastumista yhteystiedollesi. Tämä toiminto heikentää puhelun laatua.Välitä aina kaikki puhelut
+ Kuka voi…Sovelluksen käyttöKommunikointiKeskustelut
@@ -1795,6 +1826,7 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
Ilmoita minulleVastaanota ilmoituksia, kun sinut mainitaan mykistetyissä keskusteluissaAseta käyttäjätunnus
+ Mukauta vaihtoehto
@@ -1884,14 +1916,14 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
Kopioi leikepöydälleVertaa leikepöytään
- Käyttämäsi Signalin versio on vanhentunut!
-
+
+
+
+
+
Käytä oletuksena tekstiviesteille?Napauta, jos haluat tehdä Signalista oletustekstiviestisovelluksesi.Tuo järjestelmän tekstiviestit
@@ -2093,7 +2125,14 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
Signalin rekisteröinti - vahvistuskoodi Androidilleei koskaanTuntematon
- Ei kenellekkään
+ Nähdä minun puhelinnumero
+ Löytää minut puhelinnumeron perusteella
+ Kaikki
+ Yhteystietoni
+ Ei kukaan
+ Puhelinnumerosi näkyy kaikille ihmisille ja ryhmille, joille lähetät viestejä.
+ Jokainen, jolla on puhelinnumerosi yhteystiedoissa, näkee sinut yhteystietona Signalissa. Muut voivat löytää sinut haun kautta.
+ Vain yhteystietosi näkevät puhelinnumerosi Signalissa.Näytön lukitusLukitse Signal Androidin näytön lukituksella tai sormenjäljelläAutomaattisen näytön lukituksen odotusaika
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index c3062413d..798e8e8d9 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -449,6 +449,7 @@
Demandes de membres en attenteIl n’y a aucune demande de membre à afficher.
+ Des personnes de cette liste tentent de se joindre à ce groupe grâce au lien de groupe.« %1$s » a été ajouté« %1$s » a été refusé
@@ -845,11 +846,17 @@
%1$s a changé qui peut modifier les membres du groupe en « %2$s ».Qui peut modifier les membres du groupe a été changé en « %1$s ».
- Vous avez activé le lien de groupe partageable avec approbation d’un administrateur.
- Vous avez désactivé le lien de groupe partageable.
+ Vous avez activé le lien de groupe et l’approbation d’un administrateur est désactivée.
+ Vous avez activé le lien de groupe et l’approbation d’un administrateur est activée.
+ Vous avez désactivé le lien de groupe.
+ %1$s a activé le lien de groupe et l’approbation d’un administrateur est désactivée.
+ %1$s a activé le lien de groupe et l’approbation d’un administrateur est activée.
+ Le lien de groupe a été activé et l’approbation d’un administrateur est désactivée.
+ Le lien de groupe a été activé et l’approbation d’un administrateur est activée.
+ Vous avez réinitialisé le lien de groupe.
- Vous avez rejoint le groupe grâce au lien de groupe.
+ Vous êtes joint au groupe grâce au lien de groupe.Vous avez demandé à vous joindre au groupe.
@@ -1716,6 +1723,7 @@
LentAide Avancés
+ Faire un don à SignalConfidentialitéAgent utilisateur MMSParamètres manuels de messagerie multimédia
@@ -1765,7 +1773,7 @@
SonÉtat de la mémoire1 an
- Aucune
+ AucunPersonnaliséUtiliser les émojis du systèmeDésactiver la prise en charge des émojis intégrés à Signal
@@ -1837,7 +1845,7 @@
Raccourci des paramètresChercher
- Épinglé
+ ÉpingléeConversationsVous pouvez seulement épingler jusqu’à %1$d conversations
@@ -1884,14 +1892,14 @@
Copier dans le presse-papiersComparer avec le presse-papiers
- Votre version de Signal est désuète
-
+
+
+
+
+
Utiliser comme appli de textos par défautTouchez pour faire de Signal votre appli de texto par défaut.Importer les textos du système
diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml
index 6a38ed60a..cc74a0e1c 100644
--- a/app/src/main/res/values-ga/strings.xml
+++ b/app/src/main/res/values-ga/strings.xml
@@ -1071,10 +1071,10 @@ a shonrú
Macasamhlaigh chuig an ghearrthaisceCuir i gcomórtas leis an ngearrthaisce
- Tá an leagan de Signal a bhfuil agat seanda
- Rachaidh do leagan Signal as bhfeidhm inniu. Cnag chun é a nuashonrú chuig an leagan is deanaí.
- Tá an leagan de Signal atá agat as feidhm!
- Ní sheolfar go rathúil teachtaireachtaí a thuilleadh. Cnag chun é a nuashonrú chuig an leagan is déanaí.
+
+
+
+
Úsáid mar aip SMS réamhshocrúCnag chun Signal a úsáid mar aip SMS réamhshocrúTabhair isteach SMS an chórais
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 39d873089..9f14e1449 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -1560,14 +1560,14 @@
Copiar ao portapapeisComparar co portapapeis
- A túa versión de Signal está desactualizada
-
+
+
+
+
+
Aplicación predefinida das SMSToca para facer de Signal a túa aplicación predefinida de SMSImportar SMS do sistema
diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml
index 47e08356d..ce72c41da 100644
--- a/app/src/main/res/values-gu/strings.xml
+++ b/app/src/main/res/values-gu/strings.xml
@@ -1432,14 +1432,14 @@
ક્લિપબોર્ડ પર કૉપી કરેલુંક્લિપબોર્ડ સાથે તુલના કરો
- તમારું Signal નું વર્ઝન જૂનું છે
-
+
+
+
+
+
ડિફોલ્ટ SMS એપ્લિકેશન તરીકે ઉપયોગ કરોતમારી ડિફોલ્ટ SMS એપ્લિકેશન Signal બનાવવા માટે ટેપ કરો.સિસ્ટમ SMS ઇમ્પોર્ટ કરો
diff --git a/app/src/main/res/values-ha/strings.xml b/app/src/main/res/values-ha/strings.xml
index 8981f8951..1c5f0f9a9 100644
--- a/app/src/main/res/values-ha/strings.xml
+++ b/app/src/main/res/values-ha/strings.xml
@@ -1436,14 +1436,14 @@
Kwafa zuwa allon rubutuHada da allon rubutu
- Sigar Signal dinka/ki ya tsufa
-
+
+
+
+
+
Yi amfani dashi a matsayin tanadadden manhajar SMSTaba domin mayar da Signal tanadadden manhajarka/ki wajen tura sakonin SMS dinka/ki.Shigar da SMS din na\'ura
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 98734aa1e..ba711d776 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -1443,14 +1443,14 @@
क्लिपबोर्ड पर कॉपी करेंक्लिपबोर्ड के साथ तुलना करें
- Signal का आपका वर्ज़न पुराना है
-
+
+
+
+
+
डिफ़ॉल्ट SMS ऐप के रूप में उपयोग करेंअपने डिफ़ॉल्ट SMS ऐप को Signal करने के लिए टैप करेंसिस्टम SMS आयात करें
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 029048910..7a82e44f9 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -1462,15 +1462,15 @@ Uvezi nekriptiranu kopiju. Kompatibilno s \'SMSBackup And Restore\'.
Kopiraj u međuspremnikUsporedi s međuspremnikom
- Vaša Signal inačica je istekla!
-
+
+
+
+
+
Koristi kao zadanu SMS aplikacijuPritisnite kako biste postavili Signal kao zadanu SMS aplikaciju.Uvezi SMS poruke sustava
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 5a400dba2..c6a258adc 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -1726,6 +1726,7 @@ Kulcs-csere üzenet érkezett érvénytelen protokoll verzióhoz.
LassúSúgóHaladó
+ Adomány a Signal számáraAdatvédelemMMS User AgentManuális MMS beállítások
@@ -1893,14 +1894,14 @@ Kulcs-csere üzenet érkezett érvénytelen protokoll verzióhoz.
Másolás vágólapraÖsszehasonlítás vágólappal
- A Signal-od verziója elavult
-
+
+
+
+
+
Alapértelmezett SMS alkalmazásKoppints a Signal alapértelmezett SMS alkalmazássá tételéhez.SMS-ek importálása
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 5622c9f1b..86d64938f 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -1593,13 +1593,13 @@ Menerima pesan pertukaran kunci untuk versi protokol yang tidak valid.
Salin ke papan klipBandingkan dengan papan klip
- Versi Signal Anda terlalu lama
-
+
+
+
+
+
Gunakan sebagai aplikasi SMS utamaKetuk untuk membuat Signal menjadi aplikasi SMS utama Anda.Impor sistem SMS
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 37ceead22..795b1ec93 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -449,6 +449,7 @@
Richieste di diventare membro in attesaNessuna richiesta di diventare membro da mostrare.
+ Le persone in questo elenco stanno tentando di unirsi a questo gruppo tramite il link del gruppo.Aggiunto \"%1$s\"Rifiutato \"%1$s\"
@@ -610,6 +611,7 @@
Link dei gruppi presto disponibiliAggiorna Signal per utilizzare i link dei gruppiUnirsi a un gruppo tramite un link non è ancora supportato da Signal. Questa funzione verrà rilasciata in un prossimo aggiornamento.
+ La versione di Signal che stai utilizzando non supporta i link dei gruppi. Aggiorna alla versione più recente per unirti a questo gruppo tramite link.Aggiorna SignalIl link del gruppo non è valido
@@ -848,12 +850,22 @@
Hai attivato il link del gruppo senza l\'approvazione degli amministratori.Hai attivato il link del gruppo con l\'approvazione degli amministratori.Hai disattivato il link del gruppo.
+ %1$s ha attivato il link del gruppo senza l\'approvazione degli amministratori.
+ %1$s ha attivato il link del gruppo con l\'approvazione degli amministratori.
+ %1$s ha disattivato il link del gruppo.
+ Il link del gruppo è stato attivato senza l\'approvazione degli amministratori.
+ Il link del gruppo è stato attivato con l\'approvazione degli amministratori.
+ Il link del gruppo è stato disattivato.Hai reimpostato il link del gruppo.
+ %1$s ha reimpostato il link del gruppo.
+ Il link del gruppo è stato reimpostato.Ti sei unito al gruppo tramite il link del gruppo.
+ %1$s si è unito al gruppo tramite il link del gruppo.Hai inviato una richiesta a unirsi al gruppo.
+ %1$s ha richiesto di unirsi tramite il link del gruppo.%1$s ha approvato la tua richiesta di unirti al gruppo.%1$s ha approvato una richiesta di unirsi al gruppo da %2$s.
@@ -1435,6 +1447,7 @@
Modifiche al numero di sicurezzaInvia comunque
+ Chiama comunqueLe seguenti persone potrebbero aver reinstallato o cambiato i dispositivi. Verifica il tuo numero di sicurezza con loro per garantire la privacy.MostraVerificato in precedenza
@@ -1728,6 +1741,7 @@
LentoAiutoAvanzate
+ Dona a SignalPrivacyUser agent MMSImpostazioni manuali MMS
@@ -1741,6 +1755,8 @@
Chat e downloadMemoriaLimite di lunghezza conversazione
+ Conserva i messaggi
+ Cancella la cronologia dei messaggiDispositivi collegatiChiaroScuro
@@ -1770,19 +1786,34 @@
Via Wi-FiIn roamingDownload automatico file
+ Cronologia dei messaggiUtilizzo memoriaFotoVideoFileAudioEsamina memoria
+ Eliminare i messaggi più vecchi?
+ Cancellare la cronologia dei messaggi?
+ Questo eliminerà permanentemente tutta la cronologia dei messaggi e i contenuti multimediali dal tuo dispositivo più vecchi di %1$s.
+ Questo ridurrà permanentemente tutte le conversazioni ai %1$s messaggi più recenti.
+ Questo eliminerà permanentemente tutta la cronologia dei messaggi e i contenuti multimediali dal tuo dispositivo.
+ Sei sicuro di voler eliminare tutta la cronologia dei messaggi?
+ Tutta la cronologia dei messaggi verrà rimossa definitivamente. Questa azione non può essere annullata.
+ Elimina tutto ora
+ Per sempre1 anno
+ 6 mesi
+ 30 giorniNessuno
+ %1$s messaggiPersonalizzato
+ Limite di lunghezza delle conversazioni personalizzatoUsa le emoji di sistemaDisattiva le emoji di SignalRitrasmetti le chiamate attraverso i server di Signal per non rivelare il tuo indirizzo IP ai tuoi contatti. Abilitandolo verrà ridotta la qualità della chiamata.Ritrasmetti sempre le chiamate
+ Chi può…Accesso appComunicazioneConversazioni
@@ -1807,6 +1838,7 @@
NotificamiRicevi le notifiche quando vieni menzionato nelle chat mutateImposta un nome utente
+ Personalizza opzione
@@ -1896,14 +1928,14 @@
Copia negli appuntiConfronta con gli appunti
- La tua versione di Signal è vecchia
-
+
+
+
+
+
Usa come app per tutti gli SMSTocca per usare Signal come applicazione di default per gli SMS.Importa gli SMS di sistema
@@ -2105,7 +2137,13 @@
Registrazione Signal - Codice di verifica per AndroidMaiSconosciuto
+ Vedere il mio numero di telefono
+ Trovarmi tramite numero di telefono
+ Chiunque
+ I miei contattiNessuno
+ Il tuo numero di telefono sarà visibile a tutte le persone e ai gruppi a cui invii messaggi.
+ Chiunque abbia il tuo numero nei suoi contatti telefonici lo vedrà anche su Signal. Gli altri potranno trovarti nella ricerca.Solo i tuoi contatti vedranno il tuo numero di telefono su Signal.Blocco schermoBlocca l\'accesso a Signal con il blocco schermo di Android o la tua impronta digitale
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index f2b0a492c..79cf242fe 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -1831,6 +1831,7 @@
איטיעזרהמתקדם
+ תרום אל Signalפרטיותסוכן משתמש MMSהגדרות MMS ידניות
@@ -1998,16 +1999,16 @@
העתק ללוח העריכההשווה עם לוח העריכה
- גרסת Signal שלך אינה עדכנית
-
+
+
+
+
+
השתמש כיישום המסרונים ברירת המחדלהקש כדי להפוך את Signal ליישום המסרונים ברירת המחדל שלך.ייבא מסרוני מערכת
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index f3e6984af..3eff9874d 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -431,6 +431,7 @@
保留中のメンバー申請メンバー申請はありません。
+ このリストの人々が、グループリンクからグループ参加を申請しています。「%1$s」を追加しました「%1$s」を拒否しました
@@ -583,6 +584,7 @@
グループリンクのご案内グループリンクを使用するためSignalをアップデートリンク経由でのグループ参加は、Signalではまだ対応していません。この機能は今後のアップデートで提供されます。
+ このバージョンのSignalはグループリンクをサポートしていません。リンク経由でこのグループに参加するには、最新バージョンにアップデートしてください。Signalをアップデートグループリンクが正しくありません
@@ -807,12 +809,18 @@
グループ情報を編集できるユーザーが「%1$s」に変更されました。グループリンクを無効にしました。
+ %1$s がグループリンクを無効にしました。
+ グループリンクが無効になりました。グループリンクをリセットしました。
+ %1$s がグループリンクをリセットしました。
+ グループリンクがリセットされました。グループリンクからグループに参加しました。
+ %1$s がグループリンクからグループに参加しました。グループ参加を申請しました。
+ %1$s がグループリンクから参加を申請しました。%1$s がグループ参加申請を承認しました。%1$s が %2$s からのグループ参加申請を承認しました。
@@ -1377,6 +1385,7 @@
安全番号の変更とにかく送信する
+ とにかく発信する以下の方はアプリを再インストールしたか端末を変更した可能性があります。プライバシーを保証するために安全番号を検証してください。表示する以前に検証済み
@@ -1662,6 +1671,7 @@
遅いヘルプ詳細設定
+ Signalへの寄付プライバシーMMSユーザエージェント手動MMS設定
@@ -1675,6 +1685,8 @@
チャットとメディアストレージ会話の長さ制限
+ メッセージの保存期間
+ メッセージ履歴を消去するリンク済み端末ライトダーク
@@ -1704,15 +1716,27 @@
Wi-Fi利用時ローミング時メディアの自動ダウンロード
+ メッセージ履歴ストレージ使用量写真動画ファイル音声ストレージを確認
+ より古いメッセージを消去しますか?
+ メッセージ履歴を消去しますか?
+ すべての会話で最新%1$s件のメッセージを残して完全に削除します。
+ 本当にすべてのメッセージ履歴を削除しますか?
+ すべてのメッセージ履歴を完全に削除します。取り消しはできません。
+ すべて削除する
+ 永久1年
+ 6か月
+ 30日なし
+ %1$s件カスタム
+ 会話の長さ制限システムの絵文字を使うSignal独自の絵文字を無効にしますすべての通話をSignalサーバで中継して、相手にIPアドレスを知られることを防ぎます。ただし通話の品質は下がります。
@@ -1830,13 +1854,13 @@
クリップボードにコピークリップボードと比較
- Signalのバージョンが古すぎます
-
+
+
+
+
+
既定のSMSアプリにするタップしてSignalを規定のSMSアプリにします。システムSMSのインポート
@@ -2031,7 +2055,13 @@
Signal登録 - Android用認証コードなし不明
+ 私の電話番号を見る
+ 電話番号で私を見つける
+ 全員
+ 自分の連絡先無人
+ あなたの電話番号は、メッセージを送信したすべての相手とグループに表示されます。
+ あなたの連絡先だけが、Signal上であなたの電話番号を見ることができます。画面ロックSignalをAndroidの画面ロックや指紋認証でロックします画面ロックの無操作タイムアウト
diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml
index 372ebbb7a..b21875eef 100644
--- a/app/src/main/res/values-jv/strings.xml
+++ b/app/src/main/res/values-jv/strings.xml
@@ -1423,13 +1423,13 @@
Salin dhateng clipboardBandingaken kaliyan clipboard
- Versi Signal sampeyan sampun dangu
-
+
+
+
+
+
Ginakaken dados aplikasi SMS defaultTutul kangge ngginakaken Signal dados aplikasi SMS default.Impor SMS sistem
diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml
index 08d09e1a1..e194159e7 100644
--- a/app/src/main/res/values-km/strings.xml
+++ b/app/src/main/res/values-km/strings.xml
@@ -1659,13 +1659,13 @@
ចម្លងទៅ clipboardប្រៀបធៀបជាមួយ clipboard
- កំណែSignalរបស់អ្នកបានផុតកំណត់
-
+
+
+
+
+
ប្រើជាកម្មវិធីផ្ញើសារចុច ដើម្បីដាក់ Signal ជាកម្មវិធីផ្ញើសាររបស់អ្នកនាំចូលប្រព័ន្ធ SMS
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 97117da28..a88340343 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -1478,14 +1478,14 @@
ಕ್ಲಿಪ್ಬೋರ್ಡ್ ಗೆ ನಕಲಿಸಿಕ್ಲಿಪ್ಬೋರ್ಡ್ ಜೊತೆ ಹೋಲಿಸಿ
- ನಿಮ್ಮ Signal ನ ಆವೃತ್ತಿ ಹಳೆಯದು
-
+
+
+
+
+
ಡೀಫಾಲ್ಟ್ ಎಸ್ಎಂಎಸ್ ಆ್ಯಪ್ ಆಗಿ ಬಳಸಿ Signal ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಎಸ್ಎಂಎಸ್ ಆ್ಯಪ್ ಆಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ.ಸಿಸ್ಟಂ ಎಸ್ಎಂಎಸ್ ಇಂಪೋರ್ಟ್ ಮಾಡಿ
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 5f7d06b31..217f4b3b8 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -1477,13 +1477,13 @@
클립보드에 복사클립보드와 비교
- 설치된 Signal 버전이 곧 만료됨
-
+
+
+
+
+
기본 SMS 앱으로 사용탭하여 Signal을 기본 SMS 앱으로 설정하세요.시스템 SMS 가져오기
diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml
index ff19cfa36..9f01e26dd 100644
--- a/app/src/main/res/values-ku/strings.xml
+++ b/app/src/main/res/values-ku/strings.xml
@@ -1151,14 +1151,14 @@
Kopî ser rûnûsgehê bikeBi rûnûsgehê re bide ber hev
- Guhertoya Signala te êdî kevn bûye
-
+
+
+
+
+
Wek bernameya SMSê ya jixweber bi kar bîne.Ji bo Signalê wek bernameya SMSê ya sereke bi kar bînî bitepîne.SMSên pergalê bihundirîne
diff --git a/app/src/main/res/values-lg/strings.xml b/app/src/main/res/values-lg/strings.xml
index d78e0b892..1a6407c9d 100644
--- a/app/src/main/res/values-lg/strings.xml
+++ b/app/src/main/res/values-lg/strings.xml
@@ -723,10 +723,10 @@ gy\'olonze (%s) sintuufu.
copinga ku clipbodigeraageranya ne kilipuboodi
- Version yo eya Signal ya yitako dda
- Version yo eya Sgnal ya kugwako leero.Nyiga ode ku version empya kweyo
- Version ya Signal yo yagwaako!
- Obubaka tebujjakusobla kwewereza bukungi.konakookufuna vazoni empya
+
+
+
+
gikozese nga app yo gyofunirako obubakakonako okuffula Signal app yo gyofunirako obubakaYingiza system SMS
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index eea048cb4..49723d2c4 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -1849,6 +1849,7 @@
LėtasPagalbaIšplėstiniai
+ Paaukokite Signal programėleiPrivatumasMMS naudotojo agentasRankiniai MMS nustatymai
@@ -1902,6 +1903,7 @@
Peržiūrėti saugykląIštrinti senesnes žinutes?Išvalyti žinučių istoriją?
+ Tai visam laikui ištrins visą žinučių istoriją ir mediją iš jūsų įrenginio, kuri senesnė nei %1$sTai visam laikui išvalys visus pokalbius iki %1$s naujausių žinučių.Tai visam laikui ištrins visą žinučių istoriją ir mediją iš jūsų įrenginio.Ar tikrai norite ištrinti visą žinučių istoriją?
@@ -2034,16 +2036,16 @@
Kopijuoti į iškarpinęPalyginti su iškarpine
- Jūsų Signal versija yra pasenusi
-
+
+
+
+
+
Naudoti kaip numatytąją SMS programėlęBakstelėkite, kad padarytumėte Signal savo numatytąja SMS programėle.Importuoti sistemos SMS
@@ -2264,6 +2266,9 @@
VisiMano adresataiNiekas
+ Jūsų telefono numeris bus matomas visiems žmonėms, kuriems rašysite žinutes ir grupėms, kuriose rašysite žinutes.
+ Bet kuris žmogus, turintis jūsų telefono numerį savo adresatuose, matys jus kaip Signal adresatą. Kiti žmonės galės rasti jus paieškoje.
+ Jūsų telefono numerį Signal programėlėje matys tik jūsų adresatai.Ekrano užraktasUžrakinti prieigą prie Signal, naudojant Android ekrano užraktą ar piršto atspaudąEkrano užrakto neveiklumui skirtas laikas
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index 6db885672..32d38f1da 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -1654,15 +1654,15 @@ Saņemts nederīgas protokola versijas atslēgas apmaiņas ziņojums.
Kopēt starpenēSalīdzināt ar starpeni
- Jūsu Signal versija ir novecojusi/norakstāma
-
+
+
+
+
+
Izmantot kā noklusējuma SMS lietotniPieskaries, lai padarītu Signāla par noklusēto SMS lietotniImportēt sistēmas SMS
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 36194fcdf..ee13e8c82 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -538,7 +538,7 @@
Помош
- Вашата верзија на Signal е застарена.
+
Користи како стандардна СМС апликацијаПокани ги твиоте пријатели!
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index dd434a1f8..e79ffe28e 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -1726,14 +1726,14 @@ grūpp apḍē
ക്ലിപ്പ്ബോർഡിലേയ്ക്ക് പകർത്തുകക്ലിപ്പ്ബോർഡുമായി താരതമ്യം ചെയ്യുക
- നിങ്ങളുടെ Signal-ന്റെ പതിപ്പ് കാലഹരണപ്പെട്ടു
-
+
+
+
+
+
സ്ഥിരസ്ഥിതി SMS അപ്ലിക്കേഷനായി ഉപയോഗിക്കുകനിങ്ങളുടെ സ്ഥിരസ്ഥിതി SMS അപ്ലിക്കേഷൻ സിഗ്നൽ ആക്കാൻ ടാപ്പുചെയ്യുക.സിസ്റ്റം SMS ഇറക്കുമതി ചെയ്യുക
diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml
index 54a7d7963..94da035fc 100644
--- a/app/src/main/res/values-mr/strings.xml
+++ b/app/src/main/res/values-mr/strings.xml
@@ -1517,14 +1517,14 @@
क्लिपबोर्ड वर कॉपी कराक्लिपबोर्ड सोबत तुलना करा
- Signal ची आपली आवृत्ती कालबाह्य आहे
-
+
+
+
+
+
पूर्वनिर्धारित SMS अॅप म्हणून वापराSignal ला आपले पूर्वनिर्धारित SMS अॅप बनवण्यासाठी टॅप करा.सिस्टिम SMS आयात करा
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index 8534b10c9..8a7460ec1 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -1285,13 +1285,13 @@ Menerima mesej pertukaran kunci untuk versi protokol yang tidak sah.
Salin ke papan klipBandingkan dengan papan klip
- Versi Signal anda telah lapuk
-
+
+
+
+
+
Guna sebagai aplikasi SMS lalaiKetik untuk menjadikan Signal sebagai aplikasi SMS lalai anda.Import SMS sistem
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index ea7078895..a669ffe4e 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -1089,13 +1089,13 @@
ကူးယူလိုက်ပါ။clipboard နဲ့ ယှဥ်လိုက်ပါ။
- သင့်ရဲ့ Signal ဗားရှင်းက သက်တမ်းကျော်နေပြီ။
-
+
+
+
+
+
ပုံသေ SMS app အဖြစ် သုံးပါ။Signal ကို သင့်ရဲ့ ပုံသေ SMS app အဖြစ် လုပ်ဖို့ နှိပ်ပါ။SMS စနစ်ကို တင်ပို့ပါ
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index a1d3c21f4..e6739af53 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -1771,14 +1771,14 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion.
Kopiere til utklippstavleSammenlign med utklippstavlen
- Din versjon av Signal er utdatert
-
+
+
+
+
+
Bruk som forvalgt SMS-programTrykk for å gjøre Signal til forvalgt SMS-program.Importer system-SMS
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 3826e3eca..b510f2a23 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -450,7 +450,7 @@
Groepsuitnodigingen in afwachtingEr zijn geen groeps uitnodigingen om weer te geven.
- Personen opdeze lijst proberen lid te worden van deze groep via de groepslink.
+ Personen in deze lijst proberen via de groepsverwijzing lid te worden van deze groep.\"%1$s\" toegevoegd\"%1$s\" afgewezen
@@ -492,7 +492,7 @@
Groepsinformatie aanpassenKies wie de naam van de groep, de groepsafbeelding en de timer voor zelfwissende berichten mag aanpassen.Kies wie nieuwe leden mag toevoegen of uitnodigen.
- Groepslink
+ GroepsverwijzingGroepsgesprek blokkerenGroep deblokkerenGroep verlaten
@@ -612,7 +612,7 @@
Groepslinks komen binnenkortWerk Signal bij om groepskoppelingen te kunnen gebruikenLid worden van een groep is nog niet ondersteund in Signal. Deze functie zal in een komende versie uitgeleverd worden.
- De versie van Signal die je gebruikt ondersteunt geen groepslinks. Werk Signal bij naar de meest recente versie om via een link lid te kunen worden van een groep.
+ De versie van Signal die je gebruikt ondersteunt groepsverwijzingen niet. Werk Signal bij naar de meest recente versie om via een verwijzing lid te kunnen worden van een groep.Signal bijwerkenOngeldige groepslink
@@ -848,23 +848,25 @@
%1$s heeft de instelling voor wie de groepslidmaatschap kan aanpassen op ‘%2$s’ ingesteld.De instelling voor wie de groepslidmaatschap kan aanpassen is op ‘%1$s’ ingesteld.
- Je hebt de groepslink ingeschakeld, beheerderstoestemming is uitgeschakeld.
- Je hebt de groepslink met beheerderstoestemming ingeschakeld.
- Je hebt de groepslink uitgeschakeld.
- %1$s heeft de groepslink uitgeschakeld.
- De groepslink is ingeschakeld. beheerderstoestemming is uitgeschakeld.
- De groepslink met beheerderstoestemming is ingeschakeld.
- De groepslink is uitgeschakeld.
+ Je hebt de groepsverwijzingen ingeschakeld en beheerderstoestemming om lid te mogen worden is uitgeschakeld.
+ Je hebt de groepsverwijzing ingeschakeld maar er is nog beheerderstoestemming vereist om lid te mogen worden.
+ Je hebt de groepsverwijzing uitgeschakeld.
+ %1$s heeft de groepsverwijzing met beheerderstoestemming uitgeschakeld.
+ %1$s heeft de groepsverwijzing met beheerderstoestemming ingeschakeld.
+ %1$s heeft de groepsverwijzing uitgeschakeld.
+ De groepsverwijzing is ingeschakeld. beheerderstoestemming is uitgeschakeld.
+ De groepsverwijzing met beheerderstoestemming is ingeschakeld.
+ De groepsverwijzing is uitgeschakeld.
- Je hebt de groepslink vernieuwd.
- %1$s heeft de groepslink vernieuwd.
- De groepslink is vernieuwd.
+ Je hebt de groepsverwijzing vernieuwd.
+ %1$s heeft de groepsverwijzing vernieuwd.
+ De groepsverwijzing is vernieuwd.
- Je bent via de groepslink lid geworden van de groep.
- %1$s is lid geworden via de groepslink.
+ Je bent via de groepsverwijzing lid geworden van de groep.
+ %1$s is lid geworden via de groepsverwijzing.Je hebt een verzoek verstuurd om lid te worden van de groep.
- %1$s heeft verzocht om via de groepslink lid te worden.
+ %1$s heeft verzocht om via de groepsverwijzing lid te worden.%1$s heeft je verzoek om lid te worden van de groep toegestaan.%1$s heeft het verzoek van %2$s om lid te worden van de groep toegestaan.
@@ -1744,6 +1746,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
LangzaamHulpGeavanceerd
+ Aan Signal donerenPrivacyMms-gebruikersagentHandmatige mms-instellingen
@@ -1758,7 +1761,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
OpslagGesprekslengtelimietBerichten bewaren
- Berichtengeschiedenis opschonen
+ Berichtengeschiedenis wissenGekoppelde apparatenLichtDonker
@@ -1795,9 +1798,13 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
DocumentenAudioAlle bestanden bekijken
- Oude berichten verwijderen?
- Berichtengeschiedenis opschonen?
- Dit zalalle berichten ouder dan %1$s permanent van je apparaat verwijderen.
+ Oude berichten wissen?
+ Berichtengeschiedenis wissen?
+ Dit zal pertinent alle gespreksgeschiedenis en media ouder dan %1$s van dit apparaat wissen.
+ Dit zal direct alle gesprekken inkorten tot de laatste %1$s berichten.
+ Dit zal pertinent al je gespreksgeschiedenis en media van dit apparaat wissen.
+ Weet je zeker dat je de hele berichtengeschiedenis wilt wissen?
+ De hele berichtengeschiedenis zal worden gewist. Dit kan niet ongedaan gemaakt worden.Nu alles verwijderenVoor altijd1 jaar
@@ -1926,14 +1933,14 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
Kopiëren naar klembordVergelijken met klembord
- Je versie van Signal is verouderd
-
+
+
+
+
+
Als standaard sms-app gebruikenTik hier om van Signal je standaard sms-app te maken.Sms uit systeem importeren
@@ -2141,6 +2148,8 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
Mijn contactpersonenNiemandJe telefoonnummer zal zichtbaar zijn voor iedereen en elke groep waar je een bericht naar stuurt
+ Iedereen die je telefoonnummer in zijn contactenlijst heeft zal je als een contact in Signal zien. Anderen zullen je kunnen vinden als ze zoeken.
+ Alleen jouw contacten zullen je telefoonnummer in Signal zien.SchermvergrendelingVergrendel Signal met de Android-schermvergrendeling of vingerafdrukInactiviteitsduur voor schermvergrendeling
diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml
index 27a9db42e..a8bcd57d5 100644
--- a/app/src/main/res/values-nn/strings.xml
+++ b/app/src/main/res/values-nn/strings.xml
@@ -454,6 +454,7 @@ Dei er invitert inn, og ser inga gruppemeldingar før dei godtek.
Ventande medlemsførespurnaderIngen medlemsførespurnader
+ Personar på denne lista prøver å bli med i gruppa via gruppelenka.La til «%1$s»Avslo «%1$s»
@@ -615,6 +616,7 @@ Dei er invitert inn, og ser inga gruppemeldingar før dei godtek.
Gruppelenker kjem snartOppdater Signal for å bruka gruppelenkerSignal støtter ikkje enno å bli med i grupper via lenker. Denne funksjonaliteten kjem i ei seinare utgåve.
+ Signal-utgåva di støttar ikkje gruppelenker. Oppdater til siste utgåve for å bli med denne gruppa via ei lenke.Oppdater SignalGruppelenka er ugyldig
@@ -850,10 +852,25 @@ Dei er invitert inn, og ser inga gruppemeldingar før dei godtek.
%1$s endra kven som kan redigera gruppemedlemskap til «%2$s».Kven som kan endra gruppemedlemskap er endra til «%1$s».
+ Du aktiverte gruppelenka utan admin-godkjenning.
+ Du aktiverte gruppelenka med admin-godkjenning.
+ Du deaktiverte gruppelenka.
+ %1$s skrudde på gruppelenka utan admin-godkjenning.
+ %1$s skrudde på gruppelenka med admin-godkjenning.
+ %1$s skrudde av gruppelenka.
+ Gruppelenka er aktivert utan admin-godkjenning.
+ Gruppelenka er aktivert med admin-godkjenning.
+ Gruppelenka er deaktivert.
+ Du nullstilte gruppelenka.
+ %1$s nullstilte gruppelenka.
+ Gruppelenka er nullstilt.
+ Du blei med i gruppa via gruppelenka.
+ %1$s blei med i gruppa via gruppelenka.Du spurde om å bli med i gruppa.
+ %1$s spurde om å bli med via gruppelenka.%1$s godkjende førespurnaden din om å bli med i gruppa.%1$s godkjende førespurnaden frå %2$s om å bli med i gruppa.
@@ -1434,6 +1451,7 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversjon.
Endringar med tryggleiksnummer.Send uansett
+ Ring uansettDesse personane kan ha reinstallert eller bytta einingar. Stadfest tryggleiksnummeret ditt med dei for å sikra personvernet.SjåTidlegare stadfesta
@@ -1729,6 +1747,7 @@ Ved registrering sender me litt kontaktinformasjon til tenaren. Informasjonen ve
LangsamHjelpAvansert
+ Doner til SignalPersonvernMMS-brukaragentManuelt MMS-oppsett
@@ -1742,6 +1761,8 @@ Ved registrering sender me litt kontaktinformasjon til tenaren. Informasjonen ve
Samtalar og mediaLagringLengdgrense for samtalar
+ Spar på meldingar
+ Tøm meldingshistorikkTilkopla einingarLysMørk
@@ -1771,18 +1792,34 @@ Ved registrering sender me litt kontaktinformasjon til tenaren. Informasjonen ve
Ved bruk av WifiI framandnettAutomatisk nedlasting av media
+ MeldingshistorikkLagringsbrukBildeVideoarFilerLydGå gjennom lagring
+ Slett eldre meldingar?
+ Tøm meldingshistorikk?
+ Dette slettar all meldingshistorikk og media som er eldre enn %1$s frå eininga di for godt.
+ Dette vil permanent forkorta alle samtalar til dei %1$s siste meldingane.
+ Dette vil permanent sletta all meldingshistorikk og media frå eininga di.
+ Er du sikker på at du vil sletta all meldingshistorikk?
+ All meldingshistorikk blir permanent sletta. Denne handlinga kan ikkje angrast.
+ Slett alt no
+ For alltid
+ 1 år
+ 6 månader
+ 30 dagarInga
+ %1$s meldingarSjølvvald
+ Sjølvvald lengdgrense for samtalarBruk emoji på systemetSlå av innebygd emoji-støtte i SignalVidaresend alle samtalar gjennom Signal-tenaren for å unngå å visa IP-adressa di til kontakten din. Dette vil gi dårlegare samtalekvalitet.Alltid vidaresend samtalar
+ Kven kan …App-tilgangKommunikasjonSamtalar
@@ -1807,6 +1844,7 @@ Ved registrering sender me litt kontaktinformasjon til tenaren. Informasjonen ve
Varsla megFå varsel når du blir nemnt i dempa samtalarLag eit brukarnamn
+ Endra val
@@ -1897,14 +1935,14 @@ Du er à jour!
Kopiera til utklippstavleSamanlikn med utklippstavla
- Denne Signal-installasjonen er utdatert
-
+
+
+
+
+
Bruk som standard SMS-programTrykk for å gjera Signal til standard SMS-program.Importer system-SMS
@@ -2107,6 +2145,14 @@ Du er à jour!
Signal-registrering – stadfestingskode for AndroidAldriUkjend
+ Sjå mitt telefonnummer
+ Finna meg via telefonnummer
+ Alle
+ Kontaktane mine
+ Ingen
+ Telefonnummeret ditt blir synleg for alle personar og grupper som du melder med.
+ Alle som har telefonnummeret ditt i kontaktlista si kan få deg opp som ein Signal-kontakt. Andre kan finna deg i søk.
+ Berre kontaktane dine vil sjå telefonnummeret ditt på Signal.SkjermlåsLås tilgangen til Signal med Androids skjermlås eller fingeravtrykkTidsgrense for inaktivitet før skjermlås
diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml
index 150cf68d0..a18601257 100644
--- a/app/src/main/res/values-pa-rPK/strings.xml
+++ b/app/src/main/res/values-pa-rPK/strings.xml
@@ -1444,14 +1444,14 @@
کلپ بورڈ تے کاپی کروکلپ بورڈ نال موازنہ کرو
- تہاڈا Signal دا ورژن پرانا اے
-
+
+
+
+
+
ڈیفالٹ SMS ایپ دے طور تے ورتوSgnal نوں اپناں ڈیفالٹ SMS ایپ بنان لئی بٹن دبو ۔درآمد سسٹم SMS
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index 32b41c922..61af20e84 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -1552,14 +1552,14 @@
ਕਲਿਪਬੋਰਡ ਤੇ ਕਾਪੀ ਕਰੋ ਕਲਿਪਬੋਰਡ ਨਾਲ ਤੁਲਨਾ ਕਰੋ
- ਤੁਹਾਡੇ Signal ਦਾ ਵਰਜਨ ਪੁਰਾਣਾ ਹੈ
-
+
+
+
+
+
ਡਿਫੌਲਟ SMS ਐਪ ਦੇ ਤੌਰ ਤੇ ਉਪਯੋਗ ਕਰੋSignal ਨੂੰ ਆਪਣੀ ਡਿਫੌਲਟ SMS ਐਪ ਬਣਾਉਣ ਲਈ ਟੈਪ ਕਰੋਸਿਸਟਮ ਐਸਐਮਐਸ ਇੰਪੋਰਟ ਕਰੋ
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 75ea61378..1c1d7cc69 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1841,6 +1841,7 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu.
WolnoPomocZaawansowane
+ Datek na SignalPrywatnośćMMS User AgentManualne ustawienia MMS
@@ -1854,7 +1855,7 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu.
Rozmowy i multimediaPamięćLimit długości konwersacji
- Zachowaj wiadomości
+ Zachowuj wiadomościWyczyść historię wiadomościPołączone urządzeniaJasny
@@ -1906,7 +1907,7 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu.
30 dniBrak%1$s wiadomości
- Własne
+ WłasnyWłasny limit długości konwersacjiUżywaj emoji systemuWyłącz wbudowane wspomaganie emoji Signal
@@ -2027,16 +2028,16 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu.
Skopiuj do schowka Porównaj ze schowkiem
- Twoja wersja Signal jest nieaktualna.
-
+
+
+
+
+
Ustaw jako domyślną aplikację SMSDotknij, aby Signal był Twoją domyślną aplikacją SMS.Importuj bazę SMS
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 8aa61804a..5825a4c61 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -449,6 +449,7 @@
Solicitações de membros pendentesNão há pedidos de membros para mostrar.
+ As pessoas desta lista estão tentando se conectar a este grupo através do link de grupo.Adicionado \"%1$s\"Negado \"%1$s\"
@@ -610,6 +611,7 @@
Links de grupos em breveAtualize o Signal para usar links do grupoParticipar no grupo através de um link ainda não é suportado pelo Signal. Este recurso será lançado na próxima atualização.
+ A versão do Signal que você está usando não suporta links de grupo. Atualize para a versão mais recente para se conectar a este grupo via link.Atualizar o SignalO link de grupo não é válido
@@ -845,10 +847,25 @@
%1$s mudou quem pode editar os membros do grupo. Agora é \"%2$s\".Quem pode editar as informações do grupo foi alterado para \"%1$s\".
+ Você ativou o link do grupo com a aprovação do administrador desativada.
+ Você ativou o link do grupo com a aprovação de administrador ativada.
+ Você desativou o link do grupo.
+ %1$s ativou o link do grupo com a aprovação de administrador desativada.
+ %1$s ativou o link do grupo com a aprovação de administrador ativada.
+ %1$s desativou o link do grupo.
+ O link do grupo foi ativado com a aprovação de administrador desativada.
+ O link do grupo foi ativado com a aprovação de administrador ativada.
+ O link do grupo foi desativado.
+ Você resetou o link do grupo.
+ %1$s resetou o link do grupo.
+ O link do grupo foi resetado.
+ Você se conectou ao grupo via o link do grupo.
+ %1$s se conectou ao grupo via o link do grupo.Você enviou um pedido para participar no grupo.
+ %1$s solicitou a participar via o link do grupo.%1$s aprovou seu pedido de participação no grupo.%1$s aprovou um pedido de participação no grupo de %2$s.
@@ -1430,6 +1447,7 @@
Mudanças no Número de SegurançaEnvie de qualquer forma
+ Ligue de qualquer maneiraAs seguintes pessoas podem ter reinstalado ou mudado de aparelho. Verifique o seu número de segurança com elas para garantir a sua privacidade e a delas.ExibirJá verificado
@@ -1736,6 +1754,8 @@
Chats e mídiaArmazenamentoTamanho máximo de conversa
+ Guardar mensagens
+ Excluir histórico de mensagensDispositivos vinculadosClaroEscuro
@@ -1765,18 +1785,32 @@
Quando usar Wi-FiQuando em roamingDownload automático de mídia
+ Histórico da mensagensUso do armazenamentoFotosVídeosArquivosÁudioChecar armazenamento
+ Excluir as mensagens mais antigas?
+ Excluir histórico de mensagens?
+ Isto excluirá permanentemente todas as conversas menos as %1$s mensagens mais recentes.
+ Tem certeza que quer excluir todo o histórico de mensagens?
+ Todo o histórico de mensagens será excluído permanentemente. Esta ação não pode ser desfeita.
+ Excluir tudo agora
+ Para sempre
+ 1 ano
+ 6 meses
+ 30 diasNenhum
+ %1$s mensagensPersonalizado
+ Limite personalizado de duração da conversaUsar emoji do sistemaDesabilitar o suporte a emoji embutido do SignalEncaminhar todas as chamadas através do servidor Signal para evitar revelar seu endereço IP para seu contato. Habilitar reduzirá a qualidade da chamada.Sempre reencaminhar chamadas
+ Quem pode…Acesso ao aplicativoComunicaçãoChats
@@ -1801,6 +1835,7 @@
Notifique-meReceba notificações quando você for mencionado em conversas silenciosasDefinir um nome de usuário
+ Opção para personalizar
@@ -1890,14 +1925,14 @@
Copiar para a área de transferênciaComparar com a área de transferência
- Sua versão do Signal está desatualizada
-
+
+
+
+
+
Usar como aplicativo padrão de SMSToque para tornar o Signal o seu aplicativo padrão de SMS.Importar SMS do sistema
@@ -2099,7 +2134,14 @@
Cadastro Signal - Código de verificação para AndroidNuncaDesconhecida
+ Ver meu número de telefone
+ Pode me encontrar pelo número de telefone
+ Todo o mundo
+ Meus contatosNinguém
+ Seu número de telefone estará visível para todas as pessoas e grupos dos quais você participe.
+ Qualquer pessoa que tenha seu número de telefone em seus contatos o verá como um contato no Signal. Outros poderão encontrá-lo em busca.
+ Somente seus contatos verão seu número de telefone no Signal.Bloqueio de telaProteger acesso ao Signal com tela de bloqueio do Android ou impressão digital.Tempo de espera para bloquear tela
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 8655c9ae7..bb6275c87 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -1724,6 +1724,7 @@ Mensagem de troca de chaves inválida para esta versão do protocolo.
LentoAjudaAvançado
+ Doar ao SignalPrivacidadeAgente do utilizador de MMSDefinições manuais de MMS
@@ -1891,14 +1892,14 @@ Mensagem de troca de chaves inválida para esta versão do protocolo.
Copiar para a área de transferênciaComparar com a área de transferência
- A sua versão do Signal encontra-se desatualizada
-
+
+
+
+
+
Definir como aplicação de SMS pré-definidaToque para tornar o Signal na sua aplicação de SMS pré-definida.Importar as SMS do sistema
diff --git a/app/src/main/res/values-qu-rEC/strings.xml b/app/src/main/res/values-qu-rEC/strings.xml
index 5df061cea..eb340abad 100644
--- a/app/src/main/res/values-qu-rEC/strings.xml
+++ b/app/src/main/res/values-qu-rEC/strings.xml
@@ -1122,14 +1122,14 @@ Shuk ranti pakallayupay chaski chayamurka, shuk ñawpa mana alli protocolo kashk
Panka allichikman chayshina allichishkaPanka allichikwan chimpapuray
- Kikinpa Signal mawkayashka
-
+
+
+
+
+
Signal aplicacionta, killkashka SMS chaskichun churaySignal aplicacionta, killkashka SMS chaskichun llapipay.SMS killkashkata sistemamanta apamuna
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 0e61d98a9..573e10f7d 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -1927,15 +1927,15 @@ Am primit mesajul conform căruia schimbul de chei a avut loc pentru o versiune
Copiază în clipboardCompară cu clipboard-ul
- Versiunea ta de Signal este veche
-
+
+
+
+
+
Utilizează ca și aplicație SMS implicităAtingeți pentru a seta Signal ca și aplicație SMS implicită.Importă SMS de sistem
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 1b34d1e69..1b4108b8c 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -1842,6 +1842,7 @@
МедленноеПомощьРасширенные
+ Поддержать SignalКонфиденциальностьUser Agent для MMS Ручные настройки MMS
@@ -1907,8 +1908,8 @@
30 днейНет%1$s сообщений
- Пользовательское
- Пользовательское ограничение длины разговора
+ Пользовательский
+ Пользовательский предел длины разговораИспользовать системные эмодзиОтключить встроенные эмодзи SignalПропускать все звонки через сервер Signal, чтобы не раскрывать ваш IP-адрес собеседнику. Качество звонка ухудшится.
@@ -2028,16 +2029,16 @@
Копировать в буфер обменаСравнить с буфером обмена
- Ваша версия Signal скоро устареет
-
+
+
+
+
+
Использовать для всех SMSНажмите, чтобы сделать Signal своим приложением для SMS по умолчаниюИмпортировать SMS из системы
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 950dde2a0..cb70ee24b 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -1558,6 +1558,7 @@ Bola prijatá správa výmeny kľúčov s neplatnou verziou protokolu.
PomalyPomocníkRozšírené
+ Prispieť na SignalSúkromieMMS používateľský agentManuálne MMS nastavenia
@@ -1714,16 +1715,16 @@ Bola prijatá správa výmeny kľúčov s neplatnou verziou protokolu.
KopírovaťPorovnať
- Vaša verzia Signalu nie je aktuálna
-
+
+
+
+
+
Použiť ako predvolenú SMS aplikáciuŤuknutím nastavíte Signal ako Vašu predvolenú SMS aplikáciu.Importovať systémové SMS správy?
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index e05b4db5d..e049d6125 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -1840,6 +1840,7 @@ Prejeto sporočilo za izmenjavo ključev za napačno različico protokola.Počasi
PomočNapredno
+ Podprite SignalZasebnostUporabniški posrednik MMSRočne nastavitve MMS
@@ -1853,7 +1854,7 @@ Prejeto sporočilo za izmenjavo ključev za napačno različico protokola.Pogovori in večpredstavnost
PomnilnikOmejitev dolžine pogovorov
- Obdrži sporočila
+ Hramba sporočilIzbriši zgodovino pogovorovPovezane napraveSvetla
@@ -1899,7 +1900,7 @@ Prejeto sporočilo za izmenjavo ključev za napačno različico protokola.Ste prepričani, da želite izbrisati celotno zgodovino sporočil?
Celotna zgodovina vaših sporočil bo za vedno izbrisana. Ta korak je nepovraten.Izbriši vse zdaj!
- kadarkoli
+ Za vedno1 leto6 mesecev30 dni
@@ -2026,16 +2027,16 @@ Prejeto sporočilo za izmenjavo ključev za napačno različico protokola.Kopiraj v odložišče
Primerjaj preko odložišča
- Vaša različica aplikacije Signal je zastarela
-
+
+
+
+
+
Uporabljaj kot privzeto aplikacijo SMSZ dotikom nastavite Signal za privzeto aplikacijo SMSUvoz iz sistemske zbirke sporočil SMS
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index 867bf652e..10d390639 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -1708,6 +1708,7 @@ të përditësojnë Signal-in, ose t’i hiqni para krijimit të grupit.
I ngadaltëNdihmëTë mëtejshme
+ Dhuroni për Signal-inPrivatësiAgjent Përdoruesi MMSRregullime dorazi për MMS-në
@@ -1876,14 +1877,14 @@ aktivizoni Kyçje Regjistrimi, teksa PIN-i është i çaktivizuar.
Kopjoje në të papastërKrahasoje me lëndën në të papastër
- Versioni juaj i Signal-it është i vjetruar
-
+
+
+
+
+
Përdoresi aplikacionin parazgjedhje për SMS-tëPrekeni për ta bërë Signal-in aplikacionin tuaj parazgjedhje për SMS-të.Importo SMS sistemi
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 47a15de19..42d41fead 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -1328,15 +1328,15 @@
Копирај на клипбордУпореди са клипбордом
- Ваше издање Signal-a је застарело!
-
+
+
+
+
+
Користи као подразумевану апл. за СМСТапните да поставите Signal за подразумевану апликацију за СМС.Увези системске СМС
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index f7d701a2d..2c15a325e 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -1717,6 +1717,7 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion.
LångsamHjälpAvancerat
+ Donera till SignalIntegritetsskyddMMS User AgentManuella MMS-inställningar
@@ -1885,14 +1886,14 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion.
Kopiera till urklippJämför med urklipp
- Din version av Signal är förlegad
-
+
+
+
+
+
Använd som standardapp för SMSTryck för att göra Signal till din standardapp för SMS.Importera systemets SMS
diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml
index 9ff445c64..9eb25f108 100644
--- a/app/src/main/res/values-sw/strings.xml
+++ b/app/src/main/res/values-sw/strings.xml
@@ -1445,14 +1445,14 @@ nambari yako ya simu
Nakili kwenye clipbodiLinganisha na clipbodi
- Toleo lako la Signal limepitwa na wakati
-
+
+
+
+
+
Tumia kama chaguo msingi programu ya mesejiGonga ili kuifanya Signal programu chaguo msingi ya SMS.Ingiza SMS ya mfumo
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index dd48f8b58..198cc39be 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -1661,6 +1661,7 @@
மெதுவாகஉதவிமேம்பட்ட
+ Donate to Signal சிக்னலுக்கு நன்கொடைதனியுரிமைஎம்.எம்.எஸ் பயனர் முகவர்நீங்கள் செய்யவேண்டிய MMS அமைப்புகள்
@@ -1827,14 +1828,14 @@
கிளிப்போர்டுக்கு நகலெடுக்கவும்கிளிப்போர்டுடன் ஒப்பிடுக
- Signal உங்கள் பதிப்பு காலாவதியானது
-
+
+
+
+
+
இயல்புநிலை எஸ்எம்எஸ் பயன்பாடு பயன்படுத்தவும்உங்கள் இயல்புநிலை எஸ்எம்எஸ் பயன்பாடு Signal மாற்ற தட்டவும்.கணினி எஸ்எம்எஸ் இறக்குமதி
diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml
index cb707f6e4..f029ea6e5 100644
--- a/app/src/main/res/values-te/strings.xml
+++ b/app/src/main/res/values-te/strings.xml
@@ -1548,14 +1548,14 @@
తాత్కాలికంగా భద్రపరుచు ప్రదేశముకు నకలు చెయ్యి తాత్కాలికంగా భద్రపరుచు ప్రదేశముతో పోల్చడం
- మీ Signal అనువాదముకు కాలం చెల్లినది
-
+
+
+
+
+
డిఫాల్ట్ ఎస్ఎంఎస్ అప్లికేషన్ ని ఉపయోగించండిSignal ను మీ వైఫల్య యస్ యం యస్ అనువర్తనంగా చేయడానికి నొక్కండి.వ్యవస్థ ఎస్సెమ్మెస్ దిగుమతి
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 33567c5fa..9dbd3e5cf 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -1597,13 +1597,13 @@
คัดลอกไปยังคลิปบอร์ดเปรียบเทียบกับคลิปบอร์ด
- Signal รุ่นที่คุณมีล้าสมัยแล้ว
-
+
+
+
+
+
ใช้เป็นแอป SMS หลักแตะเพื่อกำหนดให้ Signal เป็นแอป SMS หลักของคุณนำเข้า SMS ของระบบ
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index 2f88a7854..71526eed3 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -1518,14 +1518,14 @@
Kopyahin sa clipboardIkumpara sa clipboard
- Luma na ang iyong bersyon ng Signal
-
+
+
+
+
+
Gamitin bilang default na app na pang-SMSPindutin upang gawing Signal ang iyong default na app na pang-SMSI-import ang system SMS
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 9bd91eaed..7a00aaec4 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -1721,14 +1721,14 @@ Geçersiz protokol sürümünde anahtar değişim iletisi alındı.
Panoya kopyalaPano ile karşılaştır
- Signal sürümünüz eskimiş
-
+
+
+
+
+
Varsayılan SMS uygulaması olarak ayarlaSignal\'i varsayılan SMS uygulaması yapmak için dokunun.Sistem SMS\'lerini içe aktar
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index e41226293..ef73164d6 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -1209,16 +1209,16 @@
Скопіювати до буфера обмінуПорівняти із буфером обміну
- Ваша версія Signal застаріла
-
+
+
+
+
+
Використовувати як типову програму для SMSТоркніться, щоб зробити Signal типовою програмою для SMS.Імпортувати системну базу SMS?
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index 1aaf8f985..1f139ca7b 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -1440,14 +1440,14 @@
کلپ بورڈ کو کاپی کریںکلپ بورڈ کے ساتھ موازنہ کریں
- آپ کا Signal ورژن پرانا ہے
-
+
+
+
+
+
پہلے سے طے شدہ ایس ایم ایس ایپ استعمال کریںsignal کو اپنا پہلے سے موجود ایس ایم ایس ایپ بنانے کیلئے ٹیپ کریں۔ایس ایم ایس نظام درآمد کریں
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 154e58c79..9f879e892 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -1814,13 +1814,13 @@ Nhận thông tin trao đổi mã khóa về phiên bản giao thức không h
Sao chép vào clipboardSo sánh với clipboard
- Phiên bản Signal của bạn đã quá cũ
-
+
+
+
+
+
Dùng làm ứng dụng SMS mặc địnhNhấn để đặt Signal làm ứng dụng SMS mặc định.Nhập SMS hệ thống
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 142b77f6a..c46d9febc 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1512,13 +1512,13 @@
复制到剪切板与剪切板中的内容进行比较
- Signal 版本已经过期
-
+
+
+
+
+
设置为默认短信应用点击将 Signal 设置为默认短信应用。导入系统短信
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 33786392d..cb4c84fd2 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -1684,6 +1684,7 @@
緩慢幫助進階
+ 捐贈 Signal隱私權MMS User Agent手動多媒體設定
@@ -1737,7 +1738,7 @@
檢視儲存空間刪除舊訊息?清除訊息歷史記錄?
- 這將從裝置中永久刪除所有早於%1$s的訊息歷史記錄和媒體檔案。
+ 這將從裝置中永久刪除所有早於%1$s時間的訊息歷史記錄和媒體檔案。這將會永久整理所有對話到%1$s最近的訊息。這將從你的裝置中永久刪除所有訊息歷史記錄和媒體檔案。你確定要刪除所有訊息歷史記錄嗎?
@@ -1870,13 +1871,13 @@
複製到剪貼簿與剪貼簿中的內容進行比較
- 您的 Signal 版本已過期
-
+
+
+
+
+
設定為預設簡訊應用程式輕觸將 Signal 設定為預設的簡訊應用程式。匯入系統簡訊
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index f15d18003..abdaa25e0 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -158,6 +158,8 @@
+
+
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
index ebcc8de54..41e5186a1 100644
--- a/app/src/main/res/values/ids.xml
+++ b/app/src/main/res/values/ids.xml
@@ -6,4 +6,5 @@
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5a3e52e91..7b1370628 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -151,6 +151,14 @@
Remove profile photo?Remove group photo?
+
+ Update Signal
+ This version of the app is no longer supported. To continue sending and receiving messages, update to the latest version.
+ Update
+ Don\'t Update
+ Warning
+ Your version of Signal has expired. You can view your message history but you won\'t be able to send or receive messages until you update.
+
No web browser found.No email app found.
@@ -428,6 +436,10 @@
Optimize for missing Play ServicesThis device does not support Play Services. Tap to disable system battery optimizations that prevent Signal from retrieving messages while inactive.
+
+ This version of Signal has expired. Update now to send and receive messages.
+ Update now
+
Share withMultiple attachments are only supported for images and videos
@@ -1087,6 +1099,14 @@
Your messages will not expire.Messages sent and received in this conversation will disappear %s after they have been seen.
+
+ Update now
+
+ This version of Signal will expire today. Update to the most recent version.
+ This version of Signal will expire tomorrow. Update to the most recent version.
+ This version of Signal will expire in %d days. Update to the most recent version.
+
+
Enter passphraseSignal icon
@@ -2289,14 +2309,6 @@
Compare with clipboard
- Your version of Signal is outdated
-
- Your version of Signal will expire in %d day. Tap to update to the most recent version.
- Your version of Signal will expire in %d days. Tap to update to the most recent version.
-
- Your version of Signal will expire today. Tap to update to the most recent version.
- Your version of Signal has expired!
- Messages will no longer send successfully. Tap to update to the most recent version.Use as default SMS appTap to make Signal your default SMS app.Import system SMS
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 06bb62c5e..b2be0b79b 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -60,8 +60,8 @@
@style/TextSecure.TitleTextStyle@style/TextSecure.SubtitleTextStyle0dp
- @style/Signal.Toolbar.Overflow
- @style/Signal.Toolbar.Overflow
+ @style/Signal.Toolbar.Overflow.Light
+ @style/Signal.Toolbar.Overflow.Light
+
+
@@ -359,6 +363,14 @@
+
+