diff --git a/app/build.gradle b/app/build.gradle
index 8d3526340b..5d9841d0d7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -77,8 +77,8 @@ ktlint {
version = "0.43.2"
}
-def canonicalVersionCode = 1136
-def canonicalVersionName = "5.51.7"
+def canonicalVersionCode = 1142
+def canonicalVersionName = "5.52.5"
def mollyRevision = 0
def postFixSize = 100
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b20c6cfda9..70862ba3c8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -620,6 +620,10 @@
android:theme="@style/Theme.Signal.DayNight.NoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
+
+
diff --git a/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java
index 53fcd38366..ffb3c432da 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java
@@ -65,6 +65,7 @@
import org.thoughtcrime.securesms.database.MediaDatabase.MediaRecord;
import org.thoughtcrime.securesms.database.loaders.PagingMediaLoader;
import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity;
+import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory;
import org.thoughtcrime.securesms.mediapreview.MediaPreviewFragment;
import org.thoughtcrime.securesms.mediapreview.MediaPreviewViewModel;
import org.thoughtcrime.securesms.mediapreview.MediaRailAdapter;
@@ -98,18 +99,6 @@ public final class MediaPreviewActivity extends PassphraseRequiredActivity
private final static String TAG = Log.tag(MediaPreviewActivity.class);
- private static final int NOT_IN_A_THREAD = -2;
-
- public static final String THREAD_ID_EXTRA = "thread_id";
- public static final String DATE_EXTRA = "date";
- public static final String SIZE_EXTRA = "size";
- public static final String CAPTION_EXTRA = "caption";
- public static final String LEFT_IS_RECENT_EXTRA = "left_is_recent";
- public static final String HIDE_ALL_MEDIA_EXTRA = "came_from_all_media";
- public static final String SHOW_THREAD_EXTRA = "show_thread";
- public static final String SORTING_EXTRA = "sorting";
- public static final String IS_VIDEO_GIF = "is_video_gif";
-
private ViewPager mediaPager;
private View detailsContainer;
private TextView caption;
@@ -127,7 +116,7 @@ public final class MediaPreviewActivity extends PassphraseRequiredActivity
private ViewPagerListener viewPagerListener;
private int restartItem = -1;
- private long threadId = NOT_IN_A_THREAD;
+ private long threadId = MediaIntentFactory.NOT_IN_A_THREAD;
private boolean cameFromAllMedia;
private boolean showThread;
private MediaDatabase.Sorting sorting;
@@ -143,12 +132,12 @@ public final class MediaPreviewActivity extends PassphraseRequiredActivity
{
DatabaseAttachment attachment = Objects.requireNonNull(mediaRecord.getAttachment());
Intent intent = new Intent(context, MediaPreviewActivity.class);
- intent.putExtra(MediaPreviewActivity.THREAD_ID_EXTRA, mediaRecord.getThreadId());
- intent.putExtra(MediaPreviewActivity.DATE_EXTRA, mediaRecord.getDate());
- intent.putExtra(MediaPreviewActivity.SIZE_EXTRA, attachment.getSize());
- intent.putExtra(MediaPreviewActivity.CAPTION_EXTRA, attachment.getCaption());
- intent.putExtra(MediaPreviewActivity.LEFT_IS_RECENT_EXTRA, leftIsRecent);
- intent.putExtra(MediaPreviewActivity.IS_VIDEO_GIF, attachment.isVideoGif());
+ intent.putExtra(MediaIntentFactory.THREAD_ID_EXTRA, mediaRecord.getThreadId());
+ intent.putExtra(MediaIntentFactory.DATE_EXTRA, mediaRecord.getDate());
+ intent.putExtra(MediaIntentFactory.SIZE_EXTRA, attachment.getSize());
+ intent.putExtra(MediaIntentFactory.CAPTION_EXTRA, attachment.getCaption());
+ intent.putExtra(MediaIntentFactory.LEFT_IS_RECENT_EXTRA, leftIsRecent);
+ intent.putExtra(MediaIntentFactory.IS_VIDEO_GIF, attachment.isVideoGif());
intent.setDataAndType(attachment.getUri(), mediaRecord.getContentType());
return intent;
}
@@ -305,17 +294,17 @@ private void initializeViews() {
private void initializeResources() {
Intent intent = getIntent();
- threadId = intent.getLongExtra(THREAD_ID_EXTRA, NOT_IN_A_THREAD);
- cameFromAllMedia = intent.getBooleanExtra(HIDE_ALL_MEDIA_EXTRA, false);
- showThread = intent.getBooleanExtra(SHOW_THREAD_EXTRA, false);
- sorting = MediaDatabase.Sorting.values()[intent.getIntExtra(SORTING_EXTRA, 0)];
+ threadId = intent.getLongExtra(MediaIntentFactory.THREAD_ID_EXTRA, MediaIntentFactory.NOT_IN_A_THREAD);
+ cameFromAllMedia = intent.getBooleanExtra(MediaIntentFactory.HIDE_ALL_MEDIA_EXTRA, false);
+ showThread = intent.getBooleanExtra(MediaIntentFactory.SHOW_THREAD_EXTRA, false);
+ sorting = MediaDatabase.Sorting.values()[intent.getIntExtra(MediaIntentFactory.SORTING_EXTRA, 0)];
initialMediaUri = intent.getData();
initialMediaType = intent.getType();
- initialMediaSize = intent.getLongExtra(SIZE_EXTRA, 0);
- initialCaption = intent.getStringExtra(CAPTION_EXTRA);
- leftIsRecent = intent.getBooleanExtra(LEFT_IS_RECENT_EXTRA, false);
- initialMediaIsVideoGif = intent.getBooleanExtra(IS_VIDEO_GIF, false);
+ initialMediaSize = intent.getLongExtra(MediaIntentFactory.SIZE_EXTRA, 0);
+ initialCaption = intent.getStringExtra(MediaIntentFactory.CAPTION_EXTRA);
+ leftIsRecent = intent.getBooleanExtra(MediaIntentFactory.LEFT_IS_RECENT_EXTRA, false);
+ initialMediaIsVideoGif = intent.getBooleanExtra(MediaIntentFactory.IS_VIDEO_GIF, false);
restartItem = -1;
}
@@ -533,7 +522,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
}
private boolean isMediaInDb() {
- return threadId != NOT_IN_A_THREAD;
+ return threadId != MediaIntentFactory.NOT_IN_A_THREAD;
}
private @Nullable MediaItem getCurrentMediaItem() {
@@ -789,7 +778,7 @@ public Fragment getItem(int position) {
cursor.moveToPosition(cursorPosition);
- MediaDatabase.MediaRecord mediaRecord = MediaDatabase.MediaRecord.from(context, cursor);
+ MediaDatabase.MediaRecord mediaRecord = MediaDatabase.MediaRecord.from(cursor);
DatabaseAttachment attachment = Objects.requireNonNull(mediaRecord.getAttachment());
MediaPreviewFragment fragment = MediaPreviewFragment.newInstance(attachment, autoPlay);
@@ -819,7 +808,7 @@ public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Obj
cursor.moveToPosition(cursorPosition);
- MediaRecord mediaRecord = MediaRecord.from(context, cursor);
+ MediaRecord mediaRecord = MediaRecord.from(cursor);
DatabaseAttachment attachment = Objects.requireNonNull(mediaRecord.getAttachment());
RecipientId recipientId = mediaRecord.getRecipientId();
RecipientId threadRecipientId = mediaRecord.getThreadRecipientId();
@@ -890,4 +879,4 @@ interface MediaItemAdapter {
@Nullable View getPlaybackControls(int position);
boolean hasFragmentFor(int position);
}
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java b/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java
index da935281b3..85ca770bfe 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java
@@ -4,11 +4,12 @@
import androidx.annotation.NonNull;
import androidx.viewpager.widget.ViewPager;
+import androidx.viewpager2.widget.ViewPager2;
/**
* Based on https://developer.android.com/training/animation/screen-slide#depth-page
*/
-public final class DepthPageTransformer implements ViewPager.PageTransformer {
+public final class DepthPageTransformer implements ViewPager.PageTransformer, ViewPager2.PageTransformer {
private static final float MIN_SCALE = 0.75f;
public void transformPage(@NonNull View view, float position) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/color/ViewColorSet.kt b/app/src/main/java/org/thoughtcrime/securesms/color/ViewColorSet.kt
new file mode 100644
index 0000000000..60cfe75996
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/color/ViewColorSet.kt
@@ -0,0 +1,55 @@
+package org.thoughtcrime.securesms.color
+
+import android.content.Context
+import android.os.Parcelable
+import androidx.annotation.ColorInt
+import androidx.annotation.ColorRes
+import androidx.core.content.ContextCompat
+import kotlinx.parcelize.Parcelize
+import org.thoughtcrime.securesms.R
+
+/**
+ * Represents a set of colors to be applied to the foreground and background of a view.
+ *
+ * Supports mixing color ints and color resource ids.
+ */
+@Parcelize
+data class ViewColorSet(
+ val foreground: ViewColor,
+ val background: ViewColor
+) : Parcelable {
+ companion object {
+ val PRIMARY = ViewColorSet(
+ foreground = ViewColor.ColorResource(R.color.signal_colorOnPrimary),
+ background = ViewColor.ColorResource(R.color.signal_colorPrimary)
+ )
+
+ fun forCustomColor(@ColorInt customColor: Int): ViewColorSet {
+ return ViewColorSet(
+ foreground = ViewColor.ColorResource(R.color.signal_colorOnCustom),
+ background = ViewColor.ColorValue(customColor)
+ )
+ }
+ }
+
+ @Parcelize
+ sealed class ViewColor : Parcelable {
+
+ @ColorInt
+ abstract fun resolve(context: Context): Int
+
+ @Parcelize
+ data class ColorValue(@ColorInt val colorInt: Int) : ViewColor() {
+ override fun resolve(context: Context): Int {
+ return colorInt
+ }
+ }
+
+ @Parcelize
+ data class ColorResource(@ColorRes val colorRes: Int) : ViewColor() {
+ override fun resolve(context: Context): Int {
+ return ContextCompat.getColor(context, colorRes)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/DialogFragmentDisplayManager.kt b/app/src/main/java/org/thoughtcrime/securesms/components/DialogFragmentDisplayManager.kt
new file mode 100644
index 0000000000..c6b16998e5
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/DialogFragmentDisplayManager.kt
@@ -0,0 +1,35 @@
+package org.thoughtcrime.securesms.components
+
+import androidx.fragment.app.DialogFragment
+import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.DefaultLifecycleObserver
+import androidx.lifecycle.LifecycleOwner
+
+/**
+ * Manages the lifecycle of displaying a dialog fragment. Will automatically close and nullify the reference
+ * if the bound lifecycle is destroyed, and handles repeat calls to show such that no more than one dialog is
+ * displayed.
+ */
+class DialogFragmentDisplayManager(private val builder: () -> DialogFragment) : DefaultLifecycleObserver {
+
+ private var dialogFragment: DialogFragment? = null
+
+ fun show(lifecycleOwner: LifecycleOwner, fragmentManager: FragmentManager, tag: String? = null) {
+ val fragment = dialogFragment ?: builder()
+ if (fragment.dialog?.isShowing != true) {
+ fragment.show(fragmentManager, tag)
+ dialogFragment = fragment
+ lifecycleOwner.lifecycle.addObserver(this)
+ }
+ }
+
+ fun hide() {
+ dialogFragment?.dismissNow()
+ dialogFragment = null
+ }
+
+ override fun onDestroy(owner: LifecycleOwner) {
+ owner.lifecycle.removeObserver(this)
+ hide()
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
index 42a6f2c930..f16c9a068c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
@@ -11,6 +11,7 @@
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
+import org.signal.core.util.BreakIteratorCompat;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.SimpleEmojiTextView;
@@ -19,6 +20,7 @@
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
+import java.util.Iterator;
import java.util.Objects;
public class FromTextView extends SimpleEmojiTextView {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ProgressCardDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ProgressCardDialogFragment.kt
new file mode 100644
index 0000000000..41a649a812
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/ProgressCardDialogFragment.kt
@@ -0,0 +1,20 @@
+package org.thoughtcrime.securesms.components
+
+import android.app.Dialog
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import androidx.fragment.app.DialogFragment
+import org.thoughtcrime.securesms.R
+
+/**
+ * Displays a small progress spinner in a card view, as a non-cancellable dialog fragment.
+ */
+class ProgressCardDialogFragment : DialogFragment(R.layout.progress_card_dialog) {
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ isCancelable = false
+ return super.onCreateDialog(savedInstanceState).apply {
+ this.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java
index 4eb15f6348..f47c66b57d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java
@@ -304,12 +304,11 @@ private void setQuoteText(@Nullable CharSequence body,
missingStoryReaction.setVisibility(View.GONE);
}
- boolean isTextStory = !attachments.containsMediaSlide() && isStoryReply();
-
+ StoryTextPostModel textPostModel = isStoryReply() ? getStoryTextPost(body) : null;
if (!TextUtils.isEmpty(body) || !attachments.containsMediaSlide()) {
- if (isTextStory && body != null) {
+ if (textPostModel != null) {
try {
- bodyView.setText(getStoryTextPost(body).getText());
+ bodyView.setText(textPostModel.getText());
} catch (Exception e) {
Log.w(TAG, "Could not parse body of text post.", e);
bodyView.setText("");
@@ -364,8 +363,8 @@ private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull C
mainView.setMinimumHeight(isStoryReply() && originalMissing ? 0 : thumbHeight);
thumbnailView.setPadding(0, 0, 0, 0);
- if (!attachments.containsMediaSlide() && isStoryReply()) {
- StoryTextPostModel model = getStoryTextPost(body);
+ StoryTextPostModel model = isStoryReply() ? getStoryTextPost(body) : null;
+ if (model != null) {
attachmentVideoOverlayView.setVisibility(GONE);
attachmentContainerView.setVisibility(GONE);
thumbnailView.setVisibility(VISIBLE);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java
index 05d1b56b53..4c09af37ef 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java
@@ -89,7 +89,7 @@ public ThreadPhotoViewHolder onCreateItemViewHolder(ViewGroup parent, int viewTy
@Override
public void onBindItemViewHolder(ThreadPhotoViewHolder viewHolder, @NonNull Cursor cursor) {
ThumbnailView imageView = viewHolder.imageView;
- MediaDatabase.MediaRecord mediaRecord = MediaDatabase.MediaRecord.from(getContext(), cursor);
+ MediaDatabase.MediaRecord mediaRecord = MediaDatabase.MediaRecord.from(cursor);
Slide slide = MediaUtil.getSlideForAttachment(getContext(), mediaRecord.getAttachment());
if (slide != null) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt
index 6c70a78257..3ff3ba08e0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt
@@ -66,6 +66,7 @@ sealed class DSLSettingsText {
}
object TitleLargeModifier : TextAppearanceModifier(R.style.Signal_Text_TitleLarge)
+ object TitleMediumModifier : TextAppearanceModifier(R.style.Signal_Text_TitleMedium)
object Body1BoldModifier : TextAppearanceModifier(R.style.TextAppearance_Signal_Body1_Bold)
open class TextAppearanceModifier(@StyleRes private val textAppearance: Int) : Modifier {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt
index 4a557fe414..a0fa37bea2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt
@@ -43,6 +43,7 @@ import org.thoughtcrime.securesms.util.navigation.safeNavigate
import java.util.Optional
import java.util.concurrent.TimeUnit
import kotlin.math.max
+import kotlin.time.Duration.Companion.seconds
class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__internal_preferences) {
@@ -190,6 +191,25 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter
sectionHeaderPref(R.string.preferences__internal_network)
+ switchPref(
+ title = DSLSettingsText.from("Force websocket mode"),
+ summary = DSLSettingsText.from("Pretend you have no Play Services. Ignores websocket messages and keeps the websocket open in a foreground service. You have to manually force-stop the app for changes to take effect."),
+ isChecked = state.forceWebsocketMode,
+ onClick = {
+ viewModel.setForceWebsocketMode(!state.forceWebsocketMode)
+ SimpleTask.run({
+ val jobState = ApplicationDependencies.getJobManager().runSynchronously(RefreshAttributesJob(), 10.seconds.inWholeMilliseconds)
+ return@run jobState.isPresent && jobState.get().isComplete
+ }, { success ->
+ if (success) {
+ Toast.makeText(context, "Successfully refreshed attributes. Force-stop the app for changes to take effect.", Toast.LENGTH_SHORT).show()
+ } else {
+ Toast.makeText(context, "Failed to refresh attributes.", Toast.LENGTH_SHORT).show()
+ }
+ })
+ }
+ )
+
switchPref(
title = DSLSettingsText.from(R.string.preferences__internal_allow_censorship_toggle),
summary = DSLSettingsText.from(R.string.preferences__internal_allow_censorship_toggle_description),
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt
index 702042ed2a..0ed5e3225e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt
@@ -9,6 +9,7 @@ data class InternalSettingsState(
val gv2ignoreServerChanges: Boolean,
val gv2ignoreP2PChanges: Boolean,
val allowCensorshipSetting: Boolean,
+ val forceWebsocketMode: Boolean,
val callingServer: String,
val callingAudioProcessingMethod: CallManager.AudioProcessingMethod,
val callingBandwidthMode: CallManager.BandwidthMode,
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt
index 1f30e9dbe8..287eacad99 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt
@@ -54,6 +54,11 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito
refresh()
}
+ fun setForceWebsocketMode(enabled: Boolean) {
+ preferenceDataStore.putBoolean(InternalValues.FORCE_WEBSOCKET_MODE, enabled)
+ refresh()
+ }
+
fun setUseBuiltInEmoji(enabled: Boolean) {
preferenceDataStore.putBoolean(InternalValues.FORCE_BUILT_IN_EMOJI, enabled)
refresh()
@@ -103,6 +108,7 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito
gv2ignoreServerChanges = SignalStore.internalValues().gv2IgnoreServerChanges(),
gv2ignoreP2PChanges = SignalStore.internalValues().gv2IgnoreP2PChanges(),
allowCensorshipSetting = SignalStore.internalValues().allowChangingCensorshipSetting(),
+ forceWebsocketMode = SignalStore.internalValues().isWebsocketModeForced,
callingServer = SignalStore.internalValues().groupCallingServer(),
callingAudioProcessingMethod = SignalStore.internalValues().callingAudioProcessingMethod(),
callingBandwidthMode = SignalStore.internalValues().callingBandwidthMode(),
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/StoryDialogLauncherFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/StoryDialogLauncherFragment.kt
index b8946dc4f2..bd90db9c98 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/StoryDialogLauncherFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/StoryDialogLauncherFragment.kt
@@ -16,6 +16,15 @@ class StoryDialogLauncherFragment : DSLSettingsFragment(titleId = R.string.prefe
private fun getConfiguration(): DSLConfiguration {
return configure {
+ clickPref(
+ title = DSLSettingsText.from(R.string.preferences__internal_remove_group_story),
+ onClick = {
+ StoryDialogs.removeGroupStory(requireContext(), "Family") {
+ Toast.makeText(requireContext(), R.string.preferences__internal_remove_group_story, Toast.LENGTH_SHORT).show()
+ }
+ }
+ )
+
clickPref(
title = DSLSettingsText.from(R.string.preferences__internal_retry_send),
onClick = {
@@ -44,6 +53,33 @@ class StoryDialogLauncherFragment : DSLSettingsFragment(titleId = R.string.prefe
}
}
)
+
+ clickPref(
+ title = DSLSettingsText.from(R.string.preferences__internal_turn_off_stories),
+ onClick = {
+ StoryDialogs.disableStories(requireContext(), false) {
+ Toast.makeText(requireContext(), R.string.preferences__internal_turn_off_stories, Toast.LENGTH_SHORT).show()
+ }
+ }
+ )
+
+ clickPref(
+ title = DSLSettingsText.from(R.string.preferences__internal_turn_off_stories_with_stories_on_disk),
+ onClick = {
+ StoryDialogs.disableStories(requireContext(), true) {
+ Toast.makeText(requireContext(), R.string.preferences__internal_turn_off_stories_with_stories_on_disk, Toast.LENGTH_SHORT).show()
+ }
+ }
+ )
+
+ clickPref(
+ title = DSLSettingsText.from(R.string.preferences__internal_delete_private_story),
+ onClick = {
+ StoryDialogs.deleteDistributionList(requireContext(), "Family") {
+ Toast.makeText(requireContext(), R.string.preferences__internal_delete_private_story, Toast.LENGTH_SHORT).show()
+ }
+ }
+ )
}
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt
index 028de04639..ebcca64af7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt
@@ -241,6 +241,18 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac
)
)
+ if (Stories.isFeatureAvailable()) {
+ dividerPref()
+
+ clickPref(
+ title = DSLSettingsText.from(R.string.preferences__stories),
+ summary = DSLSettingsText.from(R.string.PrivacySettingsFragment__manage_your_stories),
+ onClick = {
+ findNavController().safeNavigate(PrivacySettingsFragmentDirections.actionPrivacySettingsFragmentToStoryPrivacySettings(R.string.preferences__stories))
+ }
+ )
+ }
+
dividerPref()
sectionHeaderPref(R.string.PrivacySettingsFragment__app_security)
@@ -278,18 +290,6 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac
summary = DSLSettingsText.from(incognitoSummary),
)
- if (Stories.isFeatureAvailable()) {
- dividerPref()
-
- clickPref(
- title = DSLSettingsText.from(R.string.preferences__stories),
- summary = DSLSettingsText.from(R.string.PrivacySettingsFragment__manage_your_stories),
- onClick = {
- findNavController().safeNavigate(PrivacySettingsFragmentDirections.actionPrivacySettingsFragmentToStoryPrivacySettings(R.string.preferences__stories))
- }
- )
- }
-
dividerPref()
clickPref(
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt
index 20649663a9..8bea411de3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt
@@ -77,7 +77,7 @@ class AdvancedPrivacySettingsViewModel(
fun setCensorshipCircumventionEnabled(enabled: Boolean) {
SignalStore.settings().setCensorshipCircumventionEnabled(enabled)
SignalStore.misc().isServiceReachableWithoutCircumvention = false
- ApplicationDependencies.restartNetworkConnectionsAfterProxyChange()
+ ApplicationDependencies.restartAllNetworkConnections()
refresh()
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt
index da94949e2b..458ed789fe 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt
@@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.database.SignalDatabase
+import org.thoughtcrime.securesms.database.model.RecipientRecord
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.keyvalue.SignalStore
@@ -266,17 +267,23 @@ class InternalConversationSettingsFragment : DSLSettingsFragment(
}
private fun buildCapabilitySpan(recipient: Recipient): CharSequence {
- return TextUtils.concat(
- colorize("GV1Migration", recipient.groupsV1MigrationCapability),
- ", ",
- colorize("AnnouncementGroup", recipient.announcementGroupCapability),
- ", ",
- colorize("SenderKey", recipient.senderKeyCapability),
- ", ",
- colorize("ChangeNumber", recipient.changeNumberCapability),
- ", ",
- colorize("Stories", recipient.storiesCapability),
- )
+ val capabilities: RecipientRecord.Capabilities? = SignalDatabase.recipients.getCapabilities(recipient.id)
+
+ return if (capabilities != null) {
+ TextUtils.concat(
+ colorize("GV1Migration", capabilities.groupsV1MigrationCapability),
+ ", ",
+ colorize("AnnouncementGroup", capabilities.announcementGroupCapability),
+ ", ",
+ colorize("SenderKey", capabilities.senderKeyCapability),
+ ", ",
+ colorize("ChangeNumber", capabilities.changeNumberCapability),
+ ", ",
+ colorize("Stories", capabilities.storiesCapability),
+ )
+ } else {
+ "Recipient not found!"
+ }
}
private fun colorize(name: String, support: Recipient.Capability): CharSequence {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChipViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChipViewModel.kt
index 0cd7ce6d0b..33e9b20b5b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChipViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChipViewModel.kt
@@ -35,6 +35,7 @@ class ContactChipViewModel : ViewModel() {
disposables.clear()
disposableMap.values.forEach { it.dispose() }
disposableMap.clear()
+ store.dispose()
}
fun add(selectedContact: SelectedContact) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration.kt
index 3a743af946..962b6f6d44 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration.kt
@@ -52,7 +52,8 @@ class ContactSearchConfiguration private constructor(
val includeSelf: Boolean,
val transportType: TransportType,
override val includeHeader: Boolean,
- override val expandConfig: ExpandConfig? = null
+ override val expandConfig: ExpandConfig? = null,
+ val includeLetterHeaders: Boolean = false
) : Section(SectionKey.INDIVIDUALS)
/**
@@ -64,6 +65,7 @@ class ContactSearchConfiguration private constructor(
val includeInactive: Boolean = false,
val returnAsGroupStories: Boolean = false,
val sortOrder: ContactSearchSortOrder = ContactSearchSortOrder.NATURAL,
+ val shortSummary: Boolean = false,
override val includeHeader: Boolean,
override val expandConfig: ExpandConfig? = null
) : Section(SectionKey.GROUPS)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchData.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchData.kt
index d835ad3c83..f7ba55ba20 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchData.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchData.kt
@@ -23,7 +23,11 @@ sealed class ContactSearchData(val contactSearchKey: ContactSearchKey) {
/**
* A row displaying a known recipient.
*/
- data class KnownRecipient(val recipient: Recipient) : ContactSearchData(ContactSearchKey.RecipientSearchKey.KnownRecipient(recipient.id))
+ data class KnownRecipient(
+ val recipient: Recipient,
+ val shortSummary: Boolean = false,
+ val headerLetter: String? = null
+ ) : ContactSearchData(ContactSearchKey.RecipientSearchKey.KnownRecipient(recipient.id))
/**
* A row containing a title for a given section
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt
index cf60e759aa..c575d72d82 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt
@@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.components.AvatarImageView
import org.thoughtcrime.securesms.components.FromTextView
import org.thoughtcrime.securesms.components.menu.ActionItem
import org.thoughtcrime.securesms.components.menu.SignalContextMenu
+import org.thoughtcrime.securesms.contacts.LetterHeaderDecoration
import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.recipients.Recipient
@@ -73,7 +74,7 @@ object ContactSearchItems {
contactSearchData.filterNotNull().map {
when (it) {
is ContactSearchData.Story -> StoryModel(it, selection.contains(it.contactSearchKey), SignalStore.storyValues().userHasBeenNotifiedAboutStories)
- is ContactSearchData.KnownRecipient -> RecipientModel(it, selection.contains(it.contactSearchKey))
+ is ContactSearchData.KnownRecipient -> RecipientModel(it, selection.contains(it.contactSearchKey), it.shortSummary)
is ContactSearchData.Expand -> ExpandModel(it)
is ContactSearchData.Header -> HeaderModel(it)
is ContactSearchData.TestRow -> error("This row exists for testing only.")
@@ -207,7 +208,7 @@ object ContactSearchItems {
/**
* Recipient model
*/
- private class RecipientModel(val knownRecipient: ContactSearchData.KnownRecipient, val isSelected: Boolean) : MappingModel {
+ private class RecipientModel(val knownRecipient: ContactSearchData.KnownRecipient, val isSelected: Boolean, val shortSummary: Boolean) : MappingModel {
override fun areItemsTheSame(newItem: RecipientModel): Boolean {
return newItem.knownRecipient == knownRecipient
@@ -226,10 +227,29 @@ object ContactSearchItems {
}
}
- private class KnownRecipientViewHolder(itemView: View, displayCheckBox: Boolean, onClick: RecipientClickListener) : BaseRecipientViewHolder(itemView, displayCheckBox, onClick) {
+ private class KnownRecipientViewHolder(itemView: View, displayCheckBox: Boolean, onClick: RecipientClickListener) : BaseRecipientViewHolder(itemView, displayCheckBox, onClick), LetterHeaderDecoration.LetterHeaderItem {
+
+ private var headerLetter: String? = null
+
override fun isSelected(model: RecipientModel): Boolean = model.isSelected
override fun getData(model: RecipientModel): ContactSearchData.KnownRecipient = model.knownRecipient
override fun getRecipient(model: RecipientModel): Recipient = model.knownRecipient.recipient
+ override fun bindNumberField(model: RecipientModel) {
+ val recipient = getRecipient(model)
+
+ if (model.shortSummary && recipient.isGroup) {
+ val count = recipient.participantIds.size
+ number.text = context.resources.getQuantityString(R.plurals.ContactSearchItems__group_d_members, count, count)
+ } else {
+ super.bindNumberField(model)
+ }
+
+ headerLetter = model.knownRecipient.headerLetter
+ }
+
+ override fun getHeaderLetter(): String? {
+ return headerLetter
+ }
}
/**
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt
index 16e340da5c..b9cdfe960a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt
@@ -12,6 +12,7 @@ import io.reactivex.rxjava3.core.Observable
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.groups.SelectionLimits
import org.thoughtcrime.securesms.keyvalue.SignalStore
+import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
import org.thoughtcrime.securesms.stories.settings.custom.PrivateStorySettingsFragment
import org.thoughtcrime.securesms.stories.settings.my.MyStorySettingsFragment
import org.thoughtcrime.securesms.stories.settings.privacy.ChooseInitialMyStoryMembershipBottomSheetDialogFragment
@@ -97,6 +98,17 @@ class ContactSearchMediator(
}
private fun toggleStorySelection(view: View, contactSearchData: ContactSearchData.Story, isSelected: Boolean) {
+ if (SignalStore.storyValues().userHasSeenBetaDialog) {
+ performStoryToggle(view, contactSearchData, isSelected)
+ } else {
+ StoryDialogs.displayBetaDialog(view.context) {
+ SignalStore.storyValues().userHasSeenBetaDialog = true
+ performStoryToggle(view, contactSearchData, isSelected)
+ }
+ }
+ }
+
+ private fun performStoryToggle(view: View, contactSearchData: ContactSearchData.Story, isSelected: Boolean) {
if (contactSearchData.recipient.isMyStory && !SignalStore.storyValues().userHasBeenNotifiedAboutStories) {
ChooseInitialMyStoryMembershipBottomSheetDialogFragment.show(fragment.childFragmentManager)
} else {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt
index 28c4287a94..580cc12d02 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt
@@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.keyvalue.StorySend
import org.thoughtcrime.securesms.recipients.Recipient
+import org.thoughtcrime.securesms.recipients.RecipientId
import java.util.concurrent.TimeUnit
/**
@@ -129,6 +130,13 @@ class ContactSearchPagedDataSource(
}
}
+ private fun getNonGroupHeaderLetterMap(section: ContactSearchConfiguration.Section.Individuals, query: String?): Map {
+ return when (section.transportType) {
+ ContactSearchConfiguration.TransportType.PUSH -> contactSearchPagedDataSourceRepository.querySignalContactLetterHeaders(query, section.includeSelf)
+ else -> error("This has only been implemented for push recipients.")
+ }
+ }
+
private fun getStoriesSearchIterator(query: String?): ContactSearchIterator {
return CursorSearchIterator(contactSearchPagedDataSourceRepository.getStories(query))
}
@@ -193,6 +201,12 @@ class ContactSearchPagedDataSource(
}
private fun getNonGroupContactsData(section: ContactSearchConfiguration.Section.Individuals, query: String?, startIndex: Int, endIndex: Int): List {
+ val headerMap: Map = if (section.includeLetterHeaders) {
+ getNonGroupHeaderLetterMap(section, query)
+ } else {
+ emptyMap()
+ }
+
return getNonGroupSearchIterator(section, query).use { records ->
readContactData(
records = records,
@@ -201,7 +215,8 @@ class ContactSearchPagedDataSource(
startIndex = startIndex,
endIndex = endIndex,
recordMapper = {
- ContactSearchData.KnownRecipient(contactSearchPagedDataSourceRepository.getRecipientFromRecipientCursor(it))
+ val recipient = contactSearchPagedDataSourceRepository.getRecipientFromRecipientCursor(it)
+ ContactSearchData.KnownRecipient(recipient, headerLetter = headerMap[recipient.id])
}
)
}
@@ -219,7 +234,7 @@ class ContactSearchPagedDataSource(
if (section.returnAsGroupStories) {
ContactSearchData.Story(contactSearchPagedDataSourceRepository.getRecipientFromGroupRecord(it), 0, DistributionListPrivacyMode.ALL)
} else {
- ContactSearchData.KnownRecipient(contactSearchPagedDataSourceRepository.getRecipientFromGroupRecord(it))
+ ContactSearchData.KnownRecipient(contactSearchPagedDataSourceRepository.getRecipientFromGroupRecord(it), shortSummary = section.shortSummary)
}
}
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSourceRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSourceRepository.kt
index e5552ffa54..c84a9efc35 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSourceRepository.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSourceRepository.kt
@@ -36,6 +36,10 @@ open class ContactSearchPagedDataSourceRepository(
return contactRepository.querySignalContacts(query ?: "", includeSelf)
}
+ open fun querySignalContactLetterHeaders(query: String?, includeSelf: Boolean): Map {
+ return SignalDatabase.recipients.querySignalContactLetterHeaders(query ?: "", includeSelf)
+ }
+
open fun queryNonSignalContacts(query: String?): Cursor? {
return contactRepository.queryNonSignalContacts(query ?: "")
}
@@ -107,7 +111,7 @@ open class ContactSearchPagedDataSourceRepository(
}
open fun recipientNameContainsQuery(recipient: Recipient, query: String?): Boolean {
- return query.isNullOrBlank() || recipient.getDisplayName(context).contains(query)
+ return query.isNullOrBlank() || recipient.getDisplayName(context).contains(query, ignoreCase = true)
}
open fun myStoryContainsQuery(query: String): Boolean {
@@ -116,6 +120,6 @@ open class ContactSearchPagedDataSourceRepository(
}
val myStory = context.getString(R.string.Recipient_my_story)
- return myStory.contains(query)
+ return myStory.contains(query, ignoreCase = true)
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java
index f2d120b2cb..42dc29c5e3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java
@@ -159,6 +159,12 @@ private int getSizeInternal() {
MessageDatabase database = messageId.isMms() ? SignalDatabase.mms() : SignalDatabase.sms();
MessageRecord record = database.getMessageRecordOrNull(messageId.getId());
+ if (record instanceof MediaMmsMessageRecord &&
+ ((MediaMmsMessageRecord) record).getParentStoryId() != null &&
+ ((MediaMmsMessageRecord) record).getParentStoryId().isGroupReply()) {
+ return null;
+ }
+
stopwatch.split("message");
try {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
index 40e261ec3c..c04be108ea 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
@@ -20,6 +20,7 @@
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
+import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
@@ -95,6 +96,7 @@
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectCollection;
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
+import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
import org.thoughtcrime.securesms.database.model.MessageRecord;
@@ -107,6 +109,8 @@
import org.thoughtcrime.securesms.jobs.MmsDownloadJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
+import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory;
+import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Activity;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.mms.ImageSlide;
import org.thoughtcrime.securesms.mms.PartAuthority;
@@ -122,6 +126,7 @@
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.revealable.ViewOnceMessageView;
import org.thoughtcrime.securesms.util.DateUtils;
+import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.InterceptableLongClickCopyLinkSpan;
import org.thoughtcrime.securesms.util.LinkUtil;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
@@ -2254,17 +2259,19 @@ public void onClick(final View v, final Slide slide) {
} else if (!canPlayContent && mediaItem != null && eventListener != null) {
eventListener.onPlayInlineContent(conversationMessage);
} else if (MediaPreviewActivity.isContentTypeSupported(slide.getContentType()) && slide.getUri() != null) {
- Intent intent = new Intent(context, MediaPreviewActivity.class);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- intent.setDataAndType(slide.getUri(), slide.getContentType());
- intent.putExtra(MediaPreviewActivity.THREAD_ID_EXTRA, messageRecord.getThreadId());
- intent.putExtra(MediaPreviewActivity.DATE_EXTRA, messageRecord.getTimestamp());
- intent.putExtra(MediaPreviewActivity.SIZE_EXTRA, slide.asAttachment().getSize());
- intent.putExtra(MediaPreviewActivity.CAPTION_EXTRA, slide.getCaption().orElse(null));
- intent.putExtra(MediaPreviewActivity.IS_VIDEO_GIF, slide.isVideoGif());
- intent.putExtra(MediaPreviewActivity.LEFT_IS_RECENT_EXTRA, false);
-
- context.startActivity(intent);
+ MediaIntentFactory.MediaPreviewArgs args = new MediaIntentFactory.MediaPreviewArgs(
+ messageRecord.getThreadId(),
+ messageRecord.getTimestamp(),
+ slide.getUri(),
+ slide.getContentType(),
+ slide.asAttachment().getSize(),
+ slide.getCaption().orElse(null),
+ false,
+ false,
+ false,
+ MediaDatabase.Sorting.Newest.ordinal(),
+ slide.isVideoGif());
+ context.startActivity(MediaIntentFactory.create(context, args));
} else if (slide.getUri() != null) {
Log.i(TAG, "Clicked: " + slide.getUri() + " , " + slide.getContentType());
Uri publicUri = PartAuthority.getAttachmentPublicUri(slide.getUri());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java
index 92b39fed06..15e1e61064 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java
@@ -192,6 +192,7 @@
import org.thoughtcrime.securesms.groups.ui.invitesandrequests.ManagePendingAndRequestingMembersActivity;
import org.thoughtcrime.securesms.groups.ui.migration.GroupsV1MigrationInitiationBottomSheetDialogFragment;
import org.thoughtcrime.securesms.groups.ui.migration.GroupsV1MigrationSuggestionsDialog;
+import org.thoughtcrime.securesms.jobs.ForceUpdateGroupV2Job;
import org.thoughtcrime.securesms.jobs.GroupV1MigrationJob;
import org.thoughtcrime.securesms.jobs.GroupV2UpdateSelfProfileKeyJob;
import org.thoughtcrime.securesms.jobs.RequestGroupV2InfoJob;
@@ -580,6 +581,8 @@ public void onResume() {
.then(GroupV2UpdateSelfProfileKeyJob.withoutLimits(groupId))
.enqueue();
+ ForceUpdateGroupV2Job.enqueueIfNecessary(groupId);
+
if (viewModel.getArgs().isFirstTimeInSelfCreatedGroup()) {
groupViewModel.inviteFriendsOneTimeIfJustSelfInGroup(getChildFragmentManager(), groupId);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java
index 3fef0cffc9..bf647aeb25 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java
@@ -59,6 +59,7 @@
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.processors.PublishProcessor;
import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
@@ -135,10 +136,12 @@ private ConversationViewModel() {
.map(Recipient::resolved)
.subscribe(recipientCache);
- conversationStateStore.update(Observable.combineLatest(recipientId.distinctUntilChanged(), conversationStateTick, (id, tick) -> id)
- .switchMap(conversationRepository::getSecurityInfo)
- .toFlowable(BackpressureStrategy.LATEST),
- (securityInfo, state) -> state.withSecurityInfo(securityInfo));
+ Disposable disposable = conversationStateStore.update(Observable.combineLatest(recipientId.distinctUntilChanged(), conversationStateTick, (id, tick) -> id)
+ .switchMap(conversationRepository::getSecurityInfo)
+ .toFlowable(BackpressureStrategy.LATEST),
+ (securityInfo, state) -> state.withSecurityInfo(securityInfo));
+
+ disposables.add(disposable);
BehaviorSubject conversationMetadata = BehaviorSubject.create();
@@ -425,6 +428,7 @@ protected void onCleared() {
ApplicationDependencies.getDatabaseObserver().unregisterObserver(messageUpdateObserver);
ApplicationDependencies.getDatabaseObserver().unregisterObserver(messageInsertObserver);
disposables.clear();
+ conversationStateStore.dispose();
EventBus.getDefault().unregister(this);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt
index 41ba3ee6f1..a97b9e7cb0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt
@@ -33,6 +33,10 @@ class DraftViewModel @JvmOverloads constructor(
val voiceNoteDraft: Draft?
get() = store.state.voiceNoteDraft
+ override fun onCleared() {
+ store.dispose()
+ }
+
fun setThreadId(threadId: Long) {
store.update { it.copy(threadId = threadId) }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt
index 53b835f989..4d7b72a2bb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt
@@ -8,6 +8,7 @@ import androidx.activity.result.contract.ActivityResultContract
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
+import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.FragmentWrapperActivity
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
@@ -16,6 +17,7 @@ import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectFor
open class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectForwardFragment.Callback, SearchConfigurationProvider {
companion object {
+ private val TAG = Log.tag(MultiselectForwardActivity::class.java)
private const val ARGS = "args"
}
@@ -32,20 +34,15 @@ open class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectFo
}
override fun getFragment(): Fragment {
- return MultiselectForwardFragment.create(
- args.let {
- if (it.sendButtonTint == -1) {
- args.withSendButtonTint(ContextCompat.getColor(this, R.color.signal_colorPrimary))
- } else {
- args
- }
- }
- )
+ return MultiselectForwardFragment.create(args)
}
- override fun onFinishForwardAction() = Unit
+ override fun onFinishForwardAction() {
+ Log.d(TAG, "Completed forward action...")
+ }
override fun exitFlow() {
+ Log.d(TAG, "Exiting flow...")
onBackPressedDispatcher.onBackPressed()
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt
index 185a084e02..0ce2139e55 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt
@@ -29,6 +29,7 @@ import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.signal.core.util.DimensionUnit
+import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.ContactFilterView
import org.thoughtcrime.securesms.components.TooltipPopup
@@ -143,9 +144,10 @@ class MultiselectForwardFragment :
val sendButton: AppCompatImageView = bottomBar.findViewById(R.id.share_confirm)
val backgroundHelper: View = bottomBar.findViewById(R.id.background_helper)
- if (args.sendButtonTint != -1) {
- sendButton.setColorFilter(ContextCompat.getColor(requireContext(), R.color.signal_colorOnCustom))
- ViewCompat.setBackgroundTintList(sendButton, ColorStateList.valueOf(args.sendButtonTint))
+ val sendButtonColors = args.sendButtonColors
+ if (sendButtonColors != null) {
+ sendButton.setColorFilter(sendButtonColors.foreground.resolve(requireContext()))
+ ViewCompat.setBackgroundTintList(sendButton, ColorStateList.valueOf(sendButtonColors.background.resolve(requireContext())))
}
FullscreenHelper.configureBottomBarLayout(requireActivity(), bottomBarSpacer, bottomBar)
@@ -318,6 +320,8 @@ class MultiselectForwardFragment :
}
private fun dismissAndShowToast(@PluralsRes toastTextResId: Int) {
+ Log.d(TAG, "dismissAndShowToast")
+
val argCount = getMessageCount()
callback.onFinishForwardAction()
@@ -329,6 +333,8 @@ class MultiselectForwardFragment :
private fun getMessageCount(): Int = args.multiShareArgs.size + if (addMessage.text.isNotEmpty()) 1 else 0
private fun handleMessageExpired() {
+ Log.d(TAG, "handleMessageExpired")
+
callback.onFinishForwardAction()
dismissibleDialog?.dismiss()
Toast.makeText(requireContext(), resources.getQuantityString(R.plurals.MultiselectForwardFragment__couldnt_forward_messages, args.multiShareArgs.size), Toast.LENGTH_LONG).show()
@@ -336,6 +342,8 @@ class MultiselectForwardFragment :
}
private fun dismissWithSelection(selectedContacts: Set) {
+ Log.d(TAG, "dismissWithSelection")
+
callback.onFinishForwardAction()
dismissibleDialog?.dismiss()
@@ -451,7 +459,7 @@ class MultiselectForwardFragment :
}
private fun isSelectedMediaValidForStories(): Boolean {
- return args.multiShareArgs.all { it.isValidForStories }
+ return !args.isViewOnce && args.multiShareArgs.all { it.isValidForStories }
}
private fun isSelectedMediaValidForNonStories(): Boolean {
@@ -486,6 +494,8 @@ class MultiselectForwardFragment :
}
companion object {
+ private val TAG = Log.tag(MultiselectForwardActivity::class.java)
+
const val DIALOG_TITLE = "title"
const val ARGS = "args"
const val RESULT_KEY = "result_key"
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt
index 1d34fa3f30..ec423cfe87 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt
@@ -12,6 +12,7 @@ import org.signal.core.util.ThreadUtil
import org.signal.core.util.concurrent.SignalExecutors
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.attachments.Attachment
+import org.thoughtcrime.securesms.color.ViewColorSet
import org.thoughtcrime.securesms.conversation.ConversationMessage
import org.thoughtcrime.securesms.conversation.mutiselect.Multiselect
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart
@@ -43,12 +44,13 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
val forceDisableAddMessage: Boolean = false,
val forceSelectionOnly: Boolean = false,
val selectSingleRecipient: Boolean = false,
- @ColorInt val sendButtonTint: Int = -1,
+ val sendButtonColors: ViewColorSet = ViewColorSet.PRIMARY,
val storySendRequirements: Stories.MediaTransform.SendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND,
- val isSearchEnabled: Boolean = true
+ val isSearchEnabled: Boolean = true,
+ val isViewOnce: Boolean = false
) : Parcelable {
- fun withSendButtonTint(@ColorInt sendButtonTint: Int) = copy(sendButtonTint = sendButtonTint)
+ fun withSendButtonTint(@ColorInt sendButtonTint: Int) = copy(sendButtonColors = ViewColorSet.forCustomColor(sendButtonTint))
companion object {
@JvmStatic
@@ -61,9 +63,11 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
.withDataType(mediaType)
.build()
- val sendButtonTint: Int = threadId.takeIf { it > 0 }
- ?.let { SignalDatabase.threads.getRecipientForThreadId(it) }?.chatColors?.asSingleColor()
- ?: -1
+ val sendButtonColors: ViewColorSet? = threadId.takeIf { it > 0 }
+ ?.let { SignalDatabase.threads.getRecipientForThreadId(it) }
+ ?.chatColors
+ ?.asSingleColor()
+ ?.let { ViewColorSet.forCustomColor(it) }
ThreadUtil.runOnMain {
consumer.accept(
@@ -71,7 +75,7 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
isMmsSupported,
listOf(multiShareArgs),
storySendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND,
- sendButtonTint = sendButtonTint
+ sendButtonColors = sendButtonColors ?: ViewColorSet.PRIMARY
)
)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java
index 2e1bfeb1fb..a0a3a44578 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java
@@ -17,6 +17,8 @@
import org.signal.libsignal.protocol.ecc.ECPublicKey;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.BuildConfig;
+import org.thoughtcrime.securesms.database.RecipientDatabase;
+import org.thoughtcrime.securesms.database.RecipientDatabase.UnidentifiedAccessMode;
import org.thoughtcrime.securesms.keyvalue.CertificateType;
import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -68,8 +70,8 @@ public static List> getAccessFor(@NonNull Conte
}
@WorkerThread
- public static Map> getAccessMapFor(@NonNull Context context, @NonNull List recipients) {
- List> accessList = getAccessFor(context, recipients, true);
+ public static Map> getAccessMapFor(@NonNull Context context, @NonNull List recipients, boolean isForStory) {
+ List> accessList = getAccessFor(context, recipients, true, isForStory);
Iterator recipientIterator = recipients.iterator();
Iterator> accessIterator = accessList.iterator();
@@ -82,9 +84,14 @@ public static Map> getAccessMapFor
return accessMap;
}
-
+
@WorkerThread
public static List> getAccessFor(@NonNull Context context, @NonNull List recipients, boolean log) {
+ return getAccessFor(context, recipients, false, log);
+ }
+
+ @WorkerThread
+ public static List> getAccessFor(@NonNull Context context, @NonNull List recipients, boolean isForStory, boolean log) {
byte[] ourUnidentifiedAccessKey = UnidentifiedAccess.deriveAccessKeyFrom(ProfileKeyUtil.getSelfProfileKey());
if (TextSecurePreferences.isUniversalUnidentifiedAccess(context)) {
@@ -96,7 +103,7 @@ public static List> getAccessFor(@NonNull Conte
Map typeCounts = new HashMap<>();
for (Recipient recipient : recipients) {
- byte[] theirUnidentifiedAccessKey = getTargetUnidentifiedAccessKey(recipient);
+ byte[] theirUnidentifiedAccessKey = getTargetUnidentifiedAccessKey(recipient, isForStory);
CertificateType certificateType = getUnidentifiedAccessCertificateType(recipient);
byte[] ourUnidentifiedAccessCertificate = SignalStore.certificateValues().getUnidentifiedAccessCertificate(certificateType);
@@ -168,28 +175,40 @@ private static byte[] getUnidentifiedAccessCertificate(@NonNull Recipient recipi
.getUnidentifiedAccessCertificate(getUnidentifiedAccessCertificateType(recipient));
}
- private static @Nullable byte[] getTargetUnidentifiedAccessKey(@NonNull Recipient recipient) {
+ private static @Nullable byte[] getTargetUnidentifiedAccessKey(@NonNull Recipient recipient, boolean isForStory) {
ProfileKey theirProfileKey = ProfileKeyUtil.profileKeyOrNull(recipient.resolve().getProfileKey());
+ byte[] accessKey;
+
switch (recipient.resolve().getUnidentifiedAccessMode()) {
case UNKNOWN:
if (theirProfileKey == null) {
- return UNRESTRICTED_KEY;
+ accessKey = UNRESTRICTED_KEY;
} else {
- return UnidentifiedAccess.deriveAccessKeyFrom(theirProfileKey);
+ accessKey = UnidentifiedAccess.deriveAccessKeyFrom(theirProfileKey);
}
+ break;
case DISABLED:
- return null;
+ accessKey = null;
+ break;
case ENABLED:
if (theirProfileKey == null) {
- return null;
+ accessKey = null;
} else {
- return UnidentifiedAccess.deriveAccessKeyFrom(theirProfileKey);
+ accessKey = UnidentifiedAccess.deriveAccessKeyFrom(theirProfileKey);
}
+ break;
case UNRESTRICTED:
- return UNRESTRICTED_KEY;
+ accessKey = UNRESTRICTED_KEY;
+ break;
default:
throw new AssertionError("Unknown mode: " + recipient.getUnidentifiedAccessMode().getMode());
}
+
+ if (accessKey == null && isForStory) {
+ accessKey = UNRESTRICTED_KEY;
+ }
+
+ return accessKey;
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java
index 59a536aa55..8188f61eae 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java
@@ -739,10 +739,15 @@ public void updateMessageId(@NonNull Collection attachmentIds, lon
values.putNull(CAPTION);
}
+ int updatedCount = 0;
+ int attachmentIdSize = 0;
for (AttachmentId attachmentId : attachmentIds) {
- db.update(TABLE_NAME, values, PART_ID_WHERE, attachmentId.toStrings());
+ attachmentIdSize++;
+ updatedCount = db.update(TABLE_NAME, values, PART_ID_WHERE, attachmentId.toStrings());
}
+ Log.d(TAG, "[updateMessageId] Updated " + updatedCount + " out of " + attachmentIdSize + " ids.");
+
db.setTransactionSuccessful();
} finally {
db.endTransaction();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt
index f5cab53979..757b008841 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt
@@ -16,7 +16,6 @@ import org.signal.core.util.requireString
import org.signal.core.util.select
import org.signal.core.util.withinTransaction
import org.thoughtcrime.securesms.database.model.DistributionListId
-import org.thoughtcrime.securesms.database.model.DistributionListPartialRecord
import org.thoughtcrime.securesms.database.model.DistributionListPrivacyData
import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode
import org.thoughtcrime.securesms.database.model.DistributionListRecord
@@ -99,7 +98,10 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
const val IS_NOT_DELETED = "$DELETION_TIMESTAMP == 0"
- val LIST_UI_PROJECTION = arrayOf(ID, NAME, RECIPIENT_ID, ALLOWS_REPLIES, IS_UNKNOWN, PRIVACY_MODE)
+ val SEARCH_NAME_COLUMN = "search_name"
+ private val SEARCH_NAME = "LOWER($NAME) AS $SEARCH_NAME_COLUMN"
+
+ val LIST_UI_PROJECTION = arrayOf(ID, NAME, RECIPIENT_ID, ALLOWS_REPLIES, IS_UNKNOWN, PRIVACY_MODE, SEARCH_NAME)
}
private object MembershipTable {
@@ -148,8 +150,8 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
val where = when {
query.isNullOrEmpty() && includeMyStory -> ListTable.IS_NOT_DELETED
query.isNullOrEmpty() -> "${ListTable.ID} != ? AND ${ListTable.IS_NOT_DELETED}"
- includeMyStory -> "(${ListTable.NAME} GLOB ? OR ${ListTable.ID} == ?) AND ${ListTable.IS_NOT_DELETED} AND NOT ${ListTable.IS_UNKNOWN}"
- else -> "${ListTable.NAME} GLOB ? AND ${ListTable.ID} != ? AND ${ListTable.IS_NOT_DELETED} AND NOT ${ListTable.IS_UNKNOWN}"
+ includeMyStory -> "(${ListTable.SEARCH_NAME_COLUMN} GLOB ? OR ${ListTable.ID} == ?) AND ${ListTable.IS_NOT_DELETED} AND NOT ${ListTable.IS_UNKNOWN}"
+ else -> "${ListTable.SEARCH_NAME_COLUMN} GLOB ? AND ${ListTable.ID} != ? AND ${ListTable.IS_NOT_DELETED} AND NOT ${ListTable.IS_UNKNOWN}"
}
val whereArgs = when {
@@ -169,29 +171,6 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
.readToList { cursor -> RecipientId.from(cursor.requireLong(ListTable.RECIPIENT_ID)) }
}
- fun getCustomListsForUi(): List {
- val db = readableDatabase
- val selection = "${ListTable.ID} != ${DistributionListId.MY_STORY_ID} AND ${ListTable.IS_NOT_DELETED}"
-
- return db.query(ListTable.TABLE_NAME, ListTable.LIST_UI_PROJECTION, selection, null, null, null, null)?.use { cursor ->
- val results = mutableListOf()
- while (cursor.moveToNext()) {
- results.add(
- DistributionListPartialRecord(
- id = DistributionListId.from(CursorUtil.requireLong(cursor, ListTable.ID)),
- name = CursorUtil.requireString(cursor, ListTable.NAME),
- allowsReplies = CursorUtil.requireBoolean(cursor, ListTable.ALLOWS_REPLIES),
- recipientId = RecipientId.from(CursorUtil.requireLong(cursor, ListTable.RECIPIENT_ID)),
- isUnknown = CursorUtil.requireBoolean(cursor, ListTable.IS_UNKNOWN),
- privacyMode = cursor.requireObject(ListTable.PRIVACY_MODE, DistributionListPrivacyMode.Serializer)
- )
- )
- }
-
- results
- } ?: emptyList()
- }
-
/**
* Gets or creates a distribution list for the given id.
*
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java
index 48bb74436e..7db24f1c8c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java
@@ -69,24 +69,25 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
private static final String TAG = Log.tag(GroupDatabase.class);
- static final String TABLE_NAME = "groups";
- private static final String ID = "_id";
- static final String GROUP_ID = "group_id";
- public static final String RECIPIENT_ID = "recipient_id";
- private static final String TITLE = "title";
- static final String MEMBERS = "members";
- private static final String AVATAR_ID = "avatar_id";
- private static final String AVATAR_KEY = "avatar_key";
- private static final String AVATAR_CONTENT_TYPE = "avatar_content_type";
- private static final String AVATAR_RELAY = "avatar_relay";
- private static final String AVATAR_DIGEST = "avatar_digest";
- private static final String TIMESTAMP = "timestamp";
- static final String ACTIVE = "active";
- static final String MMS = "mms";
- private static final String EXPECTED_V2_ID = "expected_v2_id";
- private static final String UNMIGRATED_V1_MEMBERS = "former_v1_members";
- private static final String DISTRIBUTION_ID = "distribution_id";
- private static final String SHOW_AS_STORY_STATE = "display_as_story";
+ static final String TABLE_NAME = "groups";
+ private static final String ID = "_id";
+ static final String GROUP_ID = "group_id";
+ public static final String RECIPIENT_ID = "recipient_id";
+ private static final String TITLE = "title";
+ static final String MEMBERS = "members";
+ private static final String AVATAR_ID = "avatar_id";
+ private static final String AVATAR_KEY = "avatar_key";
+ private static final String AVATAR_CONTENT_TYPE = "avatar_content_type";
+ private static final String AVATAR_RELAY = "avatar_relay";
+ private static final String AVATAR_DIGEST = "avatar_digest";
+ private static final String TIMESTAMP = "timestamp";
+ static final String ACTIVE = "active";
+ static final String MMS = "mms";
+ private static final String EXPECTED_V2_ID = "expected_v2_id";
+ private static final String UNMIGRATED_V1_MEMBERS = "former_v1_members";
+ private static final String DISTRIBUTION_ID = "distribution_id";
+ private static final String SHOW_AS_STORY_STATE = "display_as_story";
+ private static final String LAST_FORCE_UPDATE_TIMESTAMP = "last_force_update_timestamp";
/** Was temporarily used for PNP accept by pni but is no longer needed/updated */
@Deprecated
@@ -101,27 +102,28 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
/** Serialized {@link DecryptedGroup} protobuf */
public static final String V2_DECRYPTED_GROUP = "decrypted_group";
- public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY, " +
- GROUP_ID + " TEXT, " +
- RECIPIENT_ID + " INTEGER, " +
- TITLE + " TEXT, " +
- MEMBERS + " TEXT, " +
- AVATAR_ID + " INTEGER, " +
- AVATAR_KEY + " BLOB, " +
- AVATAR_CONTENT_TYPE + " TEXT, " +
- AVATAR_RELAY + " TEXT, " +
- TIMESTAMP + " INTEGER, " +
- ACTIVE + " INTEGER DEFAULT 1, " +
- AVATAR_DIGEST + " BLOB, " +
- MMS + " INTEGER DEFAULT 0, " +
- V2_MASTER_KEY + " BLOB, " +
- V2_REVISION + " BLOB, " +
- V2_DECRYPTED_GROUP + " BLOB, " +
- EXPECTED_V2_ID + " TEXT DEFAULT NULL, " +
- UNMIGRATED_V1_MEMBERS + " TEXT DEFAULT NULL, " +
- DISTRIBUTION_ID + " TEXT DEFAULT NULL, " +
- SHOW_AS_STORY_STATE + " INTEGER DEFAULT 0, " +
- AUTH_SERVICE_ID + " TEXT DEFAULT NULL);";
+ public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY, " +
+ GROUP_ID + " TEXT, " +
+ RECIPIENT_ID + " INTEGER, " +
+ TITLE + " TEXT, " +
+ MEMBERS + " TEXT, " +
+ AVATAR_ID + " INTEGER, " +
+ AVATAR_KEY + " BLOB, " +
+ AVATAR_CONTENT_TYPE + " TEXT, " +
+ AVATAR_RELAY + " TEXT, " +
+ TIMESTAMP + " INTEGER, " +
+ ACTIVE + " INTEGER DEFAULT 1, " +
+ AVATAR_DIGEST + " BLOB, " +
+ MMS + " INTEGER DEFAULT 0, " +
+ V2_MASTER_KEY + " BLOB, " +
+ V2_REVISION + " BLOB, " +
+ V2_DECRYPTED_GROUP + " BLOB, " +
+ EXPECTED_V2_ID + " TEXT DEFAULT NULL, " +
+ UNMIGRATED_V1_MEMBERS + " TEXT DEFAULT NULL, " +
+ DISTRIBUTION_ID + " TEXT DEFAULT NULL, " +
+ SHOW_AS_STORY_STATE + " INTEGER DEFAULT 0, " +
+ AUTH_SERVICE_ID + " TEXT DEFAULT NULL, " +
+ LAST_FORCE_UPDATE_TIMESTAMP + " INTEGER DEFAULT 0);";
public static final String[] CREATE_INDEXS = {
"CREATE UNIQUE INDEX IF NOT EXISTS group_id_index ON " + TABLE_NAME + " (" + GROUP_ID + ");",
@@ -132,7 +134,7 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
private static final String[] GROUP_PROJECTION = {
GROUP_ID, RECIPIENT_ID, TITLE, MEMBERS, UNMIGRATED_V1_MEMBERS, AVATAR_ID, AVATAR_KEY, AVATAR_CONTENT_TYPE, AVATAR_RELAY, AVATAR_DIGEST,
- TIMESTAMP, ACTIVE, MMS, V2_MASTER_KEY, V2_REVISION, V2_DECRYPTED_GROUP
+ TIMESTAMP, ACTIVE, MMS, V2_MASTER_KEY, V2_REVISION, V2_DECRYPTED_GROUP, LAST_FORCE_UPDATE_TIMESTAMP
};
static final List TYPED_GROUP_PROJECTION = Stream.of(GROUP_PROJECTION).map(columnName -> TABLE_NAME + "." + columnName).toList();
@@ -934,6 +936,12 @@ public void setActive(@NonNull GroupId groupId, boolean active) {
database.update(TABLE_NAME, values, GROUP_ID + " = ?", new String[] {groupId.toString()});
}
+ public void setLastForceUpdateTimestamp(@NonNull GroupId groupId, long timestamp) {
+ ContentValues values = new ContentValues();
+ values.put(LAST_FORCE_UPDATE_TIMESTAMP, timestamp);
+ getWritableDatabase().update(TABLE_NAME, values, GROUP_ID + " = ?", SqlUtil.buildArgs(groupId));
+ }
+
@WorkerThread
public boolean isCurrentMember(@NonNull GroupId.Push groupId, @NonNull RecipientId recipientId) {
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
@@ -1093,7 +1101,8 @@ public int getCount() {
CursorUtil.requireBlob(cursor, V2_MASTER_KEY),
CursorUtil.requireInt(cursor, V2_REVISION),
CursorUtil.requireBlob(cursor, V2_DECRYPTED_GROUP),
- CursorUtil.getString(cursor, DISTRIBUTION_ID).map(DistributionId::from).orElse(null));
+ CursorUtil.getString(cursor, DISTRIBUTION_ID).map(DistributionId::from).orElse(null),
+ CursorUtil.requireLong(cursor, LAST_FORCE_UPDATE_TIMESTAMP));
}
@Override
@@ -1134,6 +1143,7 @@ public static class GroupRecord {
private final boolean mms;
@Nullable private final V2GroupProperties v2GroupProperties;
private final DistributionId distributionId;
+ private final long lastForceUpdateTimestamp;
public GroupRecord(@NonNull GroupId id,
@NonNull RecipientId recipientId,
@@ -1150,19 +1160,21 @@ public GroupRecord(@NonNull GroupId id,
@Nullable byte[] groupMasterKeyBytes,
int groupRevision,
@Nullable byte[] decryptedGroupBytes,
- @Nullable DistributionId distributionId)
+ @Nullable DistributionId distributionId,
+ long lastForceUpdateTimestamp)
{
- this.id = id;
- this.recipientId = recipientId;
- this.title = title;
- this.avatarId = avatarId;
- this.avatarKey = avatarKey;
- this.avatarDigest = avatarDigest;
- this.avatarContentType = avatarContentType;
- this.relay = relay;
- this.active = active;
- this.mms = mms;
- this.distributionId = distributionId;
+ this.id = id;
+ this.recipientId = recipientId;
+ this.title = title;
+ this.avatarId = avatarId;
+ this.avatarKey = avatarKey;
+ this.avatarDigest = avatarDigest;
+ this.avatarContentType = avatarContentType;
+ this.relay = relay;
+ this.active = active;
+ this.mms = mms;
+ this.distributionId = distributionId;
+ this.lastForceUpdateTimestamp = lastForceUpdateTimestamp;
V2GroupProperties v2GroupProperties = null;
if (groupMasterKeyBytes != null && decryptedGroupBytes != null) {
@@ -1271,6 +1283,10 @@ public boolean isMms() {
return distributionId;
}
+ public long getLastForceUpdateTimestamp() {
+ return lastForceUpdateTimestamp;
+ }
+
public boolean isV1Group() {
return !mms && !isV2Group();
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java
index 7a4fd14633..21222545f1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java
@@ -63,6 +63,7 @@ public class MediaDatabase extends Database {
+ " FROM " + MmsDatabase.TABLE_NAME
+ " WHERE " + MmsDatabase.THREAD_ID + " __EQUALITY__ ?) AND (%s) AND "
+ MmsDatabase.VIEW_ONCE + " = 0 AND "
+ + MmsDatabase.STORY_TYPE + " = 0 AND "
+ AttachmentDatabase.DATA + " IS NOT NULL AND "
+ "(" + AttachmentDatabase.QUOTE + " = 0 OR (" + AttachmentDatabase.QUOTE + " = 1 AND " + AttachmentDatabase.DATA_HASH + " IS NULL)) AND "
+ AttachmentDatabase.STICKER_PACK_ID + " IS NULL AND "
@@ -192,7 +193,7 @@ private MediaRecord(@Nullable DatabaseAttachment attachment,
this.outgoing = outgoing;
}
- public static MediaRecord from(@NonNull Context context, @NonNull Cursor cursor) {
+ public static MediaRecord from(@NonNull Cursor cursor) {
AttachmentDatabase attachmentDatabase = SignalDatabase.attachments();
List attachments = attachmentDatabase.getAttachments(cursor);
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.RECIPIENT_ID)));
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java
index e5e94405d0..75bc5dd3c1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java
@@ -988,6 +988,17 @@ public int deleteStoriesOlderThan(long timestamp, boolean hasSeenReleaseChannelS
}
}
+ private void disassociateStoryQuotes(long storyId) {
+ ContentValues contentValues = new ContentValues(2);
+ contentValues.put(QUOTE_MISSING, 1);
+ contentValues.putNull(QUOTE_BODY);
+
+ getWritableDatabase().update(TABLE_NAME,
+ contentValues,
+ PARENT_STORY_ID + " = ?",
+ SqlUtil.buildArgs(new ParentStoryId.DirectReply(storyId).serialize()));
+ }
+
@Override
public boolean isGroupQuitMessage(long messageId) {
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
@@ -1379,6 +1390,7 @@ public void markAsRemoteDelete(long messageId) {
SignalDatabase.messageLog().deleteAllRelatedToMessage(messageId, true);
SignalDatabase.reactions().deleteReactions(new MessageId(messageId, true));
deleteGroupStoryReplies(messageId);
+ disassociateStoryQuotes(messageId);
threadId = getThreadIdForMessage(messageId);
SignalDatabase.threads().update(threadId, false);
@@ -1874,7 +1886,18 @@ private Optional insertMessageInbox(IncomingMediaMessage retrieved
return Optional.empty();
}
- long messageId = insertMediaMessage(threadId, retrieved.getBody(), retrieved.getAttachments(), quoteAttachments, retrieved.getSharedContacts(), retrieved.getLinkPreviews(), retrieved.getMentions(), retrieved.getMessageRanges(), contentValues, null, true);
+ boolean updateThread = retrieved.getStoryType() == StoryType.NONE;
+ long messageId = insertMediaMessage(threadId,
+ retrieved.getBody(),
+ retrieved.getAttachments(),
+ quoteAttachments,
+ retrieved.getSharedContacts(),
+ retrieved.getLinkPreviews(),
+ retrieved.getMentions(),
+ retrieved.getMessageRanges(),
+ contentValues,
+ null,
+ updateThread);
boolean isNotStoryGroupReply = retrieved.getParentStoryId() == null || !retrieved.getParentStoryId().isGroupReply();
if (!Types.isExpirationTimerUpdate(mailbox) && !retrieved.getStoryType().isStory() && isNotStoryGroupReply) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt
index eaa4bc5f5d..2f985fe38a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt
@@ -924,6 +924,21 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(recipientId)
}
+ fun markAllSystemContactsNeedsSync() {
+ writableDatabase.withinTransaction { db ->
+ db
+ .select(ID)
+ .from(TABLE_NAME)
+ .where("$SYSTEM_CONTACT_URI NOT NULL")
+ .run()
+ .use { cursor ->
+ while (cursor.moveToNext()) {
+ rotateStorageId(RecipientId.from(cursor.requireLong(ID)))
+ }
+ }
+ }
+ }
+
fun applyStorageIdUpdates(storageIds: Map) {
val db = writableDatabase
db.beginTransaction()
@@ -3075,6 +3090,44 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
return readableDatabase.query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy)
}
+ fun querySignalContactLetterHeaders(inputQuery: String, includeSelf: Boolean): Map {
+ val searchSelection = ContactSearchSelection.Builder()
+ .withRegistered(true)
+ .withGroups(false)
+ .excludeId(if (includeSelf) null else Recipient.self().id)
+ .withSearchQuery(inputQuery)
+ .build()
+
+ return readableDatabase.query(
+ """
+ SELECT
+ _id,
+ UPPER(SUBSTR($SORT_NAME, 0, 2)) AS letter_header
+ FROM (
+ SELECT ${SEARCH_PROJECTION.joinToString(", ")}
+ FROM recipient
+ WHERE ${searchSelection.where}
+ ORDER BY $SORT_NAME, $SYSTEM_JOINED_NAME, $SEARCH_PROFILE_NAME, $PHONE
+ )
+ GROUP BY letter_header
+ """.trimIndent(),
+ searchSelection.args
+ ).use { cursor ->
+ if (cursor.count == 0) {
+ emptyMap()
+ } else {
+ val resultsMap = mutableMapOf()
+ while (cursor.moveToNext()) {
+ cursor.requireString("letter_header")?.let {
+ resultsMap[RecipientId.from(cursor.requireLong(ID))] = it
+ }
+ }
+
+ resultsMap
+ }
+ }
+ }
+
fun getNonSignalContacts(): Cursor? {
val searchSelection = ContactSearchSelection.Builder().withNonRegistered(true)
.withGroups(false)
@@ -3394,6 +3447,21 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
updateExtras(recipientId) { b: RecipientExtras.Builder -> b.setManuallyShownAvatar(true) }
}
+ fun getCapabilities(id: RecipientId): RecipientRecord.Capabilities? {
+ readableDatabase
+ .select(CAPABILITIES)
+ .from(TABLE_NAME)
+ .where("$ID = ?", id)
+ .run()
+ .use { cursor ->
+ return if (cursor.moveToFirst()) {
+ readCapabilities(cursor)
+ } else {
+ null
+ }
+ }
+ }
+
private fun updateExtras(recipientId: RecipientId, updater: java.util.function.Function) {
val db = writableDatabase
db.beginTransaction()
@@ -3589,7 +3657,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
SYSTEM_PHONE_LABEL to secondaryRecord.systemPhoneLabel,
SYSTEM_CONTACT_URI to secondaryRecord.systemContactUri,
PROFILE_SHARING to (primaryRecord.profileSharing || secondaryRecord.profileSharing),
- CAPABILITIES to max(primaryRecord.rawCapabilities, secondaryRecord.rawCapabilities),
+ CAPABILITIES to max(primaryRecord.capabilities.rawBits, secondaryRecord.capabilities.rawBits),
MENTION_SETTING to if (primaryRecord.mentionSetting != MentionSetting.ALWAYS_NOTIFY) primaryRecord.mentionSetting.id else secondaryRecord.mentionSetting.id
)
@@ -3645,8 +3713,9 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
private fun getValuesForStorageContact(contact: SignalContactRecord, isInsert: Boolean): ContentValues {
return ContentValues().apply {
- val profileName = ProfileName.fromParts(contact.givenName.orElse(null), contact.familyName.orElse(null))
- val username: String? = contact.username.orElse(null)
+ val profileName = ProfileName.fromParts(contact.profileGivenName.orElse(null), contact.profileFamilyName.orElse(null))
+ val systemName = ProfileName.fromParts(contact.systemGivenName.orElse(null), contact.systemFamilyName.orElse(null))
+ val username = contact.username.orElse(null)
if (contact.serviceId.isValid) {
put(SERVICE_ID, contact.serviceId.toString())
@@ -3660,6 +3729,9 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
put(PROFILE_GIVEN_NAME, profileName.givenName)
put(PROFILE_FAMILY_NAME, profileName.familyName)
put(PROFILE_JOINED_NAME, profileName.toString())
+ put(SYSTEM_GIVEN_NAME, systemName.givenName)
+ put(SYSTEM_FAMILY_NAME, systemName.familyName)
+ put(SYSTEM_JOINED_NAME, systemName.toString())
put(PROFILE_KEY, contact.profileKey.map { source -> Base64.encodeBytes(source) }.orElse(null))
put(USERNAME, if (TextUtils.isEmpty(username)) null else username)
put(PROFILE_SHARING, if (contact.isProfileSharingEnabled) "1" else "0")
@@ -3860,7 +3932,6 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
}
val recipientId = RecipientId.from(cursor.requireLong(idColumnName))
- val capabilities = cursor.requireLong(CAPABILITIES)
val distributionListId: DistributionListId? = DistributionListId.fromNullable(cursor.requireLong(DISTRIBUTION_LIST_ID))
val avatarColor: AvatarColor = if (distributionListId != null) AvatarColor.UNKNOWN else AvatarColor.deserialize(cursor.requireString(AVATAR_COLOR))
@@ -3898,14 +3969,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
notificationChannel = cursor.requireString(NOTIFICATION_CHANNEL),
unidentifiedAccessMode = UnidentifiedAccessMode.fromMode(cursor.requireInt(UNIDENTIFIED_ACCESS_MODE)),
forceSmsSelection = cursor.requireBoolean(FORCE_SMS_SELECTION),
- rawCapabilities = capabilities,
- groupsV1MigrationCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GROUPS_V1_MIGRATION, Capabilities.BIT_LENGTH).toInt()),
- senderKeyCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.SENDER_KEY, Capabilities.BIT_LENGTH).toInt()),
- announcementGroupCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.ANNOUNCEMENT_GROUPS, Capabilities.BIT_LENGTH).toInt()),
- changeNumberCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.CHANGE_NUMBER, Capabilities.BIT_LENGTH).toInt()),
- storiesCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.STORIES, Capabilities.BIT_LENGTH).toInt()),
- giftBadgesCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GIFT_BADGES, Capabilities.BIT_LENGTH).toInt()),
- pnpCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.PNP, Capabilities.BIT_LENGTH).toInt()),
+ capabilities = readCapabilities(cursor),
insightsBannerTier = InsightsBannerTier.fromId(cursor.requireInt(SEEN_INVITE_REMINDER)),
storageId = Base64.decodeNullableOrThrow(cursor.requireString(STORAGE_SERVICE_ID)),
mentionSetting = MentionSetting.fromId(cursor.requireInt(MENTION_SETTING)),
@@ -3923,6 +3987,20 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
)
}
+ private fun readCapabilities(cursor: Cursor): RecipientRecord.Capabilities {
+ val capabilities = cursor.requireLong(CAPABILITIES)
+ return RecipientRecord.Capabilities(
+ rawBits = capabilities,
+ groupsV1MigrationCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GROUPS_V1_MIGRATION, Capabilities.BIT_LENGTH).toInt()),
+ senderKeyCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.SENDER_KEY, Capabilities.BIT_LENGTH).toInt()),
+ announcementGroupCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.ANNOUNCEMENT_GROUPS, Capabilities.BIT_LENGTH).toInt()),
+ changeNumberCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.CHANGE_NUMBER, Capabilities.BIT_LENGTH).toInt()),
+ storiesCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.STORIES, Capabilities.BIT_LENGTH).toInt()),
+ giftBadgesCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GIFT_BADGES, Capabilities.BIT_LENGTH).toInt()),
+ pnpCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.PNP, Capabilities.BIT_LENGTH).toInt()),
+ )
+ }
+
private fun parseBadgeList(serializedBadgeList: ByteArray?): List {
var badgeList: BadgeList? = null
if (serializedBadgeList != null) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt
index 13ba5b9905..960f1b52d0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt
@@ -12,13 +12,14 @@ import org.thoughtcrime.securesms.database.helpers.migration.V154_PniSignaturesM
import org.thoughtcrime.securesms.database.helpers.migration.V155_SmsExporterMigration
import org.thoughtcrime.securesms.database.helpers.migration.V156_RecipientUnregisteredTimestampMigration
import org.thoughtcrime.securesms.database.helpers.migration.V157_RecipeintHiddenMigration
+import org.thoughtcrime.securesms.database.helpers.migration.V158_GroupsLastForceUpdateTimestampMigration
/**
* Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness.
*/
object SignalDatabaseMigrations {
- const val DATABASE_VERSION = 157
+ const val DATABASE_VERSION = 158
@JvmStatic
fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
@@ -57,6 +58,10 @@ object SignalDatabaseMigrations {
if (oldVersion < 157) {
V157_RecipeintHiddenMigration.migrate(context, db, oldVersion, newVersion)
}
+
+ if (oldVersion < 158) {
+ V158_GroupsLastForceUpdateTimestampMigration.migrate(context, db, oldVersion, newVersion)
+ }
}
@JvmStatic
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V158_GroupsLastForceUpdateTimestampMigration.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V158_GroupsLastForceUpdateTimestampMigration.kt
new file mode 100644
index 0000000000..8cac5cf3ea
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V158_GroupsLastForceUpdateTimestampMigration.kt
@@ -0,0 +1,13 @@
+package org.thoughtcrime.securesms.database.helpers.migration
+
+import android.app.Application
+import net.zetetic.database.sqlcipher.SQLiteDatabase
+
+/**
+ * Track last time we did a forced sanity check for this group with the server.
+ */
+object V158_GroupsLastForceUpdateTimestampMigration : SignalDatabaseMigration {
+ override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+ db.execSQL("ALTER TABLE groups ADD COLUMN last_force_update_timestamp INTEGER DEFAULT 0")
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/loaders/GroupedThreadMediaLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/GroupedThreadMediaLoader.java
index 26da50d088..8b2169ea81 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/loaders/GroupedThreadMediaLoader.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/GroupedThreadMediaLoader.java
@@ -75,7 +75,7 @@ public GroupedThreadMedia loadInBackground() {
try (Cursor cursor = ThreadMediaLoader.createThreadMediaCursor(context, threadId, mediaType, sorting)) {
while (cursor != null && cursor.moveToNext()) {
- mediaGrouping.add(MediaDatabase.MediaRecord.from(context, cursor));
+ mediaGrouping.add(MediaDatabase.MediaRecord.from(cursor));
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java
index 795af6af5a..de84d5ee89 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java
@@ -9,6 +9,7 @@
import org.thoughtcrime.securesms.mms.QuoteModel;
import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.recipients.RecipientId;
+import org.thoughtcrime.securesms.util.Util;
import java.util.List;
@@ -37,7 +38,7 @@ public Quote(long id,
this.mentions = mentions;
this.quoteType = quoteType;
- SpannableString spannable = new SpannableString(text);
+ SpannableString spannable = new SpannableString(Util.emptyIfNull(text));
MentionAnnotation.setMentionAnnotations(spannable, mentions);
this.text = spannable;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt
index 80a23c8497..118909df9f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt
@@ -63,14 +63,7 @@ data class RecipientRecord(
val unidentifiedAccessMode: UnidentifiedAccessMode,
@get:JvmName("isForceSmsSelection")
val forceSmsSelection: Boolean,
- val rawCapabilities: Long,
- val groupsV1MigrationCapability: Recipient.Capability,
- val senderKeyCapability: Recipient.Capability,
- val announcementGroupCapability: Recipient.Capability,
- val changeNumberCapability: Recipient.Capability,
- val storiesCapability: Recipient.Capability,
- val giftBadgesCapability: Recipient.Capability,
- val pnpCapability: Recipient.Capability,
+ val capabilities: Capabilities,
val insightsBannerTier: InsightsBannerTier,
val storageId: ByteArray?,
val mentionSetting: MentionSetting,
@@ -122,4 +115,29 @@ data class RecipientRecord(
val isForcedUnread: Boolean,
val unregisteredTimestamp: Long
)
+
+ data class Capabilities(
+ val rawBits: Long,
+ val groupsV1MigrationCapability: Recipient.Capability,
+ val senderKeyCapability: Recipient.Capability,
+ val announcementGroupCapability: Recipient.Capability,
+ val changeNumberCapability: Recipient.Capability,
+ val storiesCapability: Recipient.Capability,
+ val giftBadgesCapability: Recipient.Capability,
+ val pnpCapability: Recipient.Capability,
+ ) {
+ companion object {
+ @JvmField
+ val UNKNOWN = Capabilities(
+ 0,
+ Recipient.Capability.UNKNOWN,
+ Recipient.Capability.UNKNOWN,
+ Recipient.Capability.UNKNOWN,
+ Recipient.Capability.UNKNOWN,
+ Recipient.Capability.UNKNOWN,
+ Recipient.Capability.UNKNOWN,
+ Recipient.Capability.UNKNOWN
+ )
+ }
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java
index c1b5a79f87..45278cf467 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java
@@ -271,7 +271,7 @@ public static void closeConnections() {
}
}
- public static void restartNetworkConnectionsAfterProxyChange() {
+ public static void restartAllNetworkConnections() {
synchronized (LOCK) {
closeConnections();
if (signalWebSocket != null) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java
index cccf2c093f..91dc3222fa 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java
@@ -63,6 +63,7 @@
import org.thoughtcrime.securesms.service.PendingRetryReceiptManager;
import org.thoughtcrime.securesms.service.TrimThreadsByDateManager;
import org.thoughtcrime.securesms.service.webrtc.SignalCallManager;
+import org.thoughtcrime.securesms.stories.Stories;
import org.thoughtcrime.securesms.util.AlarmSleepTimer;
import org.thoughtcrime.securesms.util.AppForegroundObserver;
import org.thoughtcrime.securesms.util.ByteUnit;
@@ -283,7 +284,7 @@ public ApplicationDependencyProvider(@NonNull Application context) {
@Override
public @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier) {
- SleepTimer sleepTimer = SignalStore.account().isFcmEnabled() ? new UptimeSleepTimer() : new AlarmSleepTimer(context);
+ SleepTimer sleepTimer = !SignalStore.account().isFcmEnabled() || SignalStore.internalValues().isWebsocketModeForced() ? new AlarmSleepTimer(context) : new UptimeSleepTimer() ;
SignalWebSocketHealthMonitor healthMonitor = new SignalWebSocketHealthMonitor(context, sleepTimer);
SignalWebSocket signalWebSocket = new SignalWebSocket(provideWebSocketFactory(signalServiceConfigurationSupplier, healthMonitor));
@@ -398,7 +399,8 @@ public WebSocketConnection createWebSocket() {
signalServiceConfigurationSupplier.get(),
Optional.of(new DynamicCredentialsProvider()),
BuildConfig.SIGNAL_AGENT,
- healthMonitor);
+ healthMonitor,
+ Stories.isFeatureEnabled());
}
@Override
@@ -407,7 +409,8 @@ public WebSocketConnection createUnidentifiedWebSocket() {
signalServiceConfigurationSupplier.get(),
Optional.empty(),
BuildConfig.SIGNAL_AGENT,
- healthMonitor);
+ healthMonitor,
+ Stories.isFeatureEnabled());
}
};
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt
index 3d58e4fbde..fa039b60c6 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt
@@ -83,7 +83,12 @@ object FcmFetchManager {
context.stopService(Intent(context, FcmFetchBackgroundService::class.java))
if (startedForeground) {
- context.startService(FcmFetchForegroundService.buildStopIntent(context))
+ try {
+ context.startService(FcmFetchForegroundService.buildStopIntent(context))
+ } catch (e: IllegalStateException) {
+ Log.w(TAG, "Failed to stop the foreground notification!", e)
+ }
+
startedForeground = false
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupId.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupId.java
index d269665e93..3d4320e090 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupId.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupId.java
@@ -3,6 +3,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import org.signal.core.util.DatabaseId;
import org.signal.core.util.Hex;
import org.signal.libsignal.protocol.kdf.HKDFv3;
import org.signal.libsignal.zkgroup.InvalidInputException;
@@ -14,7 +15,7 @@
import java.io.IOException;
import java.security.SecureRandom;
-public abstract class GroupId {
+public abstract class GroupId implements DatabaseId {
private static final String ENCODED_SIGNAL_GROUP_V1_PREFIX = "__textsecure_group__!";
private static final String ENCODED_SIGNAL_GROUP_V2_PREFIX = "__signal_group__v2__!";
@@ -173,6 +174,11 @@ public int hashCode() {
return encodedId;
}
+ @Override
+ public @NonNull String serialize() {
+ return encodedId;
+ }
+
public abstract boolean isMms();
public abstract boolean isV1();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java
index 6bf940b857..f24dd70fb4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java
@@ -188,6 +188,17 @@ public static void updateGroupFromServer(@NonNull Context context,
}
}
+ @WorkerThread
+ public static void forceSanityUpdateFromServer(@NonNull Context context,
+ @NonNull GroupMasterKey groupMasterKey,
+ long timestamp)
+ throws GroupChangeBusyException, IOException, GroupNotAMemberException
+ {
+ try (GroupManagerV2.GroupUpdater updater = new GroupManagerV2(context).updater(groupMasterKey)) {
+ updater.forceSanityUpdateFromServer(timestamp);
+ }
+ }
+
@WorkerThread
public static V2GroupServerStatus v2GroupStatus(@NonNull Context context,
@NonNull ServiceId authServiceId,
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java
index d63949ed00..ff895cb31a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java
@@ -798,6 +798,14 @@ void updateLocalToServerRevision(int revision, long timestamp, @Nullable byte[]
.updateLocalGroupToRevision(revision, timestamp, getDecryptedGroupChange(signedGroupChange));
}
+ @WorkerThread
+ void forceSanityUpdateFromServer(long timestamp)
+ throws IOException, GroupNotAMemberException
+ {
+ new GroupsV2StateProcessor(context).forGroup(serviceIds, groupMasterKey)
+ .forceSanityUpdateFromServer(timestamp);
+ }
+
private DecryptedGroupChange getDecryptedGroupChange(@Nullable byte[] signedGroupChange) {
if (signedGroupChange != null) {
GroupsV2Operations.GroupOperations groupOperations = groupsV2Operations.forGroup(GroupSecretParams.deriveFromMasterKey(groupMasterKey));
@@ -928,24 +936,6 @@ public GroupManager.GroupActionResult joinGroup(@NonNull DecryptedGroupJoinInfo
if (group.isPresent()) {
Log.i(TAG, "Group already present locally");
-
- DecryptedGroup currentGroupState = group.get()
- .requireV2GroupProperties()
- .getDecryptedGroup();
-
- DecryptedGroup updatedGroup = currentGroupState;
-
- try {
- if (decryptedChange != null) {
- updatedGroup = DecryptedGroupUtil.applyWithoutRevisionCheck(updatedGroup, decryptedChange);
- }
- updatedGroup = resetRevision(updatedGroup, currentGroupState.getRevision());
- } catch (NotAbleToApplyGroupV2ChangeException e) {
- Log.w(TAG, e);
- updatedGroup = decryptedGroup;
- }
-
- groupDatabase.update(groupId, updatedGroup);
} else {
groupDatabase.create(groupMasterKey, decryptedGroup);
Log.i(TAG, "Created local group with placeholder");
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java
index e45b76c68e..f6c8fb0c96 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java
@@ -88,7 +88,7 @@ public static void migrate(@NonNull Context context, @NonNull RecipientId recipi
registeredMembers = Stream.of(registeredMembers).map(Recipient::fresh).toList();
}
- List possibleMembers = forced ? getMigratableManualMigrationMembers(registeredMembers)
+ List possibleMembers = forced ? registeredMembers
: getMigratableAutoMigrationMembers(registeredMembers);
if (!forced && !groupRecipient.hasName()) {
@@ -200,17 +200,8 @@ private static void handleLeftBehind(@NonNull GroupId.V1 gv1Id) {
* to consider them migratable in an auto-migration.
*/
private static @NonNull List getMigratableAutoMigrationMembers(@NonNull List registeredMembers) {
- return Stream.of(getMigratableManualMigrationMembers(registeredMembers))
- .filter(r -> r.getProfileKey() != null)
- .toList();
- }
-
- /**
- * You can only migrate users that have the required capabilities.
- */
- private static @NonNull List getMigratableManualMigrationMembers(@NonNull List registeredMembers) {
return Stream.of(registeredMembers)
- .filter(r -> r.getGroupsV1MigrationCapability() == Recipient.Capability.SUPPORTED)
+ .filter(r -> r.getProfileKey() != null)
.toList();
}
@@ -219,7 +210,6 @@ private static void handleLeftBehind(@NonNull GroupId.V1 gv1Id) {
*/
public static boolean isAutoMigratable(@NonNull Recipient recipient) {
return recipient.hasServiceId() &&
- recipient.getGroupsV1MigrationCapability() == Recipient.Capability.SUPPORTED &&
recipient.getRegistered() == RecipientDatabase.RegisteredState.REGISTERED &&
recipient.getProfileKey() != null;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java
index 9f827a1199..e813f9270f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java
@@ -68,19 +68,7 @@ private MigrationState getMigrationState(@NonNull RecipientId groupRecipientId)
return new MigrationState(Collections.emptyList(), Collections.emptyList());
}
- List members = Recipient.resolvedList(group.getParticipantIds());
- Set needsRefresh = Stream.of(members)
- .filter(r -> r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED)
- .map(Recipient::getId)
- .collect(Collectors.toSet());
-
- List jobs = RetrieveProfileJob.forRecipients(needsRefresh);
-
- for (Job job : jobs) {
- if (!ApplicationDependencies.getJobManager().runSynchronously(job, TimeUnit.SECONDS.toMillis(3)).isPresent()) {
- Log.w(TAG, "Failed to refresh capabilities in time!");
- }
- }
+ List members = Recipient.resolvedList(group.getParticipantIds());
try {
List registered = Stream.of(members)
@@ -95,9 +83,7 @@ private MigrationState getMigrationState(@NonNull RecipientId groupRecipientId)
group = group.fresh();
List ineligible = Stream.of(members)
- .filter(r -> !r.hasServiceId() ||
- r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED ||
- r.getRegistered() != RecipientDatabase.RegisteredState.REGISTERED)
+ .filter(r -> !r.hasServiceId() || r.getRegistered() != RecipientDatabase.RegisteredState.REGISTERED)
.toList();
List invites = Stream.of(members)
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 156755bdab..c33164ae16 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
@@ -48,6 +48,7 @@
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupHistoryEntry;
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil;
+import org.whispersystems.signalservice.api.groupsv2.GroupChangeReconstruct;
import org.whispersystems.signalservice.api.groupsv2.GroupHistoryPage;
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Api;
import org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException;
@@ -170,6 +171,52 @@ public static final class StateProcessorForGroup {
this.profileAndMessageHelper = profileAndMessageHelper;
}
+ @WorkerThread
+ public GroupUpdateResult forceSanityUpdateFromServer(long timestamp)
+ throws IOException, GroupNotAMemberException
+ {
+ Optional localRecord = groupDatabase.getGroup(groupId);
+ DecryptedGroup localState = localRecord.map(g -> g.requireV2GroupProperties().getDecryptedGroup()).orElse(null);
+ DecryptedGroup serverState;
+
+ if (localState == null) {
+ info("No local state to force update");
+ return new GroupUpdateResult(GroupState.GROUP_CONSISTENT_OR_AHEAD, null);
+ }
+
+ try {
+ serverState = groupsV2Api.getGroup(groupSecretParams, groupsV2Authorization.getAuthorizationForToday(serviceIds, groupSecretParams));
+ } catch (NotInGroupException | GroupNotFoundException e) {
+ throw new GroupNotAMemberException(e);
+ } catch (VerificationFailedException | InvalidGroupStateException e) {
+ throw new IOException(e);
+ }
+
+ DecryptedGroupChange decryptedGroupChange = GroupChangeReconstruct.reconstructGroupChange(localState, serverState);
+ GlobalGroupState inputGroupState = new GlobalGroupState(localState, Collections.singletonList(new ServerGroupLogEntry(serverState, decryptedGroupChange)));
+ AdvanceGroupStateResult advanceGroupStateResult = GroupStateMapper.partiallyAdvanceGroupState(inputGroupState, serverState.getRevision());
+ DecryptedGroup newLocalState = advanceGroupStateResult.getNewGlobalGroupState().getLocalState();
+
+ if (newLocalState == null || newLocalState == inputGroupState.getLocalState()) {
+ info("Local state and server state are equal");
+ return new GroupUpdateResult(GroupState.GROUP_CONSISTENT_OR_AHEAD, null);
+ } else {
+ info("Local state (revision: " + localState.getRevision() + ") does not match server state (revision: " + serverState.getRevision() + "), updating");
+ }
+
+ updateLocalDatabaseGroupState(inputGroupState, newLocalState);
+ if (localState.getRevision() == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION) {
+ info("Inserting single update message for restore placeholder");
+ profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(newLocalState, null)));
+ } else {
+ info("Inserting force update messages");
+ profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries());
+ }
+ profileAndMessageHelper.persistLearnedProfileKeys(inputGroupState);
+
+ return new GroupUpdateResult(GroupState.GROUP_UPDATED, newLocalState);
+ }
+
/**
* Using network where required, will attempt to bring the local copy of the group up to the revision specified.
*
@@ -560,10 +607,12 @@ static class ProfileAndMessageHelper {
private final Context context;
private final ServiceId serviceId;
- private final GroupMasterKey masterKey;
private final GroupId.V2 groupId;
private final RecipientDatabase recipientDatabase;
+ @VisibleForTesting
+ GroupMasterKey masterKey;
+
ProfileAndMessageHelper(@NonNull Context context, @NonNull ServiceId serviceId, @NonNull GroupMasterKey masterKey, @NonNull GroupId.V2 groupId, @NonNull RecipientDatabase recipientDatabase) {
this.context = context;
this.serviceId = serviceId;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckServiceReachabilityJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckServiceReachabilityJob.kt
index 90263cc145..eef5f39fd8 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckServiceReachabilityJob.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckServiceReachabilityJob.kt
@@ -7,6 +7,7 @@ import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.keyvalue.SignalStore
+import org.thoughtcrime.securesms.stories.Stories
import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState
import org.whispersystems.signalservice.internal.util.StaticCredentialsProvider
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection
@@ -78,7 +79,8 @@ class CheckServiceReachabilityJob private constructor(params: Parameters) : Base
),
BuildConfig.SIGNAL_AGENT,
null,
- ""
+ "",
+ Stories.isFeatureEnabled()
)
try {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ForceUpdateGroupV2Job.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ForceUpdateGroupV2Job.java
new file mode 100644
index 0000000000..0b427c4ee3
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ForceUpdateGroupV2Job.java
@@ -0,0 +1,86 @@
+package org.thoughtcrime.securesms.jobs;
+
+import androidx.annotation.NonNull;
+
+import org.signal.core.util.concurrent.SignalExecutors;
+import org.thoughtcrime.securesms.database.GroupDatabase;
+import org.thoughtcrime.securesms.database.SignalDatabase;
+import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
+import org.thoughtcrime.securesms.groups.GroupId;
+import org.thoughtcrime.securesms.jobmanager.Data;
+import org.thoughtcrime.securesms.jobmanager.Job;
+import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
+
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Schedules a {@link ForceUpdateGroupV2WorkerJob} to happen after message queues are drained.
+ */
+public final class ForceUpdateGroupV2Job extends BaseJob {
+
+ public static final String KEY = "ForceUpdateGroupV2Job";
+
+ private static final long FORCE_UPDATE_INTERVAL = TimeUnit.DAYS.toMillis(7);
+ private static final String KEY_GROUP_ID = "group_id";
+
+ private final GroupId.V2 groupId;
+
+ public static void enqueueIfNecessary(@NonNull GroupId.V2 groupId) {
+ SignalExecutors.BOUNDED.execute(() -> {
+ Optional group = SignalDatabase.groups().getGroup(groupId);
+ if (group.isPresent() &&
+ group.get().isV2Group() &&
+ group.get().getLastForceUpdateTimestamp() + FORCE_UPDATE_INTERVAL < System.currentTimeMillis()
+ ) {
+ ApplicationDependencies.getJobManager().add(new ForceUpdateGroupV2Job(groupId));
+ }
+ });
+ }
+
+ private ForceUpdateGroupV2Job(@NonNull GroupId.V2 groupId) {
+ this(new Parameters.Builder().setQueue("ForceUpdateGroupV2Job_" + groupId)
+ .setMaxInstancesForQueue(1)
+ .addConstraint(DecryptionsDrainedConstraint.KEY)
+ .setMaxAttempts(Parameters.UNLIMITED)
+ .build(),
+ groupId);
+ }
+
+ private ForceUpdateGroupV2Job(@NonNull Parameters parameters, @NonNull GroupId.V2 groupId) {
+ super(parameters);
+ this.groupId = groupId;
+ }
+
+ @Override
+ public @NonNull Data serialize() {
+ return new Data.Builder().putString(KEY_GROUP_ID, groupId.toString()).build();
+ }
+
+ @Override
+ public @NonNull String getFactoryKey() {
+ return KEY;
+ }
+
+ @Override
+ public void onRun() {
+ ApplicationDependencies.getJobManager().add(new ForceUpdateGroupV2WorkerJob(groupId));
+ }
+
+ @Override
+ public boolean onShouldRetry(@NonNull Exception e) {
+ return false;
+ }
+
+ @Override
+ public void onFailure() {
+ }
+
+ public static final class Factory implements Job.Factory {
+
+ @Override
+ public @NonNull ForceUpdateGroupV2Job create(@NonNull Parameters parameters, @NonNull Data data) {
+ return new ForceUpdateGroupV2Job(parameters, GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2());
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ForceUpdateGroupV2WorkerJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ForceUpdateGroupV2WorkerJob.java
new file mode 100644
index 0000000000..b84e5c291c
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ForceUpdateGroupV2WorkerJob.java
@@ -0,0 +1,103 @@
+package org.thoughtcrime.securesms.jobs;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.WorkerThread;
+
+import org.signal.core.util.logging.Log;
+import org.thoughtcrime.securesms.database.GroupDatabase;
+import org.thoughtcrime.securesms.database.SignalDatabase;
+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.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.recipients.Recipient;
+import org.whispersystems.signalservice.api.groupsv2.NoCredentialForRedemptionTimeException;
+import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
+
+import java.io.IOException;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Scheduled by {@link ForceUpdateGroupV2Job} after message queues are drained.
+ *
+ * Forces a sanity check between local state and server state, and updates local state
+ * as necessary.
+ */
+final class ForceUpdateGroupV2WorkerJob extends BaseJob {
+
+ public static final String KEY = "ForceUpdateGroupV2WorkerJob";
+
+ private static final String TAG = Log.tag(ForceUpdateGroupV2WorkerJob.class);
+
+ private static final String KEY_GROUP_ID = "group_id";
+
+ private final GroupId.V2 groupId;
+
+ ForceUpdateGroupV2WorkerJob(@NonNull GroupId.V2 groupId) {
+ this(new Parameters.Builder().setQueue(PushProcessMessageJob.getQueueName(Recipient.externalGroupExact(groupId).getId()))
+ .addConstraint(NetworkConstraint.KEY)
+ .setMaxAttempts(Parameters.UNLIMITED)
+ .build(),
+ groupId);
+ }
+
+ private ForceUpdateGroupV2WorkerJob(@NonNull Parameters parameters, @NonNull GroupId.V2 groupId) {
+ super(parameters);
+ this.groupId = groupId;
+ }
+
+ @Override
+ public @NonNull Data serialize() {
+ return new Data.Builder().putString(KEY_GROUP_ID, groupId.toString())
+ .build();
+ }
+
+ @Override
+ public @NonNull String getFactoryKey() {
+ return KEY;
+ }
+
+ @Override
+ public void onRun() throws IOException, GroupNotAMemberException, GroupChangeBusyException {
+ Optional group = SignalDatabase.groups().getGroup(groupId);
+
+ if (!group.isPresent()) {
+ Log.w(TAG, "Group not found");
+ return;
+ }
+
+ if (Recipient.externalGroupExact(groupId).isBlocked()) {
+ Log.i(TAG, "Not fetching group info for blocked group " + groupId);
+ return;
+ }
+
+ GroupManager.forceSanityUpdateFromServer(context, group.get().requireV2GroupProperties().getGroupMasterKey(), System.currentTimeMillis());
+
+ SignalDatabase.groups().setLastForceUpdateTimestamp(group.get().getId(), System.currentTimeMillis());
+ }
+
+ @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 ForceUpdateGroupV2WorkerJob create(@NonNull Parameters parameters, @NonNull Data data) {
+ return new ForceUpdateGroupV2WorkerJob(parameters,
+ GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2());
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java
index 2f37c995a8..36e423e441 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java
@@ -66,49 +66,6 @@ public static void enqueuePossibleAutoMigrate(@NonNull RecipientId recipientId)
});
}
- public static void enqueueRoutineMigrationsIfNecessary(@NonNull Application application) {
- if (!SignalStore.registrationValues().isRegistrationComplete() ||
- !SignalStore.account().isRegistered() ||
- SignalStore.account().getAci() == null)
- {
- Log.i(TAG, "Registration not complete. Skipping.");
- return;
- }
-
- long timeSinceRefresh = System.currentTimeMillis() - SignalStore.misc().getLastGv1RoutineMigrationTime();
-
- if (timeSinceRefresh < REFRESH_INTERVAL) {
- Log.i(TAG, "Too soon to refresh. Did the last refresh " + timeSinceRefresh + " ms ago.");
- return;
- }
-
- SignalStore.misc().setLastGv1RoutineMigrationTime(System.currentTimeMillis());
-
- SignalExecutors.BOUNDED.execute(() -> {
- JobManager jobManager = ApplicationDependencies.getJobManager();
- List threads = SignalDatabase.threads().getRecentV1Groups(ROUTINE_LIMIT);
- Set needsRefresh = new HashSet<>();
-
- if (threads.size() > 0) {
- Log.d(TAG, "About to enqueue refreshes for " + threads.size() + " groups.");
- }
-
- for (ThreadRecord thread : threads) {
- jobManager.add(new GroupV1MigrationJob(thread.getRecipient().getId()));
-
- needsRefresh.addAll(Stream.of(Recipient.resolvedList(thread.getRecipient().getParticipantIds()))
- .filter(r -> r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED)
- .map(Recipient::getId)
- .toList());
- }
-
- if (needsRefresh.size() > 0) {
- Log.w(TAG, "Enqueuing profile refreshes for " + needsRefresh.size() + " GV1 participants.");
- RetrieveProfileJob.enqueue(needsRefresh);
- }
- });
- }
-
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
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 a19079649f..7942ad7689 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
@@ -59,6 +59,7 @@
import org.thoughtcrime.securesms.migrations.StickerMyDailyLifeMigrationJob;
import org.thoughtcrime.securesms.migrations.StorageCapabilityMigrationJob;
import org.thoughtcrime.securesms.migrations.StorageServiceMigrationJob;
+import org.thoughtcrime.securesms.migrations.StorageServiceSystemNameMigrationJob;
import org.thoughtcrime.securesms.migrations.SyncDistributionListsMigrationJob;
import org.thoughtcrime.securesms.migrations.TrimByLengthSettingsMigrationJob;
import org.thoughtcrime.securesms.migrations.UserNotificationMigrationJob;
@@ -94,6 +95,8 @@ public static Map getJobFactories(@NonNull Application appl
put(FcmRefreshJob.KEY, new FcmRefreshJob.Factory());
put(FetchRemoteMegaphoneImageJob.KEY, new FetchRemoteMegaphoneImageJob.Factory());
put(FontDownloaderJob.KEY, new FontDownloaderJob.Factory());
+ put(ForceUpdateGroupV2Job.KEY, new ForceUpdateGroupV2Job.Factory());
+ put(ForceUpdateGroupV2WorkerJob.KEY, new ForceUpdateGroupV2WorkerJob.Factory());
put(GiftSendJob.KEY, new FailingJob.Factory());
put(GroupV1MigrationJob.KEY, new GroupV1MigrationJob.Factory());
put(GroupCallUpdateSendJob.KEY, new GroupCallUpdateSendJob.Factory());
@@ -133,7 +136,7 @@ public static Map getJobFactories(@NonNull Application appl
put(PaymentNotificationSendJob.KEY, new PaymentNotificationSendJob.Factory());
put(PaymentSendJob.KEY, new PaymentSendJob.Factory());
put(PaymentTransactionCheckJob.KEY, new PaymentTransactionCheckJob.Factory());
- put(PnpInitializeDevicesJob.KEY, new PnpInitializeDevicesJob.Factory());
+ put(PnpInitializeDevicesJob.KEY, new PnpInitializeDevicesJob.Factory());
put(PreKeysSyncJob.KEY, new PreKeysSyncJob.Factory());
put(ProfileKeySendJob.KEY, new ProfileKeySendJob.Factory());
put(ProfileUploadJob.KEY, new ProfileUploadJob.Factory());
@@ -219,6 +222,7 @@ public static Map getJobFactories(@NonNull Application appl
put(StickerMyDailyLifeMigrationJob.KEY, new StickerMyDailyLifeMigrationJob.Factory());
put(StorageCapabilityMigrationJob.KEY, new StorageCapabilityMigrationJob.Factory());
put(StorageServiceMigrationJob.KEY, new StorageServiceMigrationJob.Factory());
+ put(StorageServiceSystemNameMigrationJob.KEY, new StorageServiceSystemNameMigrationJob.Factory());
put(TrimByLengthSettingsMigrationJob.KEY, new TrimByLengthSettingsMigrationJob.Factory());
put(UserNotificationMigrationJob.KEY, new UserNotificationMigrationJob.Factory());
put(UuidMigrationJob.KEY, new FailingJob.Factory());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java
index f563e3d90f..27dc77db5d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java
@@ -87,6 +87,11 @@ public void onRun() throws RetryLaterException {
List jobs = new LinkedList<>();
DecryptionResult result = MessageDecryptionUtil.decrypt(context, envelope);
+ if (result.getState() == MessageState.DECRYPTED_OK && envelope.isStory() && !isStoryMessage(result)) {
+ Log.w(TAG, "Envelope was flagged as a story, but it did not have any story-related content! Dropping.");
+ return;
+ }
+
if (result.getContent() != null) {
if (result.getContent().getSenderKeyDistributionMessage().isPresent()) {
handleSenderKeyDistributionMessage(result.getContent().getSender(), result.getContent().getSenderDevice(), result.getContent().getSenderKeyDistributionMessage().get());
@@ -157,6 +162,35 @@ private void handlePniSignatureMessage(@NonNull SignalServiceAddress address, in
}
}
+ private boolean isStoryMessage(@NonNull DecryptionResult result) {
+ if (result.getContent() == null) {
+ return false;
+ }
+
+ if (result.getContent().getSenderKeyDistributionMessage().isPresent()) {
+ return true;
+ }
+
+ if (result.getContent().getStoryMessage().isPresent()) {
+ return true;
+ }
+
+ if (result.getContent().getDataMessage().isPresent() &&
+ result.getContent().getDataMessage().get().getStoryContext().isPresent() &&
+ result.getContent().getDataMessage().get().getGroupContext().isPresent())
+ {
+ return true;
+ }
+
+ if (result.getContent().getDataMessage().isPresent() &&
+ result.getContent().getDataMessage().get().getRemoteDelete().isPresent())
+ {
+ return true;
+ }
+
+ return false;
+ }
+
public static final class Factory implements Job.Factory {
@Override
public @NonNull PushDecryptMessageJob create(@NonNull Parameters parameters, @NonNull Data data) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java
index 777c0c3958..52a628fe8b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java
@@ -296,7 +296,7 @@ private List deliver(OutgoingMediaMessage message, @NonNull R
.withExpiration(groupRecipient.getExpiresInSeconds())
.asGroupMessage(group)
.build();
- return GroupSendUtil.sendResendableDataMessage(context, groupRecipient.requireGroupId().requireV2(), destinations, isRecipientUpdate, ContentHint.IMPLICIT, new MessageId(messageId, true), groupDataMessage, message.isUrgent());
+ return GroupSendUtil.sendResendableDataMessage(context, groupRecipient.requireGroupId().requireV2(), null, destinations, isRecipientUpdate, ContentHint.IMPLICIT, new MessageId(messageId, true), groupDataMessage, message.isUrgent(), false);
} else {
throw new UndeliverableMessageException("Messages can no longer be sent to V1 groups!");
}
@@ -351,12 +351,14 @@ private List deliver(OutgoingMediaMessage message, @NonNull R
return GroupSendUtil.sendResendableDataMessage(context,
groupRecipient.getGroupId().map(GroupId::requireV2).orElse(null),
+ null,
destinations,
isRecipientUpdate,
ContentHint.RESENDABLE,
new MessageId(messageId, true),
groupMessageBuilder.build(),
- message.isUrgent());
+ message.isUrgent(),
+ message.getStoryType().isStory() || message.getParentStoryId() != null);
}
} catch (ServerRejectedException e) {
throw new UndeliverableMessageException(e);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java
index b8fdfaf52a..167df0923c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java
@@ -357,6 +357,8 @@ protected Optional getQuoteFor(OutgoingMediaMess
if (quoteAuthorRecipient.isMaybeRegistered()) {
return Optional.of(new SignalServiceDataMessage.Quote(quoteId, RecipientUtil.getOrFetchServiceId(context, quoteAuthorRecipient), quoteBody, quoteAttachments, quoteMentions, quoteType.getDataMessageType()));
+ } else if (quoteAuthorRecipient.hasServiceId()) {
+ return Optional.of(new SignalServiceDataMessage.Quote(quoteId, quoteAuthorRecipient.requireServiceId(), quoteBody, quoteAttachments, quoteMentions, quoteType.getDataMessageType()));
} else {
return Optional.empty();
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java
index bf3ba72e8f..01131cd284 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java
@@ -238,12 +238,14 @@ public void onFailure() {
boolean includesSelf = nonSelfDestinations.size() != destinations.size();
List results = GroupSendUtil.sendResendableDataMessage(context,
conversationRecipient.getGroupId().map(GroupId::requireV2).orElse(null),
+ null,
nonSelfDestinations,
false,
ContentHint.RESENDABLE,
messageId,
dataMessage,
- true);
+ true,
+ false);
if (includesSelf) {
results.add(ApplicationDependencies.getSignalServiceMessageSender().sendSyncMessage(dataMessage));
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java
index 58e8a7a7ad..1aec897d6b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java
@@ -50,7 +50,7 @@ public RefreshAttributesJob(boolean forced) {
.addConstraint(NetworkConstraint.KEY)
.setQueue("RefreshAttributesJob")
.setMaxInstancesForFactory(2)
- .setLifespan(TimeUnit.DAYS.toDays(30))
+ .setLifespan(TimeUnit.DAYS.toMillis(30))
.setMaxAttempts(Parameters.UNLIMITED)
.build(),
forced);
@@ -84,7 +84,7 @@ public void onRun() throws IOException {
}
int registrationId = SignalStore.account().getRegistrationId();
- boolean fetchesMessages = !SignalStore.account().isFcmEnabled();
+ boolean fetchesMessages = !SignalStore.account().isFcmEnabled() || SignalStore.internalValues().isWebsocketModeForced();
byte[] unidentifiedAccessKey = UnidentifiedAccess.deriveAccessKeyFrom(ProfileKeyUtil.getSelfProfileKey());
boolean universalUnidentifiedAccess = TextSecurePreferences.isUniversalUnidentifiedAccess(context);
String registrationLockV1 = null;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java
index 04b285d9e9..498cc8d2f5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java
@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
@@ -10,8 +11,11 @@
import org.thoughtcrime.securesms.database.MessageDatabase;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.SignalDatabase;
+import org.thoughtcrime.securesms.database.model.DistributionListId;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.database.model.MessageRecord;
+import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
+import org.thoughtcrime.securesms.database.model.StoryType;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
@@ -29,6 +33,7 @@
import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
import org.whispersystems.signalservice.api.messages.SendMessageResult;
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
+import org.whispersystems.signalservice.api.push.DistributionId;
import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException;
import java.io.IOException;
@@ -157,7 +162,10 @@ protected void onRun() throws Exception {
List eligible = RecipientUtil.getEligibleForSending(Stream.of(recipients).map(Recipient::resolved).toList());
List skipped = Stream.of(SetUtil.difference(possible, eligible)).map(Recipient::getId).toList();
- GroupSendJobHelper.SendResult sendResult = deliver(conversationRecipient, eligible, targetSentTimestamp);
+ boolean isForStory = message.isMms() && (((MmsMessageRecord) message).getStoryType().isStory() || ((MmsMessageRecord) message).getParentStoryId() != null);
+ DistributionListId distributionListId = isForStory ? message.getRecipient().getDistributionListId().orElse(null) : null;
+
+ GroupSendJobHelper.SendResult sendResult = deliver(conversationRecipient, eligible, targetSentTimestamp, isForStory, distributionListId);
for (Recipient completion : sendResult.completed) {
recipients.remove(completion.getId());
@@ -196,7 +204,11 @@ public void onFailure() {
Log.w(TAG, "Failed to send remote delete to all recipients! (" + (initialRecipientCount - recipients.size() + "/" + initialRecipientCount + ")") );
}
- private @NonNull GroupSendJobHelper.SendResult deliver(@NonNull Recipient conversationRecipient, @NonNull List destinations, long targetSentTimestamp)
+ private @NonNull GroupSendJobHelper.SendResult deliver(@NonNull Recipient conversationRecipient,
+ @NonNull List destinations,
+ long targetSentTimestamp,
+ boolean isForStory,
+ @Nullable DistributionListId distributionListId)
throws IOException, UntrustedIdentityException
{
SignalServiceDataMessage.Builder dataMessageBuilder = SignalServiceDataMessage.newBuilder()
@@ -210,12 +222,14 @@ public void onFailure() {
SignalServiceDataMessage dataMessage = dataMessageBuilder.build();
List results = GroupSendUtil.sendResendableDataMessage(context,
conversationRecipient.getGroupId().map(GroupId::requireV2).orElse(null),
+ distributionListId,
destinations,
false,
ContentHint.RESENDABLE,
new MessageId(messageId, isMms),
dataMessage,
- true);
+ true,
+ isForStory);
return GroupSendJobHelper.getCompletedSends(destinations, results);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SenderKeyDistributionSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SenderKeyDistributionSendJob.java
index 55a3291003..c0fcaa03f9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SenderKeyDistributionSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SenderKeyDistributionSendJob.java
@@ -79,11 +79,6 @@ protected void onRun() throws Exception {
Recipient targetRecipient = Recipient.resolved(targetRecipientId);
Recipient threadRecipient = Recipient.resolved(threadRecipientId);
- if (targetRecipient.getSenderKeyCapability() != Recipient.Capability.SUPPORTED) {
- Log.w(TAG, targetRecipientId + " does not support sender key! Not sending.");
- return;
- }
-
if (targetRecipient.isUnregistered()) {
Log.w(TAG, threadRecipient.getId() + " not registered!");
return;
@@ -125,7 +120,7 @@ protected void onRun() throws Exception {
SenderKeyDistributionMessage message = messageSender.getOrCreateNewGroupSession(distributionId);
List> access = UnidentifiedAccessUtil.getAccessFor(context, Collections.singletonList(targetRecipient));
- SendMessageResult result = messageSender.sendSenderKeyDistributionMessage(distributionId, address, access, message, Optional.ofNullable(groupId).map(GroupId::getDecodedId), false).get(0);
+ SendMessageResult result = messageSender.sendSenderKeyDistributionMessage(distributionId, address, access, message, Optional.ofNullable(groupId).map(GroupId::getDecodedId), false, false).get(0);
if (result.isSuccess()) {
List addresses = result.getSuccess()
diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java
index 3f815ddeee..8be02dbb05 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java
@@ -25,6 +25,7 @@ public final class InternalValues extends SignalStoreValues {
public static final String CALLING_BANDWIDTH_MODE = "internal.calling_bandwidth_mode";
public static final String CALLING_DISABLE_TELECOM = "internal.calling_disable_telecom";
public static final String DISABLE_STORAGE_SERVICE = "internal.disable_storage_service";
+ public static final String FORCE_WEBSOCKET_MODE = "internal.force_websocket_mode";
InternalValues(KeyValueStore store) {
super(store);
@@ -151,7 +152,18 @@ public synchronized CallManager.BandwidthMode callingBandwidthMode() {
*/
public synchronized boolean callingDisableTelecom() {
if (FeatureFlags.internalUser()) {
- return getBoolean(CALLING_DISABLE_TELECOM, false);
+ return getBoolean(CALLING_DISABLE_TELECOM, true);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Whether or not the system is forced to be in 'websocket mode', where FCM is ignored and we use a foreground service to keep the app alive.
+ */
+ public boolean isWebsocketModeForced() {
+ if (FeatureFlags.internalUser()) {
+ return getBoolean(FORCE_WEBSOCKET_MODE, false);
} else {
return false;
}
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 8b35d39b5e..104636d9b9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
@@ -13,7 +13,6 @@ public final class MiscellaneousValues extends SignalStoreValues {
private static final String LAST_PREKEY_REFRESH_TIME = "last_prekey_refresh_time";
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 LAST_GV1_ROUTINE_MIGRATION_TIME = "misc.last_gv1_routine_migration_time";
private static final String USERNAME_SHOW_REMINDER = "username.show.reminder";
private static final String CLIENT_DEPRECATED = "misc.client_deprecated";
private static final String OLD_DEVICE_TRANSFER_LOCKED = "misc.old_device.transfer.locked";
@@ -62,14 +61,6 @@ public void setLastProfileRefreshTime(long time) {
putLong(LAST_PROFILE_REFRESH_TIME, time);
}
- public long getLastGv1RoutineMigrationTime() {
- return getLong(LAST_GV1_ROUTINE_MIGRATION_TIME, 0);
- }
-
- public void setLastGv1RoutineMigrationTime(long time) {
- putLong(LAST_GV1_ROUTINE_MIGRATION_TIME, time);
- }
-
public void hideUsernameReminder() {
putBoolean(USERNAME_SHOW_REMINDER, false);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt
index 828f14ce1f..1a5ee87511 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt
@@ -53,6 +53,7 @@ internal class PaymentsValues internal constructor(store: KeyValueStore) : Signa
const val MOB_PAYMENTS_ENABLED = "mob_payments_enabled"
}
+ @get:JvmName("isPaymentLockEnabled")
var paymentLock: Boolean by booleanValue(PAYMENT_LOCK_ENABLED, false)
var paymentLockTimestamp: Long by longValue(PAYMENT_LOCK_TIMESTAMP, 0)
var paymentLockSkipCount: Int by integerValue(PAYMENT_LOCK_SKIP_COUNT, 0)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/StoryValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/StoryValues.kt
index 9d55e9a460..072e2351ff 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/StoryValues.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/StoryValues.kt
@@ -39,6 +39,11 @@ internal class StoryValues(store: KeyValueStore) : SignalStoreValues(store) {
* Marks whether the user has seen the onboarding story
*/
private const val USER_HAS_SEEN_ONBOARDING_STORY = "stories.user.has.seen.onboarding"
+
+ /**
+ * Marks whether the user has seen the beta dialog
+ */
+ private const val USER_HAS_SEEN_BETA_DIALOG = "stories.user.has.seen.beta.dialog"
}
override fun onFirstEverAppLaunch() = Unit
@@ -47,7 +52,8 @@ internal class StoryValues(store: KeyValueStore) : SignalStoreValues(store) {
MANUAL_FEATURE_DISABLE,
USER_HAS_ADDED_TO_A_STORY,
USER_HAS_SEEN_FIRST_NAV_VIEW,
- HAS_DOWNLOADED_ONBOARDING_STORY
+ HAS_DOWNLOADED_ONBOARDING_STORY,
+ USER_HAS_SEEN_BETA_DIALOG
)
var isFeatureDisabled: Boolean by booleanValue(MANUAL_FEATURE_DISABLE, false)
@@ -62,6 +68,8 @@ internal class StoryValues(store: KeyValueStore) : SignalStoreValues(store) {
var userHasSeenOnboardingStory: Boolean by booleanValue(USER_HAS_SEEN_ONBOARDING_STORY, false)
+ var userHasSeenBetaDialog: Boolean by booleanValue(USER_HAS_SEEN_BETA_DIALOG, false)
+
fun setLatestStorySend(storySend: StorySend) {
synchronized(this) {
val storySends: List = getList(LATEST_STORY_SENDS, StorySendSerializer)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java
index 7f2f2bbf0b..acec125f56 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java
@@ -5,6 +5,9 @@
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.AppCapabilities;
+import org.thoughtcrime.securesms.database.RecipientDatabase;
+import org.thoughtcrime.securesms.database.SignalDatabase;
+import org.thoughtcrime.securesms.database.model.RecipientRecord;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.whispersystems.signalservice.api.account.AccountAttributes;
@@ -28,23 +31,31 @@ public final class LogSectionCapabilities implements LogSection {
Recipient self = Recipient.self();
- AccountAttributes.Capabilities capabilities = AppCapabilities.getCapabilities(false);
-
- return new StringBuilder().append("-- Local").append("\n")
- .append("GV2 : ").append(capabilities.isGv2()).append("\n")
- .append("GV1 Migration : ").append(capabilities.isGv1Migration()).append("\n")
- .append("Sender Key : ").append(capabilities.isSenderKey()).append("\n")
- .append("Announcement Groups: ").append(capabilities.isAnnouncementGroup()).append("\n")
- .append("Change Number : ").append(capabilities.isChangeNumber()).append("\n")
- .append("Stories : ").append(capabilities.isStories()).append("\n")
- .append("Gift Badges : ").append(capabilities.isGiftBadges()).append("\n")
+ AccountAttributes.Capabilities localCapabilities = AppCapabilities.getCapabilities(false);
+ RecipientRecord.Capabilities globalCapabilities = SignalDatabase.recipients().getCapabilities(self.getId());
+
+ StringBuilder builder = new StringBuilder().append("-- Local").append("\n")
+ .append("GV2 : ").append(localCapabilities.isGv2()).append("\n")
+ .append("GV1 Migration : ").append(localCapabilities.isGv1Migration()).append("\n")
+ .append("Sender Key : ").append(localCapabilities.isSenderKey()).append("\n")
+ .append("Announcement Groups: ").append(localCapabilities.isAnnouncementGroup()).append("\n")
+ .append("Change Number : ").append(localCapabilities.isChangeNumber()).append("\n")
+ .append("Stories : ").append(localCapabilities.isStories()).append("\n")
+ .append("Gift Badges : ").append(localCapabilities.isGiftBadges()).append("\n")
.append("\n")
- .append("-- Global").append("\n")
- .append("GV1 Migration : ").append(self.getGroupsV1MigrationCapability()).append("\n")
- .append("Sender Key : ").append(self.getSenderKeyCapability()).append("\n")
- .append("Announcement Groups: ").append(self.getAnnouncementGroupCapability()).append("\n")
- .append("Change Number : ").append(self.getChangeNumberCapability()).append("\n")
- .append("Stories : ").append(self.getStoriesCapability()).append("\n")
- .append("Gift Badges : ").append(self.getGiftBadgesCapability()).append("\n");
+ .append("-- Global").append("\n");
+
+ if (globalCapabilities != null) {
+ builder.append("GV1 Migration : ").append(globalCapabilities.getGroupsV1MigrationCapability()).append("\n")
+ .append("Sender Key : ").append(globalCapabilities.getSenderKeyCapability()).append("\n")
+ .append("Announcement Groups: ").append(globalCapabilities.getAnnouncementGroupCapability()).append("\n")
+ .append("Change Number : ").append(globalCapabilities.getChangeNumberCapability()).append("\n")
+ .append("Stories : ").append(globalCapabilities.getStoriesCapability()).append("\n")
+ .append("Gift Badges : ").append(globalCapabilities.getGiftBadgesCapability()).append("\n");
+ } else {
+ builder.append("Self not found!");
+ }
+
+ return builder;
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java
index b1f5a5d8c5..ebc41f7b0e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java
@@ -28,7 +28,6 @@
import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.MediaPreviewActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.components.menu.ActionItem;
@@ -38,6 +37,7 @@
import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.database.loaders.GroupedThreadMediaLoader;
import org.thoughtcrime.securesms.database.loaders.MediaLoader;
+import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.util.BottomOffsetDecoration;
@@ -46,6 +46,7 @@
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Arrays;
+import java.util.Objects;
public final class MediaOverviewPageFragment extends Fragment
implements MediaGalleryAllAdapter.ItemClickListener,
@@ -236,18 +237,19 @@ private void handleMediaPreviewClick(@NonNull MediaDatabase.MediaRecord mediaRec
DatabaseAttachment attachment = mediaRecord.getAttachment();
if (MediaUtil.isVideo(attachment) || MediaUtil.isImage(attachment)) {
- Intent intent = new Intent(context, MediaPreviewActivity.class);
- intent.putExtra(MediaPreviewActivity.DATE_EXTRA, mediaRecord.getDate());
- intent.putExtra(MediaPreviewActivity.SIZE_EXTRA, mediaRecord.getAttachment().getSize());
- intent.putExtra(MediaPreviewActivity.THREAD_ID_EXTRA, threadId);
- intent.putExtra(MediaPreviewActivity.LEFT_IS_RECENT_EXTRA, true);
- intent.putExtra(MediaPreviewActivity.HIDE_ALL_MEDIA_EXTRA, true);
- intent.putExtra(MediaPreviewActivity.SHOW_THREAD_EXTRA, threadId == MediaDatabase.ALL_THREADS);
- intent.putExtra(MediaPreviewActivity.SORTING_EXTRA, sorting.ordinal());
- intent.putExtra(MediaPreviewActivity.IS_VIDEO_GIF, attachment.isVideoGif());
-
- intent.setDataAndType(mediaRecord.getAttachment().getUri(), mediaRecord.getContentType());
- context.startActivity(intent);
+ MediaIntentFactory.MediaPreviewArgs args = new MediaIntentFactory.MediaPreviewArgs(
+ threadId,
+ mediaRecord.getDate(),
+ Objects.requireNonNull(mediaRecord.getAttachment().getUri()),
+ mediaRecord.getContentType(),
+ mediaRecord.getAttachment().getSize(),
+ mediaRecord.getAttachment().getCaption(),
+ true,
+ true,
+ threadId == MediaDatabase.ALL_THREADS,
+ sorting.ordinal(),
+ attachment.isVideoGif());
+ context.startActivity(MediaIntentFactory.create(context, args));
} else {
if (!MediaUtil.isAudio(attachment)) {
showFileExternally(context, mediaRecord);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt
new file mode 100644
index 0000000000..1ecff88560
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt
@@ -0,0 +1,66 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import org.thoughtcrime.securesms.MediaPreviewActivity
+import org.thoughtcrime.securesms.util.FeatureFlags
+
+object MediaIntentFactory {
+ private const val ARGS_KEY = "args"
+
+ const val NOT_IN_A_THREAD = -2
+ const val UNKNOWN_TIMESTAMP = -2
+ const val THREAD_ID_EXTRA = "thread_id"
+ const val DATE_EXTRA = "date"
+ const val SIZE_EXTRA = "size"
+ const val CAPTION_EXTRA = "caption"
+ const val LEFT_IS_RECENT_EXTRA = "left_is_recent"
+ const val HIDE_ALL_MEDIA_EXTRA = "came_from_all_media"
+ const val SHOW_THREAD_EXTRA = "show_thread"
+ const val SORTING_EXTRA = "sorting"
+ const val IS_VIDEO_GIF = "is_video_gif"
+
+ @Parcelize
+ data class MediaPreviewArgs(
+ val threadId: Long,
+ val date: Long,
+ val initialMediaUri: Uri,
+ val initialMediaType: String,
+ val initialMediaSize: Long,
+ val initialCaption: String? = null,
+ val leftIsRecent: Boolean = false,
+ val hideAllMedia: Boolean = false,
+ val showThread: Boolean = false,
+ val sorting: Int,
+ val isVideoGif: Boolean
+ ) : Parcelable
+
+ @JvmStatic
+ fun requireArguments(bundle: Bundle): MediaPreviewArgs = bundle.getParcelable(ARGS_KEY)!!
+
+ @JvmStatic
+ fun create(context: Context, args: MediaPreviewArgs): Intent {
+
+ return if (FeatureFlags.mediaPreviewV2()) {
+ val intent = Intent(context, MediaPreviewV2Activity::class.java)
+ intent.putExtra(ARGS_KEY, args)
+ return intent
+ } else {
+ val intent = Intent(context, MediaPreviewActivity::class.java).apply {
+ addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ setDataAndType(args.initialMediaUri, args.initialMediaType)
+ putExtra(THREAD_ID_EXTRA, args.threadId)
+ putExtra(DATE_EXTRA, args.date)
+ putExtra(SIZE_EXTRA, args.initialMediaSize)
+ putExtra(CAPTION_EXTRA, args.initialCaption)
+ putExtra(IS_VIDEO_GIF, args.isVideoGif)
+ putExtra(LEFT_IS_RECENT_EXTRA, args.leftIsRecent)
+ }
+ return intent
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt
new file mode 100644
index 0000000000..25c83262b1
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt
@@ -0,0 +1,64 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import android.net.Uri
+import io.reactivex.rxjava3.core.Flowable
+import io.reactivex.rxjava3.core.Single
+import io.reactivex.rxjava3.schedulers.Schedulers
+import org.signal.core.util.logging.Log
+import org.signal.core.util.requireLong
+import org.thoughtcrime.securesms.attachments.AttachmentId
+import org.thoughtcrime.securesms.database.AttachmentDatabase
+import org.thoughtcrime.securesms.database.MediaDatabase
+import org.thoughtcrime.securesms.database.MediaDatabase.Sorting
+import org.thoughtcrime.securesms.database.SignalDatabase.Companion.media
+import org.thoughtcrime.securesms.mms.PartAuthority
+
+/**
+ * Repository for accessing the attachments in the encrypted database.
+ */
+class MediaPreviewRepository {
+ companion object {
+ private val TAG: String = Log.tag(MediaPreviewRepository::class.java)
+ }
+
+ /**
+ * Accessor for database attachments.
+ * @param startingUri the initial position to select from
+ * @param threadId the thread to select from
+ * @param sorting the ordering of the results
+ * @param limit the maximum quantity of the results
+ */
+ fun getAttachments(startingUri: Uri, threadId: Long, sorting: Sorting, limit: Int = 500): Flowable> {
+ return Single.fromCallable {
+ val cursor = media.getGalleryMediaForThread(threadId, sorting)
+
+ val acc = mutableListOf()
+ var attachmentUri: Uri? = null
+ while (cursor.moveToNext()) {
+ val attachmentId = AttachmentId(cursor.requireLong(AttachmentDatabase.ROW_ID), cursor.requireLong(AttachmentDatabase.UNIQUE_ID))
+ attachmentUri = PartAuthority.getAttachmentDataUri(attachmentId)
+ if (attachmentUri == startingUri) {
+ break
+ }
+ }
+
+ if (attachmentUri == startingUri) {
+ for (i in 0..limit) {
+ val element = MediaDatabase.MediaRecord.from(cursor)
+ if (element != null) {
+ acc.add(element)
+ }
+ if (!cursor.isLast) {
+ cursor.moveToNext()
+ } else {
+ break
+ }
+ }
+ acc.toList()
+ } else {
+ Log.e(TAG, "Could not find $startingUri in thread $threadId")
+ emptyList()
+ }
+ }.subscribeOn(Schedulers.io()).toFlowable()
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt
new file mode 100644
index 0000000000..3c7640a18d
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt
@@ -0,0 +1,34 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import android.content.Context
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.fragment.app.commit
+import org.thoughtcrime.securesms.R
+
+class MediaPreviewV2Activity : AppCompatActivity(R.layout.activity_mediapreview_v2) {
+
+ override fun attachBaseContext(newBase: Context) {
+ delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES
+ super.attachBaseContext(newBase)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setTheme(R.style.TextSecure_MediaPreview)
+ if (savedInstanceState == null) {
+ val bundle = Bundle()
+ val args = MediaIntentFactory.requireArguments(intent.extras!!)
+ bundle.putParcelable(MediaPreviewV2Fragment.ARGS_KEY, args)
+ supportFragmentManager.commit {
+ setReorderingAllowed(true)
+ add(R.id.fragment_container_view, MediaPreviewV2Fragment::class.java, bundle, FRAGMENT_TAG)
+ }
+ }
+ }
+
+ companion object {
+ private const val FRAGMENT_TAG = "media_preview_fragment_v2"
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt
new file mode 100644
index 0000000000..3992b53842
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt
@@ -0,0 +1,47 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import androidx.core.os.bundleOf
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import org.thoughtcrime.securesms.attachments.Attachment
+import org.thoughtcrime.securesms.util.MediaUtil
+
+class MediaPreviewV2Adapter(val fragment: Fragment) : FragmentStateAdapter(fragment) {
+ private var items: List = listOf()
+ private var autoPlayPosition = -1
+
+ override fun getItemCount(): Int {
+ return items.count()
+ }
+
+ override fun createFragment(position: Int): Fragment {
+ val attachment: Attachment = items[position]
+
+ val contentType = attachment.contentType
+ val args = bundleOf(
+ MediaPreviewFragment.DATA_URI to attachment.uri,
+ MediaPreviewFragment.DATA_CONTENT_TYPE to contentType,
+ MediaPreviewFragment.DATA_SIZE to attachment.size,
+ MediaPreviewFragment.AUTO_PLAY to (position == autoPlayPosition),
+ MediaPreviewFragment.VIDEO_GIF to attachment.isVideoGif,
+ )
+ val fragment = if (MediaUtil.isVideo(contentType)) {
+ VideoMediaPreviewFragment()
+ } else if (MediaUtil.isImageType(contentType)) {
+ ImageMediaPreviewFragment()
+ } else {
+ throw AssertionError("Unexpected media type: $contentType")
+ }
+
+ fragment.arguments = args
+
+ return fragment
+ }
+
+ fun updateBackingItems(newItems: Collection) {
+ if (newItems != items) {
+ items = newItems.toList()
+ notifyDataSetChanged()
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt
new file mode 100644
index 0000000000..6de23e6eb9
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt
@@ -0,0 +1,389 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import android.Manifest
+import android.content.ActivityNotFoundException
+import android.content.Context
+import android.content.DialogInterface
+import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import android.view.Menu
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewGroup.MarginLayoutParams
+import android.widget.Toast
+import androidx.core.app.ShareCompat
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
+import com.google.android.material.appbar.MaterialToolbar
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+import org.signal.core.util.concurrent.SignalExecutors
+import org.signal.core.util.logging.Log
+import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.animation.DepthPageTransformer
+import org.thoughtcrime.securesms.attachments.DatabaseAttachment
+import org.thoughtcrime.securesms.components.ViewBinderDelegate
+import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
+import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs
+import org.thoughtcrime.securesms.database.MediaDatabase
+import org.thoughtcrime.securesms.databinding.FragmentMediaPreviewV2Binding
+import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity
+import org.thoughtcrime.securesms.mediasend.Media
+import org.thoughtcrime.securesms.mms.GlideApp
+import org.thoughtcrime.securesms.mms.PartAuthority
+import org.thoughtcrime.securesms.permissions.Permissions
+import org.thoughtcrime.securesms.recipients.Recipient
+import org.thoughtcrime.securesms.util.DateUtils
+import org.thoughtcrime.securesms.util.FullscreenHelper
+import org.thoughtcrime.securesms.util.LifecycleDisposable
+import org.thoughtcrime.securesms.util.MediaUtil
+import org.thoughtcrime.securesms.util.SaveAttachmentTask
+import org.thoughtcrime.securesms.util.StorageUtil
+import java.util.Locale
+import java.util.Optional
+
+class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), MediaPreviewFragment.Events {
+ private val TAG = Log.tag(MediaPreviewV2Fragment::class.java)
+
+ private val lifecycleDisposable = LifecycleDisposable()
+ private val binding by ViewBinderDelegate(FragmentMediaPreviewV2Binding::bind)
+ private val viewModel: MediaPreviewV2ViewModel by viewModels()
+
+ private lateinit var fullscreenHelper: FullscreenHelper
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ fullscreenHelper = FullscreenHelper(requireActivity())
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ val args = MediaIntentFactory.requireArguments(requireArguments())
+
+ initializeViewModel(args)
+ initializeToolbar(binding.toolbar, args)
+ binding.mediaPager.offscreenPageLimit = 1
+ binding.mediaPager.setPageTransformer(DepthPageTransformer())
+ val adapter = MediaPreviewV2Adapter(this)
+ binding.mediaPager.adapter = adapter
+ binding.mediaPager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
+ override fun onPageSelected(position: Int) {
+ super.onPageSelected(position)
+ viewModel.setCurrentPage(position)
+ }
+ })
+ initializeFullScreenUi()
+ initializeAlbumRail()
+ anchorMarginsToBottomInsets(binding.mediaPreviewDetailsContainer)
+ lifecycleDisposable += viewModel.state.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread()).subscribe {
+ bindCurrentState(it)
+ }
+ }
+
+ private fun initializeToolbar(toolbar: MaterialToolbar, args: MediaIntentFactory.MediaPreviewArgs) {
+ toolbar.setNavigationOnClickListener {
+ requireActivity().onBackPressed()
+ }
+
+ binding.toolbar.inflateMenu(R.menu.media_preview)
+
+ // Restricted to API26 because of MemoryFileUtil not supporting lower API levels well
+ binding.toolbar.menu.findItem(R.id.media_preview__share).isVisible = Build.VERSION.SDK_INT >= 26
+
+ if (args.hideAllMedia) {
+ binding.toolbar.menu.findItem(R.id.media_preview__overview).isVisible = false
+ }
+ }
+
+ private fun initializeAlbumRail() {
+ binding.mediaPreviewAlbumRail.itemAnimator = null // Or can crash when set to INVISIBLE while animating by FullscreenHelper https://issuetracker.google.com/issues/148720682
+ binding.mediaPreviewAlbumRail.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
+ binding.mediaPreviewAlbumRail.adapter = MediaRailAdapter(
+ GlideApp.with(this),
+ object : MediaRailAdapter.RailItemListener {
+ override fun onRailItemClicked(distanceFromActive: Int) {
+ binding.mediaPager.currentItem += distanceFromActive
+ }
+
+ override fun onRailItemDeleteClicked(distanceFromActive: Int) {
+ throw UnsupportedOperationException("Callback unsupported.")
+ }
+ },
+ false
+ )
+ }
+
+ private fun initializeFullScreenUi() {
+ fullscreenHelper.configureToolbarLayout(binding.toolbarCutoutSpacer, binding.toolbar)
+ fullscreenHelper.showAndHideWithSystemUI(requireActivity().window, binding.toolbarLayout, binding.mediaPreviewDetailsContainer)
+ }
+
+ private fun initializeViewModel(args: MediaIntentFactory.MediaPreviewArgs) {
+ if (!MediaUtil.isImageType(args.initialMediaType) && !MediaUtil.isVideoType(args.initialMediaType)) {
+ Log.w(TAG, "Unsupported media type sent to MediaPreviewV2Fragment, finishing.")
+ Snackbar.make(binding.root, R.string.MediaPreviewActivity_unssuported_media_type, Snackbar.LENGTH_LONG)
+ .setAction(R.string.MediaPreviewActivity_dismiss_due_to_error) {
+ requireActivity().finish()
+ }.show()
+ }
+ viewModel.setShowThread(args.showThread)
+ val sorting = MediaDatabase.Sorting.values()[args.sorting]
+ viewModel.fetchAttachments(args.initialMediaUri, args.threadId, sorting)
+ }
+
+ private fun bindCurrentState(currentState: MediaPreviewV2State) {
+ when (currentState.loadState) {
+ MediaPreviewV2State.LoadState.READY -> bindReadyState(currentState)
+ MediaPreviewV2State.LoadState.LOADED -> {
+ bindReadyState(currentState)
+ bindLoadedState(currentState)
+ }
+ else -> null
+ }
+ }
+
+ private fun bindReadyState(currentState: MediaPreviewV2State) {
+ (binding.mediaPager.adapter as MediaPreviewV2Adapter).updateBackingItems(currentState.mediaRecords.mapNotNull { it.attachment })
+ val currentItem: MediaDatabase.MediaRecord = currentState.mediaRecords[currentState.position]
+ binding.toolbar.title = getTitleText(currentItem, currentState.showThread)
+ binding.toolbar.subtitle = getSubTitleText(currentItem)
+
+ val menu: Menu = binding.toolbar.menu
+ if (currentItem.threadId == MediaIntentFactory.NOT_IN_A_THREAD.toLong()) {
+ menu.findItem(R.id.media_preview__overview).isVisible = false
+ menu.findItem(R.id.delete).isVisible = false
+ }
+
+ binding.toolbar.setOnMenuItemClickListener {
+ when (it.itemId) {
+ R.id.media_preview__overview -> showOverview(currentItem.threadId)
+ R.id.media_preview__forward -> forward(currentItem)
+ R.id.media_preview__share -> share(currentItem)
+ R.id.save -> saveToDisk(currentItem)
+ R.id.delete -> deleteMedia(currentItem)
+ android.R.id.home -> requireActivity().finish()
+ else -> return@setOnMenuItemClickListener false
+ }
+ return@setOnMenuItemClickListener true
+ }
+ }
+
+ /**
+ * These are binding steps that need a reference to the actual fragment within the pager.
+ * This is not available until after a page has been chosen by the ViewPager, and we receive the
+ * {@link OnPageChangeCallback}.
+ */
+ private fun bindLoadedState(currentState: MediaPreviewV2State) {
+ val currentItem: MediaDatabase.MediaRecord = currentState.mediaRecords[currentState.position]
+ val currentFragment: Fragment? = childFragmentManager.findFragmentByTag("f${currentState.position}")
+ val playbackControls = (currentFragment as? MediaPreviewFragment)?.playbackControls
+ val albumThumbnailMedia = currentState.mediaRecords.map { it.toMedia() }
+ val caption = currentItem.attachment?.caption
+ if (albumThumbnailMedia.isEmpty() && caption == null && playbackControls == null) {
+ binding.mediaPreviewDetailsContainer.visibility = View.GONE
+ } else {
+ binding.mediaPreviewDetailsContainer.visibility = View.VISIBLE
+ }
+ binding.mediaPreviewAlbumRail.visibility = if (albumThumbnailMedia.isEmpty()) View.GONE else View.VISIBLE
+ (binding.mediaPreviewAlbumRail.adapter as MediaRailAdapter).setMedia(albumThumbnailMedia, currentState.position)
+ binding.mediaPreviewAlbumRail.smoothScrollToPosition(currentState.position)
+
+ binding.mediaPreviewCaptionContainer.visibility = if (caption == null) View.GONE else View.VISIBLE
+ binding.mediaPreviewCaption.text = caption
+
+ if (playbackControls != null) {
+ val params = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+ playbackControls.layoutParams = params
+ binding.mediaPreviewPlaybackControlsContainer.removeAllViews()
+ binding.mediaPreviewPlaybackControlsContainer.addView(playbackControls)
+ } else {
+ binding.mediaPreviewPlaybackControlsContainer.removeAllViews()
+ }
+ }
+
+ private fun getTitleText(mediaRecord: MediaDatabase.MediaRecord, showThread: Boolean): String {
+ val recipient: Recipient = Recipient.live(mediaRecord.recipientId).get()
+ val defaultFromString: String = if (mediaRecord.isOutgoing) {
+ getString(R.string.MediaPreviewActivity_you)
+ } else {
+ recipient.getDisplayName(requireContext())
+ }
+ if (!showThread) {
+ return defaultFromString
+ }
+
+ val threadRecipient = Recipient.live(mediaRecord.threadRecipientId).get()
+ return if (mediaRecord.isOutgoing) {
+ if (threadRecipient.isSelf) {
+ getString(R.string.note_to_self)
+ } else {
+ getString(R.string.MediaPreviewActivity_you_to_s, threadRecipient.getDisplayName(requireContext()))
+ }
+ } else {
+ if (threadRecipient.isGroup) {
+ getString(R.string.MediaPreviewActivity_s_to_s, defaultFromString, threadRecipient.getDisplayName(requireContext()))
+ } else {
+ getString(R.string.MediaPreviewActivity_s_to_you, defaultFromString)
+ }
+ }
+ }
+
+ private fun getSubTitleText(mediaRecord: MediaDatabase.MediaRecord): String =
+ if (mediaRecord.date > 0) {
+ DateUtils.getExtendedRelativeTimeSpanString(requireContext(), Locale.getDefault(), mediaRecord.date)
+ } else {
+ getString(R.string.MediaPreviewActivity_draft)
+ }
+
+ private fun anchorMarginsToBottomInsets(viewToAnchor: View) {
+ ViewCompat.setOnApplyWindowInsetsListener(viewToAnchor) { view: View, windowInsetsCompat: WindowInsetsCompat ->
+ val layoutParams = view.layoutParams as MarginLayoutParams
+ val systemBarInsets = windowInsetsCompat.getInsets(WindowInsetsCompat.Type.systemBars())
+ layoutParams.setMargins(
+ systemBarInsets.left,
+ layoutParams.topMargin,
+ systemBarInsets.right,
+ systemBarInsets.bottom
+ )
+ view.layoutParams = layoutParams
+ windowInsetsCompat
+ }
+ }
+
+ private fun MediaDatabase.MediaRecord.toMedia(): Media? {
+ val attachment = this.attachment
+ val uri = attachment?.uri
+ if (attachment == null || uri == null) {
+ return null
+ }
+
+ return Media(
+ uri,
+ this.contentType,
+ this.date,
+ attachment.width,
+ attachment.height,
+ attachment.size,
+ 0,
+ attachment.isBorderless,
+ attachment.isVideoGif,
+ Optional.empty(),
+ Optional.ofNullable(attachment.caption),
+ Optional.empty()
+ )
+ }
+
+ override fun singleTapOnMedia(): Boolean {
+ fullscreenHelper.toggleUiVisibility()
+ return true
+ }
+
+ override fun mediaNotAvailable() {
+ Snackbar.make(binding.root, R.string.MediaPreviewActivity_media_no_longer_available, Snackbar.LENGTH_LONG)
+ .setAction(R.string.MediaPreviewActivity_dismiss_due_to_error) {
+ requireActivity().finish()
+ }.show()
+ }
+
+ override fun onMediaReady() {
+ Log.d(TAG, "onMediaReady()")
+ }
+
+ private fun showOverview(threadId: Long) {
+ val context = requireContext()
+ context.startActivity(MediaOverviewActivity.forThread(context, threadId))
+ }
+
+ private fun forward(mediaItem: MediaDatabase.MediaRecord) {
+ val attachment = mediaItem.attachment
+ val uri = attachment?.uri
+ if (attachment != null && uri != null) {
+ MultiselectForwardFragmentArgs.create(
+ requireContext(),
+ mediaItem.threadId,
+ uri,
+ attachment.contentType
+ ) { args: MultiselectForwardFragmentArgs ->
+ MultiselectForwardFragment.showBottomSheet(childFragmentManager, args)
+ }
+ }
+ }
+
+ private fun share(mediaItem: MediaDatabase.MediaRecord) {
+ val attachment = mediaItem.attachment
+ val uri = attachment?.uri
+ if (attachment != null && uri != null) {
+ val publicUri = PartAuthority.getAttachmentPublicUri(uri)
+ val mimeType = Intent.normalizeMimeType(attachment.contentType)
+ val shareIntent = ShareCompat.IntentBuilder(requireActivity())
+ .setStream(publicUri)
+ .setType(mimeType)
+ .createChooserIntent()
+ .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+
+ try {
+ startActivity(shareIntent)
+ } catch (e: ActivityNotFoundException) {
+ Log.w(TAG, "No activity existed to share the media.", e)
+ Toast.makeText(requireContext(), R.string.MediaPreviewActivity_cant_find_an_app_able_to_share_this_media, Toast.LENGTH_LONG).show()
+ }
+ }
+ }
+
+ private fun saveToDisk(mediaItem: MediaDatabase.MediaRecord) {
+ SaveAttachmentTask.showWarningDialog(requireContext()) { _: DialogInterface?, _: Int ->
+ if (StorageUtil.canWriteToMediaStore()) {
+ performSaveToDisk(mediaItem)
+ return@showWarningDialog
+ }
+ Permissions.with(this)
+ .request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ .ifNecessary()
+ .withPermanentDenialDialog(getString(R.string.MediaPreviewActivity_signal_needs_the_storage_permission_in_order_to_write_to_external_storage_but_it_has_been_permanently_denied))
+ .onAnyDenied { Toast.makeText(requireContext(), R.string.MediaPreviewActivity_unable_to_write_to_external_storage_without_permission, Toast.LENGTH_LONG).show() }
+ .onAllGranted { performSaveToDisk(mediaItem) }
+ .execute()
+ }
+ }
+
+ fun performSaveToDisk(mediaItem: MediaDatabase.MediaRecord) {
+ val saveTask = SaveAttachmentTask(requireContext())
+ val saveDate = if (mediaItem.date > 0) mediaItem.date else System.currentTimeMillis()
+ val attachment = mediaItem.attachment
+ val uri = attachment?.uri
+ if (attachment != null && uri != null) {
+ saveTask.executeOnExecutor(SignalExecutors.BOUNDED_IO, SaveAttachmentTask.Attachment(uri, attachment.contentType, saveDate, null))
+ }
+ }
+
+ private fun deleteMedia(mediaItem: MediaDatabase.MediaRecord) {
+ val attachment: DatabaseAttachment = mediaItem.attachment ?: return
+
+ MaterialAlertDialogBuilder(requireContext())
+ .setIcon(R.drawable.ic_warning)
+ .setTitle(R.string.MediaPreviewActivity_media_delete_confirmation_title)
+ .setMessage(R.string.MediaPreviewActivity_media_delete_confirmation_message)
+ .setCancelable(true)
+ .setPositiveButton(R.string.delete) { _, _ ->
+ viewModel.deleteItem(requireContext(), attachment, onSuccess = {
+ requireActivity().finish()
+ }, onError = {
+ Log.e(TAG, "Delete failed!", it)
+ requireActivity().finish()
+ })
+ }
+ .setNegativeButton(android.R.string.cancel, null)
+ .show()
+ }
+
+ companion object {
+ const val ARGS_KEY: String = "args"
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt
new file mode 100644
index 0000000000..bf91f819d0
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt
@@ -0,0 +1,12 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import org.thoughtcrime.securesms.database.MediaDatabase
+
+data class MediaPreviewV2State(
+ val mediaRecords: List = emptyList(),
+ val loadState: LoadState = LoadState.INIT,
+ val position: Int = 0,
+ val showThread: Boolean = false
+) {
+ enum class LoadState { INIT, READY, LOADED }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt
new file mode 100644
index 0000000000..9f6e776ea5
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt
@@ -0,0 +1,60 @@
+package org.thoughtcrime.securesms.mediapreview
+
+import android.content.Context
+import android.net.Uri
+import androidx.lifecycle.ViewModel
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+import io.reactivex.rxjava3.core.Flowable
+import io.reactivex.rxjava3.core.Single
+import io.reactivex.rxjava3.disposables.CompositeDisposable
+import io.reactivex.rxjava3.functions.Consumer
+import io.reactivex.rxjava3.kotlin.plusAssign
+import io.reactivex.rxjava3.schedulers.Schedulers
+import org.signal.core.util.logging.Log
+import org.thoughtcrime.securesms.attachments.DatabaseAttachment
+import org.thoughtcrime.securesms.database.MediaDatabase
+import org.thoughtcrime.securesms.util.AttachmentUtil
+import org.thoughtcrime.securesms.util.rx.RxStore
+
+class MediaPreviewV2ViewModel : ViewModel() {
+ private val TAG = Log.tag(MediaPreviewV2ViewModel::class.java)
+ private val store = RxStore(MediaPreviewV2State())
+ private val disposables = CompositeDisposable()
+ private val repository: MediaPreviewRepository = MediaPreviewRepository()
+
+ val state: Flowable = store.stateFlowable.observeOn(AndroidSchedulers.mainThread())
+
+ fun fetchAttachments(startingUri: Uri, threadId: Long, sorting: MediaDatabase.Sorting) {
+ disposables += store.update(repository.getAttachments(startingUri, threadId, sorting)) {
+ mediaRecords: List, oldState: MediaPreviewV2State ->
+ oldState.copy(
+ mediaRecords = mediaRecords,
+ loadState = MediaPreviewV2State.LoadState.READY
+ )
+ }
+ }
+
+ fun setShowThread(value: Boolean) {
+ store.update { oldState ->
+ oldState.copy(showThread = value)
+ }
+ }
+
+ fun setCurrentPage(position: Int) {
+ store.update { oldState ->
+ oldState.copy(position = position, loadState = MediaPreviewV2State.LoadState.LOADED)
+ }
+ }
+
+ fun deleteItem(context: Context, attachment: DatabaseAttachment, onSuccess: Consumer, onError: Consumer) {
+ disposables += Single.fromCallable { AttachmentUtil.deleteAttachment(context.applicationContext, attachment) }
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(onSuccess, onError)
+ }
+
+ override fun onCleared() {
+ disposables.dispose()
+ store.dispose()
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java
index 2ec38b0003..70a9863658 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java
@@ -47,14 +47,14 @@ public void setActiveAlbumRailItem(@NonNull Context context, int activePosition)
cursor.moveToPosition(activePosition);
- MediaRecord activeRecord = MediaRecord.from(context, cursor);
+ MediaRecord activeRecord = MediaRecord.from(cursor);
LinkedList rail = new LinkedList<>();
Media activeMedia = toMedia(activeRecord);
if (activeMedia != null) rail.add(activeMedia);
while (cursor.moveToPrevious()) {
- MediaRecord record = MediaRecord.from(context, cursor);
+ MediaRecord record = MediaRecord.from(cursor);
if (record.getAttachment().getMmsId() == activeRecord.getAttachment().getMmsId()) {
Media media = toMedia(record);
if (media != null) rail.addFirst(media);
@@ -66,7 +66,7 @@ public void setActiveAlbumRailItem(@NonNull Context context, int activePosition)
cursor.moveToPosition(activePosition);
while (cursor.moveToNext()) {
- MediaRecord record = MediaRecord.from(context, cursor);
+ MediaRecord record = MediaRecord.from(cursor);
if (record.getAttachment().getMmsId() == activeRecord.getAttachment().getMmsId()) {
Media media = toMedia(record);
if (media != null) rail.addLast(media);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java
index 1a3f25f7cf..15de7c43bd 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java
@@ -49,6 +49,7 @@
import org.thoughtcrime.securesms.animation.AnimationCompleteListener;
import org.thoughtcrime.securesms.components.TooltipPopup;
import org.thoughtcrime.securesms.mediasend.camerax.CameraXFlashToggleView;
+import org.thoughtcrime.securesms.mediasend.camerax.CameraXModePolicy;
import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil;
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations;
import org.thoughtcrime.securesms.mediasend.v2.MediaCountIndicatorButton;
@@ -87,6 +88,7 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment {
private MemoryFileDescriptor videoFileDescriptor;
private LifecycleCameraController cameraController;
private Disposable mostRecentItemDisposable = Disposable.disposed();
+ private CameraXModePolicy cameraXModePolicy;
private boolean isThumbAvailable;
private boolean isMediaSelected;
@@ -136,13 +138,18 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
this.previewView = view.findViewById(R.id.camerax_camera);
this.controlsContainer = view.findViewById(R.id.camerax_controls_container);
+ this.cameraXModePolicy = CameraXModePolicy.acquire(requireContext(),
+ controller.getMediaConstraints(),
+ requireArguments().getBoolean(IS_VIDEO_ENABLED, true));
+
+ Log.d(TAG, "Starting CameraX with mode policy " + cameraXModePolicy.getClass().getSimpleName());
cameraController = new LifecycleCameraController(requireContext());
cameraController.bindToLifecycle(getViewLifecycleOwner());
cameraController.setCameraSelector(CameraXUtil.toCameraSelector(TextSecurePreferences.getDirectCaptureCameraId(requireContext())));
cameraController.setTapToFocusEnabled(true);
cameraController.setImageCaptureMode(CameraXUtil.getOptimalCaptureMode());
- cameraController.setEnabledUseCases(getSupportedUseCases());
+ cameraXModePolicy.initialize(cameraController);
previewView.setScaleType(PREVIEW_SCALE_TYPE);
previewView.setController(cameraController);
@@ -335,7 +342,7 @@ private void initControls() {
galleryButton.setOnClickListener(v -> controller.onGalleryClicked());
countButton.setOnClickListener(v -> controller.onCameraCountButtonClicked());
- if (isVideoRecordingSupported(requireContext())) {
+ if (Build.VERSION.SDK_INT >= 26 && cameraXModePolicy.isVideoSupported()) {
try {
closeVideoFileDescriptor();
videoFileDescriptor = CameraXVideoCaptureHelper.createFileDescriptor(requireContext());
@@ -356,6 +363,7 @@ private void initControls() {
cameraController,
previewView,
videoFileDescriptor,
+ cameraXModePolicy,
maxDuration,
new CameraXVideoCaptureHelper.Callback() {
@Override
@@ -389,23 +397,6 @@ public void onVideoError(@Nullable Throwable cause) {
}
}
- @CameraController.UseCases
- private int getSupportedUseCases() {
- if (isVideoRecordingSupported(requireContext())) {
- return CameraController.IMAGE_CAPTURE | CameraController.VIDEO_CAPTURE;
- } else {
- return CameraController.IMAGE_CAPTURE;
- }
- }
-
- private boolean isVideoRecordingSupported(@NonNull Context context) {
- return Build.VERSION.SDK_INT >= 26 &&
- requireArguments().getBoolean(IS_VIDEO_ENABLED, true) &&
- MediaConstraints.isVideoTranscodeAvailable() &&
- CameraXUtil.isMixedModeSupported(context) &&
- VideoUtil.getMaxVideoRecordDurationInSeconds(context, controller.getMediaConstraints()) > 0;
- }
-
private void displayVideoRecordingTooltipIfNecessary(CameraButtonView captureButton) {
if (shouldDisplayVideoRecordingTooltip()) {
int displayRotation = requireActivity().getWindowManager().getDefaultDisplay().getRotation();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java
index 56bc38dcf9..4da3e0e3c1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java
@@ -26,6 +26,7 @@
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.mediasend.camerax.CameraXModePolicy;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.Debouncer;
import org.thoughtcrime.securesms.util.MemoryFileDescriptor;
@@ -51,6 +52,7 @@ class CameraXVideoCaptureHelper implements CameraButtonView.VideoCaptureListener
private final @NonNull MemoryFileDescriptor memoryFileDescriptor;
private final @NonNull ValueAnimator updateProgressAnimator;
private final @NonNull Debouncer debouncer;
+ private final @NonNull CameraXModePolicy cameraXModePolicy;
private ValueAnimator cameraMetricsAnimator;
@@ -81,6 +83,7 @@ public void onError(int videoCaptureError, @NonNull String message, @Nullable Th
@NonNull CameraController cameraController,
@NonNull PreviewView previewView,
@NonNull MemoryFileDescriptor memoryFileDescriptor,
+ @NonNull CameraXModePolicy cameraXModePolicy,
int maxVideoDurationSec,
@NonNull Callback callback)
{
@@ -91,6 +94,7 @@ public void onError(int videoCaptureError, @NonNull String message, @Nullable Th
this.callback = callback;
this.updateProgressAnimator = ValueAnimator.ofFloat(0f, 1f).setDuration(TimeUnit.SECONDS.toMillis(maxVideoDurationSec));
this.debouncer = new Debouncer(TimeUnit.SECONDS.toMillis(maxVideoDurationSec));
+ this.cameraXModePolicy = cameraXModePolicy;
updateProgressAnimator.setInterpolator(new LinearInterpolator());
updateProgressAnimator.addUpdateListener(anim -> captureButton.setProgress(anim.getAnimatedFraction()));
@@ -123,6 +127,7 @@ private void displayAudioRecordingPermissionsDialog() {
@SuppressLint("RestrictedApi")
private void beginCameraRecording() {
+ cameraXModePolicy.setToVideo(cameraController);
this.cameraController.setZoomRatio(Objects.requireNonNull(this.cameraController.getZoomState().getValue()).getMinZoomRatio());
callback.onVideoRecordStarted();
shrinkCaptureArea();
@@ -196,6 +201,7 @@ public void onVideoCaptureComplete() {
updateProgressAnimator.cancel();
debouncer.clear();
+ cameraXModePolicy.setToImage(cameraController);
}
@Override
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt
new file mode 100644
index 0000000000..a4bc5d808b
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt
@@ -0,0 +1,92 @@
+package org.thoughtcrime.securesms.mediasend.camerax
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.camera.view.CameraController
+import androidx.camera.view.video.ExperimentalVideo
+import org.signal.core.util.asListContains
+import org.thoughtcrime.securesms.mms.MediaConstraints
+import org.thoughtcrime.securesms.util.FeatureFlags
+import org.thoughtcrime.securesms.video.VideoUtil
+
+/**
+ * Describes device capabilities
+ */
+@RequiresApi(21)
+@ExperimentalVideo
+sealed class CameraXModePolicy {
+
+ abstract val isVideoSupported: Boolean
+
+ abstract fun initialize(cameraController: CameraController)
+
+ open fun setToImage(cameraController: CameraController) = Unit
+
+ open fun setToVideo(cameraController: CameraController) = Unit
+
+ /**
+ * The device supports having Image and Video enabled at the same time
+ */
+ object Mixed : CameraXModePolicy() {
+
+ override val isVideoSupported: Boolean = true
+
+ override fun initialize(cameraController: CameraController) {
+ cameraController.setEnabledUseCases(CameraController.IMAGE_CAPTURE or CameraController.VIDEO_CAPTURE)
+ }
+ }
+
+ /**
+ * The device supports image and video, but only one mode at a time.
+ */
+ object Single : CameraXModePolicy() {
+
+ override val isVideoSupported: Boolean = true
+
+ override fun initialize(cameraController: CameraController) {
+ setToImage(cameraController)
+ }
+
+ override fun setToImage(cameraController: CameraController) {
+ cameraController.setEnabledUseCases(CameraController.IMAGE_CAPTURE)
+ }
+
+ override fun setToVideo(cameraController: CameraController) {
+ cameraController.setEnabledUseCases(CameraController.VIDEO_CAPTURE)
+ }
+ }
+
+ /**
+ * The device supports taking images only.
+ */
+ object ImageOnly : CameraXModePolicy() {
+
+ override val isVideoSupported: Boolean = false
+
+ override fun initialize(cameraController: CameraController) {
+ cameraController.setEnabledUseCases(CameraController.IMAGE_CAPTURE)
+ }
+ }
+
+ companion object {
+ @JvmStatic
+ fun acquire(context: Context, mediaConstraints: MediaConstraints, isVideoEnabled: Boolean): CameraXModePolicy {
+ val isVideoSupported = Build.VERSION.SDK_INT >= 26 &&
+ isVideoEnabled &&
+ MediaConstraints.isVideoTranscodeAvailable() &&
+ VideoUtil.getMaxVideoRecordDurationInSeconds(context, mediaConstraints) > 0
+
+ val isMixedModeSupported = isVideoSupported &&
+ Build.VERSION.SDK_INT >= 26 &&
+ CameraXUtil.isMixedModeSupported(context) &&
+ !FeatureFlags.cameraXMixedModelBlocklist().asListContains(Build.MODEL)
+
+ return when {
+ isMixedModeSupported -> Mixed
+ isVideoSupported -> Single
+ else -> ImageOnly
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt
index 40f201d544..564cf727a6 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt
@@ -26,6 +26,10 @@ class MediaCaptureViewModel(private val repository: MediaCaptureRepository) : Vi
}
}
+ override fun onCleared() {
+ store.dispose()
+ }
+
fun onImageCaptured(data: ByteArray, width: Int, height: Int) {
repository.renderImageToMedia(data, width, height, this::onMediaRendered, this::onMediaRenderFailed)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
index b55934e848..331c8ccfed 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
@@ -24,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import app.cash.exhaustive.Exhaustive
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+import org.signal.core.util.concurrent.SimpleTask
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.conversation.MessageSendType
@@ -41,6 +42,7 @@ import org.thoughtcrime.securesms.mediasend.v2.stories.StoriesMultiselectForward
import org.thoughtcrime.securesms.mms.SentMediaQuality
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.recipients.Recipient
+import org.thoughtcrime.securesms.scribbles.ImageEditorFragment
import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
@@ -158,17 +160,43 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) {
}
sendButton.setOnClickListener {
+ val viewOnce: Boolean = sharedViewModel.state.value?.viewOnceToggleState == MediaSelectionState.ViewOnceToggleState.ONCE
+
if (sharedViewModel.isContactSelectionRequired) {
val args = MultiselectForwardFragmentArgs(
false,
title = R.string.MediaReviewFragment__send_to,
storySendRequirements = sharedViewModel.getStorySendRequirements(),
- isSearchEnabled = !sharedViewModel.isStory()
+ isSearchEnabled = !sharedViewModel.isStory(),
+ isViewOnce = viewOnce
)
if (sharedViewModel.isStory()) {
- val previews = sharedViewModel.state.value?.selectedMedia?.take(2)?.map { it.uri } ?: emptyList()
- storiesLauncher.launch(StoriesMultiselectForwardActivity.Args(args, previews))
+ val snapshot = sharedViewModel.state.value
+
+ if (snapshot != null) {
+ sendButton.isEnabled = false
+ SimpleTask.run(viewLifecycleOwner.lifecycle, {
+ snapshot.selectedMedia.take(2).map { media ->
+ val editorData = snapshot.editorStateMap[media.uri]
+ if (MediaUtil.isImageType(media.mimeType) && editorData != null && editorData is ImageEditorFragment.Data) {
+ val model = editorData.readModel()
+ if (model != null) {
+ ImageEditorFragment.renderToSingleUseBlob(requireContext(), model)
+ } else {
+ media.uri
+ }
+ } else {
+ media.uri
+ }
+ }
+ }, {
+ sendButton.isEnabled = true
+ storiesLauncher.launch(StoriesMultiselectForwardActivity.Args(args, it))
+ })
+ } else {
+ storiesLauncher.launch(StoriesMultiselectForwardActivity.Args(args, emptyList()))
+ }
} else {
multiselectLauncher.launch(args)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt
index e91ebd9636..e2e7c72ea3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt
@@ -32,11 +32,9 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
const val RESULT_SET = "groups"
}
- private lateinit var confirmButton: View
- private lateinit var selectedList: RecyclerView
- private lateinit var backgroundHelper: View
private lateinit var divider: View
private lateinit var mediator: ContactSearchMediator
+ private lateinit var innerContainer: View
private var animatorSet: AnimatorSet? = null
@@ -50,14 +48,14 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
val container = view.parent.parent.parent as FrameLayout
val bottomBar = LayoutInflater.from(requireContext()).inflate(R.layout.stories_choose_group_bottom_bar, container, true)
- confirmButton = bottomBar.findViewById(R.id.share_confirm)
- selectedList = bottomBar.findViewById(R.id.selected_list)
- backgroundHelper = bottomBar.findViewById(R.id.background_helper)
+ innerContainer = bottomBar.findViewById(R.id.inner_container)
divider = bottomBar.findViewById(R.id.divider)
val adapter = ShareSelectionAdapter()
+ val selectedList: RecyclerView = bottomBar.findViewById(R.id.selected_list)
selectedList.adapter = adapter
+ val confirmButton: View = bottomBar.findViewById(R.id.share_confirm)
confirmButton.setOnClickListener {
onDone()
}
@@ -75,7 +73,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
addSection(
ContactSearchConfiguration.Section.Groups(
includeHeader = false,
- returnAsGroupStories = true,
+ shortSummary = true,
sortOrder = ContactSearchSortOrder.RECENCY
)
)
@@ -86,7 +84,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
mediator.getSelectionState().observe(viewLifecycleOwner) { state ->
adapter.submitList(
- state.filterIsInstance(ContactSearchKey.RecipientSearchKey.Story::class.java)
+ state.filterIsInstance(ContactSearchKey.RecipientSearchKey.KnownRecipient::class.java)
.map { it.recipientId }
.mapIndexed { index, recipientId ->
ShareSelectionMappingModel(
@@ -118,9 +116,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
animatorSet?.cancel()
animatorSet = AnimatorSet().apply {
playTogether(
- ObjectAnimator.ofFloat(confirmButton, View.ALPHA, 1f),
- ObjectAnimator.ofFloat(selectedList, View.TRANSLATION_Y, 0f),
- ObjectAnimator.ofFloat(backgroundHelper, View.TRANSLATION_Y, 0f),
+ ObjectAnimator.ofFloat(innerContainer, View.TRANSLATION_Y, 0f),
ObjectAnimator.ofFloat(divider, View.TRANSLATION_Y, 0f)
)
start()
@@ -128,14 +124,12 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
}
private fun animateOutBottomBar() {
- val translationY = DimensionUnit.DP.toPixels(48f)
+ val translationY = DimensionUnit.SP.toPixels(68f)
animatorSet?.cancel()
animatorSet = AnimatorSet().apply {
playTogether(
- ObjectAnimator.ofFloat(confirmButton, View.ALPHA, 0f),
- ObjectAnimator.ofFloat(selectedList, View.TRANSLATION_Y, translationY),
- ObjectAnimator.ofFloat(backgroundHelper, View.TRANSLATION_Y, translationY),
+ ObjectAnimator.ofFloat(innerContainer, View.TRANSLATION_Y, translationY),
ObjectAnimator.ofFloat(divider, View.TRANSLATION_Y, translationY)
)
start()
@@ -150,7 +144,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
RESULT_SET,
ArrayList(
mediator.getSelectedContacts()
- .filterIsInstance(ContactSearchKey.RecipientSearchKey.Story::class.java)
+ .filterIsInstance(ContactSearchKey.RecipientSearchKey.KnownRecipient::class.java)
.map { it.recipientId }
)
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseStoryTypeBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseStoryTypeBottomSheet.kt
index f3e0a7cf33..f5b5e49f34 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseStoryTypeBottomSheet.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseStoryTypeBottomSheet.kt
@@ -12,7 +12,7 @@ import org.thoughtcrime.securesms.components.settings.conversation.preferences.L
import org.thoughtcrime.securesms.util.fragments.requireListener
class ChooseStoryTypeBottomSheet : DSLSettingsBottomSheetFragment(
- layoutId = R.layout.dsl_settings_bottom_sheet_no_handle
+ layoutId = R.layout.dsl_settings_bottom_sheet
) {
override fun bindAdapter(adapter: DSLSettingsAdapter) {
LargeIconClickPreference.register(adapter)
@@ -24,7 +24,7 @@ class ChooseStoryTypeBottomSheet : DSLSettingsBottomSheetFragment(
textPref(
title = DSLSettingsText.from(
stringId = R.string.ChooseStoryTypeBottomSheet__choose_your_story_type,
- DSLSettingsText.CenterModifier, DSLSettingsText.Body1BoldModifier, DSLSettingsText.BoldModifier
+ DSLSettingsText.CenterModifier, DSLSettingsText.TitleMediumModifier
)
)
@@ -37,11 +37,11 @@ class ChooseStoryTypeBottomSheet : DSLSettingsBottomSheetFragment(
stringId = R.string.ChooseStoryTypeBottomSheet__visible_only_to
),
icon = DSLSettingsIcon.from(
- R.drawable.ic_plus_24,
- R.color.signal_icon_tint_primary,
- R.drawable.circle_tintable,
- R.color.signal_button_secondary_ripple,
- DimensionUnit.DP.toPixels(8f).toInt()
+ iconId = R.drawable.ic_plus_24,
+ iconTintId = R.color.signal_colorOnSurface,
+ backgroundId = R.drawable.circle_tintable,
+ backgroundTint = R.color.signal_colorSurface5,
+ insetPx = DimensionUnit.DP.toPixels(8f).toInt()
),
onClick = {
dismissAllowingStateLoss()
@@ -59,11 +59,11 @@ class ChooseStoryTypeBottomSheet : DSLSettingsBottomSheetFragment(
stringId = R.string.ChooseStoryTypeBottomSheet__share_to_an_existing_group
),
icon = DSLSettingsIcon.from(
- R.drawable.ic_group_outline_24,
- R.color.signal_icon_tint_primary,
- R.drawable.circle_tintable,
- R.color.signal_button_secondary_ripple,
- DimensionUnit.DP.toPixels(8f).toInt()
+ iconId = R.drawable.ic_group_outline_24,
+ iconTintId = R.color.signal_colorOnSurface,
+ backgroundId = R.drawable.circle_tintable,
+ backgroundTint = R.color.signal_colorSurface5,
+ insetPx = DimensionUnit.DP.toPixels(8f).toInt()
),
onClick = {
dismissAllowingStateLoss()
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java
index cb8b30beec..03d141fac2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java
@@ -12,7 +12,7 @@
import java.util.List;
import java.util.TreeSet;
-final class MessageDetails {
+public final class MessageDetails {
private static final Comparator HAS_DISPLAY_NAME = (r1, r2) -> Boolean.compare(r2.getRecipient().hasAUserSetDisplayName(ApplicationDependencies.getApplication()), r1.getRecipient().hasAUserSetDisplayName(ApplicationDependencies.getApplication()));
private static final Comparator ALPHABETICAL = (r1, r2) -> r1.getRecipient().getDisplayName(ApplicationDependencies.getApplication()).compareToIgnoreCase(r2.getRecipient().getDisplayName(ApplicationDependencies.getApplication()));
private static final Comparator RECIPIENT_COMPARATOR = ComparatorCompat.chain(HAS_DISPLAY_NAME).thenComparing(ALPHABETICAL);
@@ -71,33 +71,33 @@ final class MessageDetails {
}
}
- @NonNull ConversationMessage getConversationMessage() {
+ public @NonNull ConversationMessage getConversationMessage() {
return conversationMessage;
}
- @NonNull Collection getPending() {
+ public @NonNull Collection getPending() {
return pending;
}
- @NonNull Collection getSent() {
+ public @NonNull Collection getSent() {
return sent;
}
- @NonNull Collection getSkipped() {return skipped;}
+ public @NonNull Collection getSkipped() {return skipped;}
- @NonNull Collection getDelivered() {
+ public @NonNull Collection getDelivered() {
return delivered;
}
- @NonNull Collection getRead() {
+ public @NonNull Collection getRead() {
return read;
}
- @NonNull Collection getNotSent() {
+ public @NonNull Collection getNotSent() {
return notSent;
}
- @NonNull Collection getViewed() {
+ public @NonNull Collection getViewed() {
return viewed;
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java
index 8d92baf1c9..60efc0c5c4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java
@@ -10,9 +10,11 @@
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory;
+import org.thoughtcrime.securesms.database.DatabaseObserver;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
import org.thoughtcrime.securesms.database.MmsSmsDatabase;
+import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
@@ -24,7 +26,10 @@
import java.util.LinkedList;
import java.util.List;
-final class MessageDetailsRepository {
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+
+public final class MessageDetailsRepository {
private final Context context = ApplicationDependencies.getApplication();
@@ -44,11 +49,33 @@ final class MessageDetailsRepository {
return liveData;
}
+ public @NonNull Observable getMessageDetails(@NonNull MessageId messageId) {
+ return Observable.create(emitter -> {
+ DatabaseObserver.MessageObserver messageObserver = mId -> {
+ try {
+ MessageRecord messageRecord = messageId.isMms() ? SignalDatabase.mms().getMessageRecord(messageId.getId())
+ : SignalDatabase.sms().getMessageRecord(messageId.getId());
+
+ MessageDetails messageDetails = getRecipientDeliveryStatusesInternal(messageRecord);
+
+ emitter.onNext(messageDetails);
+ } catch (NoSuchMessageException e) {
+ emitter.onError(e);
+ }
+ };
+
+ ApplicationDependencies.getDatabaseObserver().registerMessageUpdateObserver(messageObserver);
+ emitter.setCancellable(() -> ApplicationDependencies.getDatabaseObserver().unregisterObserver(messageObserver));
+
+ messageObserver.onMessageChanged(messageId);
+ }).observeOn(Schedulers.io());
+ }
+
@WorkerThread
private @NonNull MessageDetails getRecipientDeliveryStatusesInternal(@NonNull MessageRecord messageRecord) {
List recipients = new LinkedList<>();
- if (!messageRecord.getRecipient().isGroup()) {
+ if (!messageRecord.getRecipient().isGroup() && !messageRecord.getRecipient().isDistributionList()) {
recipients.add(new RecipientDeliveryStatus(messageRecord,
messageRecord.getRecipient(),
getStatusFor(messageRecord),
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientDeliveryStatus.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientDeliveryStatus.java
index 1f2d9e247f..baee7b158a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientDeliveryStatus.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientDeliveryStatus.java
@@ -8,7 +8,7 @@
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.recipients.Recipient;
-final class RecipientDeliveryStatus {
+public final class RecipientDeliveryStatus {
enum Status {
UNKNOWN, PENDING, SENT, DELIVERED, READ, VIEWED, SKIPPED,
@@ -32,31 +32,31 @@ enum Status {
this.keyMismatchFailure = keyMismatchFailure;
}
- @NonNull MessageRecord getMessageRecord() {
+ public @NonNull MessageRecord getMessageRecord() {
return messageRecord;
}
- @NonNull Status getDeliveryStatus() {
+ public @NonNull Status getDeliveryStatus() {
return deliveryStatus;
}
- boolean isUnidentified() {
+ public boolean isUnidentified() {
return isUnidentified;
}
- long getTimestamp() {
+ public long getTimestamp() {
return timestamp;
}
- @NonNull Recipient getRecipient() {
+ public @NonNull Recipient getRecipient() {
return recipient;
}
- @Nullable NetworkFailure getNetworkFailure() {
+ public @Nullable NetworkFailure getNetworkFailure() {
return networkFailure;
}
- @Nullable IdentityKeyMismatch getKeyMismatchFailure() {
+ public @Nullable IdentityKeyMismatch getKeyMismatchFailure() {
return keyMismatchFailure;
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java
index 5b083501ca..60e0438df5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java
@@ -45,6 +45,7 @@
import org.whispersystems.signalservice.api.push.DistributionId;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.NotFoundException;
+import org.whispersystems.signalservice.api.util.Preconditions;
import org.whispersystems.signalservice.internal.push.exceptions.InvalidUnidentifiedAccessHeaderException;
import org.whispersystems.signalservice.internal.push.http.CancelationSignal;
import org.whispersystems.signalservice.internal.push.http.PartialSendCompleteListener;
@@ -82,19 +83,41 @@ private GroupSendUtil() {}
*
* @param groupId The groupId of the group you're sending to, or null if you're sending to a collection of recipients not joined by a group.
* @param isRecipientUpdate True if you've already sent this message to some recipients in the past, otherwise false.
+ * @param isForStory True if the message is related to a story, and should be sent with the story flag on the envelope
*/
@WorkerThread
public static List sendResendableDataMessage(@NonNull Context context,
@Nullable GroupId.V2 groupId,
+ @Nullable DistributionListId distributionListId,
@NonNull List allTargets,
boolean isRecipientUpdate,
ContentHint contentHint,
@NonNull MessageId messageId,
@NonNull SignalServiceDataMessage message,
- boolean urgent)
+ boolean urgent,
+ boolean isForStory)
throws IOException, UntrustedIdentityException
{
- return sendMessage(context, groupId, getDistributionId(groupId), messageId, allTargets, isRecipientUpdate, DataSendOperation.resendable(message, contentHint, messageId, urgent), null);
+ Preconditions.checkArgument(groupId == null || distributionListId == null, "Cannot supply both a groupId and a distributionListId!");
+
+ DistributionId distributionId = groupId != null ? getDistributionId(groupId) : getDistributionId(distributionListId);
+
+ return sendMessage(context, groupId, distributionId, messageId, allTargets, isRecipientUpdate, isForStory, DataSendOperation.resendable(message, contentHint, messageId, urgent, isForStory), null);
+ }
+
+ @WorkerThread
+ public static List sendResendableStoryRelatedMessage(@NonNull Context context,
+ @Nullable GroupId.V2 groupId,
+ @NonNull DistributionListId distributionListId,
+ @NonNull List allTargets,
+ boolean isRecipientUpdate,
+ ContentHint contentHint,
+ @NonNull MessageId messageId,
+ @NonNull SignalServiceDataMessage message,
+ boolean urgent)
+ throws IOException, UntrustedIdentityException
+ {
+ return sendMessage(context, groupId, getDistributionId(distributionListId), messageId, allTargets, isRecipientUpdate, true, DataSendOperation.resendable(message, contentHint, messageId, urgent, true), null);
}
/**
@@ -116,7 +139,7 @@ public static List sendUnresendableDataMessage(@NonNull Conte
boolean urgent)
throws IOException, UntrustedIdentityException
{
- return sendMessage(context, groupId, getDistributionId(groupId), null, allTargets, isRecipientUpdate, DataSendOperation.unresendable(message, contentHint, urgent), null);
+ return sendMessage(context, groupId, getDistributionId(groupId), null, allTargets, isRecipientUpdate, false, DataSendOperation.unresendable(message, contentHint, urgent), null);
}
/**
@@ -133,7 +156,7 @@ public static List sendTypingMessage(@NonNull Context context
@Nullable CancelationSignal cancelationSignal)
throws IOException, UntrustedIdentityException
{
- return sendMessage(context, groupId, getDistributionId(groupId), null, allTargets, false, new TypingSendOperation(message), cancelationSignal);
+ return sendMessage(context, groupId, getDistributionId(groupId), null, allTargets, false, false, new TypingSendOperation(message), cancelationSignal);
}
/**
@@ -149,11 +172,11 @@ public static List sendCallMessage(@NonNull Context context,
@NonNull SignalServiceCallMessage message)
throws IOException, UntrustedIdentityException
{
- return sendMessage(context, groupId, getDistributionId(groupId), null, allTargets, false, new CallSendOperation(message), null);
+ return sendMessage(context, groupId, getDistributionId(groupId), null, allTargets, false, false, new CallSendOperation(message), null);
}
/**
- * Handles all of the logic of sending a story to a group. Will do sender key sends and legacy 1:1 sends as-needed, and give you back a list of
+ * Handles all of the logic of sending a story to a distribution list. Will do sender key sends and legacy 1:1 sends as-needed, and give you back a list of
* {@link SendMessageResult}s just like we're used to.
*
* @param isRecipientUpdate True if you've already sent this message to some recipients in the past, otherwise false.
@@ -175,6 +198,7 @@ public static List sendStoryMessage(@NonNull Context context,
messageId,
allTargets,
isRecipientUpdate,
+ true,
new StorySendOperation(messageId, null, sentTimestamp, message, manifest),
null);
}
@@ -201,6 +225,7 @@ public static List sendGroupStoryMessage(@NonNull Context con
messageId,
allTargets,
isRecipientUpdate,
+ true,
new StorySendOperation(messageId, groupId, sentTimestamp, message, Collections.emptySet()),
null);
}
@@ -219,6 +244,7 @@ private static List sendMessage(@NonNull Context context,
@Nullable MessageId relatedMessageId,
@NonNull List allTargets,
boolean isRecipientUpdate,
+ boolean isStorySend,
@NonNull SendOperation sendOperation,
@Nullable CancelationSignal cancelationSignal)
throws IOException, UntrustedIdentityException
@@ -228,7 +254,7 @@ private static List sendMessage(@NonNull Context context,
Set unregisteredTargets = allTargets.stream().filter(Recipient::isUnregistered).collect(Collectors.toSet());
List registeredTargets = allTargets.stream().filter(r -> !unregisteredTargets.contains(r)).collect(Collectors.toList());
- RecipientData recipients = new RecipientData(context, registeredTargets);
+ RecipientData recipients = new RecipientData(context, registeredTargets, isStorySend);
Optional groupRecord = groupId != null ? SignalDatabase.groups().getGroup(groupId) : Optional.empty();
List senderKeyTargets = new LinkedList<>();
@@ -242,8 +268,7 @@ private static List sendMessage(@NonNull Context context,
validMembership = false;
}
- if (recipient.getSenderKeyCapability() == Recipient.Capability.SUPPORTED &&
- recipient.hasServiceId() &&
+ if (recipient.hasServiceId() &&
access.isPresent() &&
access.get().getTargetUnidentifiedAccess().isPresent() &&
validMembership)
@@ -258,10 +283,11 @@ private static List sendMessage(@NonNull Context context,
Log.i(TAG, "No DistributionId. Using legacy.");
legacyTargets.addAll(senderKeyTargets);
senderKeyTargets.clear();
- } else if (Recipient.self().getSenderKeyCapability() != Recipient.Capability.SUPPORTED) {
- Log.i(TAG, "All of our devices do not support sender key. Using legacy.");
- legacyTargets.addAll(senderKeyTargets);
+ } else if (isStorySend) {
+ Log.i(TAG, "Sending a story. Using sender key for all " + allTargets.size() + " recipients.");
senderKeyTargets.clear();
+ senderKeyTargets.addAll(registeredTargets);
+ legacyTargets.clear();
} else if (SignalStore.internalValues().removeSenderKeyMinimum()) {
Log.i(TAG, "Sender key minimum removed. Using for " + senderKeyTargets.size() + " recipients.");
} else if (senderKeyTargets.size() < 2) {
@@ -438,21 +464,23 @@ private static class DataSendOperation implements SendOperation {
private final MessageId relatedMessageId;
private final boolean resendable;
private final boolean urgent;
+ private final boolean isForStory;
- public static DataSendOperation resendable(@NonNull SignalServiceDataMessage message, @NonNull ContentHint contentHint, @NonNull MessageId relatedMessageId, boolean urgent) {
- return new DataSendOperation(message, contentHint, true, relatedMessageId, urgent);
+ public static DataSendOperation resendable(@NonNull SignalServiceDataMessage message, @NonNull ContentHint contentHint, @NonNull MessageId relatedMessageId, boolean urgent, boolean isForStory) {
+ return new DataSendOperation(message, contentHint, true, relatedMessageId, urgent, isForStory);
}
public static DataSendOperation unresendable(@NonNull SignalServiceDataMessage message, @NonNull ContentHint contentHint, boolean urgent) {
- return new DataSendOperation(message, contentHint, false, null, urgent);
+ return new DataSendOperation(message, contentHint, false, null, urgent, false);
}
- private DataSendOperation(@NonNull SignalServiceDataMessage message, @NonNull ContentHint contentHint, boolean resendable, @Nullable MessageId relatedMessageId, boolean urgent) {
+ private DataSendOperation(@NonNull SignalServiceDataMessage message, @NonNull ContentHint contentHint, boolean resendable, @Nullable MessageId relatedMessageId, boolean urgent, boolean isForStory) {
this.message = message;
this.contentHint = contentHint;
this.resendable = resendable;
this.relatedMessageId = relatedMessageId;
this.urgent = urgent;
+ this.isForStory = isForStory;
if (resendable && relatedMessageId == null) {
throw new IllegalArgumentException("If a message is resendable, it must have a related message ID!");
@@ -468,7 +496,7 @@ private DataSendOperation(@NonNull SignalServiceDataMessage message, @NonNull Co
throws NoSessionException, UntrustedIdentityException, InvalidKeyException, IOException, InvalidRegistrationIdException
{
SenderKeyGroupEvents listener = relatedMessageId != null ? new SenderKeyMetricEventListener(relatedMessageId.getId()) : SenderKeyGroupEvents.EMPTY;
- return messageSender.sendGroupDataMessage(distributionId, targets, access, isRecipientUpdate, contentHint, message, listener, urgent);
+ return messageSender.sendGroupDataMessage(distributionId, targets, access, isRecipientUpdate, contentHint, message, listener, urgent, isForStory);
}
@Override
@@ -481,6 +509,7 @@ private DataSendOperation(@NonNull SignalServiceDataMessage message, @NonNull Co
@Nullable CancelationSignal cancelationSignal)
throws IOException, UntrustedIdentityException
{
+ // PniSignatures are only needed for 1:1 messages, but some message jobs use the GroupSendUtil methods to send 1:1
if (targets.size() == 1 && relatedMessageId == null) {
Recipient targetRecipient = targetRecipients.get(0);
SendMessageResult result = messageSender.sendDataMessage(targets.get(0), access.get(0), contentHint, message, SignalServiceMessageSender.IndividualSendEvents.EMPTY, urgent, targetRecipient.needsPniSignature());
@@ -686,7 +715,14 @@ public StorySendOperation(@NonNull MessageId relatedMessageId,
@Nullable CancelationSignal cancelationSignal)
throws IOException, UntrustedIdentityException
{
- return messageSender.sendStory(targets, access, isRecipientUpdate, message, getSentTimestamp(), manifest);
+ // We only allow legacy sends if you're sending to an empty group and just need to send a sync message.
+ if (targets.isEmpty()) {
+ Log.w(TAG, "Only sending a sync message.");
+ messageSender.sendStorySyncMessage(message, getSentTimestamp(), isRecipientUpdate, manifest);
+ return Collections.emptyList();
+ } else {
+ throw new UnsupportedOperationException("Stories can only be send via sender key!");
+ }
}
@Override
@@ -772,8 +808,8 @@ private static final class RecipientData {
private final Map addressById;
private final RecipientAccessList accessList;
- RecipientData(@NonNull Context context, @NonNull List recipients) throws IOException {
- this.accessById = UnidentifiedAccessUtil.getAccessMapFor(context, recipients);
+ RecipientData(@NonNull Context context, @NonNull List recipients, boolean isForStory) throws IOException {
+ this.accessById = UnidentifiedAccessUtil.getAccessMapFor(context, recipients, isForStory);
this.addressById = mapAddresses(context, recipients);
this.accessList = new RecipientAccessList(recipients);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java
index 1843fdd71e..9d4fc55b94 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java
@@ -27,6 +27,7 @@
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.service.KeyCachingService;
+import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.util.AppForegroundObserver;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.SignalWebSocket;
@@ -77,6 +78,8 @@ public IncomingMessageObserver(@NonNull Application context) {
new MessageRetrievalThread().start();
+ // MOLLY: Foreground service startup is handled to the connection loop
+
ApplicationDependencies.getAppForegroundObserver().addListener(new AppForegroundObserver.Listener() {
@Override
public void onForeground() {
@@ -158,13 +161,14 @@ private synchronized boolean isConnectionNecessary() {
return false;
}
- boolean registered = SignalStore.account().isRegistered();
- boolean fcmEnabled = SignalStore.account().isFcmEnabled();
- boolean hasNetwork = NetworkConstraint.isMet(context);
- boolean hasProxy = ApplicationDependencies.getNetworkManager().isProxyEnabled();
- long oldRequest = System.currentTimeMillis() - OLD_REQUEST_WINDOW_MS;
+ boolean registered = SignalStore.account().isRegistered();
+ boolean fcmEnabled = SignalStore.account().isFcmEnabled();
+ boolean hasNetwork = NetworkConstraint.isMet(context);
+ boolean hasProxy = ApplicationDependencies.getNetworkManager().isProxyEnabled();
+ boolean forceWebsocket = SignalStore.internalValues().isWebsocketModeForced();
+ long oldRequest = System.currentTimeMillis() - OLD_REQUEST_WINDOW_MS;
- if (!fcmEnabled && registered && !isForegroundService) {
+ if ((!fcmEnabled || forceWebsocket) && registered && !isForegroundService) {
ContextCompat.startForegroundService(context, new Intent(context, ForegroundService.class));
isForegroundService = true;
}
@@ -174,11 +178,11 @@ private synchronized boolean isConnectionNecessary() {
Log.d(TAG, "Removed old keep web socket open requests.");
}
- Log.d(TAG, String.format("Network: %s, Foreground: %s, FCM: %s, Stay open requests: [%s], Censored: %s, Registered: %s, Proxy: %s",
- hasNetwork, appVisible, fcmEnabled, Util.join(keepAliveTokens.entrySet(), ","), networkAccess.isCensored(), registered, hasProxy));
+ Log.d(TAG, String.format("Network: %s, Foreground: %s, FCM: %s, Stay open requests: [%s], Censored: %s, Registered: %s, Proxy: %s, Force websocket: %s",
+ hasNetwork, appVisible, fcmEnabled, Util.join(keepAliveTokens.entrySet(), ","), networkAccess.isCensored(), registered, hasProxy, forceWebsocket));
return registered &&
- (appVisible || !fcmEnabled || Util.hasItems(keepAliveTokens)) &&
+ (appVisible || !fcmEnabled || forceWebsocket || Util.hasItems(keepAliveTokens)) &&
hasNetwork &&
!networkAccess.isCensored();
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java
index ec0bfdf1cd..4c77d3ecbc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java
@@ -1641,6 +1641,10 @@ private void handleStoryMessage(@NonNull SignalServiceContent content, @NonNull
Recipient threadRecipient = Objects.requireNonNull(SignalDatabase.threads().getRecipientForThreadId(story.getThreadId()));
boolean groupStory = threadRecipient.isActiveGroup();
+ if (!groupStory) {
+ threadRecipient = senderRecipient;
+ }
+
handlePossibleExpirationUpdate(content, message, threadRecipient.getGroupId(), senderRecipient, threadRecipient, receivedTime);
if (message.getGroupContext().isPresent() ) {
@@ -1883,7 +1887,7 @@ private long handleSynchronizeSentStoryReply(@NonNull SentTranscriptMessage mess
}
quoteModel = new QuoteModel(storyContext.getSentTimestamp(), storyAuthorRecipient, quoteBody, false, story.getSlideDeck().asAttachments(), Collections.emptyList(), QuoteModel.Type.NORMAL);
- expiresInMillis = TimeUnit.SECONDS.toMillis(message.getExpirationStartTimestamp());
+ expiresInMillis = TimeUnit.SECONDS.toMillis(message.getDataMessage().get().getExpiresInSeconds());
} else {
warn(envelopeTimestamp, "Story has replies disabled. Dropping reply.");
return -1L;
@@ -2955,8 +2959,13 @@ private Recipient getSyncMessageDestination(@NonNull SentTranscriptMessage messa
}
private Recipient getMessageDestination(@NonNull SignalServiceContent content) throws BadGroupIdException {
- SignalServiceDataMessage message = content.getDataMessage().orElse(null);
- return getGroupRecipient(message != null ? message.getGroupContext() : Optional.empty()).orElseGet(() -> Recipient.externalPush(content.getSender()));
+ if (content.getStoryMessage().isPresent()) {
+ SignalServiceStoryMessage message = content.getStoryMessage().get();
+ return getGroupRecipient(message.getGroupContext()).orElseGet(() -> Recipient.externalPush(content.getSender()));
+ } else {
+ SignalServiceDataMessage message = content.getDataMessage().orElse(null);
+ return getGroupRecipient(message != null ? message.getGroupContext() : Optional.empty()).orElseGet(() -> Recipient.externalPush(content.getSender()));
+ }
}
private Optional getGroupRecipient(Optional message) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java
index e97fa69dbf..819a9c9239 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java
@@ -127,7 +127,7 @@ private MessageDecryptionUtil() {}
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e, true);
Recipient sender = Recipient.external(context, e.getSender());
- if (sender.supportsMessageRetries() && Recipient.self().supportsMessageRetries() && FeatureFlags.retryReceipts()) {
+ if (FeatureFlags.retryReceipts()) {
jobs.add(handleRetry(context, sender, envelope, e));
postInternalErrorNotification(context);
} else {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/RestStrategy.java b/app/src/main/java/org/thoughtcrime/securesms/messages/RestStrategy.java
index 99333ee060..ac5607c607 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/RestStrategy.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/RestStrategy.java
@@ -10,6 +10,8 @@
import org.thoughtcrime.securesms.jobs.MarkerJob;
import org.thoughtcrime.securesms.jobs.PushDecryptMessageJob;
import org.thoughtcrime.securesms.jobs.PushProcessMessageJob;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
+import org.thoughtcrime.securesms.stories.Stories;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import java.io.IOException;
@@ -82,7 +84,7 @@ private static int enqueuePushDecryptJobs(IncomingMessageProcessor.Processor pro
receiver.setSoTimeoutMillis(timeout);
- receiver.retrieveMessages(envelope -> {
+ receiver.retrieveMessages(Stories.isFeatureEnabled(), envelope -> {
Log.i(TAG, "Retrieved an envelope." + timeSuffix(startTime));
String jobId = processor.processEnvelope(envelope);
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 bd9043c320..3e22c58e84 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java
@@ -97,9 +97,10 @@ static final class Version {
static final int REFRESH_PNI_REGISTRATION_ID = 64;
static final int KBS_MIGRATION_2 = 65;
static final int PNI_2 = 66;
+ static final int SYSTEM_NAME_SYNC = 67;
}
- public static final int CURRENT_VERSION = 66;
+ public static final int CURRENT_VERSION = 67;
/**
* This *must* be called after the {@link JobManager} has been instantiated, but *before* the call
@@ -421,6 +422,10 @@ private static LinkedHashMap getMigrationJobs(@NonNull Co
jobs.put(Version.PNI_2, new PniMigrationJob());
}
+ if (lastSeenVersion < Version.SYSTEM_NAME_SYNC) {
+ jobs.put(Version.SYSTEM_NAME_SYNC, new StorageServiceSystemNameMigrationJob());
+ }
+
return jobs;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob.java
new file mode 100644
index 0000000000..4ccf03c0aa
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob.java
@@ -0,0 +1,56 @@
+package org.thoughtcrime.securesms.migrations;
+
+import androidx.annotation.NonNull;
+
+import org.thoughtcrime.securesms.database.SignalDatabase;
+import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
+import org.thoughtcrime.securesms.jobmanager.Data;
+import org.thoughtcrime.securesms.jobmanager.Job;
+import org.thoughtcrime.securesms.jobs.DownloadLatestEmojiDataJob;
+import org.thoughtcrime.securesms.jobs.EmojiSearchIndexDownloadJob;
+import org.thoughtcrime.securesms.storage.StorageSyncHelper;
+
+/**
+ * Added for when we started syncing contact names in storage service.
+ * Rotates the storageId of every system contact and then schedules a storage sync.
+ */
+public final class StorageServiceSystemNameMigrationJob extends MigrationJob {
+
+ public static final String KEY = "StorageServiceSystemNameMigrationJob";
+
+ StorageServiceSystemNameMigrationJob() {
+ this(new Parameters.Builder().build());
+ }
+
+ private StorageServiceSystemNameMigrationJob(@NonNull Parameters parameters) {
+ super(parameters);
+ }
+
+ @Override
+ public boolean isUiBlocking() {
+ return false;
+ }
+
+ @Override
+ public @NonNull String getFactoryKey() {
+ return KEY;
+ }
+
+ @Override
+ public void performMigration() {
+ SignalDatabase.recipients().markAllSystemContactsNeedsSync();
+ StorageSyncHelper.scheduleSyncForDataChange();
+ }
+
+ @Override
+ boolean shouldRetry(@NonNull Exception e) {
+ return false;
+ }
+
+ public static class Factory implements Job.Factory {
+ @Override
+ public @NonNull StorageServiceSystemNameMigrationJob create(@NonNull Parameters parameters, @NonNull Data data) {
+ return new StorageServiceSystemNameMigrationJob(parameters);
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java
index 61caa9e94f..2e7adbea06 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java
@@ -52,8 +52,10 @@
import org.thoughtcrime.securesms.components.location.SignalPlace;
import org.thoughtcrime.securesms.conversation.MessageSendType;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
+import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.giph.ui.GiphyActivity;
import org.thoughtcrime.securesms.maps.PlacePickerActivity;
+import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory;
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity;
import org.thoughtcrime.securesms.payments.create.CreatePaymentFragmentArgs;
import org.thoughtcrime.securesms.payments.preferences.PaymentsActivity;
@@ -469,13 +471,19 @@ private boolean areConstraintsSatisfied(final @NonNull Context context,
private void previewImageDraft(final @NonNull Slide slide) {
if (MediaPreviewActivity.isContentTypeSupported(slide.getContentType()) && slide.getUri() != null) {
- Intent intent = new Intent(context, MediaPreviewActivity.class);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- intent.putExtra(MediaPreviewActivity.SIZE_EXTRA, slide.asAttachment().getSize());
- intent.putExtra(MediaPreviewActivity.CAPTION_EXTRA, slide.getCaption().orElse(null));
- intent.setDataAndType(slide.getUri(), slide.getContentType());
-
- context.startActivity(intent);
+ MediaIntentFactory.MediaPreviewArgs args = new MediaIntentFactory.MediaPreviewArgs(
+ MediaIntentFactory.NOT_IN_A_THREAD,
+ MediaIntentFactory.UNKNOWN_TIMESTAMP,
+ slide.getUri(),
+ slide.getContentType(),
+ slide.asAttachment().getSize(),
+ slide.getCaption().orElse(null),
+ false,
+ false,
+ false,
+ MediaDatabase.Sorting.Newest.ordinal(),
+ slide.isVideoGif());
+ context.startActivity(MediaIntentFactory.create(context, args));
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/NetworkManager.java b/app/src/main/java/org/thoughtcrime/securesms/net/NetworkManager.java
index dafc3f090f..b27b6c5423 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/net/NetworkManager.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/net/NetworkManager.java
@@ -164,7 +164,7 @@ public void onEnabled(Intent statusIntent) {
if (proxyOrbotPort != socksPort) {
if (proxyType == ProxyType.ORBOT) {
if (configureProxy(new SocksProxy(OrbotHelper.DEFAULT_PROXY_HOST, socksPort))) {
- ApplicationDependencies.restartNetworkConnectionsAfterProxyChange();
+ ApplicationDependencies.restartAllNetworkConnections();
}
}
proxyOrbotPort = socksPort;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/backup/PaymentsRecoveryStartFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/backup/PaymentsRecoveryStartFragment.java
index 52783129b4..974766248f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/payments/backup/PaymentsRecoveryStartFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/backup/PaymentsRecoveryStartFragment.java
@@ -65,7 +65,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
message.setText(getDescription(state));
message.setLink(getString(R.string.PaymentsRecoveryStartFragment__learn_more__view));
startButton.setOnClickListener(v -> {
- if (state == RecoveryPhraseStates.FROM_PAYMENTS_MENU_WITH_MNEMONIC_CONFIRMED && ServiceUtil.getKeyguardManager(requireContext()).isKeyguardSecure() && SignalStore.paymentsValues().getPaymentLock()) {
+ if (state == RecoveryPhraseStates.FROM_PAYMENTS_MENU_WITH_MNEMONIC_CONFIRMED && ServiceUtil.getKeyguardManager(requireContext()).isKeyguardSecure() && SignalStore.paymentsValues().isPaymentLockEnabled()) {
BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo
.Builder()
.setAllowedAuthenticators(BiometricDeviceAuthentication.ALLOWED_AUTHENTICATORS)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java
index bac3bcf42b..2b9acdc058 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java
@@ -211,7 +211,7 @@ private static CharSequence mono(Context context, CharSequence address) {
private boolean isPaymentLockEnabled(Context context) {
- return SignalStore.paymentsValues().getPaymentLock() && ServiceUtil.getKeyguardManager(context).isKeyguardSecure();
+ return SignalStore.paymentsValues().isPaymentLockEnabled() && ServiceUtil.getKeyguardManager(context).isKeyguardSecure();
}
private class Callbacks implements ConfirmPaymentAdapter.Callbacks {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java
index c7788ce644..22e162d937 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java
@@ -222,6 +222,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
});
break;
case ACTIVATED:
+ if (!SignalStore.paymentsValues().isPaymentLockEnabled()) {
+ SafeNavigation.safeNavigate(NavHostFragment.findNavController(this), R.id.action_paymentsHome_to_securitySetup);
+ }
return;
default:
throw new IllegalStateException("Unsupported event type: " + paymentStateEvent.name());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java
index 7cbde5424f..66bc21d477 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeViewModel.java
@@ -203,6 +203,7 @@ public void activatePayments() {
@Override
public void onComplete(@Nullable Void result) {
store.update(state -> state.updatePaymentsEnabled(PaymentsHomeState.PaymentsState.ACTIVATED));
+ paymentStateEvents.postValue(PaymentStateEvent.ACTIVATED);
}
@Override
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt
new file mode 100644
index 0000000000..54f0696449
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt
@@ -0,0 +1,46 @@
+package org.thoughtcrime.securesms.payments.securitysetup
+
+import android.os.Bundle
+import android.view.View
+import androidx.activity.OnBackPressedCallback
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.databinding.PaymentsSecuritySetupFragmentBinding
+import org.thoughtcrime.securesms.payments.preferences.PaymentsHomeFragmentDirections
+import org.thoughtcrime.securesms.util.navigation.safeNavigate
+
+/**
+ * Fragment to let user know to enable payment lock to protect their funds
+ */
+class PaymentsSecuritySetupFragment : Fragment(R.layout.payments_security_setup_fragment) {
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ val binding = PaymentsSecuritySetupFragmentBinding.bind(view)
+
+ requireActivity().onBackPressedDispatcher.addCallback(
+ viewLifecycleOwner,
+ object : OnBackPressedCallback(true) {
+ override fun handleOnBackPressed() {
+ showSkipDialog()
+ }
+ }
+ )
+ binding.paymentsSecuritySetupEnableLock.setOnClickListener {
+ findNavController().safeNavigate(PaymentsHomeFragmentDirections.actionPaymentsHomeToPrivacySettings(true))
+ }
+ binding.paymentsSecuritySetupFragmentNotNow.setOnClickListener { showSkipDialog() }
+ binding.toolbar.setNavigationOnClickListener { showSkipDialog() }
+ }
+
+ private fun showSkipDialog() {
+ MaterialAlertDialogBuilder(requireContext())
+ .setTitle(getString(R.string.PaymentsSecuritySetupFragment__skip_this_step))
+ .setMessage(getString(R.string.PaymentsSecuritySetupFragment__skipping_this_step))
+ .setPositiveButton(R.string.PaymentsSecuritySetupFragment__skip) { _, _ -> findNavController().popBackStack() }
+ .setNegativeButton(R.string.PaymentsSecuritySetupFragment__cancel) { _, _ -> }
+ .setCancelable(false)
+ .show()
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java
index 1381b9162a..0df80feb0d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java
@@ -146,7 +146,7 @@ private void applyProxyChanges(boolean alwaysRestart) {
final boolean changed = networkManager.applyProxyConfig();
if (changed || alwaysRestart) {
networkManager.setNetworkEnabled(true);
- ApplicationDependencies.restartNetworkConnectionsAfterProxyChange();
+ ApplicationDependencies.restartAllNetworkConnections();
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanSeeMyPhoneNumberViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanSeeMyPhoneNumberViewModel.kt
index a38c53ba02..0c8735cd49 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanSeeMyPhoneNumberViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanSeeMyPhoneNumberViewModel.kt
@@ -29,5 +29,6 @@ class WhoCanSeeMyPhoneNumberViewModel : ViewModel() {
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java
index ef3b6afec4..68a50a55b7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java
@@ -65,6 +65,7 @@ private UsernameEditViewModel(boolean isInRegistration) {
protected void onCleared() {
super.onCleared();
disposables.clear();
+ uiState.dispose();
}
void onNicknameUpdated(@NonNull String nickname) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java
index 17988ae954..e097dec820 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java
@@ -36,6 +36,7 @@
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.DistributionListId;
import org.thoughtcrime.securesms.database.model.ProfileAvatarFileDetails;
+import org.thoughtcrime.securesms.database.model.RecipientRecord;
import org.thoughtcrime.securesms.database.model.databaseprotos.RecipientExtras;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
@@ -119,13 +120,7 @@ public class Recipient {
private final String notificationChannel;
private final UnidentifiedAccessMode unidentifiedAccessMode;
private final boolean forceSmsSelection;
- private final Capability groupsV1MigrationCapability;
- private final Capability senderKeyCapability;
- private final Capability announcementGroupCapability;
- private final Capability changeNumberCapability;
- private final Capability storiesCapability;
- private final Capability giftBadgesCapability;
- private final Capability pnpCapability;
+ private final RecipientRecord.Capabilities capabilities;
private final InsightsBannerTier insightsBannerTier;
private final byte[] storageId;
private final MentionSetting mentionSetting;
@@ -422,13 +417,7 @@ public static boolean isSelfSet() {
this.notificationChannel = null;
this.unidentifiedAccessMode = UnidentifiedAccessMode.DISABLED;
this.forceSmsSelection = false;
- this.groupsV1MigrationCapability = Capability.UNKNOWN;
- this.senderKeyCapability = Capability.UNKNOWN;
- this.announcementGroupCapability = Capability.UNKNOWN;
- this.changeNumberCapability = Capability.UNKNOWN;
- this.storiesCapability = Capability.UNKNOWN;
- this.giftBadgesCapability = Capability.UNKNOWN;
- this.pnpCapability = Capability.UNKNOWN;
+ this.capabilities = RecipientRecord.Capabilities.UNKNOWN;
this.storageId = null;
this.mentionSetting = MentionSetting.ALWAYS_NOTIFY;
this.wallpaper = null;
@@ -482,13 +471,7 @@ public Recipient(@NonNull RecipientId id, @NonNull RecipientDetails details, boo
this.notificationChannel = details.notificationChannel;
this.unidentifiedAccessMode = details.unidentifiedAccessMode;
this.forceSmsSelection = details.forceSmsSelection;
- this.groupsV1MigrationCapability = details.groupsV1MigrationCapability;
- this.senderKeyCapability = details.senderKeyCapability;
- this.announcementGroupCapability = details.announcementGroupCapability;
- this.changeNumberCapability = details.changeNumberCapability;
- this.storiesCapability = details.storiesCapability;
- this.giftBadgesCapability = details.giftBadgesCapability;
- this.pnpCapability = details.pnpCapability;
+ this.capabilities = details.capabilities;
this.storageId = details.storageId;
this.mentionSetting = details.mentionSetting;
this.wallpaper = details.wallpaper;
@@ -1027,39 +1010,20 @@ public boolean isForceSmsSelection() {
return forceSmsSelection;
}
- public @NonNull Capability getGroupsV1MigrationCapability() {
- return groupsV1MigrationCapability;
- }
-
- public @NonNull Capability getSenderKeyCapability() {
- return senderKeyCapability;
- }
-
- public @NonNull Capability getAnnouncementGroupCapability() {
- return announcementGroupCapability;
- }
-
public @NonNull Capability getChangeNumberCapability() {
- return changeNumberCapability;
+ return capabilities.getChangeNumberCapability();
}
public @NonNull Capability getStoriesCapability() {
- return storiesCapability;
+ return capabilities.getStoriesCapability();
}
public @NonNull Capability getGiftBadgesCapability() {
- return giftBadgesCapability;
+ return capabilities.getGiftBadgesCapability();
}
public @NonNull Capability getPnpCapability() {
- return pnpCapability;
- }
-
- /**
- * True if this recipient supports the message retry system, or false if we should use the legacy session reset system.
- */
- public boolean supportsMessageRetries() {
- return getSenderKeyCapability() == Capability.SUPPORTED;
+ return capabilities.getPnpCapability();
}
public @Nullable byte[] getProfileKey() {
@@ -1341,7 +1305,6 @@ public boolean hasSameContent(@NonNull Recipient other) {
Objects.equals(profileAvatar, other.profileAvatar) &&
Objects.equals(notificationChannel, other.notificationChannel) &&
unidentifiedAccessMode == other.unidentifiedAccessMode &&
- groupsV1MigrationCapability == other.groupsV1MigrationCapability &&
insightsBannerTier == other.insightsBannerTier &&
Arrays.equals(storageId, other.storageId) &&
mentionSetting == other.mentionSetting &&
diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java
index 98be1ce31a..4d854eb464 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java
@@ -69,13 +69,7 @@ public class RecipientDetails {
final String notificationChannel;
final UnidentifiedAccessMode unidentifiedAccessMode;
final boolean forceSmsSelection;
- final Recipient.Capability groupsV1MigrationCapability;
- final Recipient.Capability senderKeyCapability;
- final Recipient.Capability announcementGroupCapability;
- final Recipient.Capability changeNumberCapability;
- final Recipient.Capability storiesCapability;
- final Recipient.Capability giftBadgesCapability;
- final Recipient.Capability pnpCapability;
+ final RecipientRecord.Capabilities capabilities;
final InsightsBannerTier insightsBannerTier;
final byte[] storageId;
final MentionSetting mentionSetting;
@@ -134,13 +128,7 @@ public RecipientDetails(@Nullable String groupName,
this.notificationChannel = record.getNotificationChannel();
this.unidentifiedAccessMode = record.getUnidentifiedAccessMode();
this.forceSmsSelection = record.isForceSmsSelection();
- this.groupsV1MigrationCapability = record.getGroupsV1MigrationCapability();
- this.senderKeyCapability = record.getSenderKeyCapability();
- this.announcementGroupCapability = record.getAnnouncementGroupCapability();
- this.changeNumberCapability = record.getChangeNumberCapability();
- this.storiesCapability = record.getStoriesCapability();
- this.giftBadgesCapability = record.getGiftBadgesCapability();
- this.pnpCapability = record.getPnpCapability();
+ this.capabilities = record.getCapabilities();
this.insightsBannerTier = record.getInsightsBannerTier();
this.storageId = record.getStorageId();
this.mentionSetting = record.getMentionSetting();
@@ -195,13 +183,7 @@ private RecipientDetails() {
this.unidentifiedAccessMode = UnidentifiedAccessMode.UNKNOWN;
this.forceSmsSelection = false;
this.groupName = null;
- this.groupsV1MigrationCapability = Recipient.Capability.UNKNOWN;
- this.senderKeyCapability = Recipient.Capability.UNKNOWN;
- this.announcementGroupCapability = Recipient.Capability.UNKNOWN;
- this.changeNumberCapability = Recipient.Capability.UNKNOWN;
- this.storiesCapability = Recipient.Capability.UNKNOWN;
- this.giftBadgesCapability = Recipient.Capability.UNKNOWN;
- this.pnpCapability = Recipient.Capability.UNKNOWN;
+ this.capabilities = RecipientRecord.Capabilities.UNKNOWN;
this.storageId = null;
this.mentionSetting = MentionSetting.ALWAYS_NOTIFY;
this.wallpaper = null;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheetViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheetViewModel.kt
index 5cbd6847fa..2066277fa9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheetViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheetViewModel.kt
@@ -66,6 +66,8 @@ class SafetyNumberBottomSheetViewModel(
override fun onCleared() {
disposables.clear()
+ destinationStore.dispose()
+ store.dispose()
}
fun getIdentityRecord(recipientId: RecipientId): Maybe {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java
index 10e59e9e8c..17e1974674 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java
@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.scribbles;
import android.Manifest;
+import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
@@ -33,10 +34,10 @@
import org.signal.core.util.FontUtil;
import org.signal.core.util.concurrent.SignalExecutors;
+import org.signal.core.util.concurrent.SimpleTask;
import org.signal.core.util.logging.Log;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.ColorableRenderer;
-import org.signal.imageeditor.core.HiddenEditText;
import org.signal.imageeditor.core.ImageEditorView;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.SelectableRenderer;
@@ -48,7 +49,6 @@
import org.signal.libsignal.protocol.util.Pair;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.animation.ResizeAnimation;
-import org.thoughtcrime.securesms.components.emoji.EmojiUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.fonts.FontTypefaceProvider;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -66,7 +66,6 @@
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.ThrottledDebouncer;
import org.thoughtcrime.securesms.util.ViewUtil;
-import org.signal.core.util.concurrent.SimpleTask;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
import java.io.ByteArrayOutputStream;
@@ -791,8 +790,13 @@ private void performSaveToDisk() {
@WorkerThread
public @NonNull Uri renderToSingleUseBlob() {
+ return renderToSingleUseBlob(requireContext(), imageEditorView.getModel());
+ }
+
+ @WorkerThread
+ public static @NonNull Uri renderToSingleUseBlob(@NonNull Context context, @NonNull EditorModel editorModel) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- Bitmap image = imageEditorView.getModel().render(requireContext(), new FontTypefaceProvider());
+ Bitmap image = editorModel.render(context, new FontTypefaceProvider());
image.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);
image.recycle();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java
index a748a47903..f977dc3599 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java
@@ -165,7 +165,7 @@ public ActiveCallActionProcessorDelegate(@NonNull WebRtcInteractor webRtcInterac
state = Objects.requireNonNull(ENDED_REMOTE_EVENT_TO_STATE.get(endedRemoteEvent));
}
- if (endedRemoteEvent == CallEvent.ENDED_REMOTE_HANGUP) {
+ if (endedRemoteEvent == CallEvent.ENDED_REMOTE_HANGUP || endedRemoteEvent == CallEvent.ENDED_REMOTE_HANGUP_BUSY) {
if (remotePeerIsActive) {
state = outgoingBeforeAccept ? WebRtcViewModel.State.RECIPIENT_UNAVAILABLE : WebRtcViewModel.State.CALL_DISCONNECTED;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java
index 924484bd5b..923dbc5191 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java
@@ -149,6 +149,10 @@ public long getExpiresAt() {
}
public boolean isValidForStories() {
+ if (isViewOnce()) {
+ return false;
+ }
+
return isTextStory ||
(!media.isEmpty() && media.stream().allMatch(m -> MediaUtil.isStorySupportedType(m.getMimeType()))) ||
MediaUtil.isStorySupportedType(dataType) ||
diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareViewModel.kt
index acb5727b7d..95ad1a920b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareViewModel.kt
@@ -72,6 +72,7 @@ class ShareViewModel(
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
private fun moveToFailedState(throwable: Throwable? = null) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java
index d99a20580f..6e55132e7c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java
@@ -272,7 +272,7 @@ public static long send(final Context context,
sendMediaMessage(context, recipient, forceSms, messageId, Collections.emptyList());
onMessageSent();
- threadDatabase.update(threadId, true);
+ threadDatabase.update(allocatedThreadId, true);
return allocatedThreadId;
} catch (MmsException e) {
@@ -316,7 +316,7 @@ public static long sendPushWithPreUploadedMedia(final Context context,
sendMediaMessage(context, recipient, false, messageId, jobIds);
onMessageSent();
- threadDatabase.update(threadId, true);
+ threadDatabase.update(allocatedThreadId, true);
return allocatedThreadId;
} catch (MmsException e) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java
index 95f04f6361..4e12945da7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java
@@ -1,7 +1,5 @@
package org.thoughtcrime.securesms.storage;
-import android.content.Context;
-
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -17,7 +15,6 @@
import org.whispersystems.signalservice.api.push.ACI;
import org.whispersystems.signalservice.api.push.PNI;
import org.whispersystems.signalservice.api.push.ServiceId;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.storage.SignalContactRecord;
import org.whispersystems.signalservice.api.util.OptionalUtil;
import org.whispersystems.signalservice.internal.storage.protos.ContactRecord.IdentityState;
@@ -122,15 +119,15 @@ boolean isInvalid(@NonNull SignalContactRecord remote) {
remote = remote.withoutPni();
}
- String givenName;
- String familyName;
+ String profileGivenName;
+ String profileFamilyName;
- if (remote.getGivenName().isPresent() || remote.getFamilyName().isPresent()) {
- givenName = remote.getGivenName().orElse("");
- familyName = remote.getFamilyName().orElse("");
+ if (remote.getProfileGivenName().isPresent() || remote.getProfileFamilyName().isPresent()) {
+ profileGivenName = remote.getProfileGivenName().orElse("");
+ profileFamilyName = remote.getProfileFamilyName().orElse("");
} else {
- givenName = local.getGivenName().orElse("");
- familyName = local.getFamilyName().orElse("");
+ profileGivenName = local.getProfileGivenName().orElse("");
+ profileFamilyName = local.getProfileFamilyName().orElse("");
}
IdentityState identityState;
@@ -198,8 +195,10 @@ boolean isInvalid(@NonNull SignalContactRecord remote) {
boolean hideStory = remote.shouldHideStory();
long unregisteredTimestamp = remote.getUnregisteredTimestamp();
boolean hidden = remote.isHidden();
- boolean matchesRemote = doParamsMatch(remote, unknownFields, serviceId, pni, e164, givenName, familyName, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden);
- boolean matchesLocal = doParamsMatch(local, unknownFields, serviceId, pni, e164, givenName, familyName, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden);
+ String systemGivenName = SignalStore.account().isPrimaryDevice() ? local.getSystemGivenName().orElse("") : remote.getSystemGivenName().orElse("");
+ String systemFamilyName = SignalStore.account().isPrimaryDevice() ? local.getSystemFamilyName().orElse("") : remote.getSystemFamilyName().orElse("");
+ boolean matchesRemote = doParamsMatch(remote, unknownFields, serviceId, pni, e164, profileGivenName, profileFamilyName, systemGivenName, systemFamilyName, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden);
+ boolean matchesLocal = doParamsMatch(local, unknownFields, serviceId, pni, e164, profileGivenName, profileFamilyName, systemGivenName, systemFamilyName, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden);
if (matchesRemote) {
return remote;
@@ -209,8 +208,10 @@ boolean isInvalid(@NonNull SignalContactRecord remote) {
return new SignalContactRecord.Builder(keyGenerator.generate(), serviceId, unknownFields)
.setE164(e164)
.setPni(pni)
- .setGivenName(givenName)
- .setFamilyName(familyName)
+ .setProfileGivenName(profileGivenName)
+ .setProfileFamilyName(profileFamilyName)
+ .setSystemGivenName(systemGivenName)
+ .setSystemFamilyName(systemFamilyName)
.setProfileKey(profileKey)
.setUsername(username)
.setIdentityState(identityState)
@@ -254,8 +255,10 @@ private static boolean doParamsMatch(@NonNull SignalContactRecord contact,
@NonNull ServiceId serviceId,
@Nullable PNI pni,
@Nullable String e164,
- @NonNull String givenName,
- @NonNull String familyName,
+ @NonNull String profileGivenName,
+ @NonNull String profileFamilyName,
+ @NonNull String systemGivenName,
+ @NonNull String systemFamilyName,
@Nullable byte[] profileKey,
@NonNull String username,
@Nullable IdentityState identityState,
@@ -269,23 +272,25 @@ private static boolean doParamsMatch(@NonNull SignalContactRecord contact,
long unregisteredTimestamp,
boolean hidden)
{
- return Arrays.equals(contact.serializeUnknownFields(), unknownFields) &&
- Objects.equals(contact.getServiceId(), serviceId) &&
- Objects.equals(contact.getPni().orElse(null), pni) &&
- Objects.equals(contact.getNumber().orElse(null), e164) &&
- Objects.equals(contact.getGivenName().orElse(""), givenName) &&
- Objects.equals(contact.getFamilyName().orElse(""), familyName) &&
- Arrays.equals(contact.getProfileKey().orElse(null), profileKey) &&
- Objects.equals(contact.getUsername().orElse(""), username) &&
- Objects.equals(contact.getIdentityState(), identityState) &&
- Arrays.equals(contact.getIdentityKey().orElse(null), identityKey) &&
- contact.isBlocked() == blocked &&
- contact.isProfileSharingEnabled() == profileSharing &&
- contact.isArchived() == archived &&
- contact.isForcedUnread() == forcedUnread &&
- contact.getMuteUntil() == muteUntil &&
- contact.shouldHideStory() == hideStory &&
- contact.getUnregisteredTimestamp() == unregisteredTimestamp &&
+ return Arrays.equals(contact.serializeUnknownFields(), unknownFields) &&
+ Objects.equals(contact.getServiceId(), serviceId) &&
+ Objects.equals(contact.getPni().orElse(null), pni) &&
+ Objects.equals(contact.getNumber().orElse(null), e164) &&
+ Objects.equals(contact.getProfileGivenName().orElse(""), profileGivenName) &&
+ Objects.equals(contact.getProfileFamilyName().orElse(""), profileFamilyName) &&
+ Objects.equals(contact.getSystemGivenName().orElse(""), systemGivenName) &&
+ Objects.equals(contact.getSystemFamilyName().orElse(""), systemFamilyName) &&
+ Arrays.equals(contact.getProfileKey().orElse(null), profileKey) &&
+ Objects.equals(contact.getUsername().orElse(""), username) &&
+ Objects.equals(contact.getIdentityState(), identityState) &&
+ Arrays.equals(contact.getIdentityKey().orElse(null), identityKey) &&
+ contact.isBlocked() == blocked &&
+ contact.isProfileSharingEnabled() == profileSharing &&
+ contact.isArchived() == archived &&
+ contact.isForcedUnread() == forcedUnread &&
+ contact.getMuteUntil() == muteUntil &&
+ contact.shouldHideStory() == hideStory &&
+ contact.getUnregisteredTimestamp() == unregisteredTimestamp &&
contact.isHidden() == hidden;
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java
index 711e116cb2..8100375ce0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java
@@ -11,15 +11,12 @@
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.DistributionListId;
-import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode;
import org.thoughtcrime.securesms.database.model.DistributionListRecord;
import org.thoughtcrime.securesms.database.model.RecipientRecord;
-import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.subscription.Subscriber;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.storage.SignalAccountRecord;
@@ -34,7 +31,6 @@
import org.whispersystems.signalservice.internal.storage.protos.ContactRecord.IdentityState;
import org.whispersystems.signalservice.internal.storage.protos.GroupV2Record;
-import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -116,8 +112,10 @@ public static List localToRemotePinnedCo
.setE164(recipient.getE164())
.setPni(recipient.getPni())
.setProfileKey(recipient.getProfileKey())
- .setGivenName(recipient.getProfileName().getGivenName())
- .setFamilyName(recipient.getProfileName().getFamilyName())
+ .setProfileGivenName(recipient.getProfileName().getGivenName())
+ .setProfileFamilyName(recipient.getProfileName().getFamilyName())
+ .setSystemGivenName(recipient.getSystemProfileName().getGivenName())
+ .setSystemFamilyName(recipient.getSystemProfileName().getFamilyName())
.setBlocked(recipient.isBlocked())
.setProfileSharingEnabled(recipient.isProfileSharing() || recipient.getSystemContactUri() != null)
.setIdentityKey(recipient.getSyncExtras().getIdentityKey())
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt
index 27f757bdc0..af68ae11db 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt
@@ -11,11 +11,11 @@ import com.google.android.exoplayer2.SimpleExoPlayer
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.schedulers.Schedulers
import org.signal.core.util.ThreadUtil
-import org.signal.core.util.isAbsent
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.contacts.HeaderAction
import org.thoughtcrime.securesms.database.AttachmentDatabase
+import org.thoughtcrime.securesms.database.AttachmentDatabase.TransformProperties
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.DistributionListId
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
@@ -267,7 +267,7 @@ object Stories {
private fun getContentDuration(media: Media): DurationResult {
return if (MediaUtil.isVideo(media.mimeType)) {
- val mediaDuration = if (media.duration == 0L && media.transformProperties.isAbsent()) {
+ val mediaDuration = if (media.duration == 0L && media.transformProperties.map(TransformProperties::shouldSkipTransform).orElse(true)) {
getVideoDuration(media.uri)
} else if (media.transformProperties.map { it.isVideoTrim }.orElse(false)) {
TimeUnit.MICROSECONDS.toMillis(media.transformProperties.get().videoTrimEndTimeUs - media.transformProperties.get().videoTrimStartTimeUs)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenu.kt
index a0b356ac82..87f3850048 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenu.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenu.kt
@@ -19,9 +19,11 @@ import org.thoughtcrime.securesms.components.menu.ActionItem
import org.thoughtcrime.securesms.components.menu.SignalContextMenu
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord
import org.thoughtcrime.securesms.database.model.MessageRecord
+import org.thoughtcrime.securesms.database.model.databaseprotos.StoryTextPost
import org.thoughtcrime.securesms.stories.landing.StoriesLandingItem
import org.thoughtcrime.securesms.stories.viewer.page.StoryPost
import org.thoughtcrime.securesms.stories.viewer.page.StoryViewerPageState
+import org.thoughtcrime.securesms.util.Base64
import org.thoughtcrime.securesms.util.DeleteDialog
import org.thoughtcrime.securesms.util.SaveAttachmentTask
@@ -61,12 +63,23 @@ object StoryContextMenu {
}
fun share(fragment: Fragment, messageRecord: MediaMmsMessageRecord) {
- val attachment: Attachment = messageRecord.slideDeck.firstSlide!!.asAttachment()
- val intent: Intent = ShareCompat.IntentBuilder(fragment.requireContext())
- .setStream(attachment.publicUri)
- .setType(attachment.contentType)
- .createChooserIntent()
- .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ val intent = if (messageRecord.storyType.isTextStory) {
+ val textStoryBody = StoryTextPost.parseFrom(Base64.decode(messageRecord.body)).body
+ val linkUrl = messageRecord.linkPreviews.firstOrNull()?.url ?: ""
+ val shareText = "$textStoryBody $linkUrl".trim()
+
+ ShareCompat.IntentBuilder(fragment.requireContext())
+ .setText(shareText)
+ .createChooserIntent()
+ } else {
+ val attachment: Attachment = messageRecord.slideDeck.firstSlide!!.asAttachment()
+
+ ShareCompat.IntentBuilder(fragment.requireContext())
+ .setStream(attachment.publicUri)
+ .setType(attachment.contentType)
+ .createChooserIntent()
+ .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ }
try {
fragment.startActivity(intent)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryDialogs.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryDialogs.kt
index db1c781a55..1844aa3b94 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryDialogs.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/dialogs/StoryDialogs.kt
@@ -10,6 +10,60 @@ import org.thoughtcrime.securesms.R
object StoryDialogs {
+ fun removeGroupStory(
+ context: Context,
+ groupName: String,
+ onConfirmed: () -> Unit
+ ) {
+ MaterialAlertDialogBuilder(context)
+ .setTitle(R.string.StoryDialogs__remove_group_story)
+ .setMessage(context.getString(R.string.StoryDialogs__s_will_be_removed, groupName))
+ .setPositiveButton(R.string.StoryDialogs__remove) { _, _ -> onConfirmed() }
+ .setNegativeButton(android.R.string.cancel) { _, _ -> }
+ .show()
+ }
+
+ fun deleteDistributionList(
+ context: Context,
+ distributionListName: String,
+ onDelete: () -> Unit
+ ) {
+ MaterialAlertDialogBuilder(context)
+ .setTitle(R.string.StoryDialogs__delete_private_story)
+ .setMessage(context.getString(R.string.StoryDialogs__s_and_updates_shared, distributionListName))
+ .setPositiveButton(R.string.StoryDialogs__delete) { _, _ -> onDelete() }
+ .setNegativeButton(android.R.string.cancel) { _, _ -> }
+ .show()
+ }
+
+ fun disableStories(
+ context: Context,
+ userHasStories: Boolean,
+ onDisable: () -> Unit
+ ) {
+ val positiveButtonMessage = if (userHasStories) {
+ R.string.StoryDialogs__turn_off_and_delete
+ } else {
+ R.string.StoriesPrivacySettingsFragment__turn_off_stories
+ }
+
+ MaterialAlertDialogBuilder(context)
+ .setTitle(R.string.StoriesPrivacySettingsFragment__turn_off_stories_question)
+ .setMessage(R.string.StoriesPrivacySettingsFragment__you_will_no_longer_be_able_to_share)
+ .setPositiveButton(positiveButtonMessage) { _, _ -> onDisable() }
+ .setNegativeButton(android.R.string.cancel) { _, _ -> }
+ .show()
+ }
+
+ fun displayBetaDialog(context: Context, onConfirmed: () -> Unit) {
+ MaterialAlertDialogBuilder(context)
+ .setTitle(R.string.StoryDialogs__stories_is_available_to)
+ .setMessage(R.string.StoryDialogs__if_you_share_a_story)
+ .setPositiveButton(R.string.Permissions_continue) { _, _ -> onConfirmed() }
+ .setNegativeButton(android.R.string.cancel) { _, _ -> }
+ .show()
+ }
+
fun resendStory(context: Context, onDismiss: () -> Unit = {}, resend: () -> Unit) {
MaterialAlertDialogBuilder(context)
.setMessage(R.string.StoryDialogs__story_could_not_be_sent)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt
index 6f988c9030..577c144bd7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt
@@ -167,7 +167,9 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l
viewLifecycleOwner,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
- tabsViewModel.onChatsSelected()
+ if (!closeSearchIfOpen()) {
+ tabsViewModel.onChatsSelected()
+ }
}
}
)
@@ -350,4 +352,25 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l
viewModel.isTransitioningToAnotherScreen = true
startActivity(intent, options)
}
+
+ private fun isSearchOpen(): Boolean {
+ return isSearchVisible()
+ }
+
+ private fun isSearchVisible(): Boolean {
+ return requreSearchBinder().getSearchToolbar().resolved() && requreSearchBinder().getSearchToolbar().get().getVisibility() == View.VISIBLE
+ }
+
+ private fun closeSearchIfOpen(): Boolean {
+ if (isSearchOpen()) {
+ requreSearchBinder().getSearchToolbar().get().collapse()
+ requreSearchBinder().onSearchClosed()
+ return true
+ }
+ return false
+ }
+
+ private fun requreSearchBinder(): SearchBinder {
+ return requireListener()
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt
index b5c0a43424..7613294e95 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesFragment.kt
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.stories.my
import android.net.Uri
import android.view.View
-import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.core.app.ActivityOptionsCompat
import androidx.core.view.ViewCompat
@@ -24,7 +23,6 @@ import org.thoughtcrime.securesms.stories.dialogs.StoryContextMenu
import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
import org.thoughtcrime.securesms.stories.viewer.StoryViewerActivity
import org.thoughtcrime.securesms.util.LifecycleDisposable
-import org.thoughtcrime.securesms.util.Util
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.visible
@@ -80,11 +78,6 @@ class MyStoriesFragment : DSLSettingsFragment(
onClick = { it, preview ->
openStoryViewer(it, preview, false)
},
- onLongClick = {
- Util.copyToClipboard(requireContext(), it.distributionStory.messageRecord.timestamp.toString())
- Toast.makeText(requireContext(), R.string.MyStoriesFragment__copied_sent_timestamp_to_clipboard, Toast.LENGTH_SHORT).show()
- true
- },
onSaveClick = {
StoryContextMenu.save(requireContext(), it.distributionStory.messageRecord)
},
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt
index 0e6d7240fd..fff8be46c1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt
@@ -38,7 +38,6 @@ object MyStoriesItem {
class Model(
val distributionStory: ConversationMessage,
val onClick: (Model, View) -> Unit,
- val onLongClick: (Model) -> Boolean,
val onSaveClick: (Model) -> Unit,
val onDeleteClick: (Model) -> Unit,
val onForwardClick: (Model) -> Unit,
@@ -106,7 +105,6 @@ object MyStoriesItem {
override fun bind(model: Model) {
storyPreview.isClickable = false
itemView.setOnClickListener { model.onClick(model, storyPreview) }
- itemView.setOnLongClickListener { model.onLongClick(model) }
downloadTarget.setOnClickListener { model.onSaveClick(model) }
moreTarget.setOnClickListener { showContextMenu(model) }
presentDateOrStatus(model)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt
new file mode 100644
index 0000000000..e8979c68a5
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt
@@ -0,0 +1,60 @@
+package org.thoughtcrime.securesms.stories.settings.connections
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.components.ViewBinderDelegate
+import org.thoughtcrime.securesms.components.WrapperDialogFragment
+import org.thoughtcrime.securesms.contacts.LetterHeaderDecoration
+import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration
+import org.thoughtcrime.securesms.contacts.paged.ContactSearchMediator
+import org.thoughtcrime.securesms.databinding.ViewAllSignalConnectionsFragmentBinding
+import org.thoughtcrime.securesms.groups.SelectionLimits
+
+class ViewAllSignalConnectionsFragment : Fragment(R.layout.view_all_signal_connections_fragment) {
+
+ private val binding by ViewBinderDelegate(ViewAllSignalConnectionsFragmentBinding::bind)
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ binding.recycler.addItemDecoration(LetterHeaderDecoration(requireContext()) { false })
+ binding.toolbar.setNavigationOnClickListener {
+ requireActivity().onBackPressedDispatcher.onBackPressed()
+ }
+
+ ContactSearchMediator(
+ fragment = this,
+ recyclerView = binding.recycler,
+ selectionLimits = SelectionLimits(0, 0),
+ displayCheckBox = false,
+ mapStateToConfiguration = { getConfiguration() },
+ performSafetyNumberChecks = false
+ )
+ }
+
+ private fun getConfiguration(): ContactSearchConfiguration {
+ return ContactSearchConfiguration.build {
+ addSection(
+ ContactSearchConfiguration.Section.Individuals(
+ includeHeader = false,
+ includeSelf = false,
+ includeLetterHeaders = true,
+ transportType = ContactSearchConfiguration.TransportType.PUSH
+ )
+ )
+ }
+ }
+
+ class Dialog : WrapperDialogFragment() {
+ override fun getWrappedFragment(): Fragment {
+ return ViewAllSignalConnectionsFragment()
+ }
+
+ companion object {
+ fun show(fragmentManager: FragmentManager) {
+ Dialog().show(fragmentManager, null)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsFragment.kt
index 89ae68b789..c4aea452bc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsFragment.kt
@@ -10,6 +10,8 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.components.DialogFragmentDisplayManager
+import org.thoughtcrime.securesms.components.ProgressCardDialogFragment
import org.thoughtcrime.securesms.components.WrapperDialogFragment
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
@@ -17,6 +19,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.database.model.DistributionListId
import org.thoughtcrime.securesms.recipients.Recipient
+import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.fragments.findListener
@@ -28,6 +31,8 @@ class PrivateStorySettingsFragment : DSLSettingsFragment(
menuId = R.menu.story_private_menu
) {
+ private val progressDisplayManager = DialogFragmentDisplayManager { ProgressCardDialogFragment() }
+
private val viewModel: PrivateStorySettingsViewModel by viewModels(
factoryProducer = {
PrivateStorySettingsViewModel.Factory(PrivateStorySettingsFragmentArgs.fromBundle(requireArguments()).distributionListId, PrivateStorySettingsRepository())
@@ -49,6 +54,12 @@ class PrivateStorySettingsFragment : DSLSettingsFragment(
val toolbar: Toolbar = requireView().findViewById(R.id.toolbar)
viewModel.state.observe(viewLifecycleOwner) { state ->
+ if (state.isActionInProgress) {
+ progressDisplayManager.show(viewLifecycleOwner, childFragmentManager)
+ } else {
+ progressDisplayManager.hide()
+ }
+
toolbar.title = state.privateStory?.name
adapter.submitList(getConfiguration(state).toMappingModelList())
}
@@ -88,7 +99,8 @@ class PrivateStorySettingsFragment : DSLSettingsFragment(
clickPref(
title = DSLSettingsText.from(R.string.PrivateStorySettingsFragment__delete_private_story, DSLSettingsText.ColorModifier(ContextCompat.getColor(requireContext(), R.color.signal_alert_primary))),
onClick = {
- handleDeletePrivateStory()
+ val privateStoryName = viewModel.state.value?.privateStory?.name
+ handleDeletePrivateStory(privateStoryName)
}
)
}
@@ -113,13 +125,12 @@ class PrivateStorySettingsFragment : DSLSettingsFragment(
.show()
}
- private fun handleDeletePrivateStory() {
- MaterialAlertDialogBuilder(requireContext())
- .setTitle(R.string.PrivateStorySettingsFragment__are_you_sure)
- .setMessage(R.string.PrivateStorySettingsFragment__this_action_cannot)
- .setNegativeButton(android.R.string.cancel) { _, _ -> }
- .setPositiveButton(R.string.delete) { _, _ -> viewModel.delete().subscribe { findNavController().popBackStack() } }
- .show()
+ private fun handleDeletePrivateStory(privateStoryName: String?) {
+ val name = privateStoryName ?: return
+
+ StoryDialogs.deleteDistributionList(requireContext(), name) {
+ viewModel.delete().subscribe { findNavController().popBackStack() }
+ }
}
override fun onToolbarNavigationClicked() {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsRepository.kt
index 9a1c5037e6..3d6a9835cd 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsRepository.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsRepository.kt
@@ -7,6 +7,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.DistributionListId
import org.thoughtcrime.securesms.database.model.DistributionListRecord
import org.thoughtcrime.securesms.recipients.RecipientId
+import org.thoughtcrime.securesms.sms.MessageSender
import org.thoughtcrime.securesms.stories.Stories
class PrivateStorySettingsRepository {
@@ -27,6 +28,13 @@ class PrivateStorySettingsRepository {
return Completable.fromAction {
SignalDatabase.distributionLists.deleteList(distributionListId)
Stories.onStorySettingsChanged(distributionListId)
+
+ val recipientId = SignalDatabase.recipients.getOrInsertFromDistributionListId(distributionListId)
+ SignalDatabase.mms.getAllStoriesFor(recipientId, -1).use { reader ->
+ for (record in reader) {
+ MessageSender.sendRemoteDelete(record.id, record.isMms)
+ }
+ }
}.subscribeOn(Schedulers.io())
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsState.kt
index b89926b7a6..44d727242f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsState.kt
@@ -4,5 +4,6 @@ import org.thoughtcrime.securesms.database.model.DistributionListRecord
data class PrivateStorySettingsState(
val privateStory: DistributionListRecord? = null,
- val areRepliesAndReactionsEnabled: Boolean = false
+ val areRepliesAndReactionsEnabled: Boolean = false,
+ val isActionInProgress: Boolean = false
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsViewModel.kt
index c4197bf99c..93e4acbbd1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/custom/PrivateStorySettingsViewModel.kt
@@ -52,7 +52,9 @@ class PrivateStorySettingsViewModel(private val distributionListId: Distribution
}
fun delete(): Completable {
- return repository.delete(distributionListId).observeOn(AndroidSchedulers.mainThread())
+ return repository.delete(distributionListId)
+ .doOnSubscribe { store.update { it.copy(isActionInProgress = true) } }
+ .observeOn(AndroidSchedulers.mainThread())
}
class Factory(private val privateStoryItemData: DistributionListId, private val repository: PrivateStorySettingsRepository) : ViewModelProvider.Factory {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/group/GroupStorySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/group/GroupStorySettingsFragment.kt
index f480d213ae..7b11dd9ab5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/group/GroupStorySettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/group/GroupStorySettingsFragment.kt
@@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.conversation.ConversationIntents
+import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
import org.thoughtcrime.securesms.stories.settings.custom.PrivateStoryItem
import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
@@ -94,7 +95,12 @@ class GroupStorySettingsFragment : DSLSettingsFragment(menuId = R.menu.story_gro
DSLSettingsText.ColorModifier(ContextCompat.getColor(requireContext(), R.color.signal_colorError))
),
onClick = {
- viewModel.doNotDisplayAsStory()
+ StoryDialogs.removeGroupStory(
+ requireContext(),
+ state.name
+ ) {
+ viewModel.doNotDisplayAsStory()
+ }
}
)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/AllSignalConnectionsRowItem.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/AllSignalConnectionsRowItem.kt
new file mode 100644
index 0000000000..3e89bcb97a
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/AllSignalConnectionsRowItem.kt
@@ -0,0 +1,70 @@
+package org.thoughtcrime.securesms.stories.settings.my
+
+import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.databinding.AllSignalConnectionsRowItemBinding
+import org.thoughtcrime.securesms.util.adapter.mapping.BindingFactory
+import org.thoughtcrime.securesms.util.adapter.mapping.BindingViewHolder
+import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
+import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
+import org.thoughtcrime.securesms.util.visible
+
+/**
+ * AllSignalConnections privacy setting row item with "View" support
+ */
+object AllSignalConnectionsRowItem {
+
+ private const val IS_CHECKED = 0
+ private const val IS_COUNT = 1
+
+ fun register(mappingAdapter: MappingAdapter) {
+ mappingAdapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, AllSignalConnectionsRowItemBinding::inflate))
+ }
+
+ class Model(
+ val isChecked: Boolean,
+ val count: Int,
+ val onRowClicked: () -> Unit,
+ val onViewClicked: () -> Unit
+ ) : MappingModel {
+
+ override fun areItemsTheSame(newItem: Model): Boolean = true
+
+ override fun areContentsTheSame(newItem: Model): Boolean = isChecked == newItem.isChecked && count == newItem.count
+
+ override fun getChangePayload(newItem: Model): Any? {
+ val isCheckedDifferent = isChecked != newItem.isChecked
+ val isCountDifferent = count != newItem.count
+
+ return when {
+ isCheckedDifferent && !isCountDifferent -> IS_CHECKED
+ !isCheckedDifferent && isCountDifferent -> IS_COUNT
+ else -> null
+ }
+ }
+ }
+
+ private class ViewHolder(binding: AllSignalConnectionsRowItemBinding) : BindingViewHolder(binding) {
+ override fun bind(model: Model) {
+ binding.root.setOnClickListener { model.onRowClicked() }
+ binding.view.setOnClickListener { model.onViewClicked() }
+
+ when {
+ payload.contains(IS_COUNT) -> presentCount(model.count)
+ payload.contains(IS_CHECKED) -> presentSelected(model.isChecked)
+ else -> {
+ presentCount(model.count)
+ presentSelected(model.isChecked)
+ }
+ }
+ }
+
+ private fun presentCount(count: Int) {
+ binding.count.visible = count > 0
+ binding.count.text = context.resources.getQuantityString(R.plurals.MyStorySettingsFragment__viewers, count, count)
+ }
+
+ private fun presentSelected(isChecked: Boolean) {
+ binding.radio.isChecked = isChecked
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt
index 984b878b4b..d741d1e749 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt
@@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode
+import org.thoughtcrime.securesms.stories.settings.connections.ViewAllSignalConnectionsFragment
import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@@ -38,6 +39,7 @@ class MyStorySettingsFragment : DSLSettingsFragment(
}
override fun bindAdapter(adapter: MappingAdapter) {
+ AllSignalConnectionsRowItem.register(adapter)
viewModel.state.observe(viewLifecycleOwner) { state ->
adapter.submitList(getConfiguration(state).toMappingModelList())
}
@@ -47,14 +49,18 @@ class MyStorySettingsFragment : DSLSettingsFragment(
return configure {
sectionHeaderPref(R.string.MyStorySettingsFragment__who_can_view_this_story)
- radioPref(
- title = DSLSettingsText.from(R.string.MyStorySettingsFragment__all_signal_connections),
- summary = DSLSettingsText.from(R.string.MyStorySettingsFragment__share_with_all_connections),
- isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL,
- onClick = {
- lifecycleDisposable += viewModel.setMyStoryPrivacyMode(DistributionListPrivacyMode.ALL)
- .subscribe()
- }
+ customPref(
+ AllSignalConnectionsRowItem.Model(
+ isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL,
+ count = state.allSignalConnectionsCount,
+ onRowClicked = {
+ lifecycleDisposable += viewModel.setMyStoryPrivacyMode(DistributionListPrivacyMode.ALL)
+ .subscribe()
+ },
+ onViewClicked = {
+ ViewAllSignalConnectionsFragment.Dialog.show(parentFragmentManager)
+ }
+ )
)
val exceptText = if (state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL_EXCEPT) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsRepository.kt
index 9cc63d3f0e..714f79496a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsRepository.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsRepository.kt
@@ -22,11 +22,15 @@ class MyStorySettingsRepository {
}
fun observeChooseInitialPrivacy(): Observable {
- return Single.fromCallable { SignalDatabase.distributionLists.getRecipientId(DistributionListId.MY_STORY)!! }
+ return Single
+ .fromCallable { SignalDatabase.distributionLists.getRecipientId(DistributionListId.MY_STORY)!! }
.subscribeOn(Schedulers.io())
.flatMapObservable { recipientId ->
- Recipient.observable(recipientId)
+ val allSignalConnectionsCount = getAllSignalConnectionsCount().toObservable()
+ val stateWithoutCount = Recipient.observable(recipientId)
.flatMap { Observable.just(ChooseInitialMyStoryMembershipState(recipientId = recipientId, privacyState = getStoryPrivacyState())) }
+
+ Observable.combineLatest(allSignalConnectionsCount, stateWithoutCount) { count, state -> state.copy(allSignalConnectionsCount = count) }
}
}
@@ -50,6 +54,12 @@ class MyStorySettingsRepository {
}.subscribeOn(Schedulers.io())
}
+ fun getAllSignalConnectionsCount(): Single {
+ return Single.fromCallable {
+ SignalDatabase.recipients.getSignalContactsCount(false)
+ }.subscribeOn(Schedulers.io())
+ }
+
@WorkerThread
private fun getStoryPrivacyState(): MyStoryPrivacyState {
val privacyData: DistributionListPrivacyData = SignalDatabase.distributionLists.getPrivacyData(DistributionListId.MY_STORY)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt
index 1640e4212c..ef63a19cc7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt
@@ -2,5 +2,6 @@ package org.thoughtcrime.securesms.stories.settings.my
data class MyStorySettingsState(
val myStoryPrivacyState: MyStoryPrivacyState = MyStoryPrivacyState(),
- val areRepliesAndReactionsEnabled: Boolean = false
+ val areRepliesAndReactionsEnabled: Boolean = false,
+ val allSignalConnectionsCount: Int = 0
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt
index cb6060d269..0cbf79d4ae 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt
@@ -25,6 +25,8 @@ class MyStorySettingsViewModel @JvmOverloads constructor(private val repository:
.subscribe { myStoryPrivacyState -> store.update { it.copy(myStoryPrivacyState = myStoryPrivacyState) } }
disposables += repository.getRepliesAndReactionsEnabled()
.subscribe { repliesAndReactionsEnabled -> store.update { it.copy(areRepliesAndReactionsEnabled = repliesAndReactionsEnabled) } }
+ disposables += repository.getAllSignalConnectionsCount()
+ .subscribe { allSignalConnectionsCount -> store.update { it.copy(allSignalConnectionsCount = allSignalConnectionsCount) } }
}
fun setRepliesAndReactionsEnabled(repliesAndReactionsEnabled: Boolean) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt
index d61caef1ad..a0163fdd97 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt
@@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialog
import org.thoughtcrime.securesms.components.WrapperDialogFragment
import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode
import org.thoughtcrime.securesms.recipients.RecipientId
+import org.thoughtcrime.securesms.stories.settings.connections.ViewAllSignalConnectionsFragment
import org.thoughtcrime.securesms.stories.settings.select.BaseStoryRecipientSelectionFragment
import org.thoughtcrime.securesms.util.BottomSheetUtil
import org.thoughtcrime.securesms.util.LifecycleDisposable
@@ -42,9 +43,12 @@ class ChooseInitialMyStoryMembershipBottomSheetDialogFragment :
private lateinit var allExceptRadio: MaterialRadioButton
private lateinit var onlyWitRadio: MaterialRadioButton
+ private lateinit var allCount: TextView
private lateinit var allExceptCount: TextView
private lateinit var onlyWithCount: TextView
+ private lateinit var allView: View
+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.choose_initial_my_story_membership_fragment, container, false)
}
@@ -58,9 +62,15 @@ class ChooseInitialMyStoryMembershipBottomSheetDialogFragment :
allExceptRadio = view.findViewById(R.id.choose_initial_my_story_all_signal_connnections_except_radio)
onlyWitRadio = view.findViewById(R.id.choose_initial_my_story_only_share_with_radio)
+ allCount = view.findViewById(R.id.choose_initial_my_story_all_signal_connnections_count)
allExceptCount = view.findViewById(R.id.choose_initial_my_story_all_signal_connnections_except_count)
onlyWithCount = view.findViewById(R.id.choose_initial_my_story_only_share_with_count)
+ allView = view.findViewById(R.id.choose_initial_my_story_all_signal_connnections_view)
+ allView.setOnClickListener {
+ ViewAllSignalConnectionsFragment.Dialog.show(parentFragmentManager)
+ }
+
val save = view.findViewById(R.id.choose_initial_my_story_save).apply {
isEnabled = false
}
@@ -76,6 +86,9 @@ class ChooseInitialMyStoryMembershipBottomSheetDialogFragment :
allExceptCount.visible = allExceptRadio.isChecked
onlyWithCount.visible = onlyWitRadio.isChecked
+ allCount.visible = state.allSignalConnectionsCount > 0
+ allCount.text = resources.getQuantityString(R.plurals.MyStorySettingsFragment__viewers, state.allSignalConnectionsCount, state.allSignalConnectionsCount)
+
when (state.privacyState.privacyMode) {
DistributionListPrivacyMode.ALL_EXCEPT -> allExceptCount.text = resources.getQuantityString(R.plurals.MyStorySettingsFragment__d_people_excluded, state.privacyState.connectionCount, state.privacyState.connectionCount)
DistributionListPrivacyMode.ONLY_WITH -> onlyWithCount.text = resources.getQuantityString(R.plurals.MyStorySettingsFragment__d_people, state.privacyState.connectionCount, state.privacyState.connectionCount)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt
index d284a8a103..14ae833224 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt
@@ -3,4 +3,8 @@ package org.thoughtcrime.securesms.stories.settings.privacy
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.stories.settings.my.MyStoryPrivacyState
-data class ChooseInitialMyStoryMembershipState(val recipientId: RecipientId? = null, val privacyState: MyStoryPrivacyState = MyStoryPrivacyState())
+data class ChooseInitialMyStoryMembershipState(
+ val recipientId: RecipientId? = null,
+ val privacyState: MyStoryPrivacyState = MyStoryPrivacyState(),
+ val allSignalConnectionsCount: Int = 0
+)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt
index 64ee05a75f..bb0d88f637 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt
@@ -31,6 +31,7 @@ class ChooseInitialMyStoryMembershipViewModel @JvmOverloads constructor(
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
fun select(selection: DistributionListPrivacyMode): Single {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/select/BaseStoryRecipientSelectionFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/select/BaseStoryRecipientSelectionFragment.kt
index af56b1d688..560173a029 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/select/BaseStoryRecipientSelectionFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/select/BaseStoryRecipientSelectionFragment.kt
@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.google.android.material.button.MaterialButton
+import org.signal.core.util.dp
import org.thoughtcrime.securesms.ContactSelectionListFragment
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader
@@ -147,8 +148,10 @@ abstract class BaseStoryRecipientSelectionFragment : Fragment(R.layout.stories_b
canSelectSelf = false,
currentSelection = emptyList(),
displaySelectionCount = false,
- displayChips = false,
- checkboxResource = checkboxResource
+ displayChips = true,
+ checkboxResource = checkboxResource,
+ recyclerPadBottom = 76.dp,
+ recyclerChildClipping = false
)
contactSelectionListFragment.arguments = arguments.toArgumentBundle()
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt
index 3070657d06..388793e2a4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt
@@ -4,9 +4,10 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.ConcatAdapter
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.signal.core.util.dp
import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.components.DialogFragmentDisplayManager
+import org.thoughtcrime.securesms.components.ProgressCardDialogFragment
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
@@ -17,6 +18,7 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.groups.ParcelableGroupId
import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseGroupStoryBottomSheet
import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseStoryTypeBottomSheet
+import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
import org.thoughtcrime.securesms.stories.settings.create.CreateStoryFlowDialogFragment
import org.thoughtcrime.securesms.stories.settings.create.CreateStoryWithViewersFragment
import org.thoughtcrime.securesms.util.BottomSheetUtil
@@ -36,6 +38,7 @@ class StoriesPrivacySettingsFragment :
private val viewModel: StoriesPrivacySettingsViewModel by viewModels()
private val lifecycleDisposable = LifecycleDisposable()
+ private val progressDisplayManager = DialogFragmentDisplayManager { ProgressCardDialogFragment() }
override fun createAdapters(): Array {
return arrayOf(DSLSettingsAdapter(), PagingMappingAdapter(), DSLSettingsAdapter())
@@ -84,6 +87,12 @@ class StoriesPrivacySettingsFragment :
}
lifecycleDisposable += viewModel.state.subscribe { state ->
+ if (state.isUpdatingEnabledState) {
+ progressDisplayManager.show(viewLifecycleOwner, childFragmentManager)
+ } else {
+ progressDisplayManager.hide()
+ }
+
(top as MappingAdapter).submitList(getTopConfiguration(state).toMappingModelList())
middle.submitList(getMiddleConfiguration(state).toMappingModelList())
(bottom as MappingAdapter).submitList(getBottomConfiguration(state).toMappingModelList())
@@ -144,12 +153,9 @@ class StoriesPrivacySettingsFragment :
DSLSettingsText.ColorModifier(ContextCompat.getColor(requireContext(), R.color.signal_colorOnSurfaceVariant))
),
onClick = {
- MaterialAlertDialogBuilder(requireContext())
- .setTitle(R.string.StoriesPrivacySettingsFragment__turn_off_stories_question)
- .setMessage(R.string.StoriesPrivacySettingsFragment__you_will_no_longer_be_able_to)
- .setPositiveButton(R.string.StoriesPrivacySettingsFragment__turn_off_stories) { _, _ -> viewModel.setStoriesEnabled(false) }
- .setNegativeButton(android.R.string.cancel) { _, _ -> }
- .show()
+ StoryDialogs.disableStories(requireContext(), viewModel.userHasActiveStories) {
+ viewModel.setStoriesEnabled(false)
+ }
}
)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsRepository.kt
index ca97f0616a..6041af8d1c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsRepository.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsRepository.kt
@@ -1,12 +1,15 @@
package org.thoughtcrime.securesms.stories.settings.story
import io.reactivex.rxjava3.core.Completable
+import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
import org.thoughtcrime.securesms.database.GroupDatabase
import org.thoughtcrime.securesms.database.SignalDatabase
+import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
+import org.thoughtcrime.securesms.sms.MessageSender
import org.thoughtcrime.securesms.storage.StorageSyncHelper
import org.thoughtcrime.securesms.stories.Stories
@@ -23,6 +26,21 @@ class StoriesPrivacySettingsRepository {
return Completable.fromAction {
SignalStore.storyValues().isFeatureDisabled = !isEnabled
Stories.onStorySettingsChanged(Recipient.self().id)
+ ApplicationDependencies.restartAllNetworkConnections()
+
+ SignalDatabase.mms.getAllOutgoingStories(false, -1).use { reader ->
+ reader.map { record -> record.id }
+ }.forEach { messageId ->
+ MessageSender.sendRemoteDelete(messageId, true)
+ }
+ }.subscribeOn(Schedulers.io())
+ }
+
+ fun userHasOutgoingStories(): Single {
+ return Single.fromCallable {
+ SignalDatabase.mms.getAllOutgoingStories(false, -1).use {
+ it.iterator().hasNext()
+ }
}.subscribeOn(Schedulers.io())
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsState.kt
index bc1e0b3b47..74107df974 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsState.kt
@@ -5,5 +5,6 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchData
data class StoriesPrivacySettingsState(
val areStoriesEnabled: Boolean,
val isUpdatingEnabledState: Boolean = false,
- val storyContactItems: List = emptyList()
+ val storyContactItems: List = emptyList(),
+ val userHasStories: Boolean = false
)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt
index a17d08ed08..be46426b1b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt
@@ -39,6 +39,7 @@ class StoriesPrivacySettingsViewModel : ViewModel() {
private val headerActionRequestSubject = PublishSubject.create()
val state: Flowable = store.stateFlowable.observeOn(AndroidSchedulers.mainThread())
+ val userHasActiveStories: Boolean get() = store.state.userHasStories
val pagingController = ProxyPagingController()
val headerActionRequests: Observable = headerActionRequestSubject.debounce(100, TimeUnit.MILLISECONDS)
@@ -59,13 +60,16 @@ class StoriesPrivacySettingsViewModel : ViewModel() {
pagingController.set(observablePagedData.controller)
- store.update(observablePagedData.data.toFlowable(BackpressureStrategy.LATEST)) { data, state ->
+ updateUserHasStories()
+
+ disposables += store.update(observablePagedData.data.toFlowable(BackpressureStrategy.LATEST)) { data, state ->
state.copy(storyContactItems = data)
}
}
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
fun setStoriesEnabled(isEnabled: Boolean) {
@@ -77,6 +81,7 @@ class StoriesPrivacySettingsViewModel : ViewModel() {
areStoriesEnabled = Stories.isFeatureEnabled()
)
}
+ updateUserHasStories()
}
}
@@ -85,4 +90,10 @@ class StoriesPrivacySettingsViewModel : ViewModel() {
pagingController.onDataInvalidated()
}
}
+
+ private fun updateUserHasStories() {
+ disposables += repository.userHasOutgoingStories().subscribe { userHasActiveStories ->
+ store.update { it.copy(userHasStories = userHasActiveStories) }
+ }
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt
index 6c1201bd6e..e4d355b6fc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt
@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.stories.viewer
import android.os.Bundle
import android.view.View
+import androidx.core.app.ActivityCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.viewpager2.widget.ViewPager2
@@ -75,7 +76,7 @@ class StoryViewerFragment :
lifecycleDisposable.bindTo(viewLifecycleOwner)
lifecycleDisposable += viewModel.state.observeOn(AndroidSchedulers.mainThread()).subscribe { state ->
if (state.noPosts) {
- requireActivity().finish()
+ ActivityCompat.finishAfterTransition(requireActivity())
}
adapter.setPages(state.pages)
@@ -86,7 +87,7 @@ class StoryViewerFragment :
pagerOnPageSelectedLock = false
if (state.page >= state.pages.size) {
- requireActivity().onBackPressed()
+ ActivityCompat.finishAfterTransition(requireActivity())
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt
index db9116615f..b7cd12412e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt
@@ -143,6 +143,7 @@ class StoryViewerViewModel(
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
fun setSelectedPage(page: Int) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryVolumeViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryVolumeViewModel.kt
index 8cbfd370d3..3e422577d0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryVolumeViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryVolumeViewModel.kt
@@ -10,6 +10,10 @@ class StoryVolumeViewModel : ViewModel() {
val state: Flowable = store.stateFlowable
val snapshot: StoryVolumeState get() = store.state
+ override fun onCleared() {
+ store.dispose()
+ }
+
fun mute() {
store.update { it.copy(isMuted = true) }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoBottomSheetDialogFragment.kt
index 3b9b276a2f..1f26a14a34 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoBottomSheetDialogFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoBottomSheetDialogFragment.kt
@@ -1,12 +1,14 @@
package org.thoughtcrime.securesms.stories.viewer.info
import android.content.DialogInterface
+import androidx.annotation.StringRes
import androidx.core.os.bundleOf
import androidx.fragment.app.viewModels
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFragment
+import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.fragments.findListener
@@ -58,23 +60,61 @@ class StoryInfoBottomSheetDialogFragment : DSLSettingsBottomSheetFragment() {
)
)
- state.sections.map { (section, recipients) ->
- renderSection(section, recipients)
+ val details = state.messageDetails!!
+
+ if (state.isOutgoing) {
+ renderSection(
+ title = R.string.message_details_recipient_header__not_sent,
+ recipients = details.notSent.map { StoryInfoRecipientRow.Model(it) }
+ )
+
+ renderSection(
+ title = R.string.message_details_recipient_header__viewed,
+ recipients = details.viewed.map { StoryInfoRecipientRow.Model(it) }
+ )
+
+ renderSection(
+ title = R.string.message_details_recipient_header__read_by,
+ recipients = details.read.map { StoryInfoRecipientRow.Model(it) }
+ )
+
+ renderSection(
+ title = R.string.message_details_recipient_header__delivered_to,
+ recipients = details.delivered.map { StoryInfoRecipientRow.Model(it) }
+ )
+
+ renderSection(
+ title = R.string.message_details_recipient_header__sent_to,
+ recipients = details.sent.map { StoryInfoRecipientRow.Model(it) }
+ )
+
+ renderSection(
+ title = R.string.message_details_recipient_header__pending_send,
+ recipients = details.pending.map { StoryInfoRecipientRow.Model(it) }
+ )
+
+ renderSection(
+ title = R.string.message_details_recipient_header__skipped,
+ recipients = details.skipped.map { StoryInfoRecipientRow.Model(it) }
+ )
+ } else {
+ renderSection(
+ title = R.string.message_details_recipient_header__sent_from,
+ recipients = details.sent.map { StoryInfoRecipientRow.Model(it) }
+ )
}
}
}
- private fun DSLConfiguration.renderSection(sectionKey: StoryInfoState.SectionKey, recipients: List) {
- sectionHeaderPref(
- title = when (sectionKey) {
- StoryInfoState.SectionKey.FAILED -> R.string.StoryInfoBottomSheetDialogFragment__failed
- StoryInfoState.SectionKey.SENT_TO -> R.string.StoryInfoBottomSheetDialogFragment__sent_to
- StoryInfoState.SectionKey.SENT_FROM -> R.string.StoryInfoBottomSheetDialogFragment__sent_from
- }
- )
+ private fun DSLConfiguration.renderSection(@StringRes title: Int, recipients: List) {
+ if (recipients.isNotEmpty()) {
+ sectionHeaderPref(
+ title = DSLSettingsText.from(title)
+ )
- recipients.forEach {
- customPref(it)
+ recipients.forEach {
+ customPref(it)
+ }
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRecipientRow.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRecipientRow.kt
index 00950398c9..0ca8615c03 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRecipientRow.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRecipientRow.kt
@@ -4,7 +4,7 @@ import android.view.View
import android.widget.TextView
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.AvatarImageView
-import org.thoughtcrime.securesms.recipients.Recipient
+import org.thoughtcrime.securesms.messagedetails.RecipientDeliveryStatus
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
@@ -21,17 +21,15 @@ object StoryInfoRecipientRow {
}
class Model(
- val recipient: Recipient,
- val date: Long,
- val status: Int,
- val isFailed: Boolean
+ val recipientDeliveryStatus: RecipientDeliveryStatus
) : MappingModel {
override fun areItemsTheSame(newItem: Model): Boolean {
- return recipient.id == newItem.recipient.id
+ return recipientDeliveryStatus.recipient.id == newItem.recipientDeliveryStatus.recipient.id
}
override fun areContentsTheSame(newItem: Model): Boolean {
- return recipient.hasSameContent(newItem.recipient) && date == newItem.date
+ return recipientDeliveryStatus.recipient.hasSameContent(newItem.recipientDeliveryStatus.recipient) &&
+ recipientDeliveryStatus.timestamp == newItem.recipientDeliveryStatus.timestamp
}
}
@@ -42,9 +40,9 @@ object StoryInfoRecipientRow {
private val timestampView: TextView = itemView.findViewById(R.id.story_info_timestamp)
override fun bind(model: Model) {
- avatarView.setRecipient(model.recipient)
- nameView.text = model.recipient.getDisplayName(context)
- timestampView.text = DateUtils.getTimeString(context, Locale.getDefault(), model.date)
+ avatarView.setRecipient(model.recipientDeliveryStatus.recipient)
+ nameView.text = model.recipientDeliveryStatus.recipient.getDisplayName(context)
+ timestampView.text = DateUtils.getTimeString(context, Locale.getDefault(), model.recipientDeliveryStatus.timestamp)
}
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRepository.kt
deleted file mode 100644
index 2ad567eac0..0000000000
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoRepository.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.thoughtcrime.securesms.stories.viewer.info
-
-import io.reactivex.rxjava3.core.Observable
-import io.reactivex.rxjava3.core.Single
-import io.reactivex.rxjava3.schedulers.Schedulers
-import org.signal.core.util.logging.Log
-import org.thoughtcrime.securesms.database.DatabaseObserver
-import org.thoughtcrime.securesms.database.GroupReceiptDatabase
-import org.thoughtcrime.securesms.database.NoSuchMessageException
-import org.thoughtcrime.securesms.database.SignalDatabase
-import org.thoughtcrime.securesms.database.model.MessageRecord
-import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
-
-/**
- * Gathers necessary message record and receipt data for a given story id.
- */
-class StoryInfoRepository {
-
- companion object {
- private val TAG = Log.tag(StoryInfoRepository::class.java)
- }
-
- /**
- * Retrieves the StoryInfo for a given ID and emits a new item whenever the underlying
- * message record changes.
- */
- fun getStoryInfo(storyId: Long): Observable {
- return observeMessageRecord(storyId)
- .switchMap { record ->
- getReceiptInfo(storyId).map { receiptInfo ->
- StoryInfo(record, receiptInfo)
- }.toObservable()
- }
- .subscribeOn(Schedulers.io())
- }
-
- private fun observeMessageRecord(storyId: Long): Observable {
- return Observable.create { emitter ->
- fun refresh() {
- try {
- emitter.onNext(SignalDatabase.mms.getMessageRecord(storyId))
- } catch (e: NoSuchMessageException) {
- Log.w(TAG, "The story message disappeared. Terminating emission.")
- emitter.onComplete()
- }
- }
-
- val observer = DatabaseObserver.MessageObserver {
- if (it.mms && it.id == storyId) {
- refresh()
- }
- }
-
- ApplicationDependencies.getDatabaseObserver().registerMessageUpdateObserver(observer)
- emitter.setCancellable {
- ApplicationDependencies.getDatabaseObserver().unregisterObserver(observer)
- }
-
- refresh()
- }
- }
-
- private fun getReceiptInfo(storyId: Long): Single> {
- return Single.fromCallable {
- SignalDatabase.groupReceipts.getGroupReceiptInfo(storyId)
- }
- }
-
- /**
- * The message record and receipt info for a given story id.
- */
- data class StoryInfo(val messageRecord: MessageRecord, val receiptInfo: List)
-}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoState.kt
index 1d96a19dd8..20cadbd719 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoState.kt
@@ -1,19 +1,19 @@
package org.thoughtcrime.securesms.stories.viewer.info
+import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord
+import org.thoughtcrime.securesms.messagedetails.MessageDetails
+
/**
* Contains the needed information to render the story info sheet.
*/
data class StoryInfoState(
- val sentMillis: Long = -1L,
- val receivedMillis: Long = -1L,
- val size: Long = -1L,
- val isOutgoing: Boolean = false,
- val sections: Map> = emptyMap(),
- val isLoaded: Boolean = false
+ val messageDetails: MessageDetails? = null
) {
- enum class SectionKey {
- FAILED,
- SENT_TO,
- SENT_FROM
- }
+ private val mediaMessage = messageDetails?.conversationMessage?.messageRecord as? MediaMmsMessageRecord
+
+ val sentMillis: Long = mediaMessage?.dateSent ?: -1L
+ val receivedMillis: Long = mediaMessage?.dateReceived ?: -1L
+ val size: Long = mediaMessage?.slideDeck?.thumbnailSlide?.fileSize ?: 0
+ val isOutgoing: Boolean = mediaMessage?.isOutgoing ?: false
+ val isLoaded: Boolean = mediaMessage != null
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoViewModel.kt
index c2d9c642a7..22ccc80a14 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/info/StoryInfoViewModel.kt
@@ -7,17 +7,14 @@ import io.reactivex.rxjava3.core.BackpressureStrategy
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
-import org.thoughtcrime.securesms.database.model.MessageRecord
-import org.thoughtcrime.securesms.database.model.MmsMessageRecord
-import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
-import org.thoughtcrime.securesms.recipients.Recipient
-import org.thoughtcrime.securesms.recipients.RecipientId
+import org.thoughtcrime.securesms.database.model.MessageId
+import org.thoughtcrime.securesms.messagedetails.MessageDetailsRepository
import org.thoughtcrime.securesms.util.rx.RxStore
/**
* Gathers and stores the StoryInfoState which is used to render the story info sheet.
*/
-class StoryInfoViewModel(storyId: Long, repository: StoryInfoRepository = StoryInfoRepository()) : ViewModel() {
+class StoryInfoViewModel(storyId: Long, repository: MessageDetailsRepository = MessageDetailsRepository()) : ViewModel() {
private val store = RxStore(StoryInfoState())
private val disposables = CompositeDisposable()
@@ -25,56 +22,16 @@ class StoryInfoViewModel(storyId: Long, repository: StoryInfoRepository = StoryI
val state: Flowable = store.stateFlowable.observeOn(AndroidSchedulers.mainThread())
init {
- disposables += store.update(repository.getStoryInfo(storyId).toFlowable(BackpressureStrategy.LATEST)) { storyInfo, storyInfoState ->
+ disposables += store.update(repository.getMessageDetails(MessageId(storyId, true)).toFlowable(BackpressureStrategy.LATEST)) { messageDetails, storyInfoState ->
storyInfoState.copy(
- isLoaded = true,
- sentMillis = storyInfo.messageRecord.dateSent,
- receivedMillis = storyInfo.messageRecord.dateReceived,
- size = (storyInfo.messageRecord as? MmsMessageRecord)?.let { it.slideDeck.firstSlide?.fileSize } ?: -1L,
- isOutgoing = storyInfo.messageRecord.isOutgoing,
- sections = buildSections(storyInfo)
+ messageDetails = messageDetails
)
}
}
- private fun buildSections(storyInfo: StoryInfoRepository.StoryInfo): Map> {
- return if (storyInfo.messageRecord.isOutgoing) {
- storyInfo.receiptInfo.map { groupReceiptInfo ->
- StoryInfoRecipientRow.Model(
- recipient = Recipient.resolved(groupReceiptInfo.recipientId),
- date = groupReceiptInfo.timestamp,
- status = groupReceiptInfo.status,
- isFailed = hasFailure(storyInfo.messageRecord, groupReceiptInfo.recipientId)
- )
- }.groupBy {
- when {
- it.isFailed -> StoryInfoState.SectionKey.FAILED
- else -> StoryInfoState.SectionKey.SENT_TO
- }
- }
- } else {
- mapOf(
- StoryInfoState.SectionKey.SENT_FROM to listOf(
- StoryInfoRecipientRow.Model(
- recipient = storyInfo.messageRecord.individualRecipient,
- date = storyInfo.messageRecord.dateSent,
- status = -1,
- isFailed = false
- )
- )
- )
- }
- }
-
- private fun hasFailure(messageRecord: MessageRecord, recipientId: RecipientId): Boolean {
- val hasNetworkFailure = messageRecord.networkFailures.any { it.getRecipientId(ApplicationDependencies.getApplication()) == recipientId }
- val hasIdentityFailure = messageRecord.identityKeyMismatches.any { it.getRecipientId(ApplicationDependencies.getApplication()) == recipientId }
-
- return hasNetworkFailure || hasIdentityFailure
- }
-
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
class Factory(private val storyId: Long) : ViewModelProvider.Factory {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt
index 9e43a21628..8993d77d68 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt
@@ -111,6 +111,8 @@ class StoryViewerPageFragment :
private lateinit var storyCaptionContainer: FrameLayout
private lateinit var storyContentContainer: FrameLayout
private lateinit var storyFirstTimeNavigationViewStub: StoryFirstNavigationStub
+ private lateinit var sendingBarTextView: TextView
+ private lateinit var sendingBar: View
private lateinit var callback: Callback
@@ -182,6 +184,8 @@ class StoryViewerPageFragment :
progressBar = view.findViewById(R.id.progress)
viewsAndReplies = view.findViewById(R.id.views_and_replies_bar)
storyFirstTimeNavigationViewStub = StoryFirstNavigationStub(view.findViewById(R.id.story_first_time_nav_stub))
+ sendingBarTextView = view.findViewById(R.id.sending_text_view)
+ sendingBar = view.findViewById(R.id.sending_bar)
storySlate.callback = this
storyFirstTimeNavigationViewStub.setCallback(this)
@@ -885,11 +889,7 @@ class StoryViewerPageFragment :
}
private fun presentDate(date: TextView, storyPost: StoryPost) {
- val messageRecord = storyPost.conversationMessage.messageRecord
- date.text = when {
- messageRecord.isOutgoing && !messageRecord.isSent -> getString(R.string.StoriesLandingItem__sending)
- else -> DateUtils.getBriefRelativeTimeSpanString(context, Locale.getDefault(), storyPost.dateInMilliseconds)
- }
+ date.text = DateUtils.getBriefRelativeTimeSpanString(context, Locale.getDefault(), storyPost.dateInMilliseconds)
}
private fun presentSenderAvatar(senderAvatar: AvatarImageView, post: StoryPost) {
@@ -913,6 +913,8 @@ class StoryViewerPageFragment :
viewsAndReplies.visible = true
}
+ sendingBar.visible = false
+ viewsAndReplies.isEnabled = true
viewsAndReplies.iconTint = ColorStateList.valueOf(ContextCompat.getColor(requireContext(), R.color.signal_colorOnSurface))
when (replyState) {
@@ -934,13 +936,20 @@ class StoryViewerPageFragment :
indicatorColors = intArrayOf(ContextCompat.getColor(requireContext(), R.color.signal_dark_colorNeutralInverse))
trackThickness = 2.dp
}
- )
+ ).apply {
+ setBounds(0, 0, 20.dp, 20.dp)
+ }
}
- viewsAndReplies.icon = sendingProgressDrawable
- viewsAndReplies.iconGravity = MaterialButton.ICON_GRAVITY_TEXT_START
- viewsAndReplies.iconSize = 20.dp
- viewsAndReplies.setText(R.string.StoriesLandingItem__sending)
+ sendingBarTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(
+ sendingProgressDrawable,
+ null,
+ null,
+ null
+ )
+
+ sendingBar.visible = true
+ viewsAndReplies.isEnabled = false
}
private fun presentPartialSendBottomBar() {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt
index 6b0136dc08..0601202476 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt
@@ -99,6 +99,7 @@ class StoryViewerPageViewModel(
override fun onCleared() {
disposables.clear()
storyCache.clear()
+ store.dispose()
}
fun hideStory(): Completable {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt
index 8806782e3c..32a0614b31 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt
@@ -16,7 +16,6 @@ import com.google.android.material.bottomsheet.BottomSheetBehaviorHack
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.kotlin.subscribeBy
import org.signal.core.util.concurrent.SignalExecutors
import org.signal.core.util.logging.Log
@@ -146,6 +145,7 @@ class StoryGroupReplyFragment :
private lateinit var adapter: PagingMappingAdapter
private lateinit var dataObserver: RecyclerView.AdapterDataObserver
private lateinit var composer: StoryReplyComposer
+ private lateinit var notInGroup: View
private var markReadHelper: MarkReadHelper? = null
@@ -164,6 +164,7 @@ class StoryGroupReplyFragment :
recyclerView = view.findViewById(R.id.recycler)
composer = view.findViewById(R.id.composer)
+ notInGroup = view.findViewById(R.id.not_in_group)
lifecycleDisposable.bindTo(viewLifecycleOwner)
@@ -215,10 +216,7 @@ class StoryGroupReplyFragment :
adapter.registerAdapterDataObserver(dataObserver)
initializeMentions()
-
- if (savedInstanceState == null) {
- ViewUtil.focusAndShowKeyboard(composer)
- }
+ initializeComposer(savedInstanceState)
recyclerView.addOnScrollListener(GroupReplyScrollObserver())
}
@@ -360,7 +358,6 @@ class StoryGroupReplyFragment :
override fun onReactionSelected(emoji: String) {
dialog.dismiss()
- findListener()?.onReactionEmojiSelected(emoji)
sendReaction(emoji)
}
@@ -379,6 +376,8 @@ class StoryGroupReplyFragment :
}
private fun sendReaction(emoji: String) {
+ findListener()?.onReactionEmojiSelected(emoji)
+
lifecycleDisposable += StoryGroupReplySender.sendReaction(requireContext(), storyId, emoji)
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
@@ -433,6 +432,22 @@ class StoryGroupReplyFragment :
sendReaction(emoji)
}
+ private fun initializeComposer(savedInstanceState: Bundle?) {
+ val isActiveGroup = Recipient.observable(groupRecipientId).map { it.isActiveGroup }
+ if (savedInstanceState == null) {
+ lifecycleDisposable += isActiveGroup.firstOrError().observeOn(AndroidSchedulers.mainThread()).subscribe { active ->
+ if (active) {
+ ViewUtil.focusAndShowKeyboard(composer)
+ }
+ }
+ }
+
+ lifecycleDisposable += isActiveGroup.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread()).forEach { active ->
+ composer.visible = active
+ notInGroup.visible = !active
+ }
+ }
+
private fun initializeMentions() {
inlineQueryResultsController = InlineQueryResultsController(
requireContext(),
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt
index 81fd72e42d..be7861927e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt
@@ -51,6 +51,7 @@ class StoryGroupReplyViewModel(storyId: Long, repository: StoryGroupReplyReposit
override fun onCleared() {
disposables.clear()
+ store.dispose()
}
class Factory(private val storyId: Long, private val repository: StoryGroupReplyRepository) : ViewModelProvider.Factory {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java b/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java
index 70ea8699bc..a50140358d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java
@@ -2,10 +2,12 @@
import android.app.AlarmManager;
import android.app.PendingIntent;
+import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.os.Build;
import android.os.SystemClock;
import androidx.core.app.AlarmManagerCompat;
@@ -18,13 +20,12 @@
import java.util.concurrent.ConcurrentSkipListSet;
/**
- * A sleep timer that is based on elapsed realtime, so
- * that it works properly, even in low-power sleep modes.
- *
+ * A sleep timer that is based on elapsed realtime, so that it works properly, even in low-power sleep modes.
*/
public class AlarmSleepTimer implements SleepTimer {
private static final String TAG = Log.tag(AlarmSleepTimer.class);
- private static ConcurrentSkipListSet actionIdList = new ConcurrentSkipListSet<>();
+
+ private static final ConcurrentSkipListSet actionIdList = new ConcurrentSkipListSet<>();
private final Context context;
@@ -33,23 +34,25 @@ public AlarmSleepTimer(Context context) {
}
@Override
- public void sleep(long millis) {
- final AlarmReceiver alarmReceiver = new AlarmSleepTimer.AlarmReceiver();
- int actionId = 0;
+ public void sleep(long sleepDuration) {
+ AlarmReceiver alarmReceiver = new AlarmSleepTimer.AlarmReceiver();
+ int actionId = 0;
+
while (!actionIdList.add(actionId)){
actionId++;
}
+
try {
- context.registerReceiver(alarmReceiver,
- new IntentFilter(AlarmReceiver.WAKE_UP_THREAD_ACTION + "." + actionId));
+ String actionName = buildActionName(actionId);
+ context.registerReceiver(alarmReceiver, new IntentFilter(actionName));
- final long startTime = System.currentTimeMillis();
- alarmReceiver.setAlarm(millis, AlarmReceiver.WAKE_UP_THREAD_ACTION + "." + actionId);
+ long startTime = System.currentTimeMillis();
+ alarmReceiver.setAlarm(sleepDuration, actionName);
- while (System.currentTimeMillis() - startTime < millis) {
+ while (System.currentTimeMillis() - startTime < sleepDuration) {
try {
synchronized (this) {
- wait(millis - System.currentTimeMillis() + startTime);
+ wait(sleepDuration - (System.currentTimeMillis() - startTime));
}
} catch (InterruptedException e) {
Log.w(TAG, e);
@@ -58,25 +61,35 @@ public void sleep(long millis) {
context.unregisterReceiver(alarmReceiver);
} catch(Exception e) {
Log.w(TAG, "Exception during sleep ...",e);
- }finally {
+ } finally {
actionIdList.remove(actionId);
}
}
+ private static String buildActionName(int actionId) {
+ return AlarmReceiver.WAKE_UP_THREAD_ACTION + "." + actionId;
+ }
+
private class AlarmReceiver extends BroadcastReceiver {
private static final String WAKE_UP_THREAD_ACTION = "org.thoughtcrime.securesms.util.AlarmSleepTimer.AlarmReceiver.WAKE_UP_THREAD";
private void setAlarm(long millis, String action) {
final Intent intent = new Intent(action);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.mutable());
- final AlarmManager alarmManager = ContextCompat.getSystemService(context, AlarmManager.class);
-
- Log.w(TAG, "Setting alarm to wake up in " + millis + "ms.");
-
- AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager,
- AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + millis,
- pendingIntent);
+ final AlarmManager alarmManager = ServiceUtil.getAlarmManager(context);
+
+ if (Build.VERSION.SDK_INT < 31 || alarmManager.canScheduleExactAlarms()) {
+ Log.d(TAG, "Setting an exact alarm to wake up in " + millis + "ms.");
+ AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager,
+ AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + millis,
+ pendingIntent);
+ } else {
+ Log.w(TAG, "Setting an inexact alarm to wake up in " + millis + "ms. CanScheduleAlarms: " + alarmManager.canScheduleExactAlarms());
+ alarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + millis,
+ pendingIntent);
+ }
}
@Override
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 1a6925e210..8ed7b58697 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
@@ -81,7 +81,7 @@ public final class FeatureFlags {
private static final String RETRY_RECEIPTS = "android.retryReceipts";
private static final String MAX_GROUP_CALL_RING_SIZE = "global.calling.maxGroupCallRingSize";
private static final String GROUP_CALL_RINGING = "android.calling.groupCallRinging";
- private static final String STORIES = "android.stories.2";
+ private static final String STORIES = "android.stories.3";
private static final String STORIES_TEXT_FUNCTIONS = "android.stories.text.functions";
private static final String HARDWARE_AEC_BLOCKLIST_MODELS = "android.calling.hardwareAecBlockList";
private static final String SOFTWARE_AEC_BLOCKLIST_MODELS = "android.calling.softwareAecBlockList";
@@ -96,12 +96,14 @@ public final class FeatureFlags {
private static final String TELECOM_MANUFACTURER_ALLOWLIST = "android.calling.telecomAllowList";
private static final String TELECOM_MODEL_BLOCKLIST = "android.calling.telecomModelBlockList";
private static final String CAMERAX_MODEL_BLOCKLIST = "android.cameraXModelBlockList";
+ private static final String CAMERAX_MIXED_MODEL_BLOCKLIST = "android.cameraXMixedModelBlockList";
private static final String RECIPIENT_MERGE_V2 = "android.recipientMergeV2";
private static final String CDS_V2_LOAD_TEST = "android.cdsV2LoadTest";
- private static final String SMS_EXPORTER = "android.sms.exporter";
+ private static final String SMS_EXPORTER = "android.sms.exporter.2";
private static final String CDS_V2_COMPAT = "android.cdsV2Compat.4";
public static final String STORIES_LOCALE = "android.stories.locale";
private static final String HIDE_CONTACTS = "android.hide.contacts";
+ public static final String MEDIA_PREVIEW_V2 = "android.mediaPreviewV2";
/**
* We will only store remote values for flags in this set. If you want a flag to be controllable
@@ -150,12 +152,14 @@ public final class FeatureFlags {
TELECOM_MANUFACTURER_ALLOWLIST,
TELECOM_MODEL_BLOCKLIST,
CAMERAX_MODEL_BLOCKLIST,
+ CAMERAX_MIXED_MODEL_BLOCKLIST,
RECIPIENT_MERGE_V2,
CDS_V2_LOAD_TEST,
SMS_EXPORTER,
CDS_V2_COMPAT,
STORIES_LOCALE,
- HIDE_CONTACTS
+ HIDE_CONTACTS,
+ MEDIA_PREVIEW_V2
);
@VisibleForTesting
@@ -220,7 +224,8 @@ public final class FeatureFlags {
RECIPIENT_MERGE_V2,
CDS_V2_LOAD_TEST,
CDS_V2_COMPAT,
- STORIES
+ STORIES,
+ MEDIA_PREVIEW_V2
);
/**
@@ -244,7 +249,10 @@ public final class FeatureFlags {
*/
private static final Map FLAG_CHANGE_LISTENERS = new HashMap() {{
put(MESSAGE_PROCESSOR_ALARM_INTERVAL, change -> MessageProcessReceiver.startOrUpdateAlarm(ApplicationDependencies.getApplication()));
- put(STORIES, change -> ApplicationDependencies.getJobManager().startChain(new RefreshAttributesJob()).then(new RefreshOwnProfileJob()).enqueue());
+ put(STORIES, change -> {
+ ApplicationDependencies.getJobManager().startChain(new RefreshAttributesJob()).then(new RefreshOwnProfileJob()).enqueue();
+ ApplicationDependencies.restartAllNetworkConnections();
+ });
put(GIFT_BADGE_RECEIVE_SUPPORT, change -> ApplicationDependencies.getJobManager().startChain(new RefreshAttributesJob()).then(new RefreshOwnProfileJob()).enqueue());
}};
@@ -489,6 +497,11 @@ public static boolean storiesTextFunctions() {
return getString(CAMERAX_MODEL_BLOCKLIST, "");
}
+ /** A comma-separated list of manufacturers that should *not* use CameraX mixed mode. */
+ public static @NonNull String cameraXMixedModelBlocklist() {
+ return getString(CAMERAX_MIXED_MODEL_BLOCKLIST, "");
+ }
+
/** Whether or not hardware AEC should be used for calling on devices older than API 29. */
public static boolean useHardwareAecIfOlderThanApi29() {
return getBoolean(USE_HARDWARE_AEC_IF_OLD, false);
@@ -541,6 +554,13 @@ public static boolean hideContacts() {
return getBoolean(HIDE_CONTACTS, false);
}
+ /**
+ * Whether or not we should use the new media preview fragment implementation.
+ */
+ public static boolean mediaPreviewV2() {
+ return getBoolean(MEDIA_PREVIEW_V2, false);
+ }
+
/** Only for rendering debug info. */
public static synchronized @NonNull Map getMemoryValues() {
return new TreeMap<>(REMOTE_VALUES);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt
index b7254adf5a..eaebd6b857 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt
@@ -7,6 +7,7 @@ import android.view.View
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
+import androidx.core.widget.NestedScrollView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.animation.ArgbEvaluatorCompat
import com.google.android.material.appbar.AppBarLayout
@@ -47,6 +48,14 @@ open class Material3OnScrollHelper(
private var animator: ValueAnimator? = null
private var active: Boolean? = null
+ fun attach(nestedScrollView: NestedScrollView) {
+ nestedScrollView.setOnScrollChangeListener(
+ OnScrollListener().apply {
+ onScrollChange(nestedScrollView, 0, 0, 0, 0)
+ }
+ )
+ }
+
fun attach(recyclerView: RecyclerView) {
recyclerView.addOnScrollListener(
OnScrollListener().apply {
@@ -57,7 +66,7 @@ open class Material3OnScrollHelper(
fun attach(appBarLayout: AppBarLayout) {
appBarLayout.addOnOffsetChangedListener(
- OnOffsetChangedListener().apply {
+ OnScrollListener().apply {
onOffsetChanged(appBarLayout, 0)
}
)
@@ -119,15 +128,17 @@ open class Material3OnScrollHelper(
viewStubs.filter { it.resolved() }.forEach { it.get().setBackgroundColor(color) }
}
- private inner class OnScrollListener : RecyclerView.OnScrollListener() {
+ private inner class OnScrollListener : RecyclerView.OnScrollListener(), AppBarLayout.OnOffsetChangedListener, NestedScrollView.OnScrollChangeListener {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
updateActiveState(recyclerView.canScrollVertically(-1))
}
- }
- private inner class OnOffsetChangedListener : AppBarLayout.OnOffsetChangedListener {
override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {
updateActiveState(verticalOffset != 0)
}
+
+ override fun onScrollChange(v: NestedScrollView, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
+ updateActiveState(v.canScrollVertically(-1))
+ }
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/rx/RxStore.kt b/app/src/main/java/org/thoughtcrime/securesms/util/rx/RxStore.kt
index a36ced2e07..bab6d2cefa 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/rx/RxStore.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/rx/RxStore.kt
@@ -1,8 +1,10 @@
package org.thoughtcrime.securesms.util.rx
+import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.disposables.Disposable
+import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.processors.BehaviorProcessor
import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.PublishSubject
@@ -10,11 +12,14 @@ import io.reactivex.rxjava3.subjects.PublishSubject
/**
* Rx replacement for Store.
* Actions are run on the computation thread by default.
+ *
+ * This class is disposable, and should be explicitly disposed of in a ViewModel's onCleared method
+ * to prevent memory leaks. Disposing instances of this class is a terminal action.
*/
class RxStore(
defaultValue: T,
scheduler: Scheduler = Schedulers.computation()
-) {
+) : Disposable {
private val behaviorProcessor = BehaviorProcessor.createDefault(defaultValue)
private val actionSubject = PublishSubject.create<(T) -> T>().toSerialized()
@@ -22,20 +27,30 @@ class RxStore(
val state: T get() = behaviorProcessor.value!!
val stateFlowable: Flowable = behaviorProcessor.onBackpressureLatest()
- init {
- actionSubject
- .observeOn(scheduler)
- .scan(defaultValue) { v, f -> f(v) }
- .subscribe { behaviorProcessor.onNext(it) }
- }
+ val actionDisposable: Disposable = actionSubject
+ .observeOn(scheduler)
+ .scan(defaultValue) { v, f -> f(v) }
+ .subscribe { behaviorProcessor.onNext(it) }
fun update(transformer: (T) -> T) {
actionSubject.onNext(transformer)
}
- fun update(flowable: Flowable, transformer: (U, T) -> T): Disposable {
+ @CheckResult
+ fun update(flowable: Flowable, transformer: (U, T) -> T): Disposable {
return flowable.subscribe {
actionSubject.onNext { t -> transformer(it, t) }
}
}
+
+ /**
+ * Dispose of the underlying scan chain. This is terminal.
+ */
+ override fun dispose() {
+ actionDisposable.dispose()
+ }
+
+ override fun isDisposed(): Boolean {
+ return actionDisposable.isDisposed
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java
index d0729570e5..856760d541 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java
@@ -71,6 +71,7 @@ public static Notification getCallInProgressNotification(Context context, int ty
builder.addAction(getServiceNotificationAction(context, WebRtcCallService.hangupIntent(context), R.drawable.ic_call_end_grey600_32dp, R.string.NotificationBarManager__cancel_call));
} else {
builder.setContentText(context.getString(R.string.NotificationBarManager_signal_call_in_progress));
+ builder.setOnlyAlertOnce(true);
builder.addAction(getServiceNotificationAction(context, WebRtcCallService.hangupIntent(context), R.drawable.ic_call_end_grey600_32dp, R.string.NotificationBarManager__end_call));
}
diff --git a/app/src/main/res/drawable-night/contact_selection_checkbox_dialog.xml b/app/src/main/res/drawable-night/contact_selection_checkbox_dialog.xml
index bc6f9d9588..feb423fdb4 100644
--- a/app/src/main/res/drawable-night/contact_selection_checkbox_dialog.xml
+++ b/app/src/main/res/drawable-night/contact_selection_checkbox_dialog.xml
@@ -15,7 +15,7 @@
-
-
+
diff --git a/app/src/main/res/drawable/contact_selection_checkbox_dialog.xml b/app/src/main/res/drawable/contact_selection_checkbox_dialog.xml
index 43f5c486e0..ca684a5346 100644
--- a/app/src/main/res/drawable/contact_selection_checkbox_dialog.xml
+++ b/app/src/main/res/drawable/contact_selection_checkbox_dialog.xml
@@ -15,7 +15,7 @@
-
-
+
diff --git a/app/src/main/res/drawable/ic_payment_security_setup_lock.xml b/app/src/main/res/drawable/ic_payment_security_setup_lock.xml
new file mode 100644
index 0000000000..2696890429
--- /dev/null
+++ b/app/src/main/res/drawable/ic_payment_security_setup_lock.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/rounded_rectangle_secondary_22.xml b/app/src/main/res/drawable/rounded_rectangle_secondary_22.xml
new file mode 100644
index 0000000000..213e46e417
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_rectangle_secondary_22.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rounded_rectangle_variant_22.xml b/app/src/main/res/drawable/rounded_rectangle_variant_22.xml
new file mode 100644
index 0000000000..bfb8b1f886
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_rectangle_variant_22.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_mediapreview_v2.xml b/app/src/main/res/layout/activity_mediapreview_v2.xml
new file mode 100644
index 0000000000..fa93ff97d4
--- /dev/null
+++ b/app/src/main/res/layout/activity_mediapreview_v2.xml
@@ -0,0 +1,7 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/all_signal_connections_row_item.xml b/app/src/main/res/layout/all_signal_connections_row_item.xml
new file mode 100644
index 0000000000..dbb652ff9b
--- /dev/null
+++ b/app/src/main/res/layout/all_signal_connections_row_item.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml b/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml
index 145f3a9c8b..306cb47128 100644
--- a/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml
+++ b/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml
@@ -246,8 +246,9 @@
style="@style/Signal.Widget.Button.Large.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginTop="48dp"
android:layout_marginBottom="44dp"
- android:minWidth="221dp"
+ android:minWidth="220dp"
android:text="@string/ChooseANewDefaultSmsAppFragment__continue"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/choose_initial_my_story_membership_fragment.xml b/app/src/main/res/layout/choose_initial_my_story_membership_fragment.xml
index 6885439424..ce2b826e01 100644
--- a/app/src/main/res/layout/choose_initial_my_story_membership_fragment.xml
+++ b/app/src/main/res/layout/choose_initial_my_story_membership_fragment.xml
@@ -1,10 +1,10 @@
+ android:layout_height="wrap_content"
+ tools:viewBindingIgnore="true">
-
+ android:paddingStart="@dimen/dsl_settings_gutter">
+ android:clickable="false"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+ android:text="@string/ChooseInitialMyStoryMembershipFragment__all_signal_connections"
+ app:layout_constrainedWidth="true"
+ app:layout_constraintBottom_toTopOf="@+id/choose_initial_my_story_all_signal_connnections_count"
+ app:layout_constraintEnd_toStartOf="@id/choose_initial_my_story_all_signal_connnections_view"
+ app:layout_constraintStart_toEndOf="@id/choose_initial_my_story_all_signal_connnections_radio"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_chainStyle="packed" />
-
+
+
+
+
+
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_chainStyle="packed" />
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_chainStyle="packed" />
-
+ android:orientation="vertical">
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:layout_height="match_parent"
+ android:fillViewport="true">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_media_preview_v2.xml b/app/src/main/res/layout/fragment_media_preview_v2.xml
new file mode 100644
index 0000000000..83802f0b53
--- /dev/null
+++ b/app/src/main/res/layout/fragment_media_preview_v2.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/payments_security_setup_fragment.xml b/app/src/main/res/layout/payments_security_setup_fragment.xml
new file mode 100644
index 0000000000..f28c96d797
--- /dev/null
+++ b/app/src/main/res/layout/payments_security_setup_fragment.xml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/progress_card.xml b/app/src/main/res/layout/progress_card.xml
index 0bd315bb58..413df39505 100644
--- a/app/src/main/res/layout/progress_card.xml
+++ b/app/src/main/res/layout/progress_card.xml
@@ -12,5 +12,6 @@
android:layout_gravity="center"
android:layout_margin="24dp"
android:indeterminate="true"
+ android:background="@color/transparent"
app:indicatorColor="@color/signal_colorPrimary" />
diff --git a/app/src/main/res/layout/progress_card_dialog.xml b/app/src/main/res/layout/progress_card_dialog.xml
new file mode 100644
index 0000000000..2130169a6b
--- /dev/null
+++ b/app/src/main/res/layout/progress_card_dialog.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/stories_base_recipient_selection_fragment.xml b/app/src/main/res/layout/stories_base_recipient_selection_fragment.xml
index bad2a17c19..be1b262828 100644
--- a/app/src/main/res/layout/stories_base_recipient_selection_fragment.xml
+++ b/app/src/main/res/layout/stories_base_recipient_selection_fragment.xml
@@ -1,10 +1,10 @@
+ android:layout_height="match_parent"
+ tools:viewBindingIgnore="true">
+ app:navigationIcon="@drawable/ic_arrow_left_24"
+ app:titleTextAppearance="@style/Signal.Text.TitleLarge" />
-
+ android:layout_gravity="bottom"
+ android:orientation="vertical">
+ android:layout_height="4dp"
+ android:background="@drawable/bottom_toolbar_shadow"
+ app:layout_constraintTop_toTopOf="parent" />
-
+
+
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/stories_choose_group_bottom_sheet.xml b/app/src/main/res/layout/stories_choose_group_bottom_sheet.xml
index c268f77be7..cedb998b93 100644
--- a/app/src/main/res/layout/stories_choose_group_bottom_sheet.xml
+++ b/app/src/main/res/layout/stories_choose_group_bottom_sheet.xml
@@ -22,8 +22,7 @@
android:layout_marginTop="12dp"
android:gravity="center"
android:text="@string/ChooseGroupStoryBottomSheet__choose_groups"
- android:textAppearance="@style/Signal.Text.Body"
- android:textStyle="bold" />
+ android:textAppearance="@style/Signal.Text.TitleMedium" />
+ android:textColor="@color/signal_colorOnSurfaceVariant"
+ app:backgroundTint="@color/signal_colorSurface5" />
+ android:layout_height="match_parent"
+ tools:viewBindingIgnore="true">
+ app:title="@string/EditPrivateStoryNameFragment__edit_story_name"
+ app:titleTextAppearance="@style/Signal.Text.TitleLarge" />
+ tools:layout_gravity="bottom"
+ tools:viewBindingIgnore="true">
-
+ app:layout_constraintBottom_toBottomOf="parent">
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/stories_viewer_fragment_page.xml b/app/src/main/res/layout/stories_viewer_fragment_page.xml
index 0448ad2e6d..2a263b2110 100644
--- a/app/src/main/res/layout/stories_viewer_fragment_page.xml
+++ b/app/src/main/res/layout/stories_viewer_fragment_page.xml
@@ -84,6 +84,27 @@
tools:icon="@drawable/ic_reply_24_outline"
tools:text="6 views 4 replies" />
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/payments_preferences.xml b/app/src/main/res/navigation/payments_preferences.xml
index f052ec26e7..8d0c8798c2 100644
--- a/app/src/main/res/navigation/payments_preferences.xml
+++ b/app/src/main/res/navigation/payments_preferences.xml
@@ -112,6 +112,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
Netwerk misluk!
Nommer nie geregistreer nie!
Die nommer wat jy geskakel het, ondersteun nie veilige telefoonoproepe nie!
- Het dit
+ Ek verstaan
@@ -1960,6 +1960,7 @@
%1$s aan jou
Media nie meer beskikbaar nie.
Kan nie \'n toepassing vind wat hierdie media kan deel nie.
+ Maak toe
%1$d nuwe boodskappe in %2$d gesprekke
@@ -2748,10 +2749,14 @@
Pasmaak-opsie
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Nie nou nie
+
+
+ Sekuriteitsopstelling
+
+ Beskerm jou fondse
+
+ Help om te verhoed dat iemand met jou foon toegang tot jou fondse verkry deur nog \'n vlak van sekuriteit by te voeg. Jy kan hierdie opsie in Instellings deaktiveer.
+
+ Aktiveer betalingsluiting
+
+ Nie nou nie
+
+ Slaan hierdie stap oor?
+
+ As jy hierdie stap oorslaan, kan enigiemand wat fisiese toegang tot jou foon het, toegelaat word om fondse oor te plaas of jou herstelfrase te sien.
+
+ Kanselleer
+
+ Slaan oor
+
Voeg fondse by
Jou beursie-adres
@@ -4733,7 +4758,7 @@
Tik om weer te probeer
- Versteek storie
+ Versteek storie?
Nuwe storiebywerkings van %1$s sal nie meer boaan die storielys verskyn nie.
@@ -4799,6 +4824,8 @@
Verwyder kyker.
Nog geen antwoorde nie
+
+ Jy kan nie op hierdie storie antwoord nie, want jy is nie meer \'n lid van hierdie groep nie.
Het op die storie gereageer
@@ -4817,6 +4844,13 @@
Skrap
My Storie
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Wie hierdie storie kan sien
@@ -4828,7 +4862,7 @@
Almal behalwe…
- Versteek jou storie van spesifieke persone
+ Versteek jou storie vir spesifieke mense
- %1$d persoon uitgesluit
@@ -4851,8 +4885,6 @@
Laat antwoorde & toe; reaksies
Laat toe dat mense wat na jou storie kan kyk, daarop reageer en antwoord
-
- Versteek jou storie vir spesifieke mense. By verstek word jou storie met jou %1$s gedeel
Signal-verbindings
@@ -4911,6 +4943,22 @@
Deel slegs met…
Klaar
+
+ Verwyder groepstorie?
+
+ “%1$s” sal verwyder word.
+
+ Verwyder
+
+ Skrap privaatstorie?
+
+ \"%1$s\" en opdaterings wat in hierdie storie gedeel word, sal uitgevee word.
+
+ Skrap
+
+ Stories is slegs vir Signal-beta-gebruikers beskikbaar.
+
+ As jy \'n storie deel, sal dit slegs beskikbaar wees vir mense wat op Signal-beta is.
Voeg by jou storie by?
@@ -4923,8 +4971,10 @@
Storie kon nie gestuur word nie. Kontroleer jou verbinding en probeer weer.
Stuur
+
+ Skakel af en vee uit
- Deel & Kyk na stories
+ Deel & Kyk na Stories
Jy sal nie meer stories kan deel of daarna kyk wanneer hierdie opsie afgeskakel is nie.
@@ -4939,7 +4989,7 @@
Benoem storie
- Storie se naam (vereis)
+ Storie se naam (word vereis)
Kykers
@@ -4977,7 +5027,7 @@
Storie gestuur
- Kon nie storie stuur nie.
+ Kon nie storie stuur nie
Kyk na storie
@@ -5063,14 +5113,19 @@
Deel slegs met
- - Private storie · %1$d kyker
- - Privaatstorie · %1$d kykers
+ - Privaatstorie · %1$d kyker
+ - Private storie · %1$d kykers
- Groepstorie · %1$d kyker
- Groepstorie · %1$d kykers
+
+
+ - %1$d lid
+ - %1$d lede
+
- %1$s · %2$d kyker
@@ -5139,7 +5194,7 @@
Alle verbindings is nagegaan, tik stuur om voort te gaan.
- Jy het %1$d verbindings wat moontlik Signal herinstalleer of van toestelle verander het. Voordat jy jou storie met hulle deel, gaan hulle veiligheidsnommers na of oorweeg dit om hulle uit jou storie te verwyder.
+ Jy het %1$d konneksies wat moontlik Signal herinstalleer of van toestelle verander het. Voordat jy jou storie met hulle deel, gaan hulle veiligheidsnommers na of oorweeg dit om hulle uit jou storie te verwyder.
Verifieer veiligheidsnommer
@@ -5206,7 +5261,7 @@
Wil jy stories afskakel?
- Jy sal nie meer stories kan deel of kyk nie. Enige stories wat jy onlangs gestuur het, sal steeds vir andere sigbaar wees totdat dit verval.
+ Jy sal nie meer stories kan deel of sien nie. Storiebywerkings wat jy onlangs gedeel het, sal ook uitgevee word.
Storieprivaatheid
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 48ce5ab134..002b56726c 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -197,7 +197,7 @@
تحديث التطبيق
لا تقم بالتحديث
تحذير
- لقد انتهت صلاحية إصدار Signal الخاص بك. يمكنك عرض محفوظات رسائلك ولكنك لن يصبح بإمكانك إرسال أو استلام الرسائل إلى حين قيامك بالتحديث.
+ لقد انتهت صلاحية إصدار Signal الخاص بك. يُمكنك عرض محفوظات رسائلك ولكنك لن تتمكّن من إرسال أو استلام الرسائل إلى حين قيامك بالتحديث.
لم يتم العثور على متصفح للإنترنت.
@@ -765,7 +765,7 @@
ما هي المجموعات الجديدة ؟
تحوي المجموعات الجديدة ميزات كـ @mentions والمشرفين على المجموعة، كما ستدعم مستقبلا المزيد من الميزات.
- تم الاحتفاظ بكل محفوظات الرسائل والوسائط قبل الترقية.
+ سيُحتفظ بكل محفوظات الرسائل والوسائط التي كانت قبل الترقية.
قبول دعوة الانضمام إلى هذه المجموعة مرة أخرى ضروري، ولن تصلك أي رسائل من المجموعة إلى حين موافقتك علي الانضمام إليها.
- يحتاج هذا العضو قبول دعوة الانضمام إلى هذه المجموعة مرة أخرى، ولن تصله أي رسائل من المجموعة إلى حين موافقته على الانضمام إليها :
@@ -788,7 +788,7 @@
قم بالترقية إلى مجموعة جديدة
يُرجى ترقية هذه المجموعة
تحوي المجموعات الجديدة ميزات كـ @mentions والمشرفين على المجموعة، كما ستدعم مستقبلا المزيد من الميزات.
- ستُحتفَظ كل محفوظات الرسائل والوسائط قبل الترقية.
+ سيُحتفظ بكل محفوظات الرسائل والوسائط التي كانت قبل الترقية.
حدث خطأ في الشبكة. يُرجى المحاولة مرة أخرى لاحقا.
فشلت الترقية.
@@ -2256,6 +2256,7 @@
%1$s إليك
هذه الوسيط لم يعد متاحا.
لم يعثر على تطبيق قادر على فتح هذا الملف.
+ إغلاق
%1$d رسائل جديدة في %2$d محادثات
@@ -2679,7 +2680,7 @@
لقد نُسخ ثم أُرسل مع التاريخ إلى الحافظة
- سوف يظهر تحديث قصتك هنا.
+ ستظهر تحديثات قصتك هنا.
@@ -3009,12 +3010,12 @@
صوت
مراجعة سعة التخزين
أأحذف الرسائل القديمة ؟
- أأمحو محفوظات الرسائل ؟
- سوف تُحذَف من جهازك كل الملفات الأقدم من %1$s نهائيا، بما في ذلك محفوظات الرسائل والوسائط.
+ محو محفوظات الرسائل؟
+ ستُحذَف جميع محفوظات الرسائل والوسائط الأقدم من %1$s من جهازك بصفة نهائية.
سوف يتم تقليم كل المحادثات إلى أحدث %1$s رسالة.
- سوف تُحذَف كل محفوظات الرسائل والوسائط نهائيا من جهازك.
- أأنت على يقين من نيتك حذف كل محفوظات الرسائل ؟
- ستُزال محفوظات الرسائل نهائيا. لن يتم التراجع عن هذا الإجراء.
+ ستُحذَف جميع محفوظات الرسائل والوسائط من جهازك بصفة نهائية.
+ هل أنت متأكد من أنك تريد حذف كل محفوظات الرسائل ؟
+ ستُحذف محفوظات الرسائل نهائيًا. لن يتم التراجع عن هذا الإجراء.
حذف الكل الآن
للأبد
عام واحد
@@ -3092,10 +3093,14 @@
تخصيص الخيارات
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3248,6 +3253,26 @@
ليس الآن
+
+
+ إعداد الأمان
+
+ اِحم أموالك
+
+ ساعد في منع أي شخص يستخدم هاتفكَ من الوصول إلى أموالك عن طريقة إضافة طبقة أخرى من الأمان. يُمكنك تعطيل هذا الخيار في الإعدادات.
+
+ تفعيل قفل عمليات الدفع
+
+ ليس الآن
+
+ تَخَطّ هذه الخطوة
+
+ قد يُؤدي تخطِّي هذه الخطوة إلى السماح لأي شخص يستخدم هاتفك بتحويل الأموال أو الاطّللاع على عبارة الاسترداد الخاصة بك.
+
+ إلغاء
+
+ تخطّي
+
إضافة مبالغ
عنوان محفظتك
@@ -4652,7 +4677,7 @@
إضافة نص
إعادة توجيه أسرع
- سَيتم تجزئة الفيديوهات إلى مقاطع من 30 ثانية وإرسالها كعدة قصص.
+ سَيتم تجزئة الفيديوهات إلى مقاطع من 30 ثانية وإرسالها كعدة قِصص.
لا يمكن أن تتعدى الفيديوهات المرسلة كقِصص 30 ثانية.
لقد أُرسِلت اﻵن الرسائل الموجَّهة فورا.
@@ -5149,9 +5174,9 @@
يُرجى اللمس لإعادة المحاولة
- أأخفي القصة ؟
+ إخفاء القصة؟
- إن مستجدات قصص %1$s الحديثة لن تظهر في أعلى لائحة القصص بعد ذلك.
+ لن تظهر مستجدات قِصص %1$s الجديدة في أعلى لائحة القصص بعد الآن.
إخفاء
@@ -5172,9 +5197,9 @@
قصص %1$s
- أأحذف القصة ؟
+ حذف القصة؟
- سوف تُحذَف هذه القصة من عند جميع من استلمها بما، فيهم أنت.
+ ستُحذَف هذه القصة من عند جميع من استلمها بما فيهم أنت.
تعذّر الحفظ
@@ -5214,7 +5239,7 @@
لا مشاهدة حاليا
- تفعيل إيصالات القراءة لرؤية من شاهد قصصك.
+ فًعّل إيصالات القراءة لرؤية من شاهد قصصك.
الانتقال إلى الإعدادات
@@ -5227,6 +5252,8 @@
إزالة المُشاهد؟
لا جواب حاليا
+
+ لا تستطيع الردّ على هذه القصة لأنك لم تعد عضواً في هذه المجموعة.
المتفاعلون مع القصة
@@ -5234,7 +5261,7 @@
الإجابات
- التفاعل مع هذه القصة
+ تفاعل مع هذه القصة
الإجابة بشكل خاص على %1$s
@@ -5245,6 +5272,17 @@
حذف
قصتي
+
+
+ - %1$d viewers
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
من يُمكنه مُشاهدة هذه القصة
@@ -5256,7 +5294,7 @@
الكل إلا…
- إخفاء قصتك من أناس مُحددين
+ إخفاء قصتك عن أناس مُحددين
- %1$d شخصا مستبعدا
@@ -5280,15 +5318,13 @@
- %1$d فرد
- اختر من يُمكنه رؤية قصتك. لن تؤثر التغييرات على القصص التي أرسلتها من قبل.
+ اِختر من يُمكنه رؤية قصتك. لن تؤثر التغييرات على القصص التي أرسلتها من قبل.
الإجابات وردود الفعل
السماح بالإجابات وردود الفعل
- تمكين الأفراد الذين يمكنهم مشاهدة قصتك من التفاعل والرد عليها
-
- إخفاء قصتك عن أفراد محددين. إن قصتك تتم مشاركتها افتراضيا مع %1$s.
+ تمكين الأفراد الذين يُمكنهم مشاهدة قصتك من التفاعل والرد عليها
جهات الاتصال في Signal
@@ -5300,7 +5336,7 @@
وجودهم في جهات اتصال نظامك
- "يمكنك لمعارفك رؤية اسمك وصورتك، كما يمكنهم الاطلاع على منشوراتك في « قصتي » إلا إذا أخفيتها عنهم."
+ "يُمكن لِجهات اتصالك رؤية اسمك وصورتك، كما يمكنهم الاطلاع على منشوراتك في \"قصتي\" إلا إذا أخفيتها عنهم."
إضافة مُشاهد
@@ -5308,7 +5344,7 @@
إزالة %1$s ؟
- لن يتمكن هذا الشخص بعد ذلك من رؤية قصتك.
+ لن يتمكن هذا الشخص من رؤية قصتك بعد الآن.
إزالة
@@ -5336,7 +5372,7 @@
يُرجى كتابة أو لصق عنوان الصفحة
- مشاركة وصلة مع مشاهدي قصتك
+ مشاركة رابط مع مشاهدي قصتك
البحث
@@ -5347,20 +5383,38 @@
مشاركة فقط مع…
تمّ
+
+ حذف قصة المجموعة؟
+
+ سيتم حذف \"%1$s\"
+
+ إزالة
+
+ حذف قصة خاصة؟
+
+ سيتم حذف \"%1$s\" والتحديثات التي تمت مشاركتها في هذه القصة.
+
+ حذف
+
+ القصص متاحة لمستخدمي الإصدار التجريبي لتطبيق Signal فقط.
+
+ إذا قمت بمشاركة قصة، فلن تكون متاحة إلا للأشخاص الذين يستخدمون الإصدار التجريبي لتطبيق Signal.
- أأضيف للقصة ؟
+ إضافة للقصة؟
- إن إضافة محتوى لقصتك سوف يمكِّن معارف Signal من مشاهدتها لمدة 24 ساعة. يمكنك تغيير من يمكنه مشاهدة قصصك في الإعدادات.
+ يَسمح إضافة محتوى لقصتك لجهات اتصال Signal من مشاهدتها لمدة 24 ساعة. يُمكنك تغيير من يمكنه مشاهدة قصصك في الإعدادات.
- الإضافة للقصة
+ إضافة للقصة
تحرير المشاهدين
لقد تعذر إرسال القصة. يُرجى التحقق من اتصالك ثم المحاولة مرة أخرى.
أرسلْ
+
+ إيقاف وحذف
- مشاركة أو إظهار القصص
+ مشاركة و إظهار القصص
لن يصبح بإمكانك بعد الآن مشاركة القصص أو مشاهدتها حينما يكون هذا الخيار غير مُشغَّل.
@@ -5415,11 +5469,11 @@
لقد تعذر تحميل المحتوى
- القصة مُرسَلة
+ قصة مُرسَلة
لقد فشل إرسال القصة
- عرض قصة
+ عرض القصة
عرض صورة الحساب الشخصي
@@ -5435,9 +5489,9 @@
لقد تفاعلت مع قصة %1$s
- التفاعلات مع قصتك
+ تفاعل مع قصتك
- التفاعلات مع قصة
+ تفاعل مع قصة
@@ -5508,20 +5562,29 @@
- قصة خاصة · %1$d مشاهد
- - قصة خاصة · %1$d مشاهد
- - قصة خاصة · %1$d مشاهدين
+ - قصة خاصة · مشاهد واحد
+ - قصة خاصة · %1$d مشاهدين
- قصة خاصة · %1$d مشاهدين
- - قصة خاصة · %1$d مشاهدين
- - قصة خاصة · %1$d مشاهدين / مشاهد
+ - قصة خاصة · %1$d مشاهدًا
+ - قصة خاصة · %1$d مشاهد
- قصة جماعية · %1$d مشاهد
- - قصة جماعية · %1$d مشاهد
- - قصة جماعية · %1$d مشاهدين
+ - قصة جماعية · مشاهد واحد
+ - قصة جماعية · %1$d مشاهدين
- قصة جماعية · %1$d مشاهدين
- - قصة جماعية · %1$d مشاهدين
- - قصة جماعية · %1$d مشاهدين / مشاهد
+ - قصة جماعية · %1$d مشاهدًا
+ - قصة جماعية · %1$d مشاهد
+
+
+
+ - %1$d عضو
+ - %1$d عضو
+ - %1$d عضوان
+ - %1$d أعضاء
+ - %1$d عضوًا
+ - %1$d عضو
@@ -5543,13 +5606,13 @@
حذف قصة المجموعة؟
- سَيتسبب هذا في إزالة القصة من هذه اللائحة. يُمكنك مواصلة مشاهدة هذه القِصص من هذه المجموعة.
+ سَيتسبب هذا في إزالة القصة من هذه اللائحة. يُمكنك مواصلة مشاهدة القِصص من هذه المجموعة.
إزالة
- أأحذف القصة ؟
+ حذف القصة؟
- حذف القصة الخصوصية \"%1$s\"؟
+ حذف القصة الخاصة \"%1$s\"؟
حذف
@@ -5589,7 +5652,7 @@
اسحب لليمين للمُغادرة
- فهِمت
+ عُلم
فتح قائمة السياق
@@ -5607,7 +5670,7 @@
تمت مراجعة كل جهات الاتصال، انقر إرسال للمواصلة.
- لديك %1$d جهات اتصال قد يكونوا أعادو تثبيت Signal أو غيّروا أجهزتهم. قبل مشاركة قِصتك معهم، يُرجى مراجعة أرقام الأمان الخاصة بهم أو فكّر في حذفهم من قصتك.
+ %1$d من جهات اتصالك قد يكونوا أعادو تثبيت Signal أو غيّروا أجهزتهم. قبل مشاركة قِصتك معهم، يُرجى مراجعة أرقام الأمان الخاصة بهم أو فكّر في حذفهم من قصتك.
تحقق من رقم اﻷمان
@@ -5641,7 +5704,7 @@
خصوصية قصّتي
- اختيار من يمكنه رؤية منشورات في قصتي. يمكنك إحداث تغييرات في أي وقت في الإعدادات.
+ اختيار من يُمكنه رؤية منشورات في قصتي. يُمكنك إحداث تغييرات في أي وقت في الإعدادات.
كل معارف Signal
@@ -5674,11 +5737,11 @@
تفعيل القِصص
- شارك واعرض قِصص الآخرين. تختفي القصص تلقائيًا بعد 24 ساعة.
+ شارك وشاهد قِصص الآخرين. تختفي القصص تلقائيًا بعد 24 ساعة.
إيقاف تشغيل القِصص؟
- لن تتمكن بعد الآن من مشاركة القِصص أو عرضها. ستظل أي قِصص أرسلتها مؤخرًا ظاهرة للآخرين حتى تنتهي صلاحيتها.
+ لن تتمكن من مشاركة القِصص أو مُشَاهداتها بعد الآن. وسيتم أيضًا حذف تحديثات القصة التي شاركتها مؤخرًا.
إعدادات خصوصية القِصة
@@ -5686,7 +5749,7 @@
من يُمكنه مشاهدة هذه القصة
- "يُمكن لعضو في هذه المجموعة \"%1$s\" مشاهدة هذه القصة و الرّد عليها. يمكنك تحديث العضوية لهذه الدردشة في المجموعة."
+ "يُمكن لعضو في هذه المجموعة %1$s مشاهدة هذه القصة و الرّد عليها. يمكنك تحديث العضوية لهذه الدردشة في المجموعة."
حذف قصة المجموعة
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 7f388c75f3..f9ce481a76 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -688,7 +688,7 @@
Yeni Qrupa yüksəlt
Bu qrupu yüksəlt
Yeni Qrupların @adçəkmə və qrup adminləri kimi özəllikləri var və gələcəkdə daha çox özəlliyi dəstəkləyəcək.
- Bütün mesaj tarixçəsi və media, yüksəldilməzdən əvvəl saxlanılacaq.
+ Bütün mesaj tarixçəsi və media yenilənmədən əvvəl saxlanılacaq.
Şəbəkə xətası ilə qarşılaşıldı. Daha sonra yenidən sınayın.
Yüksəldilmədi.
@@ -1855,9 +1855,9 @@
Bir hədiyyə nişanı aldınız
- Hekayənizə %1$sreaksiyası verdi
+ Hekayənizə %1$s reaksiyası verdi
- Hekayəyə %1$s reaksiyası verdiniz
+ Onun hekayəsinə %1$s reaksiyası verdiniz
Molly yeniləməsi
@@ -1960,6 +1960,7 @@
%1$s sizə göndərildi
Media artıq mövcud deyil.
Bu medianı paylaşmaq üçün bir tətbiq tapıla bilmir.
+ Bağla
%2$d danışıqdan %1$d yeni mesaj
@@ -2670,7 +2671,7 @@
Bu, bütün mesajları ən son %1$s mesaja qədər kəsəcək.
Bu, bütün mesaj tarixçəsini və mediaları cihazınızdan birdəfəlik siləcək.
Bütün mesaj tarixçənizi silmək istədiyinizə əminsiniz?
- Bütün mesaj tarixçəniz birdəfəlik silənəcək. Bu əməliyyatın geri dönüşü yoxdur.
+ Bütün mesaj tarixçəniz birdəfəlik silənəcək. Bu əməliyyat geri qaytarıla bilməz.
Hamısını indi sil
Həmişəlik
1 il
@@ -2748,10 +2749,14 @@
Seçimi özəlləşdir
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
İndi yox
+
+
+ Təhlükəsizlik quraşdırması
+
+ Vəsaitlərinizi qoruyun
+
+ Əlavə təhlükəsizlik səviyyəsi ilə başqa bir şəxsin telefonunuzdan vəsaitlərinizə daxil olmasının qarşısnı alın. Parametrlərdən bu seçimi qeyri-aktiv edə bilərsiniz.
+
+ Ödəniş kilidini aktivləşdirin
+
+ İndi yox
+
+ Bu addım ötürülsün?
+
+ Bu addımı ötürməklə telefonunuza fiziki girişi olan hər kəsin vəsaitlərinizi köçürmək və ya bərpa parolunuza baxmaq imkanı olacaq.
+
+ İmtina
+
+ Ötür
+
Pul əlavə et
Pulqabı ünvanınız
@@ -4750,11 +4775,11 @@
Yönləndir
- %1$s paylaşan hekayə
+ %1$s hekayə
Hekayə silinsin?
- Bu hekayə sizin və bunu alan hər kəs üçün silinəcək
+ Bu hekayə siz və bunu alan hər kəs üçün silinəcək.
Yaddaşda saxlamaq mümkün deyil
@@ -4799,6 +4824,8 @@
İzləyicini sil
Hələ ki, cavab yoxdur
+
+ Artıq bu qrupun üzvü olmadığınız üçün bu hekayəyə cavab verə bilmirsiniz.
Hekayəyə reaksiya verildi
@@ -4817,6 +4844,13 @@
Sil
Hekayəm
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Bu hekayəni kimlər görə bilər
@@ -4851,8 +4885,6 @@
Cavablara & reaksiyalara icazə ver
Hekayələrinizi görən şəxslərin reaksiya və cavab verməsinə icazə verin
-
- Hekayələrinizi müəyyən şəxslərdən gizlədin. İlkin olaraq hekayələriniz %1$s ilə paylaşılır
Signal Bağlantıları
@@ -4864,11 +4896,11 @@
Sistem əlaqə kitabçanızda mövcud olan
- "Bağlantılarınız, adınızı və fotonuzu görə bilər, onlardan gizlətmədiyiniz müddətcə hekayələrinizdəki göndərişləri də görə bilər."
+ "Bağlantılarınız adınızı və fotonuzu görə bilər, onlardan gizlətmədiyiniz müddətcə Hekayələrinizdəki göndərişləri də görə bilər."
İzləyici əlavə et
- Özəl hekayəni sil
+ Şəxsi hekayəni sil
%1$s çıxarılsın?
@@ -4900,7 +4932,7 @@
Yazın və ya bir URL yapışdırın
- Hekayənizin bir bağlantısını izləyicilərlə paylaşın
+ Hekayənizin bir keçidini izləyicilərlə paylaşın
Axtar
@@ -4911,20 +4943,38 @@
Yalnız bunlarla paylaşın…
Bitdi
+
+ Qrup hekayəsi silinsin?
+
+ \"%1$s\" silinəcək.
+
+ Çıxart
+
+ Şəxsi hekayə silinsin?
+
+ \"%1$s\" və bu hekayədə paylaşılan yeniləmələr silinəcək.
+
+ Sil
+
+ Hekayələr yalnız Signal beta üzvlərinə açıqdır.
+
+ Bir hekayə paylaşsanız, onu yalnız Signal beta üzvləri görə biləcək.
- Bir hekayə əlavə edilsin?
+ Hekayəyə əlavə edilsin?
- Hekayənizə məzmun əlavə etmək, Signal bağlantılarınızın 24 saat ərzində ona baxmasını təmin edir. Hekayələrinizə kimlərin baxa biləcəyini tənzimləmələrdən dəyişdirə bilərsiniz.
+ Hekayənizə məzmun əlavə etmək, Signal əlaqələrinizin 24 saat ərzində ona baxmasına imkan verir. Hekayələrinizə kimlərin baxa biləcəyini Parametrlərdən dəyişdirə bilərsiniz.
Hekayəyə əlavə et
İzləyicilərə düzəliş et
- Hekayə göndərilə bilmədi. Bağlantınızı yoxlayıb yenidən sınayın.
+ Hekayə göndərilə bilmədi. Əlaqənizi yoxlayıb yenidən sınayın.
Göndər
+
+ Söndür və sil
- Hekayələrə bax & onları paylaş
+ Hekayələrə bax və onları paylaş
Bu seçim bağlı olduqda hekayələrə baxa və ya onları paylaşa bilməyəcəksiniz.
@@ -4937,7 +4987,7 @@
- %1$d izləyici
- Hekayə adı
+ Hekayəni adlandır
Hekayə adı (tələb olunur)
@@ -4951,7 +5001,7 @@
Hamısını seç
- Hekayə növünü seçin
+ Hekayənizin növünü seçin
Yeni özəl hekayə
@@ -5060,7 +5110,7 @@
İndi yox
- Yalnız bununla paylaş:
+ Bununla paylaş:
- Məxfi hekayə · %1$d baxış
@@ -5071,6 +5121,11 @@
- Qrup hekayəsi · %1$d baxış
- Qrup hekayəsi · %1$d baxış
+
+
+ - %1$d üzv
+ - %1$d üzv
+
- %1$s · %2$d baxış
@@ -5079,11 +5134,11 @@
İzləyicilərinizi seçmək üçün toxunun
- Hekayə tənzimləmələri
+ Hekayə parametrləri
- Hekayəni çıxarın
+ Hekayəni sil
- Hekayəni silin
+ Hekayəni sil
Qrup hekayəsi silinsin?
@@ -5139,11 +5194,11 @@
Bütün əlaqələr nəzərdən keçirilib, davam etmək üçün \"Göndər\" düyməsinə toxunun.
- %1$d əlaqəniz Signal-ı yenidən quraşdırmış və ya cihazlarını dəyişmiş ola bilər. Hekayənizi onlarla paylaşmazdan əvvəl, onların təhlükəsizlik nömrələrini nəzərdən keçirin və ya onları hekayə izləyiciləri siyahınızdan çıxarın.
+ %1$d əlaqəniz Signal-ı yenidən quraşdırmış və ya cihazlarını dəyişmiş ola bilər. Hekayənizi onlarla paylaşmazdan əvvəl onların təhlükəsizlik nömrələrini nəzərdən keçirin və ya onları hekayə izləyiciləri siyahınızdan çıxarın.
Güvənlik nömrəsini təsdiqlə
- Hekayədən çıxarın
+ Hekayədən çıxart
Yenə də göndər
@@ -5194,19 +5249,19 @@
- Hekayələr 24 saat sonra avtomatik yox olur. Hekayənizə baxanları seçin, yaxud da konkret istifadəçi və ya qrupu olan yeni hekayələr yaradın.
+ Hekayələr 24 saat sonra avtomatik yox olur. Hekayənizə baxanları seçin, yaxud da xüsusi istifadəçi və ya qrupu olan yeni hekayələr yaradın.
Hekayələr xüsusiyyətini söndür
- Hekayələr xüsusiyyətini söndürsəniz, artıq hekayələri paylaşa və ya onlara baxa bilməyəcəksiniz.
+ Hekayələr xüsusiyyətini söndürsəniz, artıq hekayələri paylaşa və ya aça bilməyəcəksiniz.
Hekayələr xüsusiyyətini yandır
- Digərlərinin hekayələrinə baxın və onları paylaşın. Hekayələr 24 saat sonra avtomatik yox olur.
+ Digərlərinin hekayələrini paylaşın və açın. Hekayələr 24 saat sonra avtomatik yox olur.
Hekayələr xüsusiyyəti söndürülsün?
- Artıq hekayələrə baxa və ya onları paylaşa bilməyəcəksiniz. İstifadəçilər son göndərdiyiniz bütün hekayələri aktivlik müddəti bitənədək görə bilər.
+ Artıq hekayələri paylaşa və onlara baxa bilməyəcəksiniz. Ən son paylaşdığınız hekayə yeniləmələri də silinəcək.
Hekayənin məxfiliyi
@@ -5214,7 +5269,7 @@
Bu hekayəni kimlər görə bilər
- "\"%1$s\" qrupunun üzvləri bu hekayəni görə və cavablandıra bilər. Qrupda bu çat üzvlüyünü yeniləyə bilərsiniz."
+ "%1$s qrupunun üzvləri bu hekayəni görə və cavablandıra bilər. Qrupda bu çat üzvlüyünü yeniləyə bilərsiniz."
Qrup hekayəsini sil
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 8b82e44831..0089946206 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -673,7 +673,7 @@
Какво представляват Нови групи?
Новите групи имат функции като споменавания и администратори и ще поддържат още функции в бъдеще.
- Хронологията на разговорите и медиите бяха запазени.
+ Хронологията на разговорите и медията бяха запазени преди обновяването.
Трябва да приемете покана за влизане в групата и няма да получите съобщения от групата преди приемането на поканата.
- Този член трябва да приеме покана за присъединяване в тази група и няма да получава съобщения от групата, докато не се съгласи:
@@ -688,7 +688,7 @@
Обнови групата
Обнови тази група
Новите групи имат функции като споменавания и администратори и ще поддържат още функции в бъдеще.
- Хронологията на разговорите и медиите ще бъдат запазени.
+ Хронологията на разговорите и медията ще бъдат запазени преди обновяването.
Проблем по мрежата. Опитайте отново по-късно.
Неуспешен ъпгрейд.
@@ -1960,6 +1960,7 @@
От %1$s към вас
Тази мултимедия вече не е налична.
Не може да бъде намерено приложение, което да може да споделя тази мултимедия.
+ Затвори
%1$d нови съобщения в %2$d чата
@@ -2748,10 +2749,14 @@
Опция за персонализиране
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Не сега
+
+
+ Настройка на сигурността
+
+ Защитете средствата си
+
+ Предотвратете достъпа на човек с вашия телефон до средствата ви, като добавите още едно ниво на сигурност. Можете да деактивирате тази опция в Настройки.
+
+ Активирайте заключване на плащания
+
+ Не сега
+
+ Пропуснете тази стъпка?
+
+ Пропускането на тази стъпка може да позволи на всеки, който има физически достъп до телефона ви, да прехвърли средства или да види вашата фраза за възстановяване.
+
+ Отказ
+
+ Пропусни
+
Добавяне на средства
Адресът на вашия портфейл
@@ -4799,6 +4824,8 @@
Премахване на зрител
Все още няма отговори
+
+ Не може да отговорите на тази история, защото вече не сте член на тази група.
Реагира на историята
@@ -4817,6 +4844,13 @@
Изтриване
Моята история
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Кой може да вижда тази история
@@ -4851,8 +4885,6 @@
Позволяване на отговори и реакции
Позволете на хората, които могат да видят историята ви, да реагират и отговарят
-
- Скриване на историята ви от конкретни хора. По подразбиране историята ви се споделя с вашите %1$s
Signal Връзки
@@ -4911,6 +4943,22 @@
Споделяне само с…
Готово
+
+ Премахване на груповата история?
+
+ „ %1$s “ ще бъде премахнатa.
+
+ Премахни
+
+ Изтриване на частна история?
+
+ „ %1$s “ и актуализациите, споделени за тази история, ще бъдат изтрити.
+
+ Изтрий
+
+ Историите са достъпни само за бета потребители на Signal.
+
+ Ако споделите история, тя ще бъде достъпна само за хора, които използват бета версия на Signal.
Добавяне към историята?
@@ -4923,6 +4971,8 @@
Историята не можа да бъде изпратена. Проверете връзката си и опитайте отново.
Изпращане
+
+ Изключете и изтрийте
Споделяне и преглед на истории
@@ -5071,6 +5121,11 @@
- Групова история · %1$d зрител
- Групова история · %1$d зрители
+
+
+ - %1$d член
+ - %1$d членове
+
- %1$s · %2$d зрител
@@ -5206,7 +5261,7 @@
Изключване на истории?
- Повече няма да можете да споделяте или виждате истории. Историите, които сте изпратили наскоро, все още ще бъдат видими за другите, докато не изтекат.
+ Повече няма да можете да споделяте или гледате истории. Актуализациите на истории, които сте споделили наскоро, също ще бъдат изтрити.
Поверителност на история
@@ -5229,7 +5284,7 @@
Направете експорт на вашите SMS съобщения
- Можете да експортирате вашите SMS съобщения в базата данни с SMS-и на телефона ви. Това позволява на други приложения за SMS на телефона ви да имат достъп до тях и да ги импортират. Това не създава споделим файл с хронологията на вашите SMS съобщения.
+ Можете да експортирате вашите SMS съобщения към SMS базата данни на телефона ви. Това позволява на други приложения за SMS на телефона ви да имат достъп до тях и да ги импортират. Това не създава споделим файл с хронологията на вашите SMS съобщения.
Продължи
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index f5d6c0f22f..2dc73ef53a 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -193,7 +193,7 @@
আপডেট করুন
আপডেট করবেন না
সতর্কবার্তা
- আপনার Signal-এর সংস্করণটি পুরোনো হয়ে গেছে। যতখন না আপনি আপডেট করছেন, আপনি পুরোনো বার্তাগুলো দেখতে পাবেন, কিন্তু নতুন বার্তা দেখতে বা পাঠাতে পারবেন না।
+ আপনার Signal-এর সংস্করণটি পুরোনো হয়ে গেছে। আপডেট না করা পর্যন্ত আপনি পুরোনো ম্যাসেজগুলো দেখতে পাবেন, কিন্তু নতুন ম্যাসেজ দেখতে বা পাঠাতে পারবেন না।
কোন ওয়েব ব্রাউজার পাওয়া যায়নি।
@@ -673,7 +673,7 @@
নতুন গ্রুপগুলো কি?
নতুন গ্রুপে @মেনশন এবং গ্রুপ এডমিনের মতো বৈশিষ্ট্য রয়েছে এবং ভবিষ্যতে আরও বৈশিষ্ট্য সমর্থন করবে।
- আপগ্রেডের আগের সমস্ত বার্তা ইতিহাস এবং মিডিয়া বিদ্যমান আছে।
+ আপগ্রেডের আগের সকল ম্যাসেজের ইতিহাস এবং মিডিয়া বিদ্যমান আছে।
আপনাকে আবার এই গ্রুপে যোগদানের জন্য একটি আমন্ত্রণ গ্রহণ করতে হবে এবং আপনি গ্রহণ না করা পর্যন্ত গ্রুপের বার্তা পাবেন না।
- এই ব্যাবহারকারিকে আবার এই গ্রুপে যোগদানের জন্য একটি আমন্ত্রণ গ্রহণ করতে হবে এবং তিনি সেটি গ্রহণ না করা পর্যন্ত গ্রুপের বার্তা পাবেন না।
@@ -688,7 +688,7 @@
নতুন গ্রুপে আপগ্রেড করুন
এই গ্রুপ আপগ্রেড করুন
নতুন গ্রুপে @মেনশন এবং গ্রুপ এডমিনের মতো বৈশিষ্ট্য রয়েছে এবং ভবিষ্যতে আরও বৈশিষ্ট্য সমর্থন করবে।
- আপগ্রেডের পূর্বের সমস্ত বার্তার ইতিহাস এবং মিডিয়া বিদ্যমান থাকবে।
+ আপগ্রেডের পূর্বের সকল ম্যাসেজের ইতিহাস এবং মিডিয়া বিদ্যমান থাকবে।
একটি নেটওয়ার্ক ত্রুটির সম্মুখীন হয়েছে। পরে আবার চেষ্টা করুন।
আপগ্রেড করতে ব্যর্থ হয়েছে।
@@ -1960,6 +1960,7 @@
%1$s-এর কাছ থেকে আপনার কাছে
মিডিয়াটি আর উপলভ্য নেই।
এই মিডিয়া শেয়ার করার জন্য কোনও অ্যাপ পাওয়া যায়নি।
+ বন্ধ
%1$dটি নতুন বার্তা%2$dটি কথোপকথন
@@ -2343,7 +2344,7 @@
ক্লিপবোর্ডে পাঠানো টাইমস্ট্যাম্প কপি করা হয়েছে।
- আপনার স্টোরি\'র আপডেট এখানে দেখানো হবে।
+ আপনার স্টোরি-র আপডেট এখানে দেখানো হবে।
@@ -2623,7 +2624,7 @@
পেমেন্ট (বিটা)
কথোপকথন দৈর্ঘ্য সীমা
মেসেজগুলো রাখুন
- মেসেজের ইতিহাস মুছে ফেলুন
+ ম্যাসেজের ইতিহাস মুছে ফেলুন
সংযুক্ত ডিভাইস সমূহ
আলো
অন্ধকার
@@ -2657,7 +2658,7 @@
ওয়াইফাই ব্যবহার করার সময়
রোমিং করার সময়
মিডিয়া অটো-ডাউনলোড
- বার্তার ইতিহাস
+ ম্যাসেজের ইতিহাস
স্টোরেজ ব্যবহার
ছবিসমূহ
ভিডিওসমূহ
@@ -2665,12 +2666,12 @@
শব্দ
স্টোরেজ পর্যালোচনা
পুরানো বার্তা মুছবেন?
- বার্তার ইতিহাস সাফ করবেন?
- এটি আপনার ডিভাইস থেকে %1$s পুরানো সমস্ত বার্তার ইতিহাস এবং মিডিয়া স্থায়ীভাবে মুছে ফেলবে।
+ ম্যাসেজের ইতিহাস মুছে ফেলবেন?
+ এটি আপনার ডিভাইস থেকে %1$s থেকে পুরনো সকল ম্যাসেজের ইতিহাস ও মিডিয়া স্থায়ীভাবে মুছে ফেলবে।
এটি সমস্ত কথোপকথন স্থায়ীভাবে ছাঁটাই করে সর্বশেষ %1$sটি মেসেজে রাখবে।
- এটি আপনার ডিভাইস থেকে মেসেজের সমস্ত ইতিহাস এবং মিডিয়া স্থায়ীভাবে মুছে ফেলবে।
- আপনি কি নিশ্চিত যে আপনি মেসেজের সমস্ত ইতিহাস মুছতে চান?
- মেসেজের সমস্ত ইতিহাস স্থায়ীভাবে মুছে ফেলা হবে। এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না।
+ এটি আপনার ডিভাইস থেকে ম্যাসেজের সকল ইতিহাস ও মিডিয়া স্থায়ীভাবে মুছে ফেলবে।
+ আপনি কি ম্যাসেজের সকল ইতিহাস মুছে ফেলার ব্যাপারে নিশ্চিত?
+ ম্যাসেজের সকল ইতিহাস স্থায়ীভাবে মুছে ফেলা হবে। এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না।
এখনই সব মুছুন
চিরতরে
১ বছর
@@ -2748,10 +2749,14 @@
বিকল্পগুলি কাস্টমাইজ করুন
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
এখন নয়
+
+
+ নিরাপত্তা সেটআপ
+
+ আপনার ফান্ড নিরাপদে রাখুন
+
+ নিরাপত্তার আরেকটি স্তর যোগ করে কোনো ব্যক্তিকে আপনার ফোন ব্যবহারের মাধ্যমে আপনার ফান্ড অ্যাক্সেস করা থেকে প্রতিহত করতে সাহায্য করুন। আপনি সেটিংসে এই অপশনটি নিষ্ক্রিয় করতে পারবেন।
+
+ পেমেন্ট লক সচল করুন
+
+ এখন না
+
+ এই ধাপটি বাদ দেবেন?
+
+ এই ধাপটি বাদ দিলে আপনার ফোনে অ্যাক্সেস আছে এমন যে কেউ ফান্ড ট্রান্সফার করতে বা আপনার পুনরুদ্ধার করার বাক্যটি দেখতে পারবেন।
+
+ বাতিল করুন
+
+ বাদ দিয়ে যান
+
ফান্ড যোগ করুন
আপনার ওয়ালেট ঠিকানা
@@ -4256,7 +4281,7 @@
বার্তা যোগ করুন
দ্রুত ফরোয়ার্ড
- ভিডিওগুলোকে 30 সেকেন্ড ক্লিপে কাটা হবে এবং একাধিক স্টোরি হিসাবে পাঠানো হবে৷
+ ভিডিওগুলোকে 30 সেকেন্ড ক্লিপে কাটা হবে এবং একাধিক স্টোরি হিসেবে পাঠানো হবে।
স্টোরি-তে পাঠানো ভিডিও 30 সেকেন্ডের বেশি হতে পারবে না।
ফরোয়ার্ড করা বার্তা এখন অবিলম্বে পাঠানো হয়।
@@ -4703,7 +4728,7 @@
99+
- স্টোরির গোপনীয়তা
+ স্টোরি-র গোপনীয়তা
আমার স্টোরি
@@ -4735,7 +4760,7 @@
স্টোরি লুকাবেন?
- %1$s থেকে নতুন স্টোরি আপডেটগুলো আর স্টোরি তালিকার শীর্ষে দেখা যাবে না৷
+ %1$s থেকে নতুন স্টোরি আপডেটগুলো আর স্টোরি তালিকার শীর্ষে দেখা যাবে না।
লুকান
@@ -4754,7 +4779,7 @@
স্টোরি মুছে ফেলবেন?
- এই স্টোরিটি আপনার এবং যারা এটি পেয়েছেন তাদের জন্য মুছে ফেলা হবে৷
+ এই স্টোরিটি আপনার জন্য এবং যারা এটি পেয়েছেন তাদের জন্য মুছে ফেলা হবে।
সেভ করা যায়নি
@@ -4786,7 +4811,7 @@
এখন পর্যন্ত কোন ভিউ নেই
- কে আপনার স্টোরি দেখেছে তা দেখতে রিড রিসিপ্ট চালু করুন৷
+ কে আপনার স্টোরি দেখেছে তা দেখতে রিড রিসিপ্ট চালু করুন।
সেটিংস-এ যান
@@ -4799,6 +4824,8 @@
দর্শককে বাদ দিন
এখন পর্যন্ত কোন রিপ্লাই নেই
+
+ আপনি এই স্টোরির উত্তর দিতে পারবেন না, কারণ আপনি আর এই গ্রুপের সদস্য নন।
স্টোরি-তে রিঅ্যাক্ট করা হয়েছে
@@ -4817,6 +4844,13 @@
মুছুন
আমার স্টোরি
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
যারা এই স্টোরি দেখতে পাবেন
@@ -4844,15 +4878,13 @@
- %1$d মানুষ
- আপনার স্টোরি কে দেখতে পাবে তা নির্ধারণ করুন৷ পরিবর্তনগুলো আপনার ইতোমধ্যে পাঠানো স্টোরিগুলোকে প্রভাবিত করবে না৷
+ আপনার স্টোরি কে দেখতে পাবেন তা নির্ধারণ করুন৷ পরিবর্তনগুলো আপনার ইতোমধ্যে পাঠানো স্টোরিগুলোকে প্রভাবিত করবে না।
উত্তর & রিঅ্যাকশন
উত্তর & রিঅ্যাকশন অনুমোদন করুন
- যারা আপনার স্টোরি দেখতে পাবেন তাদের রিঅ্যাক্ট এবং রিপ্লাই দিতে দিন
-
- নির্দিষ্ট ব্যক্তিদের কাছ থেকে আপনার স্টোরি লুকান। গতানুগতিকভাবে, আপনার স্টোরি আপনার %1$s এর সাথে শেয়ার করা হয়
+ যারা আপনার স্টোরি দেখতে পাবেন তাদের রিঅ্যাক্ট এবং উত্তর দিতে দিন
Signal কানেকশন
@@ -4864,7 +4896,7 @@
আপনার সিস্টেম কন্ট্যাক্টে তাদের রাখা
- "আপনার কানেকশনরা আপনার নাম এবং ছবি দেখতে পারেন এবং \"আমার স্টোরি\"-এর পোস্টগুলি দেখতে পারেন যদি না আপনি এটি তাদের কাছ থেকে লুকিয়ে রাখেন৷"
+ "আপনার কানেকশনরা আপনার নাম ও ছবি দেখতে পারবেন এবং \"আমার স্টোরি\"-এর পোস্টগুলো দেখতে পারবেন, যদি আপনি এটি তাদের কাছ থেকে লুকিয়ে না রাখেন।"
দর্শক যোগ করুন
@@ -4872,7 +4904,7 @@
%1$s মুছবেন?
- এই ব্যক্তি আর আপনার স্টোরি দেখতে পাবেন না।
+ এই ব্যক্তি আর আপনার স্টোরি দেখতে পারবেন না।
সরান
@@ -4880,9 +4912,9 @@
এই কার্যক্রমটি পূর্বাবস্থায় ফেরানো যাবে না।
- স্টোরি\'র নাম এডিট করুন
+ স্টোরি-র নাম এডিট করুন
- স্টোরি\'র নাম
+ স্টোরি-র নাম
সংরক্ষণ করুন
@@ -4900,7 +4932,7 @@
URL টাইপ করুন কিংবা পেস্ট করুন
- আপনার স্টোরি\'র ভিউয়ারদের সাথে একটি লিংক শেয়ার করুন
+ আপনার স্টোরি-র দর্শকদের সাথে একটি লিংক শেয়ার করুন
খুঁজুন
@@ -4911,22 +4943,40 @@
শুধু এর/এদের সাথে শেয়ার করুন…
শেষ
+
+ গ্রুপ স্টোরি সরাবেন?
+
+ \"%1$s\"-কে মুছে ফেলা হবে।
+
+ সরান
+
+ ব্যক্তিগত স্টোরি মুছবেন?
+
+ \"%1$s\" এবং এই স্টোরিতে শেয়ার করা আপডেট মুছে ফেলা হবে।
+
+ মুছে দিন
+
+ স্টোরি শুধুমাত্র Signal বিটা ব্যবহারকারীদের জন্য ব্যবহারযোগ্য।
+
+ আপনি যদি একটি স্টোরি শেয়ার করেন, তবে এটি শুধুমাত্র সেই ব্যক্তিরাই দেখতে পাবেন যারা Signal বিটা ব্যবহার করছেন।
স্টোরি যোগ করবেন?
- আপনার স্টোরি-তে কন্টেন্ট যোগ করলে তা আপনার Signal কানেকশনদের কাছে 24 ঘন্টা দৃশ্যমান থাকে। আপনি সেটিংসে আপনার স্টোরি কে দেখতে পারবে তা পরিবর্তন করতে পারেন।
+ আপনার স্টোরি-তে কন্টেন্ট যোগ করলে তা আপনার Signal কানেকশনদের কাছে 24 ঘন্টা দৃশ্যমান থাকে। আপনি সেটিংসে আপনার স্টোরি কে দেখতে পারবেন তা পরিবর্তন করতে পারবেন।
স্টোরি যোগ করুন
ভিউয়ার এডিট করুন
- স্টোরি পাঠানো যায়নি। আপনার সংযোগ ঠিক আছে কিনা দেখুন এবং আবার চেষ্টা করুন।
+ স্টোরি পাঠানো যায়নি। আপনার সংযোগ ঠিক আছে কি না দেখুন এবং আবার চেষ্টা করুন।
পাঠান
+
+ বন্ধ করুন এবং মুছে ফেলুন
- & শেয়ার করুন; স্টোরি দেখুন
+ শেয়ার করুন এবং স্টোরি দেখুন
- এই অপশনটি বন্ধ থাকলে আপনি আর স্টোরি শেয়ার করতে বা দেখতে পাবেন না৷
+ এই অপশনটি বন্ধ থাকলে আপনি আর স্টোরি শেয়ার করতে বা দেখতে পাবেন না।
দর্শক বেছে নিন
@@ -4937,9 +4987,9 @@
- %1$d জন দর্শক
- স্টোরি\'র নাম দিন
+ স্টোরি-র নাম দিন
- স্টোরি\'র নাম (আবশ্যক)
+ স্টোরি-র নাম (আবশ্যক)
দর্শক
@@ -4947,11 +4997,11 @@
এই ঘরটি পূরণ বাঞ্ছনীয়
- ইতিমধ্যে এই নামের একটি স্টোরি আছে
+ ইতোমধ্যে এই নামের একটি স্টোরি আছে।
সবগুলো নির্বাচন করুন
- আপনার স্টোরি\'র ধরণ বেছে নিন
+ আপনার স্টোরি-র ধরণ বেছে নিন
নতুন ব্যক্তিগত স্টোরি
@@ -4969,7 +5019,7 @@
রিপ্লাই পাঠানো হচ্ছে…
- এই স্টোরি-টি আর নেই
+ এই স্টোরিটি আর নেই।
ইন্টারনেট সংযোগ নেই
@@ -4995,9 +5045,9 @@
আপনি %1$s-এর স্টোরি-তে রিঅ্যাক্ট করেছেন
- আপনার স্টোরি-তে রিঅ্যাক্ট করা হয়েছে
+ আপনার স্টোরি-তে রিঅ্যাক্ট করেছেন
- একটি স্টোরি-তে রিঅ্যাক্ট করা হয়েছে
+ একটি স্টোরি-তে রিঅ্যাক্ট করেছেন
@@ -5071,6 +5121,11 @@
- গ্ৰুপ স্টোরি · %1$d জন দর্শক
- গ্ৰুপ স্টোরি · %1$d জন দর্শক
+
+
+ - %1$d জন সদস্য
+ - %1$d জন সদস্য
+
- %1$s · %2$d দর্শক
@@ -5139,7 +5194,7 @@
সকল কানেকশন রিভিউ করা হয়েছে, চালিয়ে যেতে সেন্ডে ট্যাপ করুন।
- আপনার %1$d-টি কানেকশন আছে যারা সম্ভবত সিগন্যাল পুনরায় ইনস্টল করেছে বা ডিভাইস পরিবর্তন করেছেন৷ তাদের সাথে আপনার স্টোরি শেয়ার করার আগে তাদের নিরাপত্তা নম্বর রিভিউ করুন বা আপনার স্টোরি দেখা থেকে তাদের বাদ দিন।
+ আপনার %1$dটি কানেকশন আছে, যারা সম্ভবত Signal পুনরায় ইনস্টল করেছেন বা ডিভাইস পরিবর্তন করেছেন৷ তাদের সাথে আপনার স্টোরি শেয়ার করার আগে তাদের নিরাপত্তা নম্বরগুলো রিভিউ করুন বা আপনার স্টোরি দেখা থেকে তাদের বাদ দিন।
নিরাপত্তা নাম্বার যাচাই করুন
@@ -5169,7 +5224,7 @@
আমার স্টোরি প্রাইভেসি
- আমার স্টোরি পোস্টগুলো কে দেখতে পাবেন তা বেছে নিন৷ আপনি সবসময় সেটিংস পরিবর্তন করতে পারবেন।
+ আমার স্টোরি পোস্টগুলো কে দেখতে পাবেন তা বেছে নিন। আপনি সবসময় সেটিংস থেকে টা পরিবর্তন করতে পারবেন।
সকল Signal কানেকশন
@@ -5194,11 +5249,11 @@
- 24 ঘন্টা পর স্টোরি স্বয়ংক্রিয়ভাবে অদৃশ্য হয়ে যায়। আপনার স্টোরি কে দেখতে পারবেন তা নির্বাচন করুন অথবা নির্দিষ্ট দর্শক বা গ্ৰুপের সাথে নতুন স্টোরি তৈরি করুন৷
+ 24 ঘন্টা পর স্টোরি স্বয়ংক্রিয়ভাবে অদৃশ্য হয়ে যায়। আপনার স্টোরি কে দেখতে পারবেন তা নির্বাচন করুন অথবা নির্দিষ্ট দর্শক বা গ্ৰুপের সাথে নতুন স্টোরি তৈরি করুন।
স্টোরি বন্ধ করুন
- স্টোরি বন্ধ করলে আপনি আর স্টোরি শেয়ার করতে কিংবা দেখতে পারবেন না৷
+ স্টোরি বন্ধ করলে আপনি আর স্টোরি শেয়ার করতে কিংবা দেখতে পারবেন না।
স্টোরি চালু করুন
@@ -5206,15 +5261,15 @@
স্টোরি বন্ধ করবেন?
- আপনি আর স্টোরি শেয়ার করতে কিংবা দেখতে পারবেন না। আপনার সম্প্রতি পাঠানো যেকোনো স্টোরি-র সময়কাল শেষ না হওয়া পর্যন্ত অন্যরা দেখতে পাবেন।
+ আপনি আর স্টোরি শেয়ার করতে বা দেখতে পারবেন না। আপনি সম্প্রতি শেয়ার করেছেন এমন স্টোরির আপডেটগুলোও মুছে ফেলা হবে৷
- স্টোরির গোপনীয়তা
+ স্টোরি-র গোপনীয়তা
যারা এই স্টোরি দেখতে পাবেন
- "\"%1$s\" গ্রুপের সদস্যরা এই স্টোরি দেখতে এবং উত্তর দিতে পারবেন। আপনি গ্রুপে এই চ্যাটের সদস্যতা আপডেট করতে পারেন।"
+ "\"%1$s\" গ্রুপের সদস্যরা এই স্টোরি দেখতে এবং উত্তর দিতে পারবেন। আপনি গ্রুপে এই চ্যাটের সদস্যতা আপডেট করতে পারবেন।"
গ্ৰুপ স্টোরি সরিয়ে ফেলুন
@@ -5229,7 +5284,7 @@
আপনার এসএমএস ম্যাসেজ এক্সপোর্ট করুন
- আপনি আপনার ফোনের এসএমএস ডেটাবেজে আপনার এসএমএস ম্যাসেজ স্থানান্তর করতে পারেন৷ এটি আপনার ফোনে থাকা অন্যান্য এসএমএস অ্যাপগুলোকে অ্যাক্সেস এবং স্থানান্তর করার অনুমতি দেয়৷ এটি আপনার এসএমএস ম্যাসেজ ইতিহাসের একটি শেয়ারযোগ্য ফাইল তৈরি করে না৷
+ আপনি আপনার ফোনের এসএমএস ডেটাবেজে আপনার এসএমএস ম্যাসেজ স্থানান্তর করতে পারবেন। এটি আপনার ফোনে থাকা অন্যান্য এসএমএস অ্যাপগুলোকে অ্যাক্সেস এবং স্থানান্তর করার অনুমতি দেয়। এটি আপনার এসএমএস ম্যাসেজের ইতিহাসের একটি শেয়ারযোগ্য ফাইল তৈরি করে না।
চালিয়ে যান
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index 8254b1cbad..c6145bb1a9 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -1462,7 +1462,7 @@
Sviđa vam se nova funkcija? Podržite Signal jednokratnom donacijom.
- Vaša historija razmjenjivanja poruka s korisnikom %1$s i brojem %2$s je spojena.
+ Vaša historija razmjenjivanja poruka s korisnikom %1$s i njihovim brojem %2$s je spojena.
Vaša historija razmjenjivanja poruka s korisnikom %1$s i drugim chatom koji je pripadao toj osobi je spojena.
@@ -1674,7 +1674,7 @@
Greška u mreži!
Broj nije registrovan!
Broj koji ste birali ne podržava sigurne pozive!
- Primljeno na znanje
+ Razumijem
@@ -2108,6 +2108,7 @@
%1$s za Vas
Datoteka više nije dostupna.
Nije pronađena aplikacija koja može podijeliti ovu datoteku.
+ Zatvori
%1$d novih poruka u %2$d konverzacija
@@ -2511,7 +2512,7 @@
Vrijeme slanja kopirano u međuspremnik.
- Novine u Vašoj priči prikazat će se ovdje.
+ Ažuriranja u vašoj priči prikazat će se ovdje.
@@ -2838,11 +2839,11 @@
Provjerite 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.
+ Ovime će se trajno izbrisati sva historija 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.
+ Ovime će se trajno izbrisati sva historija 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.
+ Cijela historija poruka bit će trajno uklonjena. Ova se radnja ne može poništiti.
Izbriši sve odmah
Zauvijek
1 godinu
@@ -2920,10 +2921,14 @@
Prilagodi
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3076,6 +3081,26 @@
Ne sada
+
+
+ Postavljanje sigurnosti
+
+ Zaštitite svoja sredstva
+
+ Spriječite osobu kod koje je vaš telefon da pristupi vašim sredstvima tako što ćete dodati još jedan nivo sigurnosti. Ovu opciju možete onemogućiti u Postavkama.
+
+ Omogućite zaključavanje plaćanja
+
+ Ne sada
+
+ Preskočiti ovaj korak?
+
+ Ako preskočite ovaj korak, možete omogućiti svima koji imaju fizički pristup vašem telefonu da prenesu sredstva ili vide vašu frazu za oporavak.
+
+ Otkaži
+
+ Preskoči
+
Dodaj sredstva
Adresa Vašeg novčanika
@@ -4170,7 +4195,7 @@
Predefinisani rok za nove konverzacije
Podesite vrijeme za nestajanje poruka koje će se automatski primijeniti na sve nove konverzacije kada ih Vi započnete.
- Upravljate pričama i ko može vidjeti vaše priče
+ Upravljate pričama i ko ih može vidjeti
Zahtijevaj zaključavanje ekrana Androida ili otisak prsta za prijenos sredstava
Nije moguće omogućiti osiguranje plaćanja
@@ -4454,9 +4479,9 @@
Napiši poruku
Brža prosljeđivanja
- Videozapisi će se skratiti na isječke od 30 s i poslati kao više Priča.
+ Videozapisi će se skratiti na isječke od 30 s i poslati kao više priča.
- Videozapisi koje pošaljete u Priče ne mogu biti duži od 30 s.
+ Videozapisi koje pošaljete u priče ne mogu biti duži od 30 s.
Proslijeđene poruke sada se šalju trenutačno.
- Pošalji %1$d poruku
@@ -4911,7 +4936,7 @@
99+
- Privatnost priče
+ Privatnost priča
Moje priče
@@ -4943,11 +4968,11 @@
Sakriti priču?
- Promjene koje %1$s načini u priči neće se više prikazivati u vrhu popisa priča.
+ Promjene koje %1$s načini u priči neće se više prikazivati na vrhu popisa priča.
Sakrij
- Priča skrivena
+ Priča je skrivena
Skrivene priče
@@ -4960,11 +4985,11 @@
Proslijedi
- %1$spriča
+ Priča korisnika %1$s
Izbrisati priču?
- Ova priča bit će izbrisana i za Vas i za sve one koji su je primili.
+ Ova priča će biti izbrisana i za vas i za sve one koji su je primili.
Nije moguće spremiti
@@ -5000,7 +5025,7 @@
Još nema pregleda
- Omogućite potvrde o čitanju da vidite ko je pregledao vaše priče.
+ Omogućite potvrde o čitanju da vidite ko je pogledao vaše priče.
Idi u postavke
@@ -5013,8 +5038,10 @@
Ukloni gledaoca
Još nema odgovora
+
+ Ne možete odgovoriti na ovu priču jer više niste član ove grupe.
- Reagovao/la na priču
+ Reagovao/la je na priču
Pregledi
@@ -5031,6 +5058,15 @@
Izbriši
Moja priča
+
+
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
Ko može vidjeti ovu priču
@@ -5042,7 +5078,7 @@
Svi osim…
- Sakrijte priču od određenih osoba
+ Sakrij priču od određenih osoba
- %1$d izuzeta osoba
@@ -5062,15 +5098,13 @@
- %1$d osoba
- Odaberite ko može pregledati vašu priču. Promjene neće uticati na priče koje ste već poslali.
+ Odaberite ko može vidjeti vašu priču. Promjene neće uticati na priče koje ste već poslali.
Odgovori i reakcije
Dopusti odgovore i reakcije
- Dopustiti osobama koje mogu vidjeti Vašu priču da reaguju i odgovore
-
- Sakrijte svoju priču od određenih osoba. Inicijalno, Vaša priča bit će podijeljena sa Vašim %1$s
+ Dopustite osobama koje mogu vidjeti vašu priču da reaguju i odgovore
Signal veze
@@ -5082,7 +5116,7 @@
Imate ih u svojim kontaktima na telefonu
- "Vaše veze mogu vidjeti Vaše ime i fotografiju, a mogu vidjeti i ono što napišete u \"Moja priča\", izuzev ako to ne sakrijete od njih."
+ "Vaši kontakti mogu vidjeti vaše ime i fotografiju, a mogu vidjeti i objave u \"Moja priča\", izuzev ako to ne sakrijete od njih."
Dodaj posmatrača
@@ -5090,7 +5124,7 @@
Ukloniti %1$s?
- Ova osoba više neće vidjeti Vašu priču.
+ Ova osoba više neće vidjeti vašu priču.
Ukloni
@@ -5118,7 +5152,7 @@
Kucajte ili zalijepite URL
- Podijelite link s pratiocima Vaše priče
+ Podijelite link s pratiocima vaše priče
Traži
@@ -5129,18 +5163,36 @@
Dijeli samo sa…
Uredu
+
+ Ukloni priču grupe?
+
+ \"%1$s\" će biti uklonjena.
+
+ Ukloni
+
+ Izbrisati privatnu priču?
+
+ \"%1$s\" i ažuriranja podijeljena u ovoj priče će se izbrisati.
+
+ Izbriši
+
+ Priče su dostupne samo korisnicima beta verzije Signala.
+
+ Ako podijelite priču, bit će dostupna samo osobama koje su na beta verziji Signala.
Dodati u priču?
- Dodavši sadržaj svojoj priči omogućavate svojim Signal vezama da ga vide narednih 24 sata. U Podešavanjima možete odrediti ko će vidjeti Vašu priču.
+ Ako dodate sadržaj svojoj priči, omogućavate svojim Signal kontaktima da ga vide naredna 24 sata. U Postavkama možete odrediti ko će vidjeti vašu priču.
Dodaj u priču
Sredi posmatrače
- Nije bilo moguće poslati priču. Provjerite svoju konekciju i pokušajte ponovo.
+ Nije bilo moguće poslati priču. Provjerite konekciju i pokušajte ponovo.
Šalji
+
+ Isključi i izbriši
Podijeli i pogledaj priče
@@ -5157,7 +5209,7 @@
- %1$d gledaoca
- Nazovi priču
+ Postavi naziv priče
Naziv priče (obavezno)
@@ -5171,7 +5223,7 @@
Odaberi sve
- Odaberite vrstu Vaše priče
+ Odaberite vrstu priče
Nova privatna priča
@@ -5215,9 +5267,9 @@
Reagovali ste na priču koju je objavio/la %1$s
- Reagovao/la na Vašu priču
+ Reagovao/la je na vašu priču
- Reagovao/la na priču
+ Reagovao/la je na priču
@@ -5282,7 +5334,7 @@
Ne sada
- Dijelite samo sa
+ Dijeli samo sa
- Privatna priča · %1$d gledalac
@@ -5297,6 +5349,13 @@
- Grupna priča · %1$d gledaoca
- Grupna priča · %1$d gledaoca
+
+
+ - %1$d član
+ - %1$d člana
+ - %1$d članova
+ - %1$d članova
+
- %1$s · %2$d gledalac
@@ -5307,7 +5366,7 @@
Dodirnite da odaberete gledaoce
- Podešavanja priče
+ Postavke priče
Ukloni priču
@@ -5355,7 +5414,7 @@
Prevucite udesno da izađete
- Primljeno na znanje
+ Razumijem
Otvorite kontekstni meni
@@ -5373,7 +5432,7 @@
Sve veze su pregledane, dodirnite \"Pošalji\" da nastavite.
- Imate veze (njih %1$d) koje su možda ponovo instalirale Signal ili su promijenile uređaje. Prije nego podijelite priču s tim osobama, pregledajte njihove sigurnosne brojeve ili razmotrite opciju da ih uklonite iz svoje priče.
+ Imate kontakte (njih %1$d) koji su možda ponovo instalirali Signal ili su promijenili uređaje. Prije nego podijelite priču s tim osobama, pregledajte njihove sigurnosne brojeve ili razmotrite opciju da ih uklonite iz svoje priče.
Provjerite sigurnosni broj
@@ -5430,7 +5489,7 @@
- Priče automatski nestaju nakon 24 sata. Odaberite ko može vidjeti vaše priče li kreirajte nove priče s određenim gledaocima ili grupama.
+ Priče automatski nestaju nakon 24 sata. Odaberite ko može vidjeti vaše priče ili kreirajte nove priče s određenim gledaocima ili grupama.
Isključi priče
@@ -5442,9 +5501,9 @@
Isključi priče?
- Više nećete moći dijeliti ni pregledati priče. Druge osobe će i dalje moći pregledati priče koje ste nedavno poslali sve dok ne isteknu.
+ Više nećete moći dijeliti niti pregledati priče. Ažuriranja priča koja ste nedavno podijelili će se također izbrisati.
- Privatnost priče
+ Privatnost priča
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 41be026e87..a5ed880a10 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -193,7 +193,7 @@
Actualitza-la
No l\'actualitzis
Advertiment
- La versió del Signal ha vençut. Podeu veure l\'historial de missatges però no podreu enviar-ne ni rebre\'n fins que l\'actualitzeu.
+ La versió de Signal ha vençut. Podràs veure l\'historial de missatges però no Podràs enviar-ne ni rebre\'n fins que l\'actualitzis.
No s\'ha trobat cap navegador web.
@@ -1346,7 +1346,7 @@
T\'agrada aquesta nova funció? Ajuda a Signal amb una donació puntual!
- El teu historial de missatges amb %1$s i el seu número %2$s s\'han combinat.
+ El teu historial de missatges amb %1$s i el teu número %2$s s\'han combinat.
El teu historial de missatges amb %1$s i un altre xat amb la mateixa persona s\'han combinat.
@@ -1960,6 +1960,7 @@
%1$s a vós
El contingut ja no està disponible.
No es pot trobar cap aplicació que pugui compartir aquest contingut.
+ Tanca
%1$d missatges nous a %2$d converses
@@ -2200,7 +2201,7 @@
Història · %1$s
- Vós · Història
+ Tu · Història
Ja no està disponible
@@ -2665,11 +2666,11 @@
Àudio
Revisa l\'emmagatzematge
Voleu suprimir els missatges més antics?
- Voleu netejar l\'historial dels missatges?
+ Vols netejar l\'historial dels missatges?
Això suprimirà permanentment l\'historial dels missatges i el contingut del dispositiu més antic de %1$s.
Això reduirà permanentment totes les converses als %1$s missatges més recents.
Això suprimirà permanentment tot l\'historial dels missatges i tot el contingut del dispositiu.
- Segur que voleu suprimir tot l\'historial dels missatges?
+ Segur que vols suprimir tot l\'historial dels missatges?
Se suprimirà permanentment tot l\'historial dels missatges. Aquesta acció no es pot desfer.
Suprimeix-ho tot ara
Per sempre
@@ -2748,10 +2749,14 @@
Opció de personalització
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Ara no
+
+
+ Configuració de seguretat
+
+ Protegeix els teus fons
+
+ Ajuda a evitar que una persona que tingui el teu telèfon pugui accedir als teus fons afegint una altra capa de seguretat. Pots desactivar aquesta opció a Ajustos.
+
+ Activar el bloqueig de pagament
+
+ Ara no
+
+ Ometre aquest pas?
+
+ Si omets aquest pas, qualsevol persona que tingui accés físic al teu telèfon podrà transferir fons o veure la teva frase de recuperació.
+
+ Cancel·la
+
+ Omet
+
Afegeix fons
La vostra adreça de cartera
@@ -4711,7 +4736,7 @@
No hi ha actualitzacions recents per mostrar ara mateix.
- Amaga la història
+ Oculta la història
Mostra la història
@@ -4733,7 +4758,7 @@
Toqueu aquí per tornar-ho a provar
- Voleu amagar la història?
+ Vols ocultar la història?
Les actualitzacions d\'històries noves de %1$s ja no apareixeran al capdamunt de la llista d\'històries.
@@ -4752,9 +4777,9 @@
Història de %1$s
- Voleu suprimir la història?
+ Vols suprimir la història?
- Aquesta història se suprimirà per a vós i per a tots els que l\'han rebut.
+ Aquesta història se suprimirà per a tu i per a tots els que l\'han rebut.
No s\'ha pogut guardar
@@ -4799,6 +4824,8 @@
Eliminar espectador
Encara no té respostes
+
+ No pots respondre a aquesta història perquè ja no pertanys a aquest grup.
Ha reaccionat a la història
@@ -4817,10 +4844,17 @@
Suprimits
La meva història
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Qui pot veure aquesta història
- Amaga la història de
+ Oculta la història de
Tots els contactes de Signal
@@ -4850,9 +4884,7 @@
Permet respostes i reaccions
- Permeteu que les persones que puguin veure la història hi reaccionin i hi responguin.
-
- Amagueu la història a persones específiques. De manera predeterminada, la vostra història es comparteix amb %1$s
+ Permet que les persones que puguin veure la història hi reaccionin i hi responguin.
Contactes de Signal
@@ -4864,7 +4896,7 @@
tenir-les als contactes del sistema
- "Els teus contactes poden veure el vostre nom i la fotografia, i poden veure les publicacions a \"La meva història\" tret que decideixis ocultar-les-hi."
+ "Els teus contactes poden veure el teu nom i la fotografia, i poden veure les publicacions a \"La meva història\" tret que decideixis ocultar-les-hi."
Afegiu-hi un espectador
@@ -4872,7 +4904,7 @@
Voleu suprimir %1$s?
- Aquesta persona ja no veurà la vostra història.
+ Aquesta persona ja no veurà la teva història.
Suprimeix
@@ -4900,7 +4932,7 @@
Escriviu o enganxeu-hi un URL
- Compartiu un enllaç amb els espectadors de la història
+ Comparteix un enllaç amb els espectadors de la història
Cerca
@@ -4911,6 +4943,22 @@
Compartir només amb…
Fet
+
+ Vols esborrar aquesta història de grup?
+
+ S\'eliminarà \"%1$s\".
+
+ Suprimeix
+
+ Eliminar història privada?
+
+ S\'eliminarà \"%1$s\" i totes les actualitzacions compartides en aquesta història.
+
+ Suprimeix
+
+ Les històries només estan disponible per als usuaris de Signal beta.
+
+ Si comparteixes una història, només estarà disponible per als usuaris de Signal beta.
Ho voleu afegir a la història?
@@ -4920,13 +4968,15 @@
Edita\'n els espectadors
- No s\'ha pogut enviar la història. Comproveu la connexió i torneu-ho a provar.
+ No s\'ha pogut enviar la història. Comprova la connexió i torna-ho a provar.
Envia
+
+ Desactivar i eliminar
- Compartiu i vegeu històries
+ Comparteix i mira històries
- Ja no podreu compartir ni veure històries quan aquesta opció estigui desactivada.
+ Ja no podràs compartir ni veure històries quan aquesta opció estigui desactivada.
Trieu espectadors
@@ -4939,7 +4989,7 @@
Nom de la història
- Nom de la història (cal)
+ Nom de la història (obligatori)
Espectadors
@@ -4951,7 +5001,7 @@
Selecciona-ho tot
- Trieu el tipus d\'història
+ Tria el tipus d\'història
Història privada nova
@@ -4977,7 +5027,7 @@
Història enviada
- Ha fallat enviar la història.
+ No s\'ha pogut enviar la història.
Mostra la història
@@ -4993,9 +5043,9 @@
Desactiva
- Heu reaccionat a la història de %1$s
+ Has reaccionat a la història de %1$s
- Ha reaccionat a la vostra història
+ Ha reaccionat a la teva història
Ha reaccionat a una història.
@@ -5071,6 +5121,11 @@
- Història de grup · %1$d espectador
- Història de grup · %1$d espectadors
+
+
+ - %1$d membre
+ - %1$d membres
+
- %1$s · %2$d espectador
@@ -5091,7 +5146,7 @@
Suprimeix
- Voleu suprimir la història?
+ Vols suprimir la història?
Vols eliminar la història privada \"%1$s\"?
@@ -5206,7 +5261,7 @@
Desactivar històries?
- Ja no podràs compartir o visualitzar històries. Qualsevol història que hagis enviat recentment continuarà sent visible per als altres usuaris fins que expiri.
+ Ja no podràs compartir o veure històries. Les històries que hagis compartit recentment també seran eliminades.
Privacitat de la història
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index e94f0593a0..d5e5baedce 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -220,7 +220,7 @@
Najít podle uživatelského jména
- Mé příběhy
+ Moje příběhy
Nový příběh
@@ -719,7 +719,7 @@
Co jsou Nové skupiny?
Nové skupiny mají funkce jako @zmínky a správce skupin a v budoucnu budou podporovat další funkce.
- Před aktualizací byla uchována veškerá historie zpráv a média.
+ Veškerá historie zpráv a média byla zachována z doby před aktualizací.
Budete muset přijmout pozvánku, abyste se znovu připojili k této skupině, a nebudete přijímat skupinové zprávy, dokud ji nepřijmete.
- Tento člen bude muset přijmout pozvánku, aby se znovu připojil k této skupině, a dokud ji nepřijme, nebude dostávat skupinové zprávy:
@@ -738,7 +738,7 @@
Aktualizovat na novou skupinu
Aktualizovat tuto skupinu
Nové skupiny mají funkce jako @zmínky a správce skupin, a v budoucnu budou podporovat další funkce.
- Před aktualizací bude uchována veškerá historie zpráv a média.
+ Veškerá historie zpráv a média budou zachována z doby před aktualizací.
Došlo k síťové chybě. Zkuste to znovu později.
Aktualizace se nezdařila.
@@ -2108,6 +2108,7 @@
%1$s pro vás
Média již nejsou k dispozici.
Nebyla nalezena žádná aplikace pro sdílení tohoto média.
+ Zavřít
%1$d nových zpráv v %2$d konverzacích
@@ -2838,10 +2839,10 @@
Zkontrolovat úložiště
Smazat starší zprávy?
Smazat historii zpráv?
- Tímto trvale smažete veškerou historii zpráv a média z vašeho zařízení starší než %1$s.
+ Tímto trvale smažete veškerou historii zpráv a média z vašeho zařízení starší než %1$s.
Tímto trvale zkrátíte všechny konverzace na %1$s nejnovějších zpráv.
- Tímto trvale smažete celou historii zpráv a média z vašeho zařízení.
- Jste si jistí, že chcete smazat celou historii zpráv?
+ Tímto trvale smažete celou historii zpráv a média z vašeho zařízení.
+ Opravdu 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
@@ -2920,10 +2921,14 @@
Nastavit předvolbu
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3076,6 +3081,26 @@
Nyní ne
+
+
+ Nastavení zabezpečení
+
+ Chraňte své prostředky
+
+ Pomozte zabránit osobě používající váš telefon v přístupu k vašim finančním prostředkům přidáním další úrovně zabezpečení. Tuto možnost můžete vypnout v nastavení.
+
+ Zapnout zámek plateb
+
+ Teď ne
+
+ Přeskočit tenhle krok?
+
+ Přeskočením tohoto kroku můžete komukoli, kdo má fyzický přístup k vašemu telefonu, umožnit provedení převodu finančních prostředků nebo zobrazení vaší fráze pro obnovení.
+
+ Storno
+
+ Přeskočit
+
Přidat prostředky
Adresa vaší peněženky
@@ -4170,7 +4195,7 @@
Výchozí časovač pro nové konverzace
Nastavení výchozího časovače zmizení zprávy pro všechny vámi zahájené nové konverzace.
- Spravujte své příběhy a to, kdo je může zobrazit
+ Spravujte své příběhy a to, kdo je může zobrazit
Vyžadovat při převodu finančních prostředků zámek obrazovky nebo otisk prstu systému Android
Zámek plateb nelze aktivovat
@@ -4454,9 +4479,9 @@
Přidat zprávu
Rychlejší přeposílání
- Videa budou zkrácena na 30vteřinové klipy a odeslána jako několik příběhů.
+ Videa budou zkrácena na 30vteřinové klipy a odeslána jako několik příběhů.
- Videa posílaná jako příběhy nesmí být delší než 30 vteřin.
+ Videa odeslaná do příběhů nesmí být delší než 30 vteřin.
Přeposlané zprávy se nyní odesílají okamžitě.
- Odeslat %1$d zprávu
@@ -4913,15 +4938,15 @@
Soukromí příběhů
- Mé příběhy
+ Moje příběhy
Klepnutím přidáte příběh
Žádné nové aktualizace k zobrazení.
- Schovat příběh
+ Skrýt příběh
- Zobrazit příběh
+ Zrušit skrytí příběhu
Přeposlat
@@ -4943,7 +4968,7 @@
Skrýt příběh?
- Nové aktualizace od %1$s se již neobjeví v horní části seznamu příběhů.
+ Nové aktualizace příběhu od %1$s se již neobjeví v horní části seznamu příběhů.
Skrýt
@@ -4964,7 +4989,7 @@
Smazat příběh?
- Příběh bude odstraněn pro vás a každého, kdo ho obdržel.
+ Příběh bude odstraněn pro vás a pro všechny, kdo ho obdrželi.
Nepodařilo se uložit
@@ -5000,7 +5025,7 @@
Zatím žádná zobrazení
- Povolte potvrzení o přečtení, abyste viděli, kdo si prohlížel vaše příběhy.
+ Povolte potvrzení o přečtení, abyste viděli, kdo si prohlížel vaše příběhy.
Přejít do nastavení
@@ -5013,8 +5038,10 @@
Odebrat sledujícího
Zatím žádné odpovědi
+
+ Na tento příběh nemůžete reagovat, protože už nejste členem této skupiny.
- Reagoval(a) na příběh
+ Reagoval/a na příběh
Zobrazení
@@ -5031,10 +5058,19 @@
Smazat
Můj příběh
+
+
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
Kdo může tento příběh zobrazit
- Skrýt příběhy od
+ Skrýt příběhy před
Všechna spojení Signal
@@ -5062,15 +5098,13 @@
- %1$d lidí
- Vyberte, kdo kdo si může váš příběh prohlédnout. Změny se nedotknou příběhů, které jste už sdíleli.
+ Vyberte, kdo si může váš příběh zobrazit. Změny se nedotknou příběhů, které jste už sdíleli.
Odpovědi & reakce
Povolit odpovědi & reakce
- Nechte lidi, kteří si mohou váš příběh prohlédnout, reagovat a odpovídat
-
- Skryjte svůj příběh před konkrétními lidmi. Ve výchozím nastavení je váš příběh sdílen s vašimi %1$s
+ Nechte lidi, kteří si mohou váš příběh zobrazit, reagovat a odpovídat
Spojení Signal
@@ -5082,7 +5116,7 @@
Uložením do vašeho seznamu kontaktů
- "Vaše připojení vidí vaše jméno a fotografii a mohou vidět příspěvky v \"Mém příběhu\", pokud je před nimi neskryjete."
+ "Vaše spojení vidí vaše jméno a fotografii a mohou vidět příspěvky v Mém příběhu, pokud je před nimi neskryjete."
Přidat sledovače
@@ -5090,7 +5124,7 @@
Odstranit %1$s?
- Tato osoba nadále neuvidí váš příběh.
+ Tato osoba již váš příběh neuvidí.
Odebrat
@@ -5098,9 +5132,9 @@
Tuto operaci nelze vzít zpět.
- Upravit jméno příběhu
+ Upravit název příběhu
- Jméno příběhu
+ Název příběhu
Uložit
@@ -5118,7 +5152,7 @@
Napište nebo vložte URL
- Sdílejte odkaz s těmi, kdo si zobrazili váš příběh
+ Sdílejte odkaz s těmi, kdo si zobrazili váš příběh
Vyhledat
@@ -5129,20 +5163,38 @@
Sdílet jen s…
Hotovo
+
+ Odebrat skupinový příběh?
+
+ „%1$s“ – bude odebrán.
+
+ Odebrat
+
+ Smazat soukromý příběh?
+
+ „%1$s“ a aktualizace sdílené k tomuto příběhu budou smazány.
+
+ Smazat
+
+ Příběhy jsou dostupné jen uživatelům verze Signal beta.
+
+ Pokud sdílíte příběh, bude dostupný jen lidem, kteří používají Signal beta.
- Přidat příběh?
+ Přidat do příběhu?
- Přidání obsahu do příběhu umožní vašim připojení k síti Signál jeho zobrazení po dobu 24 hodin. Kdo si může váš příběh prohlížet, můžete změnit v Nastaveních.
+ Přidáním obsahu do příběhu umožníte svým spojením Signal jeho zobrazení po dobu 24 hodin. V nastavení můžete změnit, kdo si váš příběh může zobrazit.
- Přidat příběh
+ Přidat do příběhu
Upravit, kdo si může příběh zobrazit
- Příběh se nepodařilo odeslat. Zkontrolujte připojení a zkuste to znovu.
+ Příběh se nepodařilo odeslat. Zkontrolujte připojení a zkuste to znovu.
Odeslat
+
+ Vypnout a smazat
- Sdílení & zobrazení příběhů
+ Sdílení a zobrazování příběhů
Po vypnutí této možnosti již nebudete moci sdílet ani zobrazovat příběhy.
@@ -5159,7 +5211,7 @@
Pojmenovat příběh
- Jméno příběhu (požadováno)
+ Název příběhu (povinné)
Zobrazení
@@ -5167,7 +5219,7 @@
Toto pole je povinné.
- Příběh se stejným jménem již existuje.
+ Příběh s tímto názvem již existuje.
Vybrat vše
@@ -5197,7 +5249,7 @@
Odeslaný příběh
- Nepodařilo se odeslat příběh
+ Příběh se nepodařilo odeslat
Zobrazit příběh
@@ -5213,11 +5265,11 @@
Vypnout
- Reagovali jste na příběh %1$s
+ Reagovali jste na příběh od %1$s
- Reagoval(a) na váš příběh
+ Reagoval/a na váš příběh
- Reakce na příběh
+ Reagoval/a na příběh
@@ -5285,17 +5337,24 @@
Sdílet pouze s
- - Soukromí příběh · %1$d sledující
- - Soukromí příběh · %1$d sledující
- - Soukromí příběh · %1$d sledujících
- - Soukromý příběh · %1$d zobrazení
+ - Soukromý příběh · %1$d sledující
+ - Soukromý příběh · %1$d sledující
+ - Soukromý příběh · %1$d sledujících
+ - Soukromý příběh · %1$d sledujících
- Skupinový příběh · %1$d sledující
- Skupinový příběh · %1$d sledující
- Skupinový příběh · %1$d sledujících
- - Skupinový příběh · %1$d zobrazení
+ - Skupinový příběh · %1$d sledujících
+
+
+
+ - %1$d člen
+ - %1$d členové
+ - %1$d členů
+ - %1$d členů
@@ -5315,7 +5374,7 @@
Odebrat skupinový příběh?
- Tím se příběh z tohoto seznamu odstraní. Stále ale uvidíte příběhy z této skupiny.
+ Tím se příběh odstraní z tohoto seznamu. Příběhy z této skupiny si budete moci prohlížet i nadále.
Odebrat
@@ -5373,11 +5432,11 @@
Všechna spojení byla zkontrolována, pokračujte klepnutím na tlačítko odeslat.
- Máte %1$d spojení, která si pravděpodobně přeinstalovala aplikaci Signal nebo změnila zařízení. Předtím, než s nimi budete sdílet svůj příběh, zkontrolujte jejich bezpečnostní čísla nebo zvažte jejich odebrání z příběhu.
+ Máte %1$d spojení, která si pravděpodobně přeinstalovala aplikaci Signal nebo změnila zařízení. Než s nimi budete sdílet svůj příběh, zkontrolujte jejich bezpečnostní čísla nebo zvažte jejich odebrání z příběhu.
Ověření bezpečnostního čísla
- Odebrat z příběhu
+ Odebrat z příběhu
Přesto poslat
@@ -5405,7 +5464,7 @@
Soukromí mého příběhu
- Vyberte, kdo může vidět příspěvky k „Mému příběhu“
+ Vyberte, kdo uvidí příspěvky v Mém příběhu. V nastavení to můžete kdykoli změnit.
Všechna spojení Signal
@@ -5430,19 +5489,19 @@
- Příběhy automaticky zmizí po 24 hodinách. Vyberte, kdo si může váš příběh prohlédnout, nebo vytvořte nové příběhy pro konkrétní diváky nebo skupiny.
+ Příběhy automaticky zmizí po 24 hodinách. Vyberte, kdo může váš příběh zobrazit, nebo vytvořte nové příběhy pro konkrétní diváky nebo skupiny.
Vypnout příběhy
- Pokud příběhy vypnete, nebudete již moci příběhy sdílet ani zobrazovat.
+ Pokud příběhy vypnete, už je nebudete moct sdílet ani zobrazovat.
Zapnout příběhy
- Sdílejte a prohlížejte příběhy ostatních. Příběhy automaticky zmizí po 24 hodinách.
+ Sdílejte a prohlížejte příběhy ostatních. Příběhy automaticky zmizí po 24 hodinách.
Vypnout příběhy?
- Příběhy již nebudete moci sdílet ani prohlížet. Všechny příběhy, které jste nedávno odeslali, budou pro ostatní stále viditelné, dokud nevyprší jejich platnost.
+ Příběhy již nebudete moci sdílet ani zobrazovat. Aktualizace příběhů, které jste nedávno sdíleli, budou také odstraněny.
Soukromí příběhů
@@ -5450,7 +5509,7 @@
Kdo může tento příběh zobrazit
- "Tento příběh mohou zobrazit a odpovídat na něj členové skupiny %1$s. Členství pro tuto konverzaci můžete aktualizovat ve skupině."
+ "Tento příběh mohou zobrazit a odpovídat na něj členové skupiny %1$s. Členství v této konverzaci můžete aktualizovat ve skupině."
Odstranit skupinový příběh
@@ -5465,7 +5524,7 @@
Exportujte své SMS zprávy
- SMS zprávy můžete exportovat do databáze SMS zpráv svého telefonu. Tím povolíte ostatním SMS aplikacím v telefonu přístup k nim a jejich import. Nevytvoří se tím však sdílený soubor historie SMS zpráv.
+ SMS zprávy můžete exportovat do databáze SMS zpráv svého telefonu. Tím povolíte ostatním SMS aplikacím v telefonu přístup k nim a jejich import. Nevytvoří se tím však sdílený soubor historie SMS zpráv.
Pokračovat
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index b58acb7d06..45f8b86820 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -193,7 +193,7 @@
Opdatér
Opdatér ikke
Advarsel
- Din version af Signal er udløbet. Du kan se din beskedhistorik, men du kan ikke sende eller modtage beskeder, før du opdaterer.
+ Din Signal-version er udløbet. Du kan se din meddelelseshistorik, men du kan ikke sende eller modtage beskeder, før du opdaterer.
Ingen webbrowser fundet.
@@ -673,7 +673,7 @@
Hvad er nye grupper?
Nye grupper har funktioner som @omtaler og gruppeadministratorer og vil understøtte flere funktioner i fremtiden.
- Al beskedhistorik og mediefiler er blevet bevaret fra før opgraderingen.
+ Al meddelelseshistorik og alle mediefiler fra før opdateringen er blevet gemt.
Du skal godkende en invitation for at blive medlem af denne gruppe igen og vil ikke modtage gruppebeskeder indtil da.
- Dette medlem skal acceptere en invitation til at deltage i gruppen igen og vil ikke modtage gruppebeskeder, før de accepterer:
@@ -688,7 +688,7 @@
Opgrader til Ny gruppe
Opgradér gruppen
Nye grupper har funktioner som @omtaler og gruppeadministratorer og vil understøtte flere funktioner i fremtiden.
- Al beskedhistorik og mediefiler vil blive gemt fra før opgraderingen.
+ Al meddelelseshistorik og alle mediefiler fra før opgraderingen gemmes.
Netværksfejl registreret. Prøv igen senere.
Opgradering mislykkedes.
@@ -1346,9 +1346,9 @@
Kan du lide denne nye funktion? Hjælp med at støtte Signal med en engangsdonation.
- Din meddelelseshistorik med %1$s og vedkommendes nummer %2$s er blevet flettet.
+ Din meddelelseshistorik med %1$s og vedkommendes nummer %2$s er slået sammen.
- Din meddelelseshistorik med %1$s og en anden chat, der tilhørte vedkommende, er blevet flettet.
+ Din meddelelseshistorik med %1$s og en anden chat, der tilhørte vedkommende, er slået sammen.
%1$s startede et gruppeopkald · %2$s
@@ -1857,7 +1857,7 @@
Reagerede %1$s på din historie
- Reagerede %1$s på vedkommendes historie
+ Reagerede %1$s på deres historie
Opdater Molly
@@ -1960,6 +1960,7 @@
%1$s til dig
Mediefil er ikke længere tilgængelig.
Kan ikke finde en app, som kan dele denne mediefil.
+ Luk
%1$d nye beskeder i %2$d samtaler
@@ -2623,7 +2624,7 @@
Betalinger (Beta)
Grænse for samtalelængde
Bevar beskeder
- Ryd beskedhistorik
+ Ryd meddelelseshistorik
Forbundne enheder
Lyst
Mørkt
@@ -2657,7 +2658,7 @@
Ved brug af WiFi
Ved roaming
Automatisk hentning af mediefiler
- Beskedhistorik
+ Meddelelseshistorik
Brug af lagerplads
Billeder
Videoer
@@ -2665,12 +2666,12 @@
Lyd
Gennemgå lager
Slet ældre beskeder?
- Ryd beskedhistorik?
- Dette vil slette al beskedhistorik og medier permanent fra din enhed, der er ældre end %1$s
+ Ryd meddelelseshistorik?
+ Dette sletter permanent al meddelelseshistorik og alle medier, der er ældre end %1$s
Dette reducerer 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. Handlingen kan ikke fortrydes
+ Dette sletter permanent al beskedhistorik og alle medier fra din enhed
+ Er du sikker på, du vil slette al meddelelseshistorik?
+ Al meddelelseshistorik fjernes permanent. Handlingen kan ikke fortrydes
Slet alt nu
For evigt
1 år
@@ -2748,10 +2749,14 @@
Tilpas mulighed
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Ikke nu
+
+
+ Sikkerhedsindstillinger
+
+ Beskyt dine ressourcer
+
+ Hjælp med at forhindre en person med din telefon i at tilgå dine penge ved at tilføje et ekstra sikkerhedslag. Du kan deaktivere denne mulighed under Indstillinger.
+
+ Aktivér betalingslås
+
+ Ikke nu
+
+ Spring dette trin over?
+
+ Hvis du springer dette trin over, kan alle, der har fysisk adgang til din telefon, overføre penge eller se din gendannelsessætning.
+
+ Annuller
+
+ Spring over
+
Tilføj midler
Din wallet-adresse
@@ -4258,7 +4283,7 @@
Videoer vil blive beskåret til klip på 30 sek. og sendt som flere historier.
- Videoer, som er sendt til Historier, kan ikke være længere end 30 sek.
+ Videoer, der er sendt til Historier, kan ikke være længere end 30 sek.
Videresendte beskeder sendes nu øjeblikkeligt.
- Send %1$d besked
@@ -4735,7 +4760,7 @@
Skjul historie?
- Nye historie-opdateringer fra %1$s vil ikke længere blive vist øverst på listen over historier.
+ Nye historieopdateringer fra %1$s vil ikke længere blive vist øverst på listen over historier.
Skjul
@@ -4750,7 +4775,7 @@
Videresend
- %1$s\'s historie
+ Historie fra %1$s
Slet historie?
@@ -4799,6 +4824,8 @@
Fjern tilskuer
Ingen svar endnu
+
+ Du kan ikke svare på denne historie, da du ikke længere er medlem af denne gruppe.
Reagerede på historien
@@ -4806,7 +4833,7 @@
Svar
- Reager på denne historie
+ Reagér på denne historie
Svarer privat til %1$s
@@ -4817,6 +4844,13 @@
Slet
Min historie
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Hvem kan se denne historie?
@@ -4828,7 +4862,7 @@
Alle med undtagelse af…
- Gem din historie for bestemte personer
+ Skjul din historie fra bestemte personer
- %1$d person er ekskluderet
@@ -4851,8 +4885,6 @@
Tillad svar & reaktioner
Lad folk, der kan se din historie, reagere og svare
-
- Skjul din historie for bestemte personer. Som standard deles din historie med dine %1$s
Signal-forbindelser
@@ -4864,7 +4896,7 @@
Have dem i dit systems kontakter
- "Dine forbindelser kan se dit navn og billede og kan se indlæg i \"Min historie\", medmindre du skjuler det for dem."
+ "Dine kontakter kan se dit navn og billede. De kan også se indlæg i \"Min historie\", medmindre du skjuler det for dem."
Tilføj seer
@@ -4880,7 +4912,7 @@
Denne handling kan ikke fortrydes.
- Rediger navn på historie
+ Redigér navn på historie
Navn på historie
@@ -4911,20 +4943,38 @@
Del kun med…
Udført
+
+ Fjern gruppehistorie?
+
+ \"%1$s\" vil blive fjernet.
+
+ Fjern
+
+ Slet privat historie?
+
+ \"%1$s\" og opdateringer, der deles til denne historie, slettes.
+
+ Slet
+
+ Historier er kun tilgængelige for Signal-betabrugere.
+
+ Hvis du deler en historie, vil den kun være tilgængelig for personer, der bruger betaversionen af Signal.
Føj til historie?
- Når du tilføjer indhold til din historie, kan dine Signal-forbindelser se det i 24 timer. Du kan ændre, hvem der kan se din historie, i Indstillinger.
+ Når du føjer indhold til din historie, kan dine Signal-kontakter se det i 24 timer. Du kan ændre, hvem der kan se din historie, under Indstillinger.
Føj til historie
Rediger seere
- Historie kunne ikke sendes. Tjek din forbindelse og prøv igen.
+ Historie kunne ikke sendes. Tjek din forbindelse, og prøv igen.
Send
+
+ Deaktivér og slet
- Del & Se historier
+ Del og se historier
Du vil ikke længere kunne dele eller se historier, når denne indstilling er slået fra.
@@ -4953,7 +5003,7 @@
Vælg din historietype
- Ny privat historie
+ Ny privat histories
Kun synlig for bestemte personer
@@ -4993,7 +5043,7 @@
Deaktiver
- Du reagerede på historie fra %1$s
+ Du reagerede på historien fra %1$s
Reagerede på din historie
@@ -5071,6 +5121,11 @@
- Gruppehistorie · %1$d seer
- Gruppehistorie · %1$d seere
+
+
+ - %1$d medlem
+ - %1$d medlemmer
+
- %1$s · %2$d seer
@@ -5093,7 +5148,7 @@
Slet historie?
- Slet denne private historie \"%1$s\"?
+ Slet den private historie \"%1$s\"?
Slet
@@ -5139,7 +5194,7 @@
Alle forbindelser er gennemgået. Tryk send for at fortsætte.
- Du har %1$d forbindelser, der muligvis har geninstalleret Signal eller skiftet enhed. Gennemgå deres sikkerhedsnummer, eller overvej at fjerne dem fra din historie, inden du deler din historie med dem.
+ Du har %1$d kontakter, der muligvis har geninstalleret Signal eller skiftet enhed. Gennemgå deres sikkerhedsnummer, eller overvej at fjerne dem fra din historie, inden du deler din historie med dem.
Verificer sikkerhedsnummer
@@ -5169,7 +5224,7 @@
Privatlivsindstillinger for Min historie
- Vælg, hvem der kan se opslag i Min Historie. Du kan altid ændre dette i indstillinger.
+ Vælg, hvem der kan se opslag i Min historie. Du kan altid ændre dette i indstillinger.
Alle Signal-forbindelser
@@ -5206,7 +5261,7 @@
Slå historier fra?
- Du vil ikke længere kunne dele eller se historier. Alle historier, som du har sendt for nyligt, vil stadig være synlige, indtil de udløber.
+ Du vil ikke længere kunne dele eller se historier. Historieopdateringer, du for nylig har delt, slettes også.
Privatlivsindstillinger for historier
@@ -5214,7 +5269,7 @@
Personer, der kan se denne historie
- "Medlemmer af gruppen \"%1$s\" kan se og svare på denne historie. Du kan opdatere medlemmerne i denne chat i gruppen."
+ "Medlemmer af gruppen %1$s kan se og svare på denne historie. Du kan opdatere medlemmerne i denne chat i gruppen."
Fjern gruppehistorie
@@ -5229,7 +5284,7 @@
Eksportér dine sms\'er
- Du kan eksportere dine SMS\'er til din telefons SMS-database. Dette giver andre SMS-apps på din telefon adgang til SMS\'erne og tilladelse til at importere dem. Dette opretter ikke en delbar fil i din SMS-historik.
+ Du kan eksportere dine sms\'er til din telefons sms-database. Dette giver andre sms-apps på din telefon adgang til sms\'erne og tilladelse til at importere dem. Dette opretter ikke en delbar fil i din sms-historik.
Fortsæt
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 2859eb0341..282bb2c2a1 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -218,7 +218,7 @@
Nach Nutzernamen suchen
- Meine Stories
+ Meine Storys
Neue Story
@@ -1960,6 +1960,7 @@
%1$s an dich
Medieninhalte nicht mehr verfügbar.
Keine App zum Teilen dieser Medieninhalte gefunden.
+ Schließen
%1$d neue Nachrichten in %2$d Unterhaltungen
@@ -1982,14 +1983,14 @@
Öffne Molly, um nach neuen Benachrichtigungen zu sehen.
%1$s %2$s
Kontakt
- Hat mit %1$s reagiert auf: »%2$s«.
- Hat mit %1$s auf dein Video reagiert.
- Hat mit %1$s auf dein Bild reagiert.
- Hat mit %1$s auf dein GIF reagiert.
- Hat mit %1$s auf deine Datei reagiert.
- Hat mit %1$s auf dein Audio reagiert.
- Hat mit %1$s auf deine einmalig anzeigbaren Medieninhalte reagiert.
- Hat mit %1$s auf deinen Sticker reagiert.
+ Mit %1$s reagiert auf: »%2$s«.
+ Mit %1$s auf dein Video reagiert.
+ Mit %1$s auf dein Bild reagiert.
+ Mit %1$s auf dein GIF reagiert.
+ Mit %1$s auf deine Datei reagiert.
+ Mit %1$s auf dein Audio reagiert.
+ Mit %1$s auf deine einmalig anzeigbaren Medieninhalte reagiert.
+ Mit %1$s auf deinen Sticker reagiert.
Diese Nachricht wurde gelöscht.
Benachrichtigungen über neue Signal-Kontakte ausschalten? Du kannst sie wieder einschalten in Signal → Einstellungen → Benachrichtigungen.
@@ -2748,10 +2749,14 @@
Option anpassen
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Jetzt nicht
+
+
+ Sicherheitseinstellungen
+
+ Schütze dein Geld
+
+ Verhindere, dass eine Person mit deinem Smartphone auf dein Geld zugreifen kann, indem du eine weitere Sicherheitsebene hinzufügst. Du kannst diese Option in Einstellungen deaktivieren.
+
+ Zahlungssperre aktivieren
+
+ Jetzt nicht
+
+ Diesen Schritt überspringen?
+
+ Wenn du diesen Schritt überspringst, kann jeder, der Zugriff auf dein Smartphone hat, Geld überweisen oder deine Wiederherstellungsphrase einsehen.
+
+ Abbrechen
+
+ Überspringen
+
Guthaben hinzufügen
Deine Wallet-Adresse
@@ -4699,13 +4724,13 @@
Unterhaltungen
- Stories
+ Storys
99+
Story-Datenschutz
- Meine Stories
+ Meine Storys
Antippen, um eine Story hinzuzufügen
@@ -4741,7 +4766,7 @@
Story ausgeblendet
- Ausgeblendete Stories
+ Ausgeblendete Storys
- %1$d Aufruf
@@ -4799,6 +4824,8 @@
Betrachter entfernen
Bisher keine Antworten
+
+ Du kannst nicht auf diese Story antworten, weil du nicht mehr Mitglied in dieser Gruppe bist.
Auf Story reagiert
@@ -4816,7 +4843,14 @@
Löschen
- Mein Story
+ Meine Story
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Wer diese Story sehen kann
@@ -4851,8 +4885,6 @@
Antworten & Reaktionen erlauben
Erlaube Personen, die deine Story sehen können, auf sie zu antworten und zu reagieren
-
- Verberge deine Story vor bestimmten Personen. Standardmäßig wird deine Story geteilt mit deinen %1$s
Signal-Verbindungen
@@ -4864,7 +4896,7 @@
Speicherung in den Systemkontakten
- "Deine Beziehungen können deinen Namen und dein Foto sowie Beiträge unter »Meine Story« sehen, es sei denn, du verbirgst sie vor ihnen."
+ "Deine Verbindungen können deinen Namen und dein Foto sowie Beiträge unter »Meine Story« sehen, es sei denn, du verbirgst sie vor ihnen."
Betrachter hinzufügen
@@ -4911,10 +4943,26 @@
Nur teilen mit …
Fertig
+
+ Deine Gruppen-Story entfernen?
+
+ »%1$s« wird entfernt.
+
+ Entfernen
+
+ Private Story löschen?
+
+ »%1$s« und Aktualisierungen, die im Rahmen dieser Story geteilt werden, werden gelöscht.
+
+ Löschen
+
+ Storys ist nur für Signal Beta User verfügbar.
+
+ Wenn du eine Story teilst, ist sie nur für Personen zugänglich, die an Signal Beta teilnehmen.
Zu Story hinzufügen?
- Wenn du deiner Story Inhalte hinzufügst, können deine Signal-Beziehungen diese 24 Stunden lang ansehen. Du kannst in den Einstellungen ändern, wer deine Story sehen kann.
+ Wenn du deiner Story Inhalte hinzufügst, können deine Signal-Verbindungen diese 24 Stunden lang ansehen. Du kannst in den Einstellungen ändern, wer deine Story sehen kann.
Zu Story hinzufügen
@@ -4923,10 +4971,12 @@
Story konnte nicht versendet werden. Überprüfe deine Internetverbindung und versuche es erneut.
Senden
+
+ Ausschalten und löschen
- Stories teilen & betrachten
+ Storys teilen und betrachten
- Wenn diese Option deaktiviert ist, können keine Stories geteilt und angesehen werden.
+ Wenn diese Option deaktiviert ist, können keine Storys geteilt und betrachtet werden.
Betrachter auswählen
@@ -4947,7 +4997,7 @@
Dieses Feld ist erforderlich.
- Es existiert bereits eine Story dieses Namens
+ Es existiert bereits eine Story mit diesem Namen
Alle auswählen
@@ -5063,13 +5113,18 @@
Nur teilen mit
- - Private Story · %1$d Ansichten
- - Private Story · %1$d Ansichten
+ - Private Story · %1$d Betrachter
+ - Private Story · %1$d Betrachter
- - Gruppen-Story · %1$d Ansichten
- - Gruppen-Story · %1$d Ansichten
+ - Gruppen-Story · %1$d Betrachter
+ - Gruppen-Story · %1$d Betrachter
+
+
+
+ - %1$d Mitglied
+ - %1$d Mitglieder
@@ -5093,7 +5148,7 @@
Story löschen?
- Private Story \"%1$s\" löschen?
+ Private Story »%1$s« löschen?
Löschen
@@ -5169,7 +5224,7 @@
Meine Story-Datenschutz
- Wähle aus, wer Posts zu deiner Story sehen kann. In „Einstellungen“ kannst du jederzeit Änderungen vornehmen.
+ Wähle aus, wer Posts zu deiner Story sehen kann. In »Einstellungen« kannst du jederzeit Änderungen vornehmen.
Alle Signal-Verbindungen
@@ -5206,7 +5261,7 @@
Storys ausschalten?
- Du kannst dann keine Storys mehr teilen oder ansehen. Alle Storys, die du kürzlich verschickt hast, sind weiterhin für andere sichtbar, bis sie ablaufen.
+ Du wirst keine Storys mehr teilen oder betrachten können. Story-Updates, die du kürzlich geteilt hast, werden ebenfalls gelöscht.
Story-Datenschutz
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index df0430e8be..5516c36e4d 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -193,7 +193,7 @@
Ενημέρωση
Να μην αναβαθμιστεί
Προσοχή
- Η έκδοση του Signal έχει λήξει. Μπορείς να δεις το ιστορικό μηνυμάτων αλλά δεν θα μπορείς να στέλνεις ή να λαβαίνεις μηνύματα μέχρι να κάνεις αναβάθμιση.
+ Η έκδοση του Signal έχει λήξει. Μπορείς να δεις το ιστορικό μηνυμάτων αλλά δεν θα μπορείς να στέλνεις ή να λαμβάνεις μηνύματα μέχρι να κάνεις αναβάθμιση.
Δεν βρέθηκε περιηγητής.
@@ -673,7 +673,7 @@
Τι είναι οι Ομάδες νέου τύπου;
Οι ομάδες νέου τύπου έχουν δυνατότητες όπως οι @αναφορές και οι διαχειριστές ομάδας, και θα αποκτήσουν παραπάνω δυνατότητες στο μέλλον.
- Όλο το ιστορικό της συζήτησης και τα πολυμέσα διατηρήθηκαν ως είχαν πριν την αναβάθμιση.
+ Όλο το ιστορικό των μηνυμάτων και τα πολυμέσα διατηρήθηκαν ως είχαν πριν από την αναβάθμιση.
Θα χρειαστεί να αποδεχτείς πάλι μια πρόσκληση για να μπεις στην ομάδα, και δεν θα λαμβάνεις μηνύματα της ομάδας μέχρι να αποδεχτείς.
- Αυτό το μέλος θα πρέπει να αποδεχτεί την πρόσκληση να ξαναμπεί στην ομάδα, και δεν θα λαμβάνει τα μηνύματα της ομάδας μέχρι να αποδεχτεί:
@@ -688,7 +688,7 @@
Αναβάθμιση σε Ομάδα νέου τύπου
Αναβάθμισε την ομάδα
Οι ομάδες νέου τύπου έχουν δυνατότητες όπως οι @αναφορές και οι διαχειριστές ομάδας, και θα αποκτήσουν παραπάνω δυνατότητες στο μέλλον.
- Όλο το ιστορικό των μηνυμάτων και τα πολυμέσα θα διατηρηθούν ως έχουν πριν την αναβάθμιση.
+ Όλο το ιστορικό των μηνυμάτων και τα πολυμέσα θα διατηρηθούν ως έχουν πριν από την αναβάθμιση.
Υπήρξε σφάλμα δικτύου. Δοκίμασε ξανά αργότερα.
Αποτυχία αναβάθμισης.
@@ -1855,9 +1855,9 @@
Εξαργύρωσες ένα δώρο έμβλημα
- Αντέδρασε/αν με %1$s στην ιστορία σου
+ Αντέδρασε με %1$s στην ιστορία σου
- Αντέδρασες με %1$s στην ιστορία τους
+ Αντέδρασε με %1$s στην ιστορία τους
Αναβάθμιση Molly
@@ -1960,6 +1960,7 @@
%1$s προς εσένα
Το πολυμέσο δεν είναι πια διαθέσιμο.
Δεν βρέθηκε εφαρμογή που να μπορεί να διαμοιραστεί αυτό το πολυμέσο.
+ Κλείσιμο
%1$d νέα μηνύματα σε %2$d συνομιλίες
@@ -2666,11 +2667,11 @@
Ανασκόπηση χώρου
Διαγραφή παλαιότερων μηνυμάτων;
Εκκαθάριση του ιστορικού μηνυμάτων;
- Αυτό θα διαγράψει μόνιμα όλο το ιστορικό μηνυμάτων και τα πολυμέσα από τη συσκευή σου, τα οποία είναι παλαιότερα από %1$s.
+ Με αυτόν τον τρόπο, θα διαγραφεί μόνιμα όλο το ιστορικό μηνυμάτων και τα πολυμέσα από τη συσκευή σου, τα οποία είναι παλαιότερα από %1$s.
Αυτό θα περικόψει όλες τις συνομιλίες στα %1$s πιο πρόσφατα μηνύματα.
- Αυτό θα διαγράψει μόνιμα όλο το ιστορικό μηνυμάτων και τα πολυμέσα από τη συσκευή σου.
- Είσαι σίγουρος/η πως θέλεις να διαγράψεις όλο το ιστορικό των μηνυμάτων;
- Όλο το ιστορικό των μηνυμάτων θα σβηστεί μόνιμα. Αυτή η ενέργεια δεν μπορεί να ανακληθεί.
+ Με αυτόν τον τρόπο, θα διαγραφεί μόνιμα όλο το ιστορικό μηνυμάτων και τα πολυμέσα από τη συσκευή σου.
+ Θέλεις σίγουρα να διαγράψεις όλο το ιστορικό των μηνυμάτων;
+ Όλο το ιστορικό των μηνυμάτων θα αφαιρεθεί μόνιμα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.
Διαγραφή όλων τώρα
Για πάντα
1 έτος
@@ -2748,10 +2749,14 @@
Προσαρμογή ρύθμισης
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Όχι τώρα
+
+
+ Ρύθμιση ασφάλειας
+
+ Προστάτεψε τα χρήματά σου
+
+ Πρόσθεσε ένα ακόμη επίπεδο ασφάλειας για να αποτρέπεις την πρόσβαση ατόμων στα χρήματα στο τηλέφωνό σου. Μπορείς να απενεργοποιήσεις αυτήν την επιλογή στις Ρυθμίσεις.
+
+ Ενεργοποίηση κλειδώματος πληρωμής
+
+ Όχι τώρα
+
+ Παράλειψη αυτού του βήματος;
+
+ Η παράλειψη αυτού του βήματος μπορεί να επιτρέψει σε οποιοδήποτε άτομο έχει φυσική πρόσβαση στο τηλέφωνό σου να μεταφέρει χρήματα ή να δει τη φράση ανάκτησης.
+
+ Ακύρωση
+
+ Παράλειψη
+
Προσθήκη χρημάτων
Η διεύθυνση πορτοφολιού σας
@@ -3976,7 +4001,7 @@
Προκαθορισμένο χρονόμετρο για νέες συνομιλίες
Ορισμός ενός προκαθορισμένου χρόνου εξαφάνισης μηνυμάτων για όλες τις συνομιλίες που ξεκινάς εσύ.
- Διαχειρίσου τις ιστορίες σου και ποιους μπορούν να τις δουν
+ Διαχειρίσου τις ιστορίες σου και τα άτομα που μπορούν να τις δουν
Απαιτείται κλείδωμα οθόνης Android ή δακτυλικό αποτύπωμα για τη μεταφορά χρημάτων
Δεν μπορώ να ενεργοποιήσω το κλείδωμα πληρωμής
@@ -4735,7 +4760,7 @@
Απόκρυψη ιστορίας;
- Νέες ιστορίες από τον/την %1$s δεν θα εμφανίζονται πλέον στη κορυφή της λίστας ιστοριών.
+ Νέες ενημερώσεις ιστοριών από τον/την %1$s δεν θα εμφανίζονται πλέον στη κορυφή της λίστας ιστοριών.
Απόκρυψη
@@ -4754,7 +4779,7 @@
Διαγραφή ιστορίας;
- Η ιστορία θα διαγραφτεί για εσένα και όλα τα άτομα που την έχουν λάβει.
+ Η ιστορία θα διαγραφεί για εσένα και όλα τα άτομα που την έχουν λάβει.
Μη δυνατότητα αποθήκευσης
@@ -4799,6 +4824,8 @@
Αφαίρεση θεατή
Καμία απάντηση ακόμα
+
+ Δεν μπορείς να απαντήσεις σε αυτήν την ιστορία γιατί δεν είσαι πια μέλος της ομάδας.
Αντέδρασε στην ιστορία
@@ -4817,8 +4844,15 @@
Διαγραφή
Η ιστορία μου
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
- Ποιοι μπορούν να δουν αυτήν την ιστορία
+ Ποια άτομα μπορούν να δουν αυτήν την ιστορία
Απόκρυψη ιστορίας από
@@ -4851,8 +4885,6 @@
Να επιτρέπονται απαντήσεις & αντιδράσεις
Να επιτρέπεται στα άτομα που μπορούν να δουν τις ιστορίες σου, να αντιδράσουν και να απαντήσουν
-
- Απόκρυψη της ιστορίας σου από συγκεκριμένα άτομα. Η προεπιλογή είναι η ιστορία σου να μοιράζεται με τις %1$s
Επαφές Signal
@@ -4880,7 +4912,7 @@
Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.
- Επεξεργασία ονόματος ιστορίας.
+ Επεξεργασία ονόματος ιστορίας
Όνομα ιστορίας
@@ -4911,22 +4943,40 @@
Κοινοποίηση μόνο σε…
Τέλος
+
+ Αφαίρεση ιστορίας ομάδας;
+
+ H ιστορία \"%1$s\" θα αφαιρεθεί.
+
+ Αφαίρεση
+
+ Διαγραφή ιδιωτικής ιστορίας;
+
+ Οι ιστορίες \"%1$s\" και οι ενημερώσεις που κοινοποιούνται σε αυτή θα διαγραφούν.
+
+ Διαγραφή
+
+ Οι ιστορίες είναι διαθέσιμες μόνο στους χρήστες beta του Signal.
+
+ Εάν κοινοποιήσεις μια ιστορία, θα είναι διαθέσιμη μόνο σε άτομα που βρίσκονται σε beta έκδοση του Signal.
Προσθήκη στην ιστορία;
- Προσθέτοντας περιεχόμενο στην ιστορία σου, επιτρέπεις στις επαφές Signal σου να το δουν για 24 ώρες. Μπορείς επίσης να αλλάξεις το ποιοι μπορούν να δουν την ιστορία σου στις Ρυθμίσεις.
+ Όταν προσθέτεις περιεχόμενο στην ιστορία σου, επιτρέπεις στις επαφές σου στο Signal να το δουν για 24 ώρες. Μπορείς επίσης να αλλάξεις τα άτομα που μπορούν να δουν την ιστορία σου στις Ρυθμίσεις.
Προσθήκη στην ιστορία
Επεξεργασία θεατών
- Η ιστορία δεν μπόρεσε να σταλθεί. Έλεγξε τη σύνδεσή σου και προσπάθησε ξανά.
+ Δεν ήταν δυνατή η αποστολή της ιστορίας. Έλεγξε τη σύνδεσή σου και προσπάθησε ξανά.
Αποστολή
+
+ Απενεργοποίηση και διαγραφή
- Διαμοιρασμός & Προβολή Ιστοριών
+ Κοινοποίηση και προβολή ιστοριών
- Δεν θα μπορείς πια να μοιραστείς ή να δεις Ιστορίες όταν αυτή η επιλογή είναι απενεργοποιημένη.
+ Δεν θα μπορείς πια να μοιράζεσαι ή να βλέπεις Ιστορίες όταν αυτή η επιλογή είναι απενεργοποιημένη.
Επιλογή θεατών
@@ -4951,7 +5001,7 @@
Επιλογή όλων
- Επέλεξε τον τύπο της ιστορίας σου
+ Επίλεξε τον τύπο της ιστορίας σου
Νέα ιδιωτική ιστορία
@@ -4975,7 +5025,7 @@
Αποτυχία φόρτωσης περιεχομένου
- Η ιστορία στάλθηκε
+ Η ιστορία εστάλη
Αποτυχία αποστολής ιστορίας
@@ -5063,14 +5113,19 @@
Κοινοποίηση μόνο σε
- - Ιδιωτική ιστορία · %1$d προβολή
- - Ιδιωτική ιστορία · %1$d προβολές
+ - Ιδιωτική ιστορία · %1$d θεατής
+ - Ιδιωτική ιστορία · %1$d θεατές
- Ομαδική ιστορία · %1$d προβολή
- Ομαδική ιστορία · %1$d προβολές
+
+
+ - %1$d μέλος
+ - %1$d μέλη
+
- %1$s · %2$d θεατής
@@ -5167,7 +5222,7 @@
Αφαίρεση
- Ιδιωτικότητα της ιστορίας σου
+ Απόρρητο της ιστορίας σου
Επίλεξε ποια άτομα μπορούν να δουν δημοσιεύσεις στην ιστορία σου. Μπορείς πάντα να κάνεις αλλαγές στις ρυθμίσεις.
@@ -5194,7 +5249,7 @@
- Οι ιστορίες εξαφανίζονται αυτόματα μετά από 24 ώρες. Διάλεξε ποιοι μπορούν να δουν την ιστορία σου ή δημιούργησε νέες ιστορίες για συγκεκριμένους θεατές ή ομάδες.
+ Οι ιστορίες εξαφανίζονται αυτόματα μετά από 24 ώρες. Διάλεξε ποια άτομα μπορούν να δουν την ιστορία σου ή δημιούργησε νέες ιστορίες για συγκεκριμένους θεατές ή ομάδες.
Απενεργοποίηση ιστοριών
@@ -5206,15 +5261,15 @@
Απενεργοποίηση ιστοριών;
- Δεν θα μπορείς πλέον να μοιράζεσαι ή να βλέπεις ιστορίες. Οι ιστορίες που έχεις στείλει πρόσφατα θα παραμείνουν ορατές σε άλλους μέχρι να εξαφανιστούν.
+ Δεν θα μπορείς πλέον να μοιράζεσαι ή να βλέπεις ιστορίες. Οι ενημερώσεις ιστορίας που κοινοποίησες πρόσφατα θα διαγραφούν επίσης.
Απόρρητο ιστορίας
- Ποιοι μπορούν να δουν αυτή την ιστορία
+ Ποια άτομα μπορούν να δουν αυτή την ιστορία
- "Τα μέλη της ομάδας «%1$s» μπορούν να δουν και να απαντήσουν σε αυτή την ιστορία. Μπορείς να ενημερώσεις τα μέλη για αυτή τη συνομιλία στην ομάδα."
+ "Τα μέλη της ομάδας %1$s μπορούν να δουν και να απαντήσουν σε αυτή την ιστορία. Μπορείς να ενημερώσεις τα μέλη για αυτή τη συνομιλία στην ομάδα."
Αφαίρεση ιστορίας ομάδας
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index fbccbbc087..df595411b7 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1542,7 +1542,7 @@
¡Fallo de red!
¡Número no registrado!
¡El número marcado no admite llamadas seguras!
- Recibido
+ Entendido
@@ -1960,6 +1960,7 @@
De %1$s para ti
El adjunto original ya no está disponible.
Fallo al encontrar la aplicación para mostrar este adjunto.
+ Cerrar
%1$d mensajes nuevos en %2$d chats
@@ -2343,7 +2344,7 @@
Tiempo de envío copiado al portapapeles.
- Actualizaciones de tu historia se mostrarán aquí.
+ Las actualizaciones de tu historia se mostrarán aquí.
@@ -2669,7 +2670,7 @@
Esto eliminará permanentemente todos los mensajes y adjuntos de este dispositivo con más antigüedad de %1$s.
Esto recortará permanentemente todos los chat y mantendrá los %1$s mensajes más recientes.
Esto eliminará permanentemente todos los mensajes y adjuntos de este dispositivo.
- ¿Estás segur@ que deseas eliminar todo tu historial de mensajes?
+ ¿Estás segur@ de que deseas eliminar todo tu historial de mensajes?
El historial completo de mensajes se eliminará permanentemente. Esta acción no se puede deshacer.
Borrar todos ahora
Siempre
@@ -2748,10 +2749,14 @@
Personalizar opción
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Ahora no
+
+
+ Configuración de seguridad
+
+ Protege tus fondos
+
+ Ayuda a evitar que una persona que tenga tu teléfono pueda accedes a tus fondos añadiendo otra capa de seguridad. Puedes desactivar esta opción en Ajustes.
+
+ Habilitar bloqueo de pago
+
+ Ahora no
+
+ ¿Omitir este paso?
+
+ Omitir este paso podría permitir que cualquier persona que tenga acceso físico a tu teléfono pueda transferir fondos o ver tu frase de recuperación.
+
+ Cancelar
+
+ Omitir
+
Añadir fondos
Dirección de tu cartera
@@ -4799,6 +4824,8 @@
Quitar espectador
Sin respuestas por ahora
+
+ No puedes responder a esta historia porque ya no perteneces a este grupo.
Reaccionó a la historia
@@ -4817,6 +4844,13 @@
Eliminar
Mi historia
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Quién puede ver esta historia
@@ -4851,8 +4885,6 @@
Permitir respuestas y reacciones
Permite a personas que pueden ver tu historia responder y reaccionar
-
- Oculta tu historia para personas específicas. Por defecto, tu historia se compartirá con %1$s
Contactos de Signal
@@ -4900,7 +4932,7 @@
Escribe o añade una URL
- Comparte tu historia via enlace con quien tú quieras
+ Comparte tu historia por un enlace con quien tú quieras
Buscar
@@ -4911,6 +4943,22 @@
Compartir solo con…
Hecho
+
+ ¿Quitar la historia de grupo?
+
+ Se eliminará \"%1$s\".
+
+ Eliminar
+
+ ¿Eliminar historia privada?
+
+ Se eliminará \"%1$s\" y todas las actualizaciones compartidas en esta historia.
+
+ Eliminar
+
+ Las historias solo están disponibles para las personas que tengan la versión beta de Signal.
+
+ Si compartes una historia, solo estará disponible para las personas que tengan la versión beta de Signal.
¿Añadir a la historia?
@@ -4923,6 +4971,8 @@
Fallo al enviar la historia. Comprueba tu conexión e inténtalo de nuevo.
Enviar
+
+ Desactivar y eliminar
Compartir y ver historias
@@ -5063,13 +5113,18 @@
Compartir solo con
- - Historia privada · %1$d vista
- - Historia privada · %1$d vistas
+ - Historia privada · %1$d persona
+ - Historia privada · %1$d personas
- - Historia de grupo · %1$d vista
- - Historia de grupo · %1$d vistas
+ - Historia de grupo · %1$d persona
+ - Historia de grupo · %1$d personas
+
+
+
+ - %1$d participante
+ - %1$d participantes
@@ -5202,11 +5257,11 @@
Activar historias
- Comparte y visualiza las historias de otros. Las historias desparecerán automáticamente después de 24 horas.
+ Comparte y visualiza las historias de otras personas. Las historias desparecerán automáticamente después de 24 horas.
¿Desactivar historias?
- Ya no podrás compartir o visualizar historias. Cualquier historia que hayas enviado recientemente continuará siendo visible por otros usuarios hasta que expire.
+ Ya no podrás compartir o ver historias. Las historias que hayas compartido recientemente también serán eliminadas.
Privacidad de la historia
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index f18c0ab62e..032c1c5192 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -1960,6 +1960,7 @@
Kasutajalt %1$s sinule
Meedia ei ole enam saadaval.
Ei leia rakendust, mis oleks võimeline seda meediafaili jagama.
+ Sulge
%1$d uut sõnumit %2$d vestluses
@@ -2748,10 +2749,14 @@
Kohanda valikut
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Mitte praegu
+
+
+ Turvasätted
+
+ Kaitse oma raha
+
+ Lisa täiendav turvakiht, et keegi sinu rahale ligi ei pääseks, juhul kui su telefon võõrastesse kätesse satub. Saad selle funktsiooni sätete alt välja lülitada.
+
+ Lülita makselukk sisse
+
+ Mitte praegu
+
+ Kas jätta see samm vahele?
+
+ Kui selle sammu vahele jätad, saab igaüks, kellel sinu telefonile ligipääs on, raha üle kanda ja sinu kontroll-lauset vaadata.
+
+ Loobu
+
+ Jäta vahele
+
Lisa vahendeid
Sinu rahakoti aadress
@@ -4799,6 +4824,8 @@
Eemalda vaataja
Vastuseid veel pole
+
+ Sa ei saa sellele loole vastata, sest sa ei ole enam selle grupi liige.
Reageeris loole
@@ -4817,6 +4844,13 @@
Kustuta
Minu lugu
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Kes seda lugu näevad
@@ -4851,8 +4885,6 @@
Luba vastuseid & reaktsioone
Luba inimestel, kes saavad su lugu vaadata, reageerida ja vastata
-
- Peida oma lugu konkreetsete inimeste eest. Vaikimisi näevad lugu: %1$s
Signali kontaktid
@@ -4911,6 +4943,22 @@
Jaga ainult nendega …
Tehtud
+
+ Kas eemaldada grupi lugu?
+
+ „%1$s“ eemaldatakse.
+
+ Eemalda
+
+ Kas kustutada privaatne lugu?
+
+ „%1$s“ ja selles loos jagatud uuendused kustutatakse.
+
+ Kustuta
+
+ Lood on kättesaadavad ainult Signali beetakasutajatele.
+
+ Kui lugu jagad, saavad seda vaadata ainult Signali beetakasutajad.
Kas lisada loosse?
@@ -4923,6 +4971,8 @@
Lugu ei õnnestunud saata. Kontrolli oma internetiühendust ja proovi uuesti.
Saada
+
+ Lülita välja ja kustuta
Jaga & Vaata lugusid
@@ -5071,6 +5121,11 @@
- Grupi lugu · %1$d vaataja
- Grupi lugu · %1$d vaataja
+
+
+ - %1$d liige
+ - %1$d liiget
+
- %1$s · %2$d vaataja
@@ -5206,7 +5261,7 @@
Kas lülitada lood välja?
- Sa ei saa enam lugusid jagada ega vaadata. Sinu hiljuti jagatud lood on teistele endiselt nähtavad, kuni need aeguvad.
+ Sa ei saa enam lugusid jagada ega vaadata. Sinu hiljuti jagatud lugude uuendused kustutatakse samuti.
Loo privaatsus
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index c176e9066b..969901a108 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -193,7 +193,7 @@
Eguneratu
Ez Eguneratu
Markatutako zenbakia ez dago Signalen erregistratuta. SMS bidez gonbidatu nahiko zenuke?
- Zure Signal bertsioa iraungi da. Zure mezuen historia ikusi dezakezu, baina ezingo duzu mezuak bidali edo jaso eguneratu arte.
+ Signal-en bertsio hau iraungi egin da. Zure mezuen historia ikusi dezakezu, baina, aplikazioa eguneratu arte, ezingo duzu mezurik bidali edo jaso.
Ezin izan da nabigatzailerik aurkitu.
@@ -673,7 +673,7 @@
Zer dira Talde Berriak?
Talde Berriek ezaugarri berriak dituzte, hala nola, @aipamenak eta talde administrazaileak; etorkizunean ezaugarri gahiago izango dituzte.
- Mezuen historiala eta multimedia eduki guztiak eguneraketa egin baino lehenagoko egoeran mantendu dira.
+ Eguneratu aurreko mezuen historia eta multimedia-eduki guztiak mantendu dira.
Talde honetara berriz sartzeko gonbidapena onartu beharko duzu, eta ez duzu taldeko mezurik jasoko gonbidapen hori onartu arte.
- Talde honetan berriro sartzeko, kide honek gonbidapena onartu beharko du; ez du talde mezurik jasoko onartu arte:
@@ -688,7 +688,7 @@
Eguneratu Talde Berrira
Eguneratu talde hau
Talde Berriek ezaugarri berriak dituzte, hala nola, @aipamenak eta talde administrazaileak; etorkizunean ezaugarri gahiago izango dituzte.
- Mezuen historiala eta multimedia eduki guztiak eguneraketa egin baino lehenagoko egoeran mantenduko dira.
+ Eguneratu aurreko mezuen historia eta multimedia-eduki guztiak mantenduko dira.
Sare errore bat izan da. Saia zaitez beranduago.
Ezin izan da eguneratu.
@@ -1542,7 +1542,7 @@
Sareak huts egin du!
Zenbakia ez da erregistratu!
Markatu duzun zenbakiak ez du dei segururik babesten!
- Jasota
+ Ulertu dut
@@ -1960,6 +1960,7 @@
%1$s(e)k zuri
Medioa jada ez dago eskuragarri.
Ez da topatu multimedia eduki hau partekatzeko gai den aplikaziorik.
+ Itxi
%1$d mezu berri %2$d solasalditan
@@ -2198,9 +2199,9 @@
Zu
Jatorrizko mezua ez da aurkitu
- %1$s • Istorioa
+ %1$s · Istorioa
- Zu • Istorioa
+ Zu · Istorioa
Jada ez dago eskuragarri
@@ -2665,12 +2666,12 @@
Audioa
Berrikusi biltegia
Ezabatu mezu zaharragoak?
- Ezabatu mezuen historia?
- Honek %1$s baino zaharrago diren mezu eta media historia osoa betiko ezabatuko du zure gailutik.
+ Mezuen historia garbitu nahi duzu?
+ Betiko ezabatuko dira gailutik %1$s baino zaharragoak diren mezuen historia eta multimedia-edukiak.
Honek betiko garbituko ditu solasaldi guztiak, beraietako bakoizean azkenengo %1$s mezuak utziz bakarrik.
- Honek betiko ezabatuko du bai zure gailuan dagoen mezuen historiala eta baita berauekin lotutako multimedia artxibo guztiak ere.
- Ziur zaude mezuen historia osoa ezabatu nahi izateaz?
- Mezuen historia osoa betiko ezabatuko da. Ekintza hau ezin da desegin.
+ Betiko ezabatuko dira gailutik mezuen historia eta multimedia-edukiak.
+ Ziur zaude mezuen historia osoa ezabatu nahi duzula?
+ Betiko ezabatuko da mezuen historia osoa. Ekintza hau ezin da desegin.
Ezabatu dena orain
Betirako
Urte 1
@@ -2748,10 +2749,14 @@
Pertsonalizatu aukera
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Orain ez
+
+
+ Segurtasun-konfigurazioa
+
+ Babestu zure funtsak
+
+ Gehitu beste segurtasun-geruza bat eta ekidin zure telefonoa darabilen jendeak zure funtsak ikusi ahal izatea. Aukera hau Ezarpenak atalean desaktibatu dezakezu.
+
+ Gaitu ordainketa-blokeoa
+
+ Orain ez
+
+ Urrats hau saltatu nahi duzu?
+
+ Urrats hau saltatuz gero, zure telefonorako sarbide fisikoa duen edonork funtsak transferitzeko edo berreskuratze-esaldia ikusteko aukera izango du.
+
+ Utzi
+
+ Saltatu
+
Gehitu funtsak
Zure diru-zorroaren helbidea
@@ -3976,7 +4001,7 @@
Txat berrietarako tenporizadore lehenetsia
Ezarri lehenetsitako desagerpen mezuen tenporizadore bat zuk hasitako txat berri guztientzat.
- Kudeatu zure istorioak eta nork ikusi ditzakeen
+ Kudeatu zure istorioak eta nork ikus ditzakeen
Funtsak transferitzeko, Android-eko pantaila-blokeoa edo hatz-marka behar da
Ezin da gaitu ordainketen babesa
@@ -4256,9 +4281,9 @@
Gehitu mezu bat
Aurrera azkarrago
- Bideoak 30 s-ko klipetan moztuko dira, eta hainbat istorio gisa bidaliko.
+ Bideoak 30 s-ko klipetan moztuko dira, eta hainbat istorio gisa bidaliko.
- Istorioetara bidalitako bideoek ezin dira 30 s baino luzeagoak izan.
+ Istorioetara bidalitako bideoak ezin dira 30 s baino luzeagoak izan.
Birbidalitako mezuak berehala bidaltzen dira.
- Bidali mezu %1$d
@@ -4699,7 +4724,7 @@
Txatak
- Storie-ak
+ Istorioak
99+
@@ -4711,9 +4736,9 @@
Une honetan ez dago azken eguneratzerik erakusteko.
- Ezkutatu storie-ak
+ Ezkutatu istorioa
- Erakutsi storie-a
+ Erakutsi istorioa
Birbidali
@@ -4733,15 +4758,15 @@
Sakatu berriro saiatzeko
- Ezkutatu storie-a?
+ Istorioa ezkuratu nahi duzu?
- Istorioen eguneratze berriak %1$stik ez dira storie-n zerrendaren goialdean agertuko.
+ %1$s(r)en istorio-eguneratze berriak ez dira agertuko istorioen zerrendaren goialdean.
Ezkutatu
- Istorioa ezkutatuta
+ Istorioa ezkutatuta dago
- Ezkutuko storie-ak
+ Ezkutuko istorioak
- Ikustaldi %1$d
@@ -4750,11 +4775,11 @@
Birbidali
- %1$sren storie-a
+ %1$s(r)en istorioa
- Ezabatu storie-a?
+ Istorioa ezabatu nahi duzu?
- Story hau zuretzat eta jaso duten guztientzat ezabatuko da.
+ Istorio hau ezabatu egingo da zuretzat eta jaso dutenentzat.
Ezin izan da gorde
@@ -4799,14 +4824,16 @@
Kendu ikuslea
Erantzunik ez oraindik
+
+ Ezin diozu erantzun istorio honi, jada ez zarelako talde honetako kidea.
- Storie-ari erreakzionatu diozu
+ Istorioari buruzko erreakzio bat bidali du
Ikustaldiak
Erantzunak
- Erreakzionatu story honi
+ Bidali istorio honi buruzko erreakzio bat
%1$sri modu pribatuan erantzuten
@@ -4817,10 +4844,17 @@
Ezabatu
Nire istorioa
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Nork ikus dezake istorio hau?
- Ezkutatu storie-a honi:
+ Ezkutatu istorioa honi:
Signal-eko konexio guztiak
@@ -4828,7 +4862,7 @@
Denak hauek izan ezik…
- Ezkutatu zure istorioa pertsona jakinei
+ Ezkutatu istorioa pertsona jakinei
- pertsona %1$d baztertuta
@@ -4844,15 +4878,13 @@
- %1$d pertsona
- Aukeratu nork ikus dezakeen zure istorioa. Aldaketek ez dute eraginik izango dagoeneko bidali dituzun istorioetan.
+ Aukeratu nork ikus dezakeen istorioa. Aldaketek ez dute eraginik izango lehenago bidalitako istorioetan.
Erantzunak & erreakzioak
Baimendu erantzunak & erreakzioak
- Utzi zure storie-a ikus dezakeen jendeari erreakzionatzen eta erantzuten
-
- Ezkutatu zure istorioa pertsona zehatzei. Lehenespenez, zure istorioa zure %1$s(are)kin partekatzen da
+ Eman istorioa ikus dezaketenei erreakzioak bidaltzeko aukera
Signal-eko konexioak
@@ -4864,15 +4896,15 @@
Zure sistemako kontaktuetan edukitzen
- "Zure konexioek zure izena eta argazkia ikus ditzakete, eta \"Nire Story\"-ko argitalpenak ikus ditzakete horiei ezkutatu ezean."
+ "Zure konexioek zure izena eta argazkia ikus ditzakete, eta \"Nire istorioa\" ataleko argitalpenak ikus ditzakete (haientzat ezkutatu ezean)."
Gehitu ikuslea
- Story pribatua ezabatu
+ Ezabatu istorio pribatua
%1$sezabatu?
- Pertsona honek ez du gehiago ikusiko zure storie-a.
+ Aurrerantzean, pertsona honek ez du ikusiko zure istorioa.
Ezabatu
@@ -4880,9 +4912,9 @@
Ekintza hau ezin da desegin.
- Editatu storie-aren izena
+ Editatu istorioaren izena
- Story izena
+ Istorioaren izena
Gorde
@@ -4900,7 +4932,7 @@
Idatzi edo itsatsi URL bat
- Partekatu esteka bat zure storie-aren ikusleekin
+ Partekatu esteka bat istorioaren ikusleekin
Bilatu
@@ -4911,22 +4943,40 @@
Partekatu hauekin bakarrik…
Eginda
+
+ Taldeko istorioa kendu nahi duzu?
+
+ \" %1$s \" kendu egingo da.
+
+ Ezabatu
+
+ Istorio pribatua ezabatu nahi duzu?
+
+ \" %1$s \" eta istorio honetan partekatutako eguneratzeak ezabatu egingo dira.
+
+ Ezabatu
+
+ Signal-en beta-bertsioaren erabiltzaileek soilik erabil dezakete Istorioak eginbidea.
+
+ Istorio bat partekatzen baduzu, Signal-en beta-bertsioa dutenek soilik ikusi ahalko dute
- Gehitu storie-ra?
+ Istorioan gehitu nahi duzu?
- Zure storie-ari edukia gehitzeak zure Signal konexioei 24 orduz ikusteko aukera ematen die. Zure storie-a nork ikus dezakeen alda dezakezu Ezarpenak atalean.
+ Zure istorioan edukia gehituta, Signal-eko konexioek 24 orduz ikusi ahalko dute. Istorioa nork ikus dezakeen aldatzeko, joan Ezarpenak atalera.
- Gehitu storie-ra
+ Gehitu istorioan
Editatu ikusleak
- Ezin izan da storie-a bidali. Egiaztatu konexioa eta saiatu berriro.
+ Ezin izan da bidali istorioa. Egiaztatu konexioa eta saiatu berriro.
Bidali
+
+ Itzali eta ezabatu
- Partekatu & Ikusi storie-ak
+ Partekatu eta ikusi istorioak
- Aurrerantzean ezingo dituzu e-ak partekatu edo ikusi aukera hau desaktibatuta dagoenean.
+ Aurrerantzean, aukera hau desaktibatuta dagoen bitartean, ezingo dituzu partekatu edo ikusi istorioak.
Aukeratu ikusleak
@@ -4937,9 +4987,9 @@
- %1$d ikusle
- Izendatu storie-a
+ Jarri izena istorioari
- Story izena (beharrezkoa)
+ Istorioaren izena (beharrezkoa)
Ikusleak
@@ -4947,17 +4997,17 @@
Eremu hau beharrezkoa da.
- Dagoeneko bada story bat izen honekin.
+ Lehendik dago izen hori duen istorio bat.
Denak hautatu
- Aukeratu zure story mota
+ Aukeratu istorio mota
- Story pribatu berria
+ Istorio pribatu berria
Pertsona zehatzentzat bakarrik ikusgai
- Taldeko storie-a
+ Taldeko istorioa
Partekatu lehendik dagoen talde batean
@@ -4969,17 +5019,17 @@
Erantzuna bidaltzen…
- Story hau jada ez dago erabilgarri.
+ Istorio hau jada ez dago erabilgarri.
Ez dago Interneteko konexiorik
Ezin izan da edukia kargatu
- Story bidalia
+ Bidali da istorioa
- Ezin izan da bidali storie-a
+ Ezin izan da bidali istorioa
- Bistaratu storie-a
+ Ikusi istorioa
Bistaratu profileko argazkia
@@ -4993,11 +5043,11 @@
Desaktibatu
- %1$sre storie-ari erreakzionatu diozu
+ %1$s(r)en istorioari buruzko erreakzio bat bidali duzu
- Zure storie-ari erreakzionatu dio
+ Zure istorioari buruzko erreakzio bat bidali du
- Storie-ari erreakzionatu dio
+ Istorio bati buruzko erreakzio bat bidali du
@@ -5060,16 +5110,21 @@
Orain ez
- Honekin bakarrik partekatu:
+ Partekatu hauekin:
- - Istorio pribatua · ikusle %1$d
+ - Istorio pribatua · %1$d ikusle
- Istorio pribatua · %1$d ikusle
- - Taldeko Istorioa · ikusle %1$d
- - Taldeko Istorioa · %1$d ikusle
+ - Taldeko istorioa · %1$d ikusle
+ - Taldeko istorioa · %1$d ikusle
+
+
+
+ - %1$d kide
+ - %1$d kide
@@ -5079,7 +5134,7 @@
Sakatu zure ikusleak aukeratzeko
- Story ezarpenak
+ Istorioen ezarpenak
Kendu istorioa
@@ -5087,11 +5142,11 @@
Taldeko istorioa kendu nahi duzu?
- Istorioa zerrenda honetatik kenduko du. Talde honetako istorioak ikusten jarraitu ahalko duzu.
+ Istorioa zerrenda honetatik kenduko da. Talde honetako istorioak ikusten jarraitu ahalko duzu.
Ezabatu
- Ezabatu storie-a?
+ Istorioa ezabatu nahi duzu?
\"%1$s\" istorio pribatua ezabatu nahi duzu?
@@ -5121,7 +5176,7 @@
Saltatzeko, pasatu hatza eskuinera
- Ulertuta
+ Ulertu dut
Ireki laster-menua
@@ -5139,7 +5194,7 @@
Konexio guztiak berrikusi dira. Aurrera egiteko, sakatu Bidali.
- Agian Signal berriro instalatu duten edo gailuak aldatu dituzten %1$d konexio dituzu. Istorioa haiekin partekatu aurretik, berrikusi haien segurtasun-zenbakiak edo ken itzazu istoriorik.
+ Agian Signal berriro instalatu duten edo gailuz aldatu diren %1$d konexio dituzu. Istorioa haiekin partekatu aurretik, berrikusi haien segurtasun-zenbakiak edo ken itzazu istoriorik.
Segurtasun zenbakia baieztatu
@@ -5206,7 +5261,7 @@
Istorioak desaktibatu nahi dituzu?
- Aurrerantzean, ezingo duzu istoriorik partekatu edo ikusi. Duela gutxi argitaratutako istorioak iraungi arte ikusi ahalko dituzte beste erabiltzaileek.
+ Aurrerantzean ezingo dituzu partekatu edo ikusi istorioak. Duela gutxi partekatu dituzun istorio-eguneratzeak ere ezabatuko dira.
Istorioen pribatutasuna
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 458441864f..a3b94d2105 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -218,7 +218,7 @@
جستجو با نام کاربری
- داستانهای من
+ استوریهای من
استوری جدید
@@ -673,7 +673,7 @@
گروههای جدید چیستند؟
گروههای جدید دارای قابلیتهایی مانند @اشارهها و مدیران گروه هستند و از قابلیتهای بیشتری در آینده پشتیبانی خواهند کرد.
- تمام تاریخچهٔ گروه و رسانههای پیش از ارتقا حفظ شدهاند.
+ تمام تاریخچه پیام و رسانههای پیش از ارتقا، حفظ شدهاند.
شما به پذیرفتن یک دعوت برای پیوستن دوباره به این گروه نیاز خواهید داشت و پیامهای گروه را تا زمانی که نپذیرید دریافت نخواهید کرد.
- این عضو نیاز به پذیرفتن دعوت برای
@@ -688,7 +688,7 @@
ارتقا به گروه جدید
ارتقا این گروه
گروههای جدید دارای قابلیتهایی مانند @اشارهها و مدیران گروه هستند و از قابلیتهای بیشتری در آینده پشتیبانی خواهند کرد.
- تمام تاریخچهٔ پیام و رسانه از قبل از ارتقا حفظ خواهند شد.
+ تمام تاریخچهٔ پیام و رسانههای پیش از ارتقاء حفظ خواهند شد.
خطای شبکه رخ داد. بعداً دوباره امتحان کنید.
ارتقا ناموفق بود.
@@ -1855,9 +1855,9 @@
یک نشان هدیه آزادسازی کردید
- با %1$s به استوری شما واکنش نشان داده شد
+ با %1$s به استوری شما واکنش نشان داد
- با %1$s به استوری او واکنش نشان داده شد
+ با %1$s به استوری او واکنش نشان داد
بهروزرسانی سیگنال
@@ -1960,6 +1960,7 @@
%1$s به شما
رسانه دیگر در دسترس نیست.
برنامهای برای اشتراکگذاری این رسانه پیدا نشد.
+ بستن
%1$d پیام جدید در %2$d مکالمه
@@ -2665,12 +2666,12 @@
صوت
بازنگری حافظه
حذف پیامهای قدیمیتر؟
- پاک کردن تاریخچهٔ پیام؟
- این گزینه تمامی تاریخچهٔ پیام و رسانه را که از %1$s قدیمیتراند از روی دستگاه شما پاک میکند.
+ تاریخچهٔ پیام پاک شود؟
+ این گزینه تمامی تاریخچهٔ پیام و رسانه را که از %1$s قدیمیترند از روی دستگاه شما پاک میکند.
این گزینه تمامی مکالمهها به جز %1$s پیام آخر را به طور دائم حذف خواهد.
این گزینه تمامی تاریخچهٔ پیام و رسانه را از روی دستگاه شما پاک میکند.
آیا از حذف کل تاریخچهٔ پیام مطمئن هستید؟
- کل تاریخچهٔ پیام به طور دائم پاک خواهد شد. این کار قابل بازگشت نیست.
+ کل تاریخچهٔ پیام به طور دائم پاک خواهد شد. این کار بازگشتپذیر نیست.
حذف همه حالا
برای همیشه
۱ سال
@@ -2748,10 +2749,14 @@
گزینهٔ سفارشیسازی
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
حالا نه
+
+
+ راهاندازی امنیتی
+
+ از سرمایه خود محافظت کنید
+
+ با افزودن یک لایه امنیتی دیگر از دسترسی شخصی که تلفن شما را در دست دارد به سرمایه خود جلوگیری کنید. میتوانید این حالت را در تنظیمات سیگنال غیرفعال کنید.
+
+ فعال کردن قفل پرداخت
+
+ حالا نه
+
+ گذر از این مرحله؟
+
+ گذر از این مرحله میتواند به هر کسی که به تلفن شما دسترسی فیزیکی دارد اجازه دهد سرمایه را منتقل کند یا عبارت بازیابی شما را مشاهده کند.
+
+ لغو
+
+ رد کردن
+
افزودن اعتبار
نشانی کیف پول شما
@@ -4705,7 +4730,7 @@
حریم شخصی استوری
- داستانهای من
+ استوریهای من
برای افزودن استوری ضربه بزنید
@@ -4754,7 +4779,7 @@
حذف استوری؟
- این استوری برای شما و همۀ کسانی که آن را دریافت کردهاند حذف میگردد.
+ این استوری برای شما و همۀ کسانی که آن را دریافت کردهاند حذف میشود.
ذخیره نمیشود
@@ -4799,8 +4824,10 @@
حذف بازدیدکننده
هنوز پاسخی داده نشده است
+
+ شما نمیتوانید به این استوری پاسخ دهید زیرا دیگر عضو این گروه نیستید.
- به استوری واکنش نشان داده شد
+ به استوری واکنش نشان داد
بازدیدها
@@ -4817,6 +4844,13 @@
حذف
استوری من
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
کسانی که میتوانند این استوری را مشاهده کنند
@@ -4850,9 +4884,7 @@
اجازه پاسخ و واکنش
- اجازه واکنش و پاسخ به افرادی که میتوانند استوری شما را ببینند
-
- استوری خود را از افراد خاصی پنهان کنید. استوری شما به طور پیشفرض با %1$s شما اشتراکگذاری میشود.
+ به کسانی که میتوانند استوری شما را ببینند اجازه واکنش و پاسخ بدهید
آشنایان در سیگنال.
@@ -4900,7 +4932,7 @@
یک URL را تایپ یا جایگذاری کنید
- اشتراکگذاری یک پیوند با بازدیدکنندگان استوری خود
+ همرسانی یک پیوند با بازدیدکنندگان استوری خود
جستجو
@@ -4911,6 +4943,22 @@
تنها اشتراکگذاری شود با…
تمام
+
+ استوری گروهی حذف شود؟
+
+ «%1$s» حذف خواهد شد.
+
+ حذف
+
+ استوری خصوصی حذف شود؟
+
+ \" %1$s \" و بهروزرسانیهای همرسانی شده در این استوری حذف خواهند شد.
+
+ حذف
+
+ استوریها فقط برای کاربران سیگنال بتا قابل دسترسی است.
+
+ اگر یک استوری به اشتراک بگذارید، فقط برای افرادی که در سیگنال بتا هستند در دسترس خواهد بود.
افزودن به استوری؟
@@ -4923,10 +4971,12 @@
استوری فرستاده نمیشود. اتصال خود را بررسی نموده و دوباره سعی کنید.
ارسال
+
+ خاموش و حذف کردن
- اشتراکگذاری و نمایش استوریها
+ همرسانی و نمایش استوریها
- هنگامی که این گزینه خاموش باشد، شما دیگر نمیتوانید استوریها را اشتراکگذاری یا مشاهده کنید.
+ هنگامی که این گزینه خاموش باشد، شما دیگر نمیتوانید استوریها را همرسانی یا مشاهده کنید.
انتخاب بازدیدکنندگان
@@ -4977,7 +5027,7 @@
استوری ارسال شده
- ارسال استوری ناموفق بود
+ استوری ارسال نشد
نمایش استوری
@@ -4995,9 +5045,9 @@
شما به استوری %1$s واکنش نشان دادید
- به استوری شما واکنش نشان داده شد
+ به استوری شما واکنش نشان داد
- به یک استوری واکنش نشان داده شد
+ به یک استوری واکنش نشان داد
@@ -5071,6 +5121,11 @@
- استوری گروهی · %1$d بازدید کننده
- استوری گروهی · %1$d بازدید کننده
+
+
+ - %1$d عضو
+ - %1$d عضو
+
- %1$s · %2$d بازدیدکننده
@@ -5085,7 +5140,7 @@
حذف استوری
- استوری گروه حذف شود؟
+ استوری گروهی حذف شود؟
با این کار این استوری از این لیست حذف میشود. همچنان میتوانید استوریهای این گروه را مشاهده کنید.
@@ -5093,7 +5148,7 @@
حذف استوری؟
- استوری خصوصی «%1$s» حذف شود؟
+ حذف استوری خصوصی «%1$s»؟
حذف
@@ -5139,7 +5194,7 @@
تمام آشنایان بررسی شدهاند، برای ادامه روی ارسال ضربه بزنید.
- شما %1$d آشنا دارید که ممکن است سیگنال را دوباره نصب کرده باشند یا دستگاه خود را تغییر داده باشند. قبل از به اشتراک گذاشتن استوری خود با آنها، شماره ایمنی آنها را بررسی کنید یا آنها را از استوری خود حذف کنید.
+ شما %1$d آشنا دارید که ممکن است سیگنال را دوباره نصب کرده باشند یا دستگاه خود را تغییر داده باشند. قبل از همرسانی استوری خود با آنها، شماره ایمنی آنها را بررسی کنید یا آنها را از استوری خود حذف کنید.
وارسی شمارهٔ ایمنی
@@ -5198,15 +5253,15 @@
خاموش کردن استوریها
- اگر از استوریها انصراف دهید، دیگر نمیتوانید استوریها را به اشتراک بگذارید یا مشاهده کنید.
+ اگر از استوریها انصراف دهید، دیگر نمیتوانید استوریها را همرسانی یا مشاهده کنید.
روشن کردن استوریها
- استوریهای دیگران را به اشتراک بگذارید و مشاهده کنید. استوریها بعد از 24 ساعت به طور خودکار ناپدید میشوند.
+ استوریهای دیگران را همرسانی و مشاهده کنید. استوریها بعد از 24 ساعت به طور خودکار ناپدید میشوند.
استوریها خاموش شود؟
- دیگر نخواهید توانست استوریها را به اشتراک بگذارید یا مشاهده کنید. استوریهایی که اخیراً ارسال کردهاید، تا زمانی که منقضی شوند همچنان توسط دیگران قابل مشاهده خواهند بود.
+ دیگر نمیتوانید استوریها را همرسانی یا مشاهده کنید. بهروزرسانیهای استوریهایی که اخیراً همرسانی کردهاید نیز حذف خواهند شد.
حریم شخصی استوری
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index d5b0e87f5c..abf300ad10 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -1524,7 +1524,7 @@
Sinä
- Omat tarinat
+ Oma tarina
Estä
@@ -1960,6 +1960,7 @@
%1$s sinulle
Media ei ole enää saatavilla.
Mikään sovellus ei tue tämän median jakamista.
+ Sulje
%1$d uutta viestiä %2$d keskustelussa
@@ -2666,11 +2667,11 @@
Tarkista 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ä poistaa pysyvästi koko viestihistorian ja mediatiedostot laitteeltasi. Tämä koskee viestejä ja tiedostoja, jotka ovat vanhempia kuin %1$s.
Keskustelut rajataan pysyvästi %1$s viimeisimpään viestiin.
- Kaikki viestit ja mediatiedostot poistetaan laitteesta.
- Haluatko varmasti poistaa kaiken viestihistorian?
- Kaikki viestihistoria poistetaan pysyvästi. Toimintoa ei voi kumota.
+ Koko viestihistoria ja kaikki mediatiedostot poistetaan laitteesta.
+ Haluatko varmasti poistaa koko viestihistorian?
+ Koko viestihistoria poistetaan pysyvästi. Toimintoa ei voi kumota.
Poista kaikki nyt
Pysyvästi
1 vuosi
@@ -2748,10 +2749,14 @@
Mukautettu vaihtoehto
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Ei nyt
+
+
+ Suojausasetukset
+
+ Varojen suojaaminen
+
+ Ota käyttöön lisäsuojaus, joka estää puhelinta käyttävää henkilöä käyttämästä varojasi luvattomasti. Voit poistaa tämän asetuksen käytöstä asetuksissa.
+
+ Ota maksun lukitus käyttöön
+
+ Ei nyt
+
+ Ohitetaanko tämä vaihe?
+
+ Jos ohitat tämän vaiheen, kuka tahansa puhelintasi käyttävä henkilö voi siirtää varoja tai nähdä palautuslauseesi.
+
+ Peruuta
+
+ Ohita
+
Lisää varoja
Lompakko-osoite
@@ -4713,7 +4738,7 @@
Piilota tarina
- Peru tarinan piilottaminen
+ Näytä tarina
Välitä
@@ -4733,7 +4758,7 @@
Yritä uudelleen napauttamalla
- Piilota tarina?
+ Piilotetaanko tarina?
Uudet tarinapäivitykset käyttäjältä %1$s eivät enää ilmesty tarinalistan alkupäähän.
@@ -4752,7 +4777,7 @@
Käyttäjän %1$s tarina
- Poista tarina?
+ Poistetaanko tarina?
Tämä tarina poistetaan sinulta ja kaikilta sen vastaanottaneilta.
@@ -4799,6 +4824,8 @@
Poista katsoja
Ei vastauksia vielä
+
+ Et voi vastata tähän tarinaan, koska et ole enää tämän ryhmän jäsen.
Lähetti reaktion tarinaan
@@ -4816,11 +4843,18 @@
Poista
- Minun tarinani
+ Oma tarina
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Kuka voi nähdä tämän tarinan
- Piilota tarina näiltä
+ Piilota tarina seuraavilta
Kaikki Signal-kontaktit
@@ -4851,8 +4885,6 @@
Salli vastaukset ja reaktiot
Anna tarinasi katsoneiden ihmisten reagoida ja vastata
-
- Piilota tarinasi tietyiltä ihmisiltä. Vakioasetuksena on, että tarinasi jaetaan %1$s
Signal-kontaktit
@@ -4864,7 +4896,7 @@
Lisäämällä heidät puhelimen järjestelmän yhteystietoihin
- "Kontaktisi näkevät nimesi ja valokuvasi, ja näet Omaan tarinaan lisäämäsi päivitykset, ellet piilota niitä heiltä."
+ "Kontaktisi näkevät nimesi ja valokuvasi sekä Omaan tarinaan lisäämäsi julkaisut, ellet piilota sitä heiltä."
Lisää katsoja
@@ -4911,8 +4943,24 @@
Jaa vain seuraaville…
Valmis
+
+ Poistetaanko ryhmätarina?
+
+ %1$s poistetaan.
+
+ Poista
+
+ Poistetaanko yksityinen tarina?
+
+ %1$s ja tähän tarinaan jaetut päivitykset poistetaan.
+
+ Poista
+
+ Tarinat ovat vain Signalin beetaversion käyttäjien saatavilla.
+
+ Jos jaat tarinan, se on vain Signalin beetaversiota käyttävien henkilöiden saatavilla.
- Haluatko lisätä tarinaan?
+ Lisätäänkö tarinaan?
Kun lisäät sisältöä tarinaasi, Signal-kontaktisi näkevät sisällön 24 tunnin ajan. Voit valita asetuksissa, kuka näkee tarinasi.
@@ -4923,10 +4971,12 @@
Tarinaa ei voitu lähettää. Tarkista yhteytesi ja yritä uudelleen.
Lähetä
+
+ Poista käytöstä ja poista
Jaa ja katso tarinoita
- Et voi enää jakaa tai katsoa tarinoita, kun tämä valinta on valittuna.
+ Et voi enää jakaa tai katsoa tarinoita, kun tämä valinta on poistettu käytöstä.
Valitse katsojat
@@ -4939,7 +4989,7 @@
Nimeä tarina
- Tarinan nimi (vaaditaan)
+ Tarinan nimi (pakollinen)
Katsojat
@@ -4993,9 +5043,9 @@
Poista käytöstä
- Reagoit käyttäjän%1$s tarinaan
+ Reagoit käyttäjän %1$s tarinaan
- lähetti reaktion tarinaasi
+ Lähetti reaktion tarinaasi
Lähetti reaktion tarinaan
@@ -5071,6 +5121,11 @@
- Ryhmätarina · %1$d katsoja
- Ryhmätarina · %1$d katsojaa
+
+
+ - %1$d jäsen
+ - %1$d jäsentä
+
- %1$s · %2$d katsoja
@@ -5091,7 +5146,7 @@
Poista
- Poista tarina?
+ Poistetaanko tarina?
Poistetaanko yksityinen tarina %1$s?
@@ -5206,7 +5261,7 @@
Poistetaanko tarinat käytöstä?
- Et voi enää jakaa tai nähdä tarinoita. Viimeksi julkaisemasi tarinat näkyvät edelleen muille, kunnes ne vanhenevat.
+ Et voi enää jakaa tai nähdä tarinoita. Myös viimeksi jakamasi tarinoiden päivitykset poistetaan.
Tarinoiden yksityisyys
@@ -5214,7 +5269,7 @@
Kuka voi nähdä tämän tarinan
- "Ryhmän \"%1$s\" jäsenet voivat nähdä tarinan ja vastata siihen. Voit päivittää tämän keskustelun jäsenyyden ryhmässä."
+ "Ryhmän %1$s jäsenet voivat nähdä tarinan ja vastata siihen. Voit päivittää tämän keskustelun jäsenyyden ryhmässä."
Poista ryhmätarina
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 1827c7a72a..34a0265139 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1960,6 +1960,7 @@
%1$s à vous
Le média n’est plus disponible.
Impossible de trouver une appli qui peut partager ce média.
+ Fermer
%1$d nouveaux messages dans %2$d conversations
@@ -2748,10 +2749,14 @@
Personnaliser l’option
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Pas maintenant
+
+
+ Security setup
+
+ Protect your funds
+
+ Help prevent a person with your phone from accessing your funds by adding another layer of security. You can disable this option in Settings.
+
+ Enable payment lock
+
+ Pas maintenant
+
+ Skip this step?
+
+ Skipping this step could allow anyone who has physical access to your phone to transfer funds or view your recovery phrase.
+
+ Annuler
+
+ Ignorer
+
Ajouter des fonds
L’adresse de votre portefeuille
@@ -4799,6 +4824,8 @@
Retirer le spectateur
Aucune réponse pour le moment
+
+ You can\'t reply to this story because you\'re no longer a member of this group.
A réagi à l’histoire
@@ -4817,6 +4844,13 @@
Supprimer
Mon histoire
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Qui peut voir cette story ?
@@ -4851,8 +4885,6 @@
Autoriser les réponses et réactions
Laisser les personnes qui peuvent voir votre histoire réagir et y répondre
-
- Cacher votre histoire pour certaines personnes. Par défaut, votre histoire est partagée avec votre %1$s
Connexions Signal
@@ -4911,6 +4943,22 @@
Partager uniquement avec…
Terminé
+
+ Supprimer l\'histoire de groupe ?
+
+ \"%1$s\" will be removed.
+
+ Supprimer
+
+ Supprimer la Story privée ?
+
+ \"%1$s\" and updates shared to this story will be deleted.
+
+ Supprimer
+
+ Stories is available to Signal beta users only.
+
+ If you share a story, it will only be available to people who are on Signal beta.
Ajouter à l’histoire ?
@@ -4923,6 +4971,8 @@
L\'histoire n’a pas pu être envoyée. Veuillez vérifier votre connexion et réessayer.
Envoyer
+
+ Turn off and delete
Partager et voir les histoires
@@ -5071,6 +5121,11 @@
- Story de groupe · %1$d spectateur
- Story de groupe · %1$d spectateurs
+
+
+ - %1$d membre
+ - %1$d membres
+
- %1$s · %2$d spectateur
@@ -5206,7 +5261,7 @@
Désactiver les stories ?
- Vous ne pourrez plus partager ni consulter de stories. Celles que vous avez récemment partagées restent visibles par vos contacts jusqu\'à leur expiration.
+ You will no longer be able to share or view stories. Story updates you have recently shared will also be deleted.
Confidentialité de la story
diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml
index 976e2389f8..d0745392f2 100644
--- a/app/src/main/res/values-ga/strings.xml
+++ b/app/src/main/res/values-ga/strings.xml
@@ -1581,11 +1581,11 @@
Ball de %1$s agus %2$s
Ball de %1$s, %2$s, agus %3$s
- - %1$d member
- - %1$d members
- - %1$d members
- - %1$d members
- - %1$d members
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d mball
+ - %1$d ball
@@ -2182,6 +2182,7 @@
%1$s to you
Níl an meán sin ar fáil a thuilleadh.
Can\'t find an app able to share this media.
+ Dún
%1$d dteachtaireacht nua i %2$d gcomhrá
@@ -2339,11 +2340,11 @@
Recommended member limit reached
Signal groups perform best with %1$d members or fewer. Adding more members will cause delays sending and receiving messages.
- - %1$d member
- - %1$d members
- - %1$d members
- - %1$d members
- - %1$d members
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d mball
+ - %1$d ball
@@ -2352,11 +2353,11 @@
- - %1$d member
- - %1$d members
- - %1$d members
- - %1$d members
- - %1$d members
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d mball
+ - %1$d ball
@@ -3006,10 +3007,14 @@
Customize option
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3162,6 +3167,26 @@
Ná bac leis anois
+
+
+ Socrú slándála
+
+ Cosain do chistí
+
+ Cabhraigh le duine a bhfuil do ghuthán aige nó aici a chosc ó rochtain a fháil ar do chistí trí shraith eile slándála a chur leis. Is féidir leat an rogha seo a dhíchumasú i Socruithe.
+
+ Cumasaigh glas íocaíochtaí
+
+ Ní anois
+
+ An bhfuil fonn ort an chéim seo a scipeáil?
+
+ Má scipeálann tú an chéim seo, bheadh cead ag aon duine ag a bhfuil rochtain fhisiciúil ar do ghuthán cistí a aistriú nó féachaint ar do fhrása athshlánaithe.
+
+ Cuir ar ceal
+
+ Léim thar seo
+
Add Funds
Your Wallet Address
@@ -3959,11 +3984,11 @@
Léim thairis seo
- - %1$d member
- - %1$d members
- - %1$d members
- - %1$d members
- - %1$d members
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d mball
+ - %1$d ball
@@ -4078,9 +4103,9 @@
Ligeann do fhrása athshlánaithe duit d\'iarmhéid a aischur sa chás is measa. Molaimid go láidir duit é a shábháil.
- Ná bac le Frása Athshlánaithe
+ Scipeáil Frása Athshlánaithe
- Cealaigh
+ Cuir ar ceal
Paste Recovery Phrase
@@ -4234,9 +4259,9 @@
Remove SMS messages
- Teachtaireachtaí SMS á mbaint de Signal...
+ Teachtaireachtaí SMS á mbaint ó Signal...
- Is féidir leat teachtaireachtaí SMS a bhaint de Signal i Socruithe uair ar bith.
+ Is féidir leat teachtaireachtaí SMS a bhaint ó Signal sna Socruithe am ar bith.
Teachtaireachtaí
@@ -4482,27 +4507,27 @@
Teachtaireacht
- Glao Fuaime
+ Guthghlao
Físghlao
- Bain é
+ Bain
- Bac Nua
+ Cuir bac air/uirthi
Bain %1$s?
Ní fheicfidh tú an duine seo agus cuardach á dhéanamh agat. Gheobhaidh tú iarratas teachtaireachta má sheolfaidh an duine sin teachtaireacht chugat amach anseo.
- Baineadh %1$s
+ %1$s bainte
- Cuireadh bac ar %1$s
+ Bac curtha ar %1$s
Ní féidir %1$s a bhaint
- Tá an duine seo sábháilte i dTeagmhálaithe ar do ghléas. Scrios an duine sin de do Theagmhálaithe agus triail arís.
+ Tá an duine seo sábháilte i dTeagmhálaithe ar do ghléas. Scrios an duine sin ó do Theagmhálaithe agus triail arís.
- Féach an teagmhálaí
+ Féach ar an teagmhálaí
Cuardaigh ainm nó uimhir
@@ -5021,7 +5046,7 @@
Tapáil chun scéal a chur leis
- Níl aon nuashonruithe le déanaí ann lena dtaispeáint díreach anois.
+ Níl aon nuashonruithe le déanaí ann le taispeáint díreach anois.
Hide Story
@@ -5120,6 +5145,8 @@
Bain an t-amharcóir
No replies yet
+
+ Ní féidir leat freagairt don scéal seo mar níl tú i do bhall den ghrúpa seo a thuilleadh.
Reacted to the story
@@ -5138,6 +5165,16 @@
Scrios
Mo Scéal
+
+
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
Who Can View This Story
@@ -5178,18 +5215,16 @@
Ceadaigh Freagraí agus Freagairtí
Let people who can view your story react and reply
-
- Hide your story from specific people. By default, your story is shared with your %1$s
Teagmhálaithe Signal
Signal Connections are people you\'ve chosen to trust, either by:
- Starting a conversation
+ Trí chomhrá a thosú leo
- Accepting a message request
+ Trí iarratas teachtaireachta a ghlacadh
- Having them in your system contacts
+ Trína gcur le do theagmhálaithe córais
"Your connections can see your name and photo, and can see posts to My Story unless you hide it from them."
@@ -5238,6 +5273,22 @@
Only share with…
Déanta
+
+ Remove group story?
+
+ Bainfear \"%1$s\".
+
+ Bain
+
+ Delete private story?
+
+ Scriosfar \"%1$s\" agus nuashonruithe a chomhroinntear chuig an scéal seo.
+
+ Scrios
+
+ Níl fáil ar scéalta ach ag úsáideoirí Signal béite .
+
+ Má chomhroinneann tú scéal, ní bheidh sé ar fáil ach ag daoine atá ar Signal béite.
Add to story?
@@ -5250,6 +5301,8 @@
Story could not be sent. Check your connection and try again.
Seol
+
+ Cas as agus scrios
Share & View Stories
@@ -5410,6 +5463,14 @@
- Group story · %1$d viewers
- Group story · %1$d viewers
+
+
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d bhall
+ - %1$d mball
+ - %1$d ball
+
- %1$s · %2$d viewer
@@ -5542,7 +5603,7 @@
Seolta ó
- Teipthe
+ Theip air
Eolas
@@ -5560,7 +5621,7 @@
An bhfuil fonn ort scéalta a chasadh as?
- Ní bheidh tú in ann scéalta a chomhroinnt ná féachaint orthu a thuilleadh. Beidh aon scéalta a sheol tú le déanaí infheicthe ag daoine eile go dtí go n-imeoidh siad as feidhm.
+ Ní bheidh tú in ann féachaint ar scéalta ná iad a chomhroinnt a thuilleadh. Scriosfar na nuashonruithe ar scéal a chomhroinn tú le déanaí freisin.
Story Privacy
@@ -5583,7 +5644,7 @@
Export your SMS messages
- Is féidir leat do theachtaireachtaí SMS a easpórtáil go dtí bunachar sonraí SMS do ghutháin. Ligeann sé seo d\'aipeanna SMS eile ar do ghuthán iad a rochtain agus a iompórtáil. Ní chruthaíonn sé seo comhad inroinnte de stair do theachtaireachtaí SMS.
+ Is féidir leat do theachtaireachtaí SMS a easpórtáil chuig bunachar sonraí SMS do ghutháin. Ligeann sé seo d\'aipeanna eile SMS ar do ghuthán iad a rochtain agus a iompórtáil. Ní chruthaíonn sé seo comhad in-chomhroinnte de stair do theachtaireachtaí SMS.
Ar Aghaidh
@@ -5613,13 +5674,13 @@
Roghnaigh \"Aip SMS\" ón liosta
- Roghnaigh aip eile chun í a úsáid le haghaidh cur teachtaireachtaí SMS
+ Roghnaigh aip eile le húsáid le cur teachtaireachtaí SMS
Fill ar Signal
Oscail aip Socruithe do ghutháin
- Téigh go dtí \"Aipeanna\" > \"Aipeanna réamhshocraithe\" > \"Aip SMS\"
+ Téigh chuig \"Aipeanna\" > \"Aipeanna réamhshocraithe\" > \"Aip SMS\"
@@ -5629,7 +5690,7 @@
Remove SMS messages from Signal?
- Is féidir leat teachtaireachtaí SMS a bhaint de Signal anois chun spás stórála a ghlanadh. Beidh siad fós ar fáil d\'aipeanna SMS eile ar do ghuthán fiú má bhaineann tú iad.
+ Is féidir leat teachtaireachtaí SMS a bhaint ó Signal anois chun spás stórála a ghlanadh. Beidh siad fós ar fáil ag aipeanna eile SMS ar do ghuthán fiú má bhaineann tú iad.
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 73cd9410d1..01c19dc078 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -193,7 +193,7 @@
Actualizar
Non actualizar
Aviso
- A túa versión de Signal caducou. Podes ver o historial de mensaxes mais non poderás enviar ou recibir mensaxes ata que a actualices.
+ A túa versión de Signal caducou. Podes ver o historial de mensaxes, mais non poderás enviar ou recibir mensaxes ata que a actualices.
Non se atopou ningún navegador web.
@@ -1960,6 +1960,7 @@
%1$s a ti
Contido multimedia xa non dispoñible.
Non se atopa unha aplicación con que compartir este contido multimedia.
+ Pechar
%1$d novas mensaxes en %2$d conversas
@@ -2657,7 +2658,7 @@
Usando conexión wifi
En itinerancia
Descarga automática multimedia
- Historial das mensaxes
+ Historial de mensaxes
Uso do almacenamento
Fotografías
Vídeos
@@ -2666,11 +2667,11 @@
Revisar o almacenamento
Eliminar mensaxes antigas?
Baleirar o historial de mensaxes?
- Esto eliminará permanentemente todo o historial de mensaxes e ficheiros de medios do teu dispositivo que sexan anteriores a %1$s.
+ Isto eliminará permanentemente todo o historial de mensaxes e multimedia do teu dispositivo que sexan anteriores a %1$s.
Esto fará que só se conserven as %1$s mensaxes máis recentes nas conversas.
- Esto eliminará permanentemente todo o historial de mensaxes e ficheiros de medios do teu dispositivo.
+ Isto eliminará permanentemente todo o historial de mensaxes e multimedia do teu dispositivo.
Tes a certeza de querer eliminar todo o historial de mensaxes?
- Vai ser eliminado todo o historial de mensaxes. Esta acción non ten volta.
+ Eliminarase todo o historial de mensaxes. Esta acción non se pode desfacer.
Borrar todo agora
Para sempre
1 ano
@@ -2748,10 +2749,14 @@
Personalizar opción
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Agora non
+
+
+ Configuración de seguranza
+
+ Protexe os teus fondos
+
+ Axuda a evitar que unha persoa co teu teléfono acceda aos teus fondos engadindo unha capa máis de seguridade. Podes desactivar esta opción en Configuración.
+
+ Activar o bloqueo de pagamento
+
+ Agora non
+
+ Omitir este paso?
+
+ Omitir este paso pode permitir que calquera que teña acceso físico ao teu teléfono poida transferir os teus fondos ou vexa a túa frase de recuperación.
+
+ Cancelar
+
+ Omitir
+
Engadir fondos
Enderezo da túa carteira
@@ -4799,6 +4824,8 @@
Eliminar espectador
Sen respostas
+
+ Non podes responder a esta historia porque xa non formas parte deste grupo.
Reaccionou á túa historia
@@ -4817,6 +4844,13 @@
Eliminar
A miña historia
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Quen pode ver esta historia
@@ -4851,8 +4885,6 @@
Permitir respostas & reaccións
Permitir ás persoas que ven a túa historia reaccionar e responder
-
- Ocutar a túa historia a persoas específicas. Por defecto, a túa historia compartirase coas tuas %1$s
Conexións de Signal
@@ -4872,7 +4904,7 @@
Eliminar %1$s?
- Esta persoa xa non pode ver a túa historia.
+ Esta persoa xa non poderá ver a túa historia.
Eliminar
@@ -4911,10 +4943,26 @@
Compartir só con…
Feito
+
+ Eliminar historia do grupo?
+
+ Eliminarase «%1$s».
+
+ Eliminar
+
+ Eliminar historia privada?
+
+ Eliminaranse «%1$s» e as actualizacións compartidas nesta historia.
+
+ Borrar
+
+ As historias só están dispoñibles para os usuarios da versión beta de Signal.
+
+ Se compartes unha historia, só estará dispoñible para as persoas que teñan a versión beta de Signal.
Engadir á historia?
- Engadir contido a túa historia permite que as túas conexións de Signal poidan vela durante 24 horas. Podes cambiar quen ve a túa historia en Configuración.
+ Engadir contido á túa historia permite que as túas conexións de Signal poidan vela durante 24 horas. Podes cambiar quen ve a túa historia en Configuración.
Engadir á historia
@@ -4923,8 +4971,10 @@
Erro ao enviar a historia. Comproba a túa conexión e inténtao de novo.
Enviar
+
+ Desactivar e eliminar
- Compartir & Ver historias
+ Compartir e ver historias
Non poderás compartir ou ver historias cando esta opción estea desactivada.
@@ -4947,7 +4997,7 @@
Este campo é obrigatorio.
- Xa tes unha historia con este nome
+ Xa tes unha historia con este nome.
Seleccionar todo
@@ -4957,7 +5007,7 @@
Visible só para xente específica
- Historia de grupo
+ Historia do grupo
Compartir nun grupo existente
@@ -4995,7 +5045,7 @@
Reaccionaches á historia de %1$s
- Reaccionou a túa historia
+ Reaccionou á túa historia
Reaccionou a unha historia
@@ -5068,8 +5118,13 @@
- - Historia grupal · %1$d espectador
- - Historia grupal · %1$d espectadores
+ - Historia do grupo · %1$d espectador
+ - Historia do grupo · %1$d espectadores
+
+
+
+ - %1$d membro
+ - %1$d membros
@@ -5169,7 +5224,7 @@
Privacidade da miña historia
- Elixe quen pode ver as publicacións en A miña historia. Sempre podes cambialo en Configuración.
+ Elixe quen pode ver as publicacións en «A miña historia». Sempre podes cambialo en Configuración.
Todas as conexións de Signal
@@ -5206,7 +5261,7 @@
Desactivar historias?
- Non poderás ver nin compartir as historias. Calquera historia que enviases recentemente seguirá a ser visible ata que caduque.
+ Xa non poderás compartir ou ver historias. Eliminaranse tamén as novas historias que compartiches.
Privacidade da historia
@@ -5216,7 +5271,7 @@
"Os membros do grupo «%1$s» poden ver e responder a esta historia. Podes actualizar a lista de membros desta conversa no grupo."
- Eliminar historia de grupo
+ Eliminar historia do grupo
Menú emerxente
diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml
index 6e22d2d6ed..58c5ba61a5 100644
--- a/app/src/main/res/values-gu/strings.xml
+++ b/app/src/main/res/values-gu/strings.xml
@@ -193,7 +193,7 @@
અપડેટ
અપડેટ કરશો નહીં
ચેતવણી
- તમારી Signal એપ નું વર્ઝન સમાપ્ત થઈ ગયું છે. તમે તમારો મેસેજ હિસ્ટ્રી જોઈ શકો છો પરંતુ તમે અપડેટ ન કરો ત્યાં સુધી તમે મેસેજ મોકલવા અથવા પ્રાપ્ત કરવામાં સમર્થ હશો નહીં.
+ તમારી Signal ઍપનું વર્ઝન જૂનું થઈ ગયું છે. તમે તમારો મેસેજ હિસ્ટ્રી જોઈ શકો છો પરંતુ તમે અપડેટ ન કરો ત્યાં સુધી તમે મેસેજ મોકલી અથવા પ્રાપ્ત નહીં કરી શકો.
કોઈ વેબ બ્રાઉઝર મળ્યું નથી.
@@ -218,7 +218,7 @@
ઉપયોગકર્તા નામ દ્વારા શોધો
- મારી સ્ટોરી
+ મારી સ્ટોરીઝ
નવી સ્ટોરી
@@ -1346,9 +1346,9 @@
આ નવી સુવિધા ગમી? Signalને એક-વખતના યોગદાન સાથે સહયોગ આપવામાં મદદ કરો.
- %1$s સાથેનો તમારો મેસેજ ઇતિહાસ અને તેમનો નંબર %2$s ભેગા કરી દેવામાં આવ્યા છે.
+ %1$s સાથેની તમારી મેસેજ હિસ્ટ્રી અને તેમનો નંબર %2$s ભેગા કરી દેવામાં આવ્યા છે.
- %1$s સાથેનો તમારો મેસેજ ઈતિહાસ અને તેમની સાથે જોડાયેલી બીજી ચેટ ભેગા કરી દેવામાં આવ્યા છે.
+ %1$s સાથેની તમારી મેસેજ હિસ્ટ્રી અને તેમની સાથેની બીજી ચેટને ભેગી કરી દેવામાં આવી છે.
%1$s એ ગ્રુપ કૉલ શરૂ કર્યો · %2$s
@@ -1542,7 +1542,7 @@
નેટવર્ક નિષ્ફળ થયું!
નંબર રજીસ્ટર નથી!
તમે ડાયલ કરેલ નંબર સુરક્ષિત ઑડિયોને સપોર્ટ કરતું નથી!
- ખબર પડી
+ સમજાઈ ગયું
@@ -1855,9 +1855,9 @@
તમે એક ગિફ્ટ બૅજ રિડિમ કર્યું
- તમારી સ્ટોરી પર %1$s પ્રતિક્રિયા આપી
+ તમારી સ્ટોરી પર %1$s એ પ્રતિક્રિયા આપી
- તેમની સ્ટોરી પર %1$s પ્રતિક્રિયા આપી
+ તેમની સ્ટોરી પર %1$s એ પ્રતિક્રિયા આપી
Molly અપડેટ
@@ -1960,6 +1960,7 @@
%1$sએ તમને
મીડિયા હવે ઉપલબ્ધ નથી.
આ મીડિયાને શેર કરવા માટે સક્ષમ એપ્લિકેશન શોધી શકાતી નથી.
+ બંધ
%1$d%2$d સંવાદ માં નવા મેસેજ
@@ -2666,10 +2667,10 @@
સ્ટોરેજ રિવ્યુ કરો
જૂના મેસેજ કાઢી નાખવા છે?
મેસેજની હિસ્ટ્રી દૂર કરવી છે?
- આ તમારા ઉપકરણમાંથી તમામ મેસેજ હિસ્ટ્રી અને મીડિયાને કાયમ માટે કાઢી નાખશે જે %1$s થી જૂની છે.
+ આનાથી તમારા ડિવાઇસમાંથી %1$s પહેલાંની તમામ મેસેજ હિસ્ટ્રી અને મીડિયા કાયમ માટે ડિલીટ થઈ જશે.
આ તમામ વાતચીતને %1$s સૌથી તાજેતરના મેસેજ માટે કાયમી રીતે ટ્રિમ કરશે.
- આ તમારા ઉપકરણમાંથી તમામ મેસેજ હિસ્ટ્રી અને મીડિયાને કાયમ માટે કાઢી નાખશે.
- તમે આ બધી મેસેજ હિસ્ટ્રી કાઢી નાખવા માંગો છો?
+ આનાથી તમારા ડિવાઇસમાંથી તમામ મેસેજ હિસ્ટ્રી અને મીડિયા કાયમ માટે ડિલીટ થઈ જશે.
+ તમે ખરેખર આ બધી મેસેજ હિસ્ટ્રી ડિલીટ કરવા માંગો છો?
તમામ મેસેજ હિસ્ટ્રી કાયમ માટે દૂર કરવામાં આવશે. આ ક્રિયા પૂર્વવત્ કરી શકાતી નથી.
બધુ હમણાં કાઢી નાખો
હમેશા
@@ -2748,10 +2749,14 @@
કસ્ટમાઇઝ વિકલ્પ
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
અત્યારે નહીં
+
+
+ સુરક્ષા સેટઅપ
+
+ તમારા ભંડોળને સુરક્ષિત કરો
+
+ સુરક્ષાનું અન્ય સ્તર ઉમેરીને તમારો ફોન ધરાવતી વ્યક્તિને તમારા ભંડોળને ઍક્સેસ કરવાથી રોકવામાં સહાય કરો. તમે આને સેટિંગ્સમાંથી બદલી શકો છો.
+
+ પેમેન્ટ લૉક ચાલુ કરો
+
+ અત્યારે નહીં
+
+ આ પગલું છોડી દઈએ?
+
+ આ પગલું અવગણવાથી તમારા ફોનની ભૌતિક ઍક્સેસ ધરાવતી કોઈપણ વ્યક્તિને ફંડ ટ્રાન્સફર કરવાની અથવા તમારા રિકવરી ફ્રેઝને જોવાની મંજૂરી મળી શકે છે.
+
+ રદ કરો
+
+ અવગણો
+
ફંડ ઉમેરો
તમારું વૉલેટ સરનામું
@@ -4256,7 +4281,7 @@
મેસેજ ઉમેરો
વધુ ઝડપી ફોરવર્ડ
- વિડીયો 30 સેકન્ડની ક્લિપમાં કાપવામાં આવશે અને મલ્ટિપલ સ્ટોરી તરીકે મોકલવામાં આવશે.
+ વિડીયો 30 સેકન્ડની ક્લિપમાં કાપવામાં આવશે અને એકથી વધુ સ્ટોરી તરીકે મોકલવામાં આવશે.
સ્ટોરી તરીકે મોકલવામાં આવતા વિડીયો 30 સેકન્ડથી વધુ લાંબા ન હોઈ શકે.
ફોરવર્ડ કરેલા મેસેજ હવે તાત્કાલિક મોકલવામાં આવે છે.
@@ -4703,7 +4728,7 @@
99+
- સ્ટોરી ગોપનીયતા
+ સ્ટોરીની ગોપનીયતા
મારી સ્ટોરી
@@ -4786,7 +4811,7 @@
હજી કોઈ દ્રશ્યો નથી
- તમારી સ્ટોરી કોણે જોઈ છે તે જોવા પ્રાપ્ત કર્યાની રસીદ સક્ષમ કરો.
+ તમારી સ્ટોરી કોણે જોઈ છે તે જોવા વાંચી લીધાનું નિશાન સક્ષમ કરો.
સેટિંગ્સ પર જાઓ
@@ -4799,6 +4824,8 @@
દર્શકને દૂર કરો
હજી કોઈ જવાબો નથી
+
+ તમે આ સ્ટોરીનો જવાબ આપી શકતા નથી કારણ કે તમે હવે આ ગ્રુપના સભ્ય નથી.
સ્ટોરી પર પ્રતિક્રિયા આપી
@@ -4817,6 +4844,13 @@
કાઢી નાખો
મારી સ્ટોરી
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
આ સ્ટોરી કોણ જોઈ શકે
@@ -4851,8 +4885,6 @@
જવાબો અને પ્રતિક્રિયાઓને મંજૂરી આપો
જે લોકો તમારી સ્ટોરી જોઈ શકે છે તેમને પ્રતિક્રિયા અને જવાબ આપવા દો
-
- તમારી સ્ટોરીને ચોક્કસ લોકોથી છુપાવો. ડિફોલ્ટ રૂપે, તમારી સ્ટોરી તમારા %1$s સાથે શેર થયેલ છે
Signal કનેક્શન
@@ -4880,9 +4912,9 @@
આ ક્રિયાને પૂર્વવત કરી શકાશે નહીં.
- સ્ટોરી નામ સંપાદિત કરો
+ સ્ટોરીનું નામ સંપાદિત કરો
- સ્ટોરી નામ
+ સ્ટોરીનું નામ
સેવ કરો
@@ -4900,7 +4932,7 @@
URL લખો અથવા પેસ્ટ કરો
- તમારી સ્ટોરીના દર્શકો સાથે લિંક શેર કરો
+ તમારી સ્ટોરીના દર્શકો સાથે એક લિંક શેર કરો
શોધો
@@ -4911,18 +4943,36 @@
ફક્ત આમની સાથે શેર કરો…
થઈ ગયું
+
+ ગ્રુપ સ્ટોરી દૂર કરવી છે?
+
+ \"%1$s\" ને દૂર કરવામાં આવશે.
+
+ દૂર કરો
+
+ ખાનગી સ્ટોરી ડિલીટ કરવી છે?
+
+ \" %1$s \" અને આ સ્ટોરી પર શેર કરેલ અપડેટ ડિલીટ કરવામાં આવશે.
+
+ ડિલીટ કરો
+
+ સ્ટોરી Signal બીટા ઉપયોગકર્તાઓ માટે જ ઉપલબ્ધ છે.
+
+ જો તમે કોઈ સ્ટોરી શેર કરો છો, તો તે ફક્ત Signal બીટા પર હોય તેવા લોકો માટે જ ઉપલબ્ધ હશે.
સ્ટોરીમાં ઉમેરવું છે?
- તમારી સ્ટોરી પર કન્ટેન્ટ ઉમેરવાથી તમારા Signal સંપર્કોને તેને 24 કલાક સુધી જોવાની મંજૂરી મળે છે. તમારી સ્ટોરી કોણ જોઈ શકે તે તમે સેટિંગ્સમાંથી બદલી શકો છો.
+ તમારી સ્ટોરી પર કન્ટેન્ટ ઉમેરવાથી તમારા Signal કનેક્શનને તેને 24 કલાક સુધી જોવાની મંજૂરી મળે છે. તમારી સ્ટોરી કોણ જોઈ શકે તે તમે સેટિંગ્સમાંથી બદલી શકો છો.
સ્ટોરીમાં ઉમેરો
દર્શકો સંપાદિત કરો
- સ્ટોરી મોકલી શકાઈ નહીં. તમારું કનેક્શન તપાસો અને ફરી પ્રયાસ કરો.
+ સ્ટોરી મોકલી શકાઈ નહીં. તમારું જોડાણ તપાસો અને ફરી પ્રયાસ કરો.
મોકલો
+
+ બંધ કરો અને ડિલીટ કરો
સ્ટોરી શેર કરો અને જુઓ
@@ -5060,16 +5110,21 @@
અત્યારે નહીં
- ફક્ત આમની સાથે શેર કરો
+ આમની સાથે જ શેર કરો
- ખાનગી સ્ટોરી · %1$d દર્શક
- - ખાનગી સ્ટોરી · %1$d વ્યૂઅર્સ
+ - ખાનગી સ્ટોરી · %1$d દર્શકો
- ગ્રૂપ સ્ટોરી · %1$d દર્શક
- - ગ્રુપ સ્ટોરી · %1$d વ્યૂઅર્સ
+ - ગ્રુપ સ્ટોરી · %1$d દર્શકો
+
+
+
+ - %1$d સભ્ય
+ - %1$d સભ્યો
@@ -5121,7 +5176,7 @@
બહાર નીકળવા જમણે સ્વાઇપ કરો
- ખબર પડી
+ સમજાઈ ગયું
સંદર્ભ મેનૂ ઓપન કરો
@@ -5139,7 +5194,7 @@
બધા જ કનેક્શનની સમીક્ષા થઈ ચૂકી છે, ચાલુ રાખવા માટે મોકલો પર ટૅપ કરો.
- તમારા %1$d કનેક્શન એવા છે જેમણે Signal ફરીથી ઇન્સ્ટોલ કરેલ અથવા તેમના ડિવાઇસ બદલેલ હોઈ શકે છે. તેમની સાથે તમારી સ્ટોરી શેર કરતાં પહેલાં તેમના સલામતી નંબરની સમીક્ષા કરો અથવા તેમને તમારી સ્ટોરીમાંથી દૂર કરવાનું વિચારો.
+ તમારા %1$d કનેક્શન એવા છે જેમણે Signal ફરીથી ઇન્સ્ટોલ કરેલ છે અથવા તેમના ડિવાઇસ બદલેલા હોઈ શકે છે. તેમની સાથે તમારી સ્ટોરી શેર કરતાં પહેલાં તેમના સલામતી નંબરની સમીક્ષા કરો અથવા તેમને તમારી સ્ટોરીમાંથી દૂર કરવાનું વિચારો.
સલામતી નંબર ચકાસો
@@ -5194,7 +5249,7 @@
- સ્ટોરી 24 કલાક પછી આપમેળે ગાયબ થઈ જાય છે. તમારી સ્ટોરી કોણ જોઈ શકે તે પસંદ કરો અથવા ચોક્કસ દર્શકો અથવા ગ્રૂપ સાથે જ સ્ટોરી બનાવો.
+ સ્ટોરી 24 કલાક પછી આપમેળે ગાયબ થઈ જાય છે. તમારી સ્ટોરી કોણ જોઈ શકે તે પસંદ કરો અથવા ચોક્કસ દર્શકો અથવા ગ્રુપ સાથે જ સ્ટોરી બનાવો.
સ્ટોરી બંધ કરો
@@ -5206,17 +5261,17 @@
સ્ટોરી બંધ કરવી છે?
- તમે હવે સ્ટોરી જોઈ અથવા શેર કરી શકશો નહીં. તમે તાજેતરમાં મોકલેલી કોઈ પણ સ્ટોરી હજી પણ તેનો સમય સમાપ્ત ન થાય ત્યાં સુધી અન્યોને દેખાશે.
+ તમે હવેથી સ્ટોરી જોઈ કે શેર કરી શકશો નહીં. તમે તાજેતરમાં શેર કરેલા સ્ટોરી અપડેટ પણ ડિલીટ થઈ જશે.
- સ્ટોરી ગોપનીયતા
+ સ્ટોરીની ગોપનીયતા
આ સ્ટોરી કોણ જોઈ શકે
- "\"%1$s\" ગ્રૂપના સભ્યો આ સ્ટોરી જોઈ શકે છે અને તેનો જવાબ આપી શકે છે. તમે ગ્રૂપમાં આ ચેટ માટેનું સભ્યપદ અપડેટ કરી શકો છો."
+ "\"%1$s\" ગ્રુપના સભ્યો આ સ્ટોરી જોઈ શકે છે અને તેનો જવાબ આપી શકે છે. તમે ગ્રૂપમાં આ ચેટ માટેનું સભ્યપદ અપડેટ કરી શકો છો."
- ગ્રૂપ સ્ટોરી દૂર કરો
+ ગ્રુપ સ્ટોરી દૂર કરો
ઓવરફ્લો મેનૂ
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 988a2062ad..d1ffa66251 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -673,7 +673,7 @@
नए समूह क्या हैं?
नए ग्रुप्स में कई फ़ीचर्स हैं जैसे कि @mentions और ग्रुप एडमिन, और भविष्य में और भी कई फ़ीचर्स शामिल किए जाएँगे।
- अपग्रेड करने से पहले के सभी मेसेज इतिहास और मीडिया को रख लिया गया है।
+ अपग्रेड करने से पहले के सभी संदेश इतिहास और मीडिया को रख लिया गया है।
इस ग्रुप में दोबारा जुड़ने के लिए बस आपको आमंत्रण को स्वीकार करना होगा, और जब तक आप स्वीकार नहीं कर लेते, आपको ग्रुप के मेसेज प्राप्त नहीं होंगे।
- इस ग्रुप में दोबारा जुड़ने के लिए इस मेंबर को आमंत्रण को स्वीकार करना होगा, और जब तक वे स्वीकार नहीं कर लेते, उन्हें ग्रुप के मेसेज प्राप्त नहीं होंगे:
@@ -688,7 +688,7 @@
नए समूह में अपग्रेड करें
इस समूह को अपग्रेड करें
नए ग्रुप्स में कई फ़ीचर्स हैं जैसे कि @mentions और ग्रुप एडमिन, और भविष्य में और भी कई फ़ीचर्स शामिल किए जाएँगे।
- अपग्रेड करने से पहले के सभी मेसेज इतिहास और मीडिया को रख लिया जाएगा।
+ अपग्रेड करने से पहले के सभी संदेश इतिहास और मीडिया को रख लिया जाएगा।
एक नेटवर्क त्रुटि हो गई। बाद में दोबरा प्रयास करें।
अपग्रेड करने में विफल।
@@ -1346,9 +1346,9 @@
यह नया फ़ीचर पसंद आया? एक बार दान देकर Signal को सहयोग देने में मदद करें।
- %1$s के साथ आपके मेसेज के इतिहास को उनके नंबर %2$s के साथ जोड़ दिया गया है।
+ %1$s के साथ आपके संदेश इतिहास को उनके नंबर %2$s के साथ जोड़ दिया गया है।
- %1$s के साथ आपके मेसेज के इतिहास को उनके साथ ही किसी अन्य चैट के साथ जोड़ दिया गया है।
+ %1$s के साथ आपके संदेश इतिहास को उनके साथ ही किसी अन्य चैट के साथ जोड़ दिया गया है।
%1$s ने एक ग्रुप कॉल शुरू की · %2$s
@@ -1960,6 +1960,7 @@
%1$s से आपको
मीडिया अब उपलब्ध नहीं है।
इस मीडिया को शेयर करने के लिए कोई ऐप नहीं मिल रही।
+ बंद करो
%2$d संवाद में %1$d नए मेसेज
@@ -2623,7 +2624,7 @@
भुगतान (बीटा)
वार्तालाप लंबाई सीमा
मेसेज रखें
- मेसेज इतिहास को साफ करें
+ संदेश इतिहास हटाएँ
जुड़े हुए उपकरण
रोशनी
अँधेरा
@@ -2657,7 +2658,7 @@
Wi-Fi का उपयोग करते समय
रोमिंग करते समय
मीडिया ऑटो डाउनलोड
- मेसेज इतिहास
+ संदेश इतिहास
स्टॉरेज का उपयोग
तस्वीरें
वीडियो
@@ -2665,12 +2666,12 @@
ऑडियो
स्टॉरेज रिव्यु
पुराने मेसेजेस को मिटाना है?
- मेसेज इतिहास को साफ करना है?
- इससे आपके डिवाइस से वह सारा मेसेज इतिहास और मीडिया स्थाई रूप से मिटा दिया जाएगा जो %1$s से पुराना है।
+ संदेश इतिहास को हटाना है?
+ इससे आपके डिवाइस से वह सारा संदेश इतिहास और मीडिया स्थाई रूप से डिलीट कर दिया जाएगा जो %1$s से पुराना है।
यह स्थाई रूप से सभी संवाद को हाल ही के %1$s मेसेज में ट्रिम कर देगा।
- इससे आपके डिवाइस से सारे मेसेज इतिहास और मीडिया को स्थायी रूप से मिटा दिया जाएगा।
- क्या आप वाकई में सारे मेसेज इतिहास को मिटाना चाहते हैं?
- सारे मेसेज इतिहास को स्थाई रूप से हटा दिया जाएगा। इस कार्य को अनकिया नहीं किया जा सकता।
+ इससे आपके डिवाइस से सारा संदेश इतिहास और मीडिया स्थायी रूप से डिलीट कर दिया जाएगा।
+ क्या आप वाकई में सारे संदेश इतिहास को डिलीट करना चाहते हैं?
+ सारे संदेश इतिहास को स्थाई रूप से हटा दिया जाएगा। यह कार्रवाई होने के बाद वापस नहीं ली जा सकती।
सभी कुछ अभी मिटाएँ
हमेशा के लिए
1 वर्ष
@@ -2748,10 +2749,14 @@
अनुकूलित करने का विकल्प
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
अभी नहीं
+
+
+ सुरक्षा सेटअप
+
+ अपनी निधियों की सुरक्षा करें
+
+ सुरक्षा का एक अतिरिक्त स्तर जोड़कर किसी व्यक्ति को आपके फ़ोन का इस्तेमाल कर आपकी निधियाँ प्राप्त करने से रोकने में मदद करें। आप सेटिंग्स में जा कर इस विकल्प को बंद कर सकते हैं।
+
+ भुगतान लॉक को सक्षम करें
+
+ अभी नहीं
+
+ इस चरण को छोड़ना है?
+
+ इस चरण को छोड़ने से कोई भी ऐसा व्यक्ति जिसके हाथ आपका फ़ोन लग जाए, उसके इस्तेमाल से निधियाँ अंतरित कर सकता है या आपका रिकवरी वाक्य देख सकता है।
+
+ रद्द करें
+
+ छोड़ दे
+
धन जोड़ें
आपका वॉलेट पता
@@ -3976,7 +4001,7 @@
नई चैट के लिए डिफ़ॉल्ट टाइमर
आपके द्वारा शुरू की गई सभी नई चैट के लिए एक ग़ायब होने वाले संदेशों का समय सेट करें।
- अपनी स्टोरीज़ और उन्हें कौन देख सकते हैं, इसे मैनेज करें
+ अपनी स्टोरीज़ को मैनेज करें और यह कि उन्हें कौन देख सकता है
निधियाँ भेजने के लिए ऐंड्रॉयड स्क्रीन लॉक या फिंगरप्रिंट चाहिए
भुगतान लॉक सक्षम नहीं किया जा सकता
@@ -4256,9 +4281,9 @@
एक मेसेज शामिल करें
तेज़ी से फ़ॉरवर्ड करें
- वीडियो कटकर 30 सेकंड की क्लिप में बदल जाएंगे और कई स्टोरी के तौर पर भेजे जाएंगे।
+ वीडियो 30 सेकेंड की क्लिप्स में छांट-छांटकर कई स्टोरीज़ के तौर पर भेजे जाएंगे।
- स्टोरी में भेजे जानेवाले वीडियो 30 सेकंड से अधिक के नहीं हो सकते।
+ स्टोरी में भेजे जानेवाले वीडियो 30 सेकेंड से अधिक के नहीं हो सकते।
फ़ॉरवर्ड किए हुए मेसेज अब तुरंत भेजे जाते हैं.
- %1$d को मेसेज भेजें
@@ -4799,6 +4824,8 @@
व्यूअर को हटाएँ
कोई जवाब नहीं
+
+ आप इस स्टोरी का जवाब नहीं दे सकते क्योंकि अब आप इस ग्रुप के सदस्य नहीं हैं।
स्टोरी पर प्रतिक्रिया दी
@@ -4817,6 +4844,13 @@
डिलीट करें
मेरी स्टोरी
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
यह स्टोरी कौन देख सकता है
@@ -4851,8 +4885,6 @@
जवाब और प्रतिक्रियाएँ अनुमत करें
आपकी स्टोरी देख सकने वाले लोगों को प्रतिक्रिया और जवाब देने दें
-
- कुछ निश्चित लोगों से अपनी स्टोरी छिपाएँ। डीफॉल्ट रूप से आपकी स्टोरी आपके %1$s के साथ शेयर की जाती है
Signal कनेक्शन
@@ -4872,7 +4904,7 @@
%1$s को हटाना है?
- यह व्यक्ति अब आपको स्टोरी नहीं देख पाएगा।
+ यह व्यक्ति अब आपकी स्टोरी नहीं देख पाएगा।
हटा दें
@@ -4911,6 +4943,22 @@
केवल इनके साथ शेयर करें…
पूर्ण
+
+ ग्रुप स्टोरी हटानी है?
+
+ \"%1$s\" को हटा दिया जाएगा।
+
+ हटा दें
+
+ निजी स्टोरी डिलीट करनी है?
+
+ \"%1$s\" और इस स्टोरी से शेयर किए गए अपडेट डिलीट कर दिए जाएंगे।
+
+ डिलीट करें
+
+ स्टोरीज़ केवल Signal के बीटा यूज़र्स के लिए उपलब्ध है।
+
+ यदि आप कोई स्टोरी शेयर करते हैं तो वह केवल उन लोगों के लिए उपलब्ध रहेगी जो Signal बीटा पर होंगे।
स्टोरी में जोड़ना है?
@@ -4923,6 +4971,8 @@
स्टोरी नहीं भेजी जा सकी। अपना कनेक्शन जाँचें और फिर से प्रयास करें।
भेजें
+
+ बंद करें और डिलीट करें
शेयर करें और स्टोरीज़ देखें
@@ -4937,7 +4987,7 @@
- %1$d व्यूअर
- नाम स्टोरी
+ नाम वाली स्टोरी
स्टोरी नाम (आवश्यक है)
@@ -5069,7 +5119,12 @@
- ग्रुप स्टोरी · %1$d व्यूअर
- - ग्रुप स्टोरी · %1$d वयूअर
+ - ग्रुप स्टोरी · %1$d व्यूअर
+
+
+
+ - %1$d सदस्य
+ - %1$d सदस्य
@@ -5196,17 +5251,17 @@
24 घंटे बाद स्टोरीज़ अपने आप गायब हो जाती हैं। चुनें कि आपकी स्टोरी कौन देख सकता है या फिर निश्चित व्यूअर्स या ग्रुप्स के साथ नई स्टोरीज़ बनाएँ।
- स्टोरीज़ बंद कर दें
+ स्टोरीज़ बंद करें
स्टोरीज़ बंद करना चुनने पर आप न तो स्टोरीज़ शेयर कर पाएंगे, न ही उन्हें देख पाएंगे।
- स्टोरीज़ बंद करें
+ स्टोरीज़ चालू करें
दूसरों की स्टोरीज़ शेयर करें और उन्हें देखें। 24 घंटे बाद स्टोरीज़ अपने आप गायब हो जाती हैं।
स्टोरीज़ बंद करनी हैं?
- आप स्टोरीज़ न तो शेयर कर पाएंगे, न ही उन्हें देख पाएंगे। फिर भी हाल ही में भेजी गई आपकी कोई भी स्टोरी, समाप्त होने तक दूसरों को दिखेंगी।
+ अब आप स्टोरीज़ न तो शेयर कर पाएंगे, न ही उन्हें देख पाएंगे। हाल ही में आपका द्वारा शेयर किए गए स्टोरी अपडेट भी डिलीट कर दिए जाएंगे।
स्टोरी की निजता
@@ -5214,7 +5269,7 @@
इस स्टोरी को कौन देख सकता है
- "\"%1$s\" ग्रुप के सदस्य इस स्टोरी को देख सकते हैं और इस पर जवाब दे सकते हैं। आप ग्रुप में इस चैट के लिए सदस्यता अपडेट कर सकते हैं।"
+ "%1$s ग्रुप के सदस्य इस स्टोरी को देख सकते हैं और इस पर जवाब दे सकते हैं। आप ग्रुप में इस चैट के लिए सदस्यता अपडेट कर सकते हैं।"
ग्रुप स्टोरी हटाएँ
@@ -5229,7 +5284,7 @@
अपने एसएमएस मेसेज एक्सपोर्ट कर दें
- आप अपने SMS मेसेज अपने फ़ोन के SMS डेटाबेस को निर्यात कर सकते हैं। इससे आपके फ़ोन के अन्य SMS ऐप उन्हें ऐक्सेस व उनका आयात कर पाएँगे। इससे आपके SMS मेसेज इतिहास की कोई साझा करने योग्य फ़ाइल नहीं बनती है।
+ आप अपने SMS संदेश अपने फ़ोन के SMS डेटाबेस को निर्यात कर सकते हैं। इससे आपके फ़ोन के अन्य SMS ऐप उन्हें ऐक्सेस व उनका आयात कर पाएँगे। इससे आपके SMS संदेश इतिहास की कोई साझा करने योग्य फ़ाइल नहीं बनती है।
जारी रखें
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 976cc4119b..72456b667a 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -195,7 +195,7 @@
Ažuriraj
Ne ažuriraj
Upozorenje
- Vaša verzija Signala je istekla. Možete pregledati svoju povijest poruka, ali nećete moći slati ili primati poruke dok ne ažurirate.
+ Vaša verzija Signala je istekla. Možete pregledati svoju povijest poruka, ali nećete moći slati ili primati poruke dok ne ažurirate aplikaciju.
Nije pronađen nijedan web preglednik.
@@ -719,7 +719,7 @@
Što su Nove grupe?
Nove grupe imaju značajke poput @spominjanja i administratora grupa, a ubuduće će podržavati više značajki.
- Sva povijest poruka i medijskih zapisa sačuvani su od prije nadogradnje.
+ Sva povijest poruka i medijski zapisi sačuvani su nakon nadogradnje.
Morati će te prihvatiti pozivnicu da se ponovno pridruži ovoj grupi i nećete primati poruke grupe dok ne prihvatite:
- Ovaj će član morati prihvatiti pozivnicu da bi se ponovno pridružio grupi i neće primati poruke grupe dok ne prihvati:
@@ -738,7 +738,7 @@
Nadogradi u Novu grupu.
Nadogradi ovu grupu
Nove grupe imaju značajke poput @spominjanja i administratora grupa, a ubuduće će podržavati više značajki.
- Sva povijest poruka i medijskih zapisa će biti sačuvana od prije nadogradnje.
+ Sva povijest poruka i medijskih zapisa bit će sačuvana nakon nadogradnje.
Došlo je do mrežne pogreške. Pokušajte ponovno kasnije.
Ažuriranje nije uspjelo.
@@ -2108,6 +2108,7 @@
Poslao korisnik %1$s
Medijski zapis više nije dostupan.
Nije moguće pronaći aplikaciju za dijeljenje ovog medijskog zapisa.
+ Zatvori
%1$d novih poruka u %2$d razgovora
@@ -2842,7 +2843,7 @@
Ovo će trenutno skratiti sve razgovore na %1$s najnovijih poruka.
Ovo će trajno izbrisati svu povijest razgovora i medijske zapise s vašeg uređaja.
Jeste li sigurni da želite izbrisati svu povijest razgovora?
- Sva povijest razgovora će biti trajno izbrisana. Ova se radnja ne može poništiti.
+ Sva povijest razgovora bit će trajno izbrisana. Ova se radnja ne može poništiti.
Izbriši sve sada
Zauvijek
1 godina
@@ -2920,10 +2921,14 @@
Opcija prilagođavanja
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3076,6 +3081,26 @@
Ne sada
+
+
+ Sigurnosne postavke
+
+ Zaštitite svoja sredstva
+
+ Onemogućite pristup vašim sredstvima osobama koje imaju pristup vašem mobilnom uređaju postavljanjem dodane razine sigurnosti. Ovu opciju možete onemogućiti u Postavkama.
+
+ Omogući zaključavanje plaćanja
+
+ Ne sada
+
+ Preskočiti ovaj korak?
+
+ Preskakanje ovog koraka moglo bi omogućiti prijenos vaših sredstava ili pregled vaše fraze za oporavak svakome tko ima fizički pristup vašem telefonu.
+
+ Poništi
+
+ Preskoči
+
Dodaj sredstva
Vaša adresa novčanika
@@ -4911,7 +4936,7 @@
99+
- Privatnost priče
+ Privatnost priča
Moje priče
@@ -5013,6 +5038,8 @@
Ukloni gledatelja
Još nema odgovora
+
+ Ne možete odgovoriti na ovu priču jer više niste član grupe.
Reakcija na priču
@@ -5031,6 +5058,15 @@
Izbriši
Moja priča
+
+
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
Tko može pogledati ovu priču
@@ -5069,8 +5105,6 @@
Dopustite odgovore i reakcije
Dopustite osobama koje mogu vidjeti vašu priču da reagiraju i odgovaraju
-
- Sakrij svoju priču od određenih osoba. Prema zadanim postavkama vaša se priča dijeli s vašim %1$s
Signal kontakti
@@ -5082,7 +5116,7 @@
Spremili ih u kontakte
- "Vaši kontakti mogu vidjeti vaše ime i fotografiju te vaše priče osim ako ih od njih ne sakrijete."
+ "Vaši kontakti mogu vidjeti vaše ime i fotografiju te vaše priče, osim ako ih od njih ne sakrijete."
Dodaj gledatelja
@@ -5098,7 +5132,7 @@
Ova se radnja ne može poništiti.
- Uređivanje naziva priče
+ Uredi naziv priče
Naziv priče
@@ -5129,6 +5163,22 @@
Podijeli samo s…
Gotovo
+
+ Ukloniti grupnu priču?
+
+ \"%1$s\" bit će uklonjena.
+
+ Ukloni
+
+ Izbrisati privatnu priču?
+
+ \"%1$s\" i ažuriranja podijeljena u ovoj priči bit će izbrisana.
+
+ Izbriši
+
+ Priče su dostupne samo korisnicima beta verzije Signala.
+
+ Ako podijelite priču, ona će biti dostupna samo osobama koje koriste beta verziju Signala.
Dodati u priču?
@@ -5141,6 +5191,8 @@
Nije moguće poslati priču. Provjerite internetsku vezu i pokušajte ponovo.
Pošalji
+
+ Isključi i izbriši
Dijelite i gledajte priče
@@ -5215,9 +5267,9 @@
Reagirali ste na priču korisnika %1$s
- Reagirala je na vašu priču
+ Reagira na vašu priču
- Reakcija na priču
+ Reagira na priču
@@ -5297,6 +5349,13 @@
- Grupna priča · %1$d gledatelja
- Grupna priča · %1$d gledatelja
+
+
+ - %1$d član
+ - %1$d člana
+ - %1$d članova
+ - %1$d članova
+
- %1$s · %2$d gledatelj
@@ -5313,7 +5372,7 @@
Izbriši priču
- Ukloni grupnu priču?
+ Ukloniti grupnu priču?
Time će se priča ukloniti s ovog popisa. I dalje ćete moći vidjeti priče iz ove grupe.
@@ -5430,7 +5489,7 @@
- Priče automatski nestaju nakon 24 sata. Odaberite tko može vidjeti vašu priču ili kreirajte nove priče s određenim gledateljima ili grupama.
+ Priče automatski nestaju nakon 24 sata. Odaberite tko može vidjeti vašu priču ili stvorite nove priče s određenim gledateljima ili grupama.
Isključi priče
@@ -5442,15 +5501,15 @@
Isključiti priče?
- Više nećete moći dijeliti niti pregledavati priče. Sve priče koje ste nedavno poslali bit će vidljive drugima dok ne isteknu.
+ Više nećete moći dijeliti niti pregledavati priče. Ažuriranja priča koja ste nedavno podijelili također će se izbrisati.
- Privatnost priče
+ Privatnost priča
Tko može pogledati ovu priču
- "Članovi grupe \"%1$s\" mogu pogledati i odgovoriti na ovu priču. Možete ažurirati članstvo za ovaj razgovor u grupi."
+ "Članovi grupe \"%1$s\" mogu pogledati ovu priču i odgovoriti na nju. Možete ažurirati članstvo za ovaj razgovor u grupi."
Ukloni grupnu priču
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index d9243902a7..1f5683a200 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -193,7 +193,7 @@
Frissítés
Nincs frissítés
Figyelmeztetés
- Az általad használt Signal verziója elavult. Megtekintheted a beszélgetés-előzményeket, de frissítésig nem fogsz tudni üzeneteket küldeni és fogadni.
+ A Signal általad használt verziója elavult. Megtekintheted a beszélgetés-előzményeket, de a frissítésig nem fogsz tudni üzeneteket küldeni és fogadni.
Nem található böngésző.
@@ -1855,7 +1855,7 @@
Beváltottál egy ajándék jelvényt
- Reakció a történetedre: %1$s
+ Reakció a Történetedre: %1$s
Reakció a Történetére: %1$s
@@ -1960,6 +1960,7 @@
Feladó: %1$s
A médiafájl már nem érhető el
Nem található alkalmazás ezen médiafájl megnyitásához.
+ Bezárás
%1$d új üzenet %2$d beszélgetésben
@@ -2343,7 +2344,7 @@
Küldés ideje vágólapra másolva
- A történeteid itt fognak megjelenni
+ A Történeteid itt fognak megjelenni.
@@ -2748,10 +2749,14 @@
Beállítás testreszabása
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Később
+
+
+ Biztonsági beállítás
+
+ Védd meg a pénzed
+
+ Egy másik biztonsági réteg hozzáadásával megakadályozhatod, hogy egy személy hozzáférjen a pénzedhez a telefonodon keresztül. Ezt az opciót a Beállításokban kikapcsolhatod.
+
+ Fizetési zár engedélyezése
+
+ Később
+
+ Kihagyod ezt a lépést?
+
+ Ha kihagyod ezt a lépést, bárki, aki fizikailag hozzáfér a telefonodhoz, átutalhat pénzt az eszközről, illetve megtekintheti a helyreállítási kifejezést is.
+
+ Mégse
+
+ Kihagyás
+
Feltöltés
A tárcád címe
@@ -4733,15 +4758,15 @@
Koppints az újrapróbálkozáshoz!
- Elrejted a történetet?
+ Elrejted a Történetet?
- A %1$s felhasználótól származó történetek a jövőben nem fognak a lista tetejére kerülni.
+ A(z) %1$s felhasználótól származó Történetek a jövőben nem fognak a lista tetejére kerülni.
Elrejtés
Történet elrejtve
- Elrejtett történetek
+ Elrejtett Történetek
- %1$d megtekintés
@@ -4750,11 +4775,11 @@
Továbbítás
- %1$s története
+ %1$s Története
- Törlöd a történetet?
+ Törlöd a Történetet?
- A történet nálad és az összes címzettnél törlésre kerül.
+ A Történet nálad és az összes címzettnél törlésre kerül.
Mentés sikertelen
@@ -4786,7 +4811,7 @@
Még nem látta senki
- Engedélyezd az olvasási értesítéseket, hogy lásd, kik nézték meg a Történeteidet!
+ Engedélyezd az Olvasási értesítéseket, hogy lásd, kik nézték meg a Történeteidet!
Ugrás a Beállításokhoz
@@ -4799,14 +4824,16 @@
Néző eltávolítása
Még nem érkeztek reakciók
+
+ Nem válaszolhatsz erre a Történetre, mert már nem vagy tagja ennek a csoportnak.
- Reakció elküldve a történetre
+ Reakció elküldve a Történetre
Megtekintések
Válaszok
- Reagálás a történetre
+ Reagálás a Történetre
Privát válasz küldése %1$s részére
@@ -4817,6 +4844,13 @@
Törlés
Történetem
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Ki tekintheti meg ezt a Történetet?
@@ -4850,9 +4884,7 @@
Válaszok és reakciók engedélyezése
- Reakciók és válaszok engedése azok számára, akik megtekinthetik a történetet
-
- A történeteket elrejtheted egyes személyek elől. Alapértelmezetten történeteidet a következők tekinthetik meg: %1$s
+ Reakciók és válaszok engedélyezése azok számára, akik megtekinthetik a Történetet
Signal-névjegyek
@@ -4864,15 +4896,15 @@
Szerepelnek a telefonkönyvedben
- "Kapcsolataid megtekinthetik neved, profilképedet, valamint a \"Történeteim\" szekcióba posztoltakat, kivéve ha kifejezetten elrejtetted azokat előlük."
+ "A névjegyeid megtekinthetik a neved, a profilképedet, valamint a „Történeteim” szekcióba posztoltakat, kivéve ha kifejezetten elrejtetted azokat előlük."
Megtekintő hozzáadása
- Privát történet eltávolítása
+ Privát Történet eltávolítása
Eltávolítod %1$s felhasználót?
- A felhasználó mostantól nem tudja megtekinteni a történedet.
+ A felhasználó mostantól nem tudja megtekinteni a Történeted.
Eltávolítás
@@ -4880,7 +4912,7 @@
Ez a művelet nem vonható vissza
- Történet címének megváltoztatása
+ Történet címének módosítása
Történet címe
@@ -4900,7 +4932,7 @@
Gépelj vagy másolj be egy URL-t
- Hivatkozás megosztása a történet megtekintői számára
+ Hivatkozás megosztása a Történet megtekintői számára
Keresés
@@ -4911,22 +4943,40 @@
Megosztás kizárólag a következőkkel…
Befejezés
+
+ Csoport Történet eltávolítása?
+
+ „%1$s” eltávolításra kerül.
+
+ Eltávolítás
+
+ Privát Történet törlése?
+
+ „%1$s” és a Történettel kapcsolatos módosítások törlésre kerülnek.
+
+ Törlés
+
+ A Történetek csak a Signal béta felhasználói számára érhetők el.
+
+ Ha megosztasz egy Történetet, az csak azok számára lesz elérhető, akik a Signal béta verziójában vannak.
- Hozzáadod a történethez?
+ Hozzáadod a Történethez?
- Ha hozzáadsz egy tartalmat a történetedhez, akkor Signal kapcsolataid 24 órán keresztül megtekinthetik azt. A Beállítások használatával testre szabhatod, hogy pontosan ki férhet hozzá történeteidhez.
+ Ha hozzáadsz egy tartalmat a Történetedhez, Signal Névjegyeid 24 órán keresztül megtekinthetik. A Beállításokban testre szabhatod, hogy pontosan ki tekintheti meg a Történeteidet.
- Hozzáadás a történethez
+ Hozzáadás a Történethez
Megtekintők módosítása
- A történetet nem sikerült elküldeni. Ellenőrizd a hálózati kapcsolatot és próbáld újra!
+ A Történetet nem sikerült elküldeni. Ellenőrizd a hálózati kapcsolatot, és próbáld újra!
Küldés
+
+ Kikapcsolás és törlés
Történetek megosztása és megtekintése
- Ha letiltod ezt a funkciót, akkor nem fogsz tudni új történeteket hozzáadni vagy másokét megtekinteni.
+ Ha letiltod ezt a funkciót, nem fogsz tudni új Történeteket hozzáadni vagy másokét megtekinteni.
Megtekintők kiválasztása
@@ -4947,17 +4997,17 @@
A mező kitöltése kötelező.
- Már létezik egy történet azonos címmel
+ Már létezik egy Történet azonos címmel.
Összes kiválasztása
- Válaszd ki a történet típusát
+ Válaszd ki a Történet típusát
- Új privát történet
+ Új privát Történet
Csak bizonyos személyek számára látható
- Csoport-történet
+ Csoport Történet
Megosztás egy meglévő csoporttal
@@ -4969,7 +5019,7 @@
Válasz küldése…
- A történet már nem érhető el.
+ A Történet már nem érhető el.
Nincs internet kapcsolat
@@ -4977,7 +5027,7 @@
Történet elküldve
- Nem sikerült elküldeni a történetet
+ Nem sikerült elküldeni a Történetet
Történet megtekintése
@@ -4993,11 +5043,11 @@
Kikapcsolás
- Reagáltál %1$s történetére
+ Reagáltál %1$s Történetére
- Válasz a történetedre
+ Reagált a Történetedre
- Reagált egy történetre
+ Reagált egy Történetre
@@ -5060,7 +5110,7 @@
Később
- Megosztás a következőkkel:
+ Megosztás kizárólag:
- Privát Történet · %1$d néző
@@ -5071,6 +5121,11 @@
- Csoport Történet · %1$d néző
- Csoport Történet · %1$d néző
+
+
+ - %1$d tag
+ - %1$d tag
+
- %1$s · %2$d megtekintő
@@ -5085,15 +5140,15 @@
Történet törlése
- Csoport történet eltávolítása?
+ Csoport Történet eltávolítása?
Ez eltávolítja a Történetet a listából. Továbbra is látni fogod a Történeteket ebből a csoportból.
Eltávolítás
- Törlöd a történetet?
+ Törlöd a Történetet?
- Törlöd a(z) \"%1$s\" privát Történetet?
+ Törlöd a privát Történetet („%1$s”)?
Törlés
@@ -5139,7 +5194,7 @@
Minden névjegy ellenőrzése megtörtént, a folytatáshoz koppints a Küldés gombra.
- %1$d olyan névjegyed van, akik vagy újratelepítették a Signalt vagy eszközt cseréltek. Mielőtt megosztanád velük a Történeted, vess egy pillantást a biztonsági számukra, vagy akár ki is zárhatod őket a Történet megtekintéséből.
+ %1$d olyan névjegyed van, aki újratelepítette a Signalt vagy eszközt cserélt. Mielőtt megosztanád velük a Történeted, vess egy pillantást a biztonsági számukra, vagy akár ki is zárhatod őket a Történet megtekintéséből.
Bizt. szám ellenőrzése
@@ -5206,7 +5261,7 @@
Történetek kikapcsolása?
- Többé nem tudsz majd Történeteket megosztani vagy megtekinteni. A közelmúltban elküldött Történeteket mások továbbra is láthatják, amíg le nem járnak.
+ Többé nem fogsz tudni megosztani vagy megtekinteni Történeteket. A közelmúltban megosztott Történettel kapcsolatos módosítások is törlődnek.
Történet adatvédelmi beállításai
@@ -5214,7 +5269,7 @@
Ki tekintheti meg ezt a Történetet?
- "A(z) „%1$s”csoport tagjai megtekinthetik ezt a Történetet, és válaszolhatnak rá. A csoportban frissítheted a csevegésre vonatkozó tagságot."
+ "A(z) „%1$s” csoport tagjai megtekinthetik ezt a Történetet, és válaszolhatnak rá. A csoportban frissítheted a csevegésre vonatkozó tagságot."
Csoport Történet eltávolítása
@@ -5229,7 +5284,7 @@
SMS-ek exportálása
- Exportálhatod SMS-eidet a telefonod SMS-adatbázisába. Ez lehetővé teszi a telefonon lévő többi SMS-alkalmazás számára, hogy hozzáférjenek és importálják őket. Ez nem hoz létre megosztható fájlt az SMS-ek előzményeiből.
+ Exportálhatod SMS-eidet a telefonod SMS-adatbázisába. Ez lehetővé teszi a telefonon lévő többi SMS-alkalmazás számára, hogy hozzáférjen és importálja őket. Ez nem hoz létre megosztható fájlt az SMS-előzményekből.
Folytatás
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index adfc59d404..b355e4c447 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -192,7 +192,7 @@
Perbarui
Jangan Perbarui
Peringatan
- Versi Signal Anda telah kedaluwarsa. Anda dapat melihat riwayat pesan Anda namun Anda tidak dapat mengirim atau menerima pesan sampai Anda memperbaruinya.
+ Versi Signal Anda telah kedaluwarsa. Anda dapat melihat riwayat pesan Anda tetapi tidak akan dapat mengirim atau menerima pesan sampai Anda memperbaruinya.
Peramban web tidak ditemukan.
@@ -217,7 +217,7 @@
Cari menurut nama pengguna
- Cerita saya
+ Cerita Saya
Cerita baru
@@ -650,7 +650,7 @@
Apakah Grup Baru?
Grup yang baru akan memiliki fitur seperti @penyebutan dan ketua grup, juga akan mendapat dukungan lebih di masa mendatang.
- Setiap riwayat pesan dan media disimpan sebelum pembaruan.
+ Semua riwayat pesan dan media telah disimpan sebelum pemutakhiran.
Anda perlu menerima undangan untuk bergabung ke grup ini lagi, dan tidak akan menerima pesan grup sampai Anda menerimanya.
- Anggota ini harus menerima undangan bergabung ke grup ini lagi dan tidak akan menerima pesan grup sampai mereka menerimanya:
@@ -663,7 +663,7 @@
Perbarui ke Grup Baru
Perbarui grup ini
Grup yang baru akan memiliki fitur seperti @penyebutan dan ketua grup, juga akan mendapat dukungan lebih di masa mendatang.
- Setiap riwayat pesan dan media akan disimpan sebelum pembaruan.
+ Semua riwayat pesan dan media akan disimpan sebelum pemutakhiran.
Terjadi galat jaringan. Coba lagi nanti.
Gagal memperbarui.
@@ -1458,7 +1458,7 @@
Anda
- Cerita saya
+ Cerita Saya
Blokir
@@ -1476,7 +1476,7 @@
Jaringan gagal!
Nomor tidak terdaftar!
Nomor yang Anda panggil tidak mendukung panggilan aman!
- Paham
+ Mengerti
@@ -1782,9 +1782,9 @@
Anda telah menebus lencana hadiah
- Memberi tanggapan %1$s untuk cerita Anda
+ Memberi tanggapan %1$s ke cerita Anda
- Memberi tanggapan %1$s untuk cerita mereka
+ Memberi tanggapan %1$s ke cerita mereka
Pembaharuan Molly
@@ -1886,6 +1886,7 @@
%1$s ke Anda
Media tidak tersedia.
Tidak dapat menemukan aplikasi untuk berbagi media ini.
+ Tutup
%1$d pesan baru dalam %2$d percakapan
@@ -2662,10 +2663,14 @@
Sesuaikan opsi
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
Jangan Sekarang
+
+
+ Pengaturan keamanan
+
+ Lindungi dana Anda
+
+ Cegah seseorang yang memegang ponsel Anda mengakses dana Anda dengan menambahkan lapisan keamanan lain. Anda dapat menonaktifkan opsi ini di Pengaturan.
+
+ Aktifkan kunci pembayaran
+
+ Nanti saja
+
+ Lewati langkah ini?
+
+ Jika Anda melewati langkah ini, siapa pun yang memegang ponsel Anda bisa saja mentransfer dana atau melihat frasa pemulihan.
+
+ Batal
+
+ Lewati
+
Tambahkan dana
Alamat Dompet Anda
@@ -3879,7 +3904,7 @@
Penghitung waktu bawaan untuk percakapan baru
Atur waktu pesan menghilang untuk semua percakapan yang Anda mulai.
- Kelola cerita Anda dan siapa yang bisa melihatnya.
+ Kelola cerita Anda dan siapa yang bisa melihatnya
Memerlukan kunci layar Android atau sidik jari untuk mentransfer dana
Tidak dapat mengaktifkan kunci pembayaran
@@ -4157,7 +4182,7 @@
Tambah pesan
Teruskan lebih cepat
- Video akan dipangkas menjadi klip 30 dtk dan dikirim sebagai beberapa Cerita.
+ Video akan dipangkas menjadi klip 30 dtk dan terbagi menjadi beberapa Cerita.
Video yang dikirim ke Cerita maksimal berdurasi 30 dtk.
Pesan yang diteruskan akan segera dikirimkan sekarang.
@@ -4601,7 +4626,7 @@
Privasi cerita
- Cerita saya
+ Cerita Saya
Ketuk untuk menambahkan cerita
@@ -4609,7 +4634,7 @@
Sembunyikan cerita
- Perlihatkan cerita
+ Tampilkan cerita
Teruskan
@@ -4631,11 +4656,11 @@
Sembunyikan cerita?
- Pembaruan cerita baru dari %1$s tidak akan muncul di atas daftar cerita lagi.
+ Pembaruan cerita baru dari %1$s tidak akan muncul lagi di bagian atas daftar cerita.
Sembunyikan
- Cerita telah disembunyikan
+ Cerita disembunyikan
Cerita tersembunyi
@@ -4649,7 +4674,7 @@
Hapus cerita?
- Cerita ini akan dihapus untuk Anda dan untuk semuanya yang menerimanya.
+ Cerita ini akan dihapus untuk Anda dan untuk semua yang menerimanya.
Tidak dapat menyimpan
@@ -4679,7 +4704,7 @@
Belum ada penonton
- Aktifkan bukti pesan terbaca untuk melihat siapa yang melihat cerita Anda.
+ Aktifkan bukti pesan terbaca untuk mengetahui siapa yang melihat cerita Anda.
Buka pengaturan
@@ -4692,6 +4717,8 @@
Hapus pemirsa
Belum ada balasan
+
+ Anda tidak dapat membalas cerita ini karena Anda bukan lagi anggota grup ini.
Menanggapi cerita
@@ -4710,10 +4737,16 @@
Hapus
Cerita saya
+
+
+ - %1$d viewers
+
+
+ View
Siapa yang bisa melihat cerita ini
- Sembunyikan serita dari
+ Sembunyikan cerita dari
Semua koneksi Signal
@@ -4721,7 +4754,7 @@
Semua kecuali…
- Sembunyikan Cerita dari orang tertentu
+ Sembunyikan cerita dari orang tertentu
- %1$d orang dikecualikan
@@ -4742,8 +4775,6 @@
Izinkan balasan & tanggapan
Biarkan orang yang bisa melihat cerita Anda menanggapi dan membalas
-
- Sembunyikan cerita Anda dari orang-orang spesifik. Secara default, cerita Anda dibagikan dengan %1$s Anda
Koneksi Signal
@@ -4755,7 +4786,7 @@
Memiliki mereka di dalam kontak sistem Anda
- "Koneksi Anda bisa melihat nama Anda dan foto, dan bisa melihat post ke \"Cerita Saya\" kecuali Anda menyembunyikannya dari mereka."
+ "Koneksi Anda bisa melihat nama dan foto Anda, dan bisa melihat postingan di Cerita Saya kecuali Anda menyembunyikannya dari mereka."
Tambah penonton
@@ -4791,7 +4822,7 @@
Ketik atau tempel sebuah URL
- Bagikan sebuah link dengan penonton cerita Anda
+ Bagikan tautan ke penonton cerita Anda
Cari
@@ -4802,22 +4833,40 @@
Hanya bagikan dengan…
Selesai
+
+ Hapus cerita grup?
+
+ \"%1$s\" akan dihapus.
+
+ Hapus
+
+ Hapus cerita privat?
+
+ \"%1$s\" dan pembaruan yang dibagikan ke cerita ini juga akan dihapus.
+
+ Hapus
+
+ Cerita hanya tersedia bagi pengguna Signal beta.
+
+ Jika Anda membagikan cerita, cerita itu hanya akan tersedia untuk mereka yang menggunakan Signal beta.
Tambahkan ke cerita?
- Menambahkan konten ke cerita Anda memungkinkan koneksi-koneksi Signal Anda untuk melihatnya untuk 24 jam. Anda bisa mengganti siapa yang dapat melihat cerita Anda dalam Pengaturan.
+ Menambahkan konten ke cerita memungkinkan koneksi Signal Anda melihatnya selama 24 jam. Anda dapat mengubah siapa saja yang bisa melihat cerita di Pengaturan.
Tambahkan ke cerita
Edit penonton
- Cerita tidak dapat dikirim. Cek koneksi Anda dan coba lagi.
+ Cerita tidak dapat dikirim. Periksa koneksi Anda dan coba lagi.
Kirim
+
+ Nonaktifkan dan hapus
- Bagikan & Tampilakan Cerita
+ Bagikan & Lihat Cerita
- Anda tidak akan dapat berbagi atau melihat Cerita saat opsi ini dinonaktifkan.
+ Anda tidak bisa membagikan atau melihat Cerita bila opsi ini dinonaktifkan.
Pilih penonton
@@ -4827,9 +4876,9 @@
- %1$d peonton
- Nama cerita
+ Beri nama cerita
- Nama cerita (diperlukan)
+ Nama cerita (wajib)
Penonton
@@ -4859,7 +4908,7 @@
Mengirim balasan…
- Cerita ini tidak lagi tersedia.
+ Cerita ini sudah tidak tersedia.
Tidak Ada Sambungan Internet
@@ -4867,9 +4916,9 @@
Cerita terkirim
- Gagal untuk mengirim cerita
+ Gagal mengirim cerita
- Tampilkan cerita
+ Lihat cerita
Perlihatkan profil foto
@@ -4958,6 +5007,10 @@
- Cerita grup · %1$d penonton
+
+
+ - %1$d anggota
+
- %1$s · %2$d penonton
@@ -5004,7 +5057,7 @@
Geser kanan untuk keluar
- Paham
+ Mengerti
Buka menu konteks
@@ -5076,7 +5129,7 @@
- Cerita otomatis dihapus setelah 24 jam. Pilih siapa yang bisa melihat cerita Anda atau buat cerita baru dengan penonton atau grup spesifik.
+ Cerita otomatis dihapus setelah 24 jam. Pilih siapa yang bisa melihat cerita Anda atau buat cerita baru dengan grup atau penonton spesifik.
Nonaktifkan cerita
@@ -5088,7 +5141,7 @@
Nonaktifkan cerita?
- Anda tidak akan bisa lagi membagikan atau melihat cerita. Cerita apa pun yang baru-baru ini Anda kirim masih bisa terlihat oleh orang lain hingga cerita tersebut kedaluwarsa.
+ Anda tidak bisa lagi membagikan atau melihat cerita. Pembaruan cerita yang baru-baru ini Anda bagikan juga akan dihapus.
Privasi cerita
@@ -5111,7 +5164,7 @@
Ekspor pesan SMS Anda
- Anda dapat mengekspor pesan SMS ke basis data SMS ponsel Anda. Ini memungkinkan aplikasi SMS lain di ponsel untuk mengakses dan mengimpornya. Tindakan ini tidak menghasilkan file yang bisa dibagikan dari riwayat pesan SMS Anda.
+ Anda dapat mengekspor pesan SMS ke database SMS ponsel Anda. Ini memungkinkan aplikasi SMS lain di ponsel Anda mengakses dan mengimpornya. Tindakan ini tidak menghasilkan file yang bisa dibagikan dari riwayat pesan SMS Anda.
Lanjutkan
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index bea0a57c75..552ee0d297 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -218,7 +218,7 @@
Cerca tramite nome utente
- Le mie storie
+ Le mie Storie
Nuova Storia
@@ -1524,7 +1524,7 @@
Tu
- La mia storia
+ La mia Storia
Blocca
@@ -1960,6 +1960,7 @@
%1$s a te
Media non più disponibile.
Impossibile trovare un\'app per condividere questo media.
+ Chiudi
%1$d nuovi messaggi in %2$d conversazioni
@@ -2343,7 +2344,7 @@
Orario di invio copiato negli appunti.
- Gli aggiornamenti alla tua storia appariranno qui.
+ Gli aggiornamenti alla tua Storia appariranno qui.
@@ -2666,10 +2667,10 @@
Esamina 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 eliminerà definitivamente tutta la cronologia dei messaggi e i contenuti multimediali più vecchi di %1$s dal tuo dispositivo.
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?
+ Questo eliminerà definitivamente tutta la cronologia dei messaggi e i contenuti multimediali dal tuo dispositivo.
+ Confermi 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 sempre
@@ -2748,10 +2749,14 @@
Personalizza opzione
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Non ora
+
+
+ Impostazioni di sicurezza
+
+ Proteggi i tuoi fondi
+
+ Rendi più sicuro l\'account per evitare che chiunque abbia accesso al tuo telefono possa accedere ai fondi presenti. Puoi cambiare questa opzione nelle Impostazioni di Signal.
+
+ Attiva la funzione Pagamento sicuro
+
+ Non ora
+
+ Vuoi saltare questo passaggio?
+
+ Se ignori questo passaggio, chiunque abbia accesso al tuo telefono potrebbe trasferire eventuali fondi presenti o vedere la tua frase segreta di recupero.
+
+ Annulla
+
+ Salta
+
Aggiungi fondi
L\'indirizzo del tuo portafoglio
@@ -4705,15 +4730,15 @@
Privacy delle Storie
- Le mie storie
+ Le mie Storie
Tocca per aggiungere una Storia
Nessun aggiornamento recente da mostrare al momento.
- Nascondi storia
+ Nascondi Storia
- Non nascondere la storia
+ Mostra la Storia
Inoltra
@@ -4733,9 +4758,9 @@
Clicca per riprovare
- Nascondere la storia?
+ Nascondere la Storia?
- Gli aggiornamenti delle nuove storie di %1$s non appariranno più in cima alla lista delle storie.
+ Gli aggiornamenti delle nuove Storie di %1$s non appariranno più in cima alla lista delle Storie.
Nascondi
@@ -4752,9 +4777,9 @@
Storia di %1$s
- Eliminare storia?
+ Eliminare la Storia?
- Questa storia sarà eliminata per te e per tutti quelli che l\'hanno ricevuta.
+ Questa Storia sarà eliminata per te e per chiunque l\'abbia ricevuta.
Salvataggio non riuscito
@@ -4799,14 +4824,16 @@
Rimuovi persona
Ancora nessuna risposta
+
+ Non puoi rispondere o reagire a questa Storia perché non fai più parte di questo gruppo.
- Ha reagito alla storia
+ Ha reagito alla Storia
Visualizzazioni
Risposte
- Reagisci a questa storia
+ Reagisci a questa Storia
Rispondi privatamente a %1$s
@@ -4816,11 +4843,18 @@
Elimina
- La mia storia
+ La mia Storia
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Chi può vedere questa Storia
- Nascondi storia a
+ Nascondi Storia a
Tutte le Amicizie di Signal
@@ -4828,7 +4862,7 @@
Chiunque tranne…
- Non mostrare la tua Storia a determinate persone
+ Nascondi la tua Storia a determinate persone
- %1$d persona esclusa
@@ -4850,9 +4884,7 @@
Permetti risposte & reazioni
- Permetti alle persone che possono vedere la tua storia di reagire e rispondere
-
- Nascondi la tua storia a persone specifiche. Per impostazione predefinita, la tua storia viene condivisa con le tue %1$s
+ Permetti alle persone che possono vedere la tua Storia di reagire e rispondere
Amicizie di Signal
@@ -4864,15 +4896,15 @@
Avendole nei tuoi contatti di sistema
- "Le tue connessioni possono vedere il tuo nome e la tua foto, e possono vedere i post su \"La mia storia\", a meno che tu non la nasconda loro."
+ "Le tue connessioni possono vedere il tuo nome e la tua foto, così come i post su \"La mia Storia\", a meno che tu non decida di nasconderli a qualcuno."
Aggiungi visualizzatore
- Elimina storia privata
+ Elimina Storia privata
Rimuovere %1$s?
- Questa persona non vedrà più la tua storia.
+ Questa persona non vedrà più la tua Storia.
Rimuovi
@@ -4880,9 +4912,9 @@
Questa azione non può essere annullata.
- Modifica nome storia
+ Modifica nome Storia
- Nome storia
+ Nome Storia
Salva
@@ -4900,7 +4932,7 @@
Digita o incolla un URL
- Condividi un link con i visualizzatori della tua storia
+ Condividi un link con le persone che hanno visto la tua Storia
Cerca
@@ -4911,20 +4943,38 @@
Condividi solo con…
Fatto
+
+ Vuoi rimuovere la Storia di gruppo?
+
+ La Storia \"%1$s\" verrà rimossa.
+
+ Rimuovi
+
+ Vuoi eliminare la Storia privata?
+
+ La Storia \"%1$s\" e tutti i relativi aggiornamenti verranno rimossi.
+
+ Elimina
+
+ Le Storie sono disponibili solo agli utenti che usano la versione beta di Signal.
+
+ Se condividi una Storia, sarà visibile solamente alle persone che usano la versione beta di Signal.
- Aggiungere alla storia?
+ Aggiungere alla Storia?
- L\'aggiunta di contenuti alla tua storia permette alle tue connessioni Signal di vederla per 24 ore. Puoi cambiare chi può vedere la tua storia in Impostazioni.
+ L\'aggiunta di contenuti alla tua Storia permette alle tue Amicizie di Signal di vederli per 24 ore. Puoi cambiare chi può vedere la tua Storia nelle Impostazioni.
- Aggiungi alla storia
+ Aggiungi alla Storia
Modifica visualizzatori
- La storia non può essere inviata. Controlla la tua connessione e riprova.
+ La Storia non può essere inviata. Controlla la tua connessione e riprova.
Invia
+
+ Disattiva ed elimina
- Condividi & Visualizza storie
+ Condividi e visualizza le Storie
Non sarai più in grado di condividere o visualizzare le Storie quando questa opzione è disattivata.
@@ -4937,9 +4987,9 @@
- %1$d persone hanno visto la Storia
- Nomina storia
+ Nome Storia
- Nome della storia (obbligatorio)
+ Nome della Storia (obbligatorio)
Visualizzatori
@@ -4947,13 +4997,13 @@
Questo campo è obbligatorio.
- C\'è già una storia con questo nome.
+ C\'è già una Storia con questo nome.
Seleziona tutto
- Scegli il tuo tipo della tua storia
+ Scegli il tipo di Storia
- Nuova storia privata
+ Nuova Storia privata
Visibile solo a persone specifiche
@@ -4969,7 +5019,7 @@
Invio risposta…
- Questa storia non è più disponibile.
+ Questa Storia non è più disponibile.
Nessuna connessione Internet
@@ -4977,9 +5027,9 @@
Storia inviata
- Invio della storia fallito
+ Impossibile inviare la Storia
- Visualizza storia
+ Visualizza Storia
Visualizza foto profilo
@@ -4993,11 +5043,11 @@
Disattiva
- Hai reagito alla storia di %1$s
+ Hai reagito alla Storia di %1$s
- Ha reagito alla tua storia
+ Ha reagito alla tua Storia
- Ha reagito alla storia
+ Ha reagito a una Storia
@@ -5071,6 +5121,11 @@
- Storia di gruppo · %1$d persona
- Storia di gruppo · %1$d persone
+
+
+ - %1$d persona
+ - %1$d persone
+
- %1$s · %2$d persona
@@ -5079,7 +5134,7 @@
Tocca per decidere chi potrà vedere la Storia
- Impostazioni storia
+ Impostazioni delle Storie
Rimuovi Storia
@@ -5091,7 +5146,7 @@
Rimuovi
- Eliminare storia?
+ Eliminare la Storia?
Vuoi eliminare la seguente Storia privata: \"%1$s\"?
@@ -5206,7 +5261,7 @@
Vuoi disattivare le Storie?
- Non potrai né condividere le tue Storie, né vedere quelle di altre persone. Qualsiasi Storia tu abbia già pubblicato sarà visibile fino a 24 ore dalla pubblicazione e poi scomparirà.
+ Non potrai più condividere o vedere le Storie. Verranno eliminati tutti gli aggiornamenti legati alle Storie che hai pubblicato di recente.
Privacy delle Storie
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index fbaf1a58ca..c138728f3e 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -195,7 +195,7 @@
עדכן
אל תעדכן
אזהרה
- גרסת Signal שלך פגה. אתה יכול לצפות בהיסטורית ההודעות שלך אבל לא תוכל לשלוח או לקבל הודעות עד שתעדכן.
+ גרסת Signal שלך כבר לא בתוקף. אפשר לצפות בהיסטוריית ההודעות שלך אבל לא תהיה לך אפשרות לשלוח או לקבל הודעות עד לעדכון האפליקציה.
דפדפן רשת לא נמצא.
@@ -220,7 +220,7 @@
מצא לפי שם משתמש
- הסיפורים שלי
+ הסטוריז שלי
סטורי חדש
@@ -719,7 +719,7 @@
מהן קבוצות חדשות?
לקבוצות חדשות יש מאפיינים כמו @אזכורים ומנהלני קבוצה, ויתמכו במאפיינים נוספים בעתיד.
- כל היסטורית ההודעות וכל המדיה נשמרו מלפני השדרוג.
+ כל היסטוריית ההודעות והמדיה נשמרו מלפני השדרוג.
תצטרך לאשר הזמנה כדי להצטרף אל קבוצה זו שוב, ולא תקבל הודעות קבוצה עד שתאשר:
- חבר קבוצה זה יצטרך לאשר הזמנה כדי להצטרף אל קבוצה זו שוב והוא לא יקבל הודעות קבוצה עד שהוא יאשר:
@@ -738,7 +738,7 @@
שדרג אל קבוצה חדשה
שדרג קבוצה זו
לקבוצות חדשות יש מאפיינים כמו @אזכורים ומנהלני קבוצה, ויתמכו במאפיינים נוספים בעתיד.
- כל היסטורית ההודעות והמדיה יישמרו מלפני השדרוג.
+ כל היסטוריית ההודעות והמדיה יישמרו מלפני השדרוג.
היישום נתקל בשגיאת רשת. נסה שוב מאוחר יותר.
נכשל לשדרג.
@@ -1656,7 +1656,7 @@
את/ה
- הסיפור שלי
+ הסטורי שלי
חסום
@@ -2108,6 +2108,7 @@
%1$s אליך
מדיה אינה זמינה יותר.
לא ניתן למצוא יישום שמסוגל לשתף מדיה זו.
+ סגור
%1$d הודעות חדשות ב־%2$d שיחות
@@ -2186,7 +2187,7 @@
בקשת הודעה
את/ה
- %1$s • סיפור
+ %1$s • סטורי
נגן סרטון
@@ -2354,9 +2355,9 @@
את/ה
הודעה מקורית לא נמצאה
- %1$s · סיפור
+ %1$s · סטורי
- את/ה · סיפור
+ את/ה · סטורי
לא זמין יותר
@@ -2511,7 +2512,7 @@
חותמת זמן של שליחה הועתקה ללוח.
- עדכונים אל הסיפור שלך יופיעו כאן.
+ עדכונים לסטורי שלך יופיעו כאן.
@@ -2795,7 +2796,7 @@
תשלומים (בטא)
מגבלת אורך שיחה
שמור הודעות
- נקה היסטורית הודעות
+ ניקוי היסטוריית הודעות
מכשירים מקושרים
בהירה
כהה
@@ -2829,7 +2830,7 @@
בעת שימוש ב־Wi-Fi
בעת נדידה
הורדה אוטומטית של מדיה
- היסטורית הודעות
+ היסטוריית הודעות
שימוש באחסון
תמונות
סרטונים
@@ -2837,12 +2838,12 @@
שמע
סקור אחסון
למחוק הודעות ישנות יותר?
- לנקות היסטורית הודעות?
- זה ימחק לצמיתות את כל היסטורית ההודעות והמדיה מהמכשיר שלך אשר ישנים יותר מן %1$s.
+ לנקות היסטוריית הודעות?
+ זה ימחק לצמיתות את כל היסטוריית ההודעות והמדיה מהמכשיר שלך שישנים יותר מ%1$s.
זה יקצץ לצמיתות את כל השיחות שלך אל %1$s ההודעות האחרונות.
- זה ימחק לצמיתות את כל היסטורית ההודעות והמדיה מהמכשיר שלך.
- האם אתה בטוח שאתה רוצה למחוק את כל היסטורית ההודעות?
- כל היסטורית ההודעות תימחק לצמיתות. פעולה זו אינה ניתנת לביטול.
+ זה ימחק לצמיתות את כל היסטוריית ההודעות והמדיה מהמכשיר שלך.
+ בטוח שבא לך למחוק את כל היסטוריית ההודעות?
+ כל היסטוריית ההודעות תימחק לצמיתות. פעולה זו אינה ניתנת לביטול.
מחק הכול עכשיו
לנצח
שנה 1
@@ -2920,10 +2921,14 @@
התאם אישית אפשרות
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3076,6 +3081,26 @@
לא עכשיו
+
+
+ הגדרות אבטחה
+
+ כדאי להגן על הכספים שלך
+
+ אפשר לעזור למנוע מאדם שמחזיק במכשיר הטלפון שלך לגשת לכספים שלך באמצעות הוספת עוד שכבה של בטיחות. אפשר לכבות את האפשרות הזו בהגדרות.
+
+ הפעלת נעילת אבטחה לתשלום
+
+ לא עכשיו
+
+ לדלג על שלב זה?
+
+ דילוג על שלב זה יאפשר לכל אדם עם גישה פיזית למכשיר הטלפון שלך להעביר כספים או לצפות במשפט שחזור הסיסמה שלך.
+
+ בטל
+
+ דלג
+
הוסף כספים
כתובת הארנק שלך
@@ -4907,21 +4932,21 @@
התכתבויות
- סיפורים
+ סטוריז
99+
פרטיות של סטורי
- הסיפורים שלי
+ הסטוריז שלי
- אפשר ללחוץ כדי להוסיף סטוריז
+ יש ללחוץ כדי להוסיף סטורי
אין עדכונים אחרונים להראות כרגע.
- הסתר סיפור
+ הסתרת סטורי
- בטל הסתרת סיפור
+ ביטול הסתרת סטורי
העבר הלאה
@@ -4941,15 +4966,15 @@
הקש כדי לנסות שוב
- להסתיר סיפור?
+ להסתיר סטורי?
- עדכוני סיפור חדש מאת %1$s לא יופיעו יותר בראש רשימת הסיפורים.
+ עדכוני סטורי חדשים מאת %1$s לא יופיעו יותר בראש רשימת הסטוריז.
הסתר
- סיפור הוסתר
+ סטורי הוסתר
- סיפורים מוסתרים
+ סטוריז מוסתרים
- צפייה %1$d
@@ -4960,11 +4985,11 @@
העבר הלאה
- הסיפור של %1$s
+ הסטורי של %1$s
- למחוק סיפור?
+ למחוק סטורי?
- הסיפור הזה יימחק עבורך ועבור כל מי שקיבל אותו.
+ הסטורי הזה יימחק עבורך ועבור כל מי שקיבל אותו.
לא ניתן לשמור
@@ -5013,14 +5038,16 @@
הסרת צופה
אין תשובות עדין
+
+ אין לך אפשרות להשיב לסטורי הזה בגלל שאינך חלק מהקבוצה הזו יותר.
- הגיב/ה אל סיפור
+ הגיב/ה לסטורי
צפיות
תשובות
- הגב אל הסיפור הזה
+ תגובה לסטורי הזה
משיב באופן פרטי אל %1$s
@@ -5030,11 +5057,20 @@
מחק
- הסיפור שלי
+ הסטורי שלי
+
+
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
מי יכול לצפות בסטורי הזה
- הסתר סיפור מפני
+ הסתרת סטורי מ
כל חברי ה-Signal
@@ -5068,9 +5104,7 @@
התר תשובות ותגובות
- תן לאנשים שיכולים לצפות בסיפור שלך להגיב ולהשיב
-
- הסתר את הסיפור שלך מפני אנשים מסוימים. כברירת מחדל, הסיפור שלך משותף עם %1$s
+ אפשר לתת לאנשים שיכולים לצפות בסטורי שלך להגיב ולהשיב
חברי Signal
@@ -5082,15 +5116,15 @@
שמירה באנשי הקשר שלך
- "החיבורים שלך יכולים לראות את השם והתמונה שלך, והם יכולים לראות רשומות אל \"הסיפור שלי\" אלא אם תסתיר אותן מפניהם."
+ "חברי ה–Signal שלך יכולים לראות את השם והתמונה שלך, והם יכולים לראות פוסטים של \"הסטורי שלי\" אלא אם הסתרת אותם מהם."
הוסף צופה
- מחק סיפור פרטי
+ מחיקת סטורי פרטי
להסיר את %1$s?
- האיש הזה לא יראה יותר את הסיפור שלך.
+ האדם הזה לא יראה יותר את הסטורי שלך.
הסר
@@ -5098,9 +5132,9 @@
פעולה זו אינה ניתנת לביטול.
- ערוך שם סיפור
+ עריכת שם סטורי
- שם סיפור
+ שם סטורי
שמור
@@ -5118,7 +5152,7 @@
הקלד או הדבק מען
- שתף קישור עם צופים של הסיפור שלך
+ שיתוף לינק עם צופי הסטורי שלך
חפש
@@ -5129,22 +5163,40 @@
שיתוף רק עם…
סיים
+
+ להסיר סטורי קבוצתי?
+
+ \"%1$s\" will be removed.
+
+ הסר
+
+ למחוק סטורי פרטי?
+
+ \"%1$s\" and updates shared to this story will be deleted.
+
+ מחק
+
+ סטוריז זמינים למשתמשי גרסת הבטא של Signal בלבד.
+
+ אם משתפים סטורי, הוא יהיה זמין רק לאנשים שמשתמשים בגרסת הבטא של Signal.
- להוסיף אל סיפור?
+ להוסיף לסטורי?
- הוספת תוכן אל הסיפור שלך מתירה אל חיבורי Signal שלך לצפות בסיפור למשך 24 שעות. אתה יכול לשנות מי יכול לצפות בסיפור שלך בהגדרות.
+ הוספת תוכן לסטורי שלך מאפשרת לחברי Signal שלך לצפות בסטורי למשך 24 שעות. אפשר לשנות את מי שיכול לצפות בסטורי שלך בהגדרות.
- הוסף אל סיפור
+ הוספה לסטורי
ערוך צופים
- סיפור לא היה יכול להישלח. בדוק את החיבור שלך ונסה שוב.
+ סטורי לא הצליח להישלח. כדאי לבדוק את החיבור שלך ולנסות שוב.
שלח
+
+ כיבוי ומחיקה
- שתף וצפה בסיפורים
+ שיתוף וצפיה בסטוריז
- לא תוכל יותר לשתף סיפורים או לצפות בסיפורים כאשר האפשרות הזאת כבויה.
+ לא תהיה לך יותר אפשרות לשתף או לצפות בסטוריז כשאפשרות זו כבויה.
בחר צופים
@@ -5157,9 +5209,9 @@
- %1$d צופים
- תן שם אל סיפור
+ מתן שם לסטורי
- שם סיפור (דרוש)
+ שם סטורי (חובה)
צופים
@@ -5167,17 +5219,17 @@
שדה זה דרוש.
- יש כבר סיפור עם השם הזה.
+ יש כבר סטורי עם השם הזה.
בחר הכול
- בחר את סוג הסיפור שלך
+ בחירת סוג הסטורי שלך
- סיפור פרטי חדש
+ סטורי פרטי חדש
גלוי רק אל אנשים מסוימים
- סיפור קבוצתי
+ סטורי קבוצתי
שתף אל קבוצה קיימת
@@ -5189,17 +5241,17 @@
שולח תשובה…
- הסיפור הזה אינו זמין יותר.
+ הסטורי הזה אינו זמין יותר.
אין חיבור אינטרנט
לא היה ניתן לטעון תוכן
- סיפור נשלח
+ סטורי נשלח
- נכשל בשליחת סיפור
+ לא הצלחנו לשלוח את הסטורי
- הצג סיפור
+ צפיה בסטורי
הצג תמונת פרופיל
@@ -5213,11 +5265,11 @@
כבה
- הגבת אל הסיפור של %1$s
+ הגבת לסטורי של %1$s
- הגיב/ה אל הסיפור שלך
+ הגיב/ה לסטורי שלך
- הגיב/ה אל סיפור
+ הגיב/ה לסטורי
@@ -5297,6 +5349,13 @@
- סטורי קבוצתי · %1$d צופים
- סטורי קבוצתי · %1$d צופים
+
+
+ - חבר/ה %1$d
+ - %1$d חברים
+ - %1$d חברים
+ - %1$d חברים
+
- %1$s· צופה %2$d
@@ -5307,7 +5366,7 @@
יש ללחוץ כדי לבחור את הצופים שלך
- הגדרות סיפור
+ הגדרות סטורי
הסרת סטורי
@@ -5315,11 +5374,11 @@
להסיר סטורי קבוצתי?
- פעולה זו תסיר את הסטורי מהרשימה הזו. עדיין תהיה לך אפשרות לצפות בסיפורים מקבוצה זו.
+ פעולה זו תסיר את הסטורי מהרשימה הזו. עדיין תהיה לך אפשרות לצפות בסטוריז מקבוצה זו.
הסר
- למחוק סיפור?
+ למחוק סטורי?
למחוק את הסטורי הפרטי ״%1$s״?
@@ -5405,7 +5464,7 @@
פרטיות הסטורי שלי
- ניתן לבחור מי יראה את הפוסטים ב״סטורי שלי״. גם אחרי שבוחרים, תמיד אפשר לשנות את ההגדרות.
+ ניתן לבחור מי יראה את הפוסטים של ״הסטורי שלי״. גם אחרי שבוחרים, תמיד אפשר לשנות את ההגדרות.
כל חברי ה-Signal
@@ -5442,7 +5501,7 @@
לכבות את סטוריז?
- לא תהיה לך אפשרות לשתף או לצפות בסטוריז יותר. סטוריז ששלחת לאחרונה עדיין יהיו זמינים לצפיה לאחרים עד שהתוקף שלהם יפוג.
+ לא תהיה לך יותר אפשרות לשתף או לצפות בסטוריז. עדכוני סטורי ששיתפת לאחרונה ימחקו גם הם.
פרטיות של סטורי
@@ -5450,7 +5509,7 @@
מי יכול לצפות בסטורי הזה
- "חברי הקבוצה ״%1$s״ יכולים לצפות ולהשיב לסטורי הזה. יש לך אפשרות לעדכן את החברות לצ׳אט הזה בתוך הקבוצה."
+ "חברי הקבוצה %1$s יכולים לצפות ולהשיב לסטורי הזה. יש לך אפשרות לעדכן את החברות לצ׳אט הזה בתוך הקבוצה."
הסרת סטורי קבוצתי
@@ -5465,7 +5524,7 @@
ייצוא הודעות ה-SMS שלך
- יש לך אפשרות לייבא את הודעות ה–SMS שלך למסד נתוני ה–SMS של הטלפון שלך. זה מאפשר לאפליקציות SMS אחרות בטלפון שלך לגשת אליהן ולייבא אותן. זה לא יוצר קובץ ניתן לשיתוף של היסטוריית הודעות ה–SMS שלך.
+ יש לך אפשרות לייצא את הודעות ה–SMS שלך למסד נתוני ה–SMS של הטלפון שלך. זה מאפשר לאפליקציות SMS אחרות בטלפון שלך לגשת אליהן ולייבא אותן. זה לא יוצר קובץ ניתן לשיתוף של היסטוריית הודעות ה–SMS שלך.
המשך
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index b8e699ea7d..fa2d28536e 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -1476,7 +1476,7 @@
ネットワークエラー!
未登録番号です!
ダイヤル先は安全な音声通話をサポートしていません!
- 分かりました
+ わかりました
@@ -1886,6 +1886,7 @@
%1$s からあなた
メディアが存在しません。
このメディアを共有できるアプリが見つかりません。
+ 閉じる
%2$d個のチャットに%1$d件の新着メッセージ
@@ -2662,10 +2663,14 @@
オプションのカスタマイズ
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
今はしない
+
+
+ セキュリティ設定
+
+ 資金の保護
+
+ セキュリティを強化することで、第三者があなたの携帯電話を使用して資金にアクセスすることを防ぎます。このオプションは設定で無効にできます。
+
+ 決済機能のロックを有効にする
+
+ 今はしない
+
+ この手順をスキップしますか?
+
+ この手順をスキップすると、第三者があなたの携帯電話を使用して資金の送金やリカバリーフレーズを閲覧できる可能性があります。
+
+ キャンセル
+
+ スキップ
+
入金
あなたのウォレットアドレス
@@ -4679,7 +4704,7 @@
閲覧 なし
- 既読を有効にすると、誰があなたのストーリーズを見たのかがわかります。
+ 既読を有効にすると、誰があなたのストーリーを見たのかがわかります。
設定へ
@@ -4692,6 +4717,8 @@
閲覧者を削除
返信 なし
+
+ このグループのメンバーではなくなったので、このストーリーに返信することはできません。
ストーリーにリアクションがありました
@@ -4710,6 +4737,12 @@
削除
マイストーリー
+
+
+ - %1$d viewers
+
+
+ View
ストーリーを閲覧できる人
@@ -4735,15 +4768,13 @@
- %1$d人
- ストーリーを閲覧できるユーザーを選択してください。 変更は、すでに送信したストーリーには影響しません。
+ ストーリーを閲覧できるユーザーを選択してください。変更は、すでに送信したストーリーには影響しません。
返信とリアクション
返信とリアクションを許可する
あなたのストーリーを閲覧可能なユーザーに返信とリアクションを許可します
-
- 特定の人にあなたのストーリーを非表示にします。 デフォルトでは、ストーリーはあなたの%1$sと共有されます。
Signalコネクション
@@ -4802,6 +4833,22 @@
共有するのは…
完了
+
+ グループストーリーを削除しますか?
+
+ 「%1$s」は削除されます。
+
+ 削除
+
+ プライベートストーリーを削除しますか?
+
+ ストーリーで共有された「 %1$s」と更新情報は削除されます。
+
+ 削除
+
+ ストーリーはSignalのベータ版ユーザーのみ利用可能です。
+
+ ストーリーを共有した場合Signalのベータ版ユーザーのみに公開されます。
ストーリーに追加しますか?
@@ -4814,6 +4861,8 @@
ストーリーを送信できませんでした。接続を確認し、再度試してください。
送信する
+
+ 非表示にして削除する
ストーリーの共有と閲覧
@@ -4958,6 +5007,10 @@
- グループストーリー · 閲覧 %1$d人
+
+
+ - メンバー %1$d人
+
- %1$s• %2$d 人の閲覧者
@@ -5022,7 +5075,7 @@
すべてのコネクションが確認されました。続行するには送信をタップしてください。
- %1$d人のコネクションがSignalを再インストールしたか、端末を変更した可能性があります。 ストーリーを彼らと共有する前に、彼らの安全番号を確認するか、あなたのストーリーから彼らを削除することを検討してください。
+ %1$d人のコネクションがSignalを再インストールしたか、端末を変更した可能性があります。ストーリーを彼らと共有する前に、彼らの安全番号を確認するか、あなたのストーリーから彼らを削除することを検討してください。
安全番号を確認
@@ -5088,7 +5141,7 @@
ストーリーを非表示にしますか?
- ストーリーの共有や閲覧ができなくなります。最近送信したストーリーは、有効期限が切れるまでは他のユーザーに表示されます。
+ ストーリーを共有したり閲覧したりできなくなります。最近共有したストーリーの更新情報も削除されます。
ストーリープライバシー
diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml
index 8a72eb3a8a..1b6c8b97af 100644
--- a/app/src/main/res/values-ka/strings.xml
+++ b/app/src/main/res/values-ka/strings.xml
@@ -193,7 +193,7 @@
განახლება
არ განაახლო
გაფრთხილება
- Signal-ის შენს ვერსიას ვადა გაუვიდა. შეგიძლია ნახო შენი შეტყობინებების ისტორია, მაგრამ ვერ შეძლებ შეტყობინებების გაგზავნას ან მიღებას, სანამ აპს არ განაახლებ.
+ Signal-ის შენს ვერსიას ვადა გაუვიდა. შეგიძლია ნახო შენი შეტყობინებების ისტორია, მაგრამ სანამ აპს არ განაახლებ შეტყობინებების გაგზავნას ან მიღებას ვერ შეძლებ.
ვებ ბრაუზერი ვერ მოიძებნა.
@@ -218,7 +218,7 @@
ძებნა მომხმარებლის სახელით
- ჩემი Story-ები
+ ჩემი Stories-ები
ახალი Story-ი
@@ -1542,7 +1542,7 @@
ქსელი ჩავარდა!
ნომერი არ არის რეგისტრირებული!
შენ მიერ აკრეფილ ნომერს არ აქვს ხმის უსაფრთხო მხარდაჭერა!
- Got it
+ გასაგებია
@@ -1855,9 +1855,9 @@
შენ გამოიყენე სასაჩუქრე ემბლემა
- %1$s-ი შენს Story-ის გამოეხმაურა
+ %1$s შენს Story-ის გამოეხმაურა
- %1$s-ი შენს Story-ის გამოეხმაურა
+ %1$s მის Story-ის გამოეხმაურა
Molly-ის განახლება
@@ -1960,6 +1960,7 @@
%1$s შენ
მედია-ფაილი აღარაა ხელმისაწვდომი.
ვერ მოიძებნა აპი, რომელსაც შეუძლია ამ მედია-ფაილის გაზიარება.
+ Close
%1$d ახალი შეტყობინება %2$d მიმოწერაში
@@ -2623,7 +2624,7 @@
ტრანზაქციები (ბეტა)
მიმოწერის სიგრძის ლიმიტი
შეტყობინებების შენახვა
- მიმოწერის ისტორიის გასუფთავება
+ შეტყობინებების ისტორიის გასუფთავება
დაკავშირებული მოწყობილობები
ღია
მუქი
@@ -2657,7 +2658,7 @@
Wi-Fi-ის გამოყენებისას
როუმინგში
მედია-ფაილების ავტომატური ჩამოტვირთვა
- შეტყობინების ისტორია
+ შეტყობინებების ისტორია
მეხსიერების ათვისება
ფოტოები
ვიდეოები
@@ -2666,10 +2667,10 @@
მეხსიერების გადახედვა
წავშალოთ ძველი შეტყობინებები?
გავასუფთავოთ შეტყობინებების ისტორია?
- ეს შენი მოწყობილობიდან სამუდამოდ წაშლის მიმოწერის მთელ ისტორიას, რომელიც %1$s-მდე გქონდათ.
+ ეს შენი მოწყობილობიდან სამუდამოდ წაშლის შეტყობინებების მთელ ისტორიას, რომელიც %1$s-მდე გქონდათ.
ეს სამუდამოდ წაშლის ყველა მიმოწერას %1$s უახლეს შეტყობინებებამდე.
ეს სამუდამოდ წაშლის შეტყობინებების მთელ ისტორიას და მედია-ფაილებს შენი მოწყობილობიდან.
- დარწმუნებული ხარ, რომ გსურს წაშალო შეტყობინებების მთელი ისტორია?
+ დარწმუნებული ხარ, რომ შეტყობინებების მთელი ისტორიის წაშლა გსურს?
შეტყობინებების მთელი ისტორია სამუდამოდ წაიშლება. ამ მოქმედების გაუქმება შეუძლებელია.
ყველას წაშლა ახლავე
სამუდამოდ
@@ -2748,10 +2749,14 @@
ვარიანტის მორგება
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
ახლა არა
+
+
+ უსაფრთხოების პარამეტრების დაყენება
+
+ დაიცავი შენი სახსრები
+
+ დაგვეხმარე, უსაფრთხოების კიდევ ერთი საფარის დამატებით, შენს თანხებზე წვდომა შევუზღუდოთ მას, ვისაც შენი ტელეფონი ექნება. ამ ოფციის გამორთვა პარამეტრებიდან შეგიძლია.
+
+ გადახდის დაბლოკვის ჩართვა
+
+ ახლა არა
+
+ გამოვტოვოთ ეს ნაბიჯი?
+
+ ამ ნაბიჯის გამოტოვება საშუალებას მისცემს ნებისმიერს, ვისაც აქვს ფიზიკური წვდომა შენს ტელეფონზე, გადარიცხოს თანხები ან ნახოს შენი აღდგენის ფრაზა.
+
+ გაუქმება
+
+ გამოტოვება
+
თანხის დამატება
შენი საფულის მისამართი
@@ -3976,7 +4001,7 @@
ნაგულისხმევი ტაიმერი ახალი ჩატებისთვის
დააყენე გაქრობადი შეტყობინებებისთვის ნაგულისხმევი ტაიმერი შენს მიერ დაწყებული ყველა ახალი ჩატისთვის.
- მართე შენი Stories-ები და ვის შეუძლია მათი ნახვა
+ მართე შენი Stories-ები და ის, თუ ვის შეუძლია მათი ნახვა
მოითხოვე Android-ის ეკრანის დაბლოკვა ან თითის ანაბეჭდი თანხის გადასატანად
ტრანზაქციის უზრუნველყოფის ჩართვა ვერ მოხერხდა
@@ -4256,9 +4281,9 @@
შეტყობინების დამატება
უფრო სწრაფი გადაგზავნები
- ვიდეოები დიჭრება 30 წმ კლიპებად და გაიგზავნება რამოდენიმე Story-ის სახით.
+ ვიდეოები 30 წამიან კლიპებად დაიჭრება და რამოდენიმე Story-ის სახით გაიგზავნება.
- Stories-ში გაგზავნილი ვიდეოები არ შეიძლება იყოს 30 წმ-ზე მეტი.
+ Stories-ში გაგზავნილი ვიდეოები 30 წმ-ზე მეტი ვერ იქნება.
გადაგზავნილი შეტყობინებები ახლა დაუყოვნებლივ იგზავნება.
- %1$d შეტყობინების გაგზავნა
@@ -4699,13 +4724,13 @@
ჩატები
- Story-ები
+ Stories-ები
99+
Story-ის კონფიდენციალურობა
- ჩემი Story-ები
+ ჩემი Stories-ები
დააჭირე Story-ის დასამატებლად
@@ -4786,7 +4811,7 @@
ნახვები ჯერ არაა
- ჩართე წაკითხვის დასტური, რომ გამოგიჩნდეს ვინ ნახა შენი Stories-ები.
+ ჩართე წაკითხვის დადასტურება, რომ გამოგიჩნდეს ვინ ნახა შენი Stories-ები.
შედი პარამეტრებში
@@ -4799,8 +4824,10 @@
მნახველის ამოშლა
პასუხები ჯერ არაა
+
+ ამ Story-ის ვერ გამოეხმაურები, რადგან ამ ჯგუფის წევრი აღარ ხარ.
- Story-იზე გამოხმაურება
+ Story-ის გამოეხმაურა
ნახვები
@@ -4817,6 +4844,13 @@
წაშლა
ჩემი Story-ი
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
ვის შეუძლია ამ Story-ის ნახვა
@@ -4850,9 +4884,7 @@
პასუხებისა & გამოხმაურებების დაშვება
- ნება მიეცი ადამიანებს, რომლებსაც შეუძლიათ შენი Story-ის ნახვა, გამოხმაურება და პასუხის დაბრუნება
-
- დამალე შენი Story-ი კონკრეტული ადამიანებისგან. ნაგულისხმევად, შენი Story-ი გაზიარებულია შენს %1$s-თან
+ ნება მიეცი ადამიანებს, რომლებსაც შეუძლიათ შენი Story-ის ნახვა, მას გამოეხმაურონ
Signal-ის კონტაქტები
@@ -4864,7 +4896,7 @@
შენი სისტემის კონტაქტებში მათი არსებობა
- "შენს კონტაქტებს შეუძლიათ დაინახონ შენი სახელი და ფოტო და დაინახონ რას პოსტავ \"ჩემს Story-ში\", თუ ამას მათგან არ დამალავ."
+ "შენს კონტაქტებს შეუძლიათ ნახონ შენი სახელი და ფოტო და დაინახონ რას პოსტავ \"ჩემი Story-ი\"-ში, თუ ამას მათგან არ დამალავ."
მნახველის დამატება
@@ -4911,10 +4943,26 @@
გაუზიარე მხოლოდ…
შესრულებულია
+
+ წავშალოთ ჯგუფის Story-ი?
+
+ \"%1$s\" წაიშლება.
+
+ წაშლა
+
+ წავშალოთ პირადი Story-ი?
+
+ \"%1$s\" და ამ Story-ში გაზიარებული განახლებები წაიშლება.
+
+ წაშლა
+
+ Stories-ები მხოლოდ Signal-ის ბეტა ვერსიის მომხმარებლებისთვისაა ხელმისაწვდომი.
+
+ თუ Story-ის გააზიარებ, ის ხელმისაწვდომი მხოლოდ Signal-ის ბეტა ვერსიაზე მყოფებისთვის იქნება.
დავამატოთ Story-ში?
- შენს Story-ში კონტენტის დამატება საშუალებას აძლევს Signal-ის შენს კონტაქტებს, ნახონ იგი 24 საათის განმავლობაში. პარამეტრებიდან შეგიძლია შეცვალო, თუ ვის შეუძლია შენი Story-ის ნახვა .
+ შენი Story-ის დამატებით, საშუალებას აძლევს Signal-ის შენს კონტაქტებს, ნახონ იგი 24 საათის განმავლობაში. პარამეტრებიდან შეგიძლია შეცვალო, თუ ვის შეუძლია შენი Story-ის ნახვა.
Story-ში დამატება
@@ -4923,6 +4971,8 @@
Story-ი ვერ გაიგზავნა. შეამოწმე შენი ინტერნეტ-კავშირი და ისევ სცადე.
გაგზავნა
+
+ გამორთვა და წაშლა
გააზიარე & ნახე Stories-ები
@@ -5071,6 +5121,11 @@
- ჯგუფის Story-ი · %1$d მნახველი
- ჯგუფის Story-ი · %1$d მნახველი
+
+
+ - %1$d წევრი
+ - %1$d წევრი
+
- %1$s · %2$d მნახველი
@@ -5121,7 +5176,7 @@
გასასვლელად გაწიე მარჯვნივ
- Got it
+ გასაგებია
გახსენი კონტექსტური მენიუ
@@ -5167,9 +5222,9 @@
წაშლა
- ჩემი Story-ის კონფიდენციალურობა
+ \"ჩემი Story-ი\"-ს კონფიდენციალურობა
- აირჩიე, ვინ შეძლებს My Story-ზე დაპოსტილის ნახვას. პარამეტრებში ცვლილებების შეტანა ყოველთვის შეგიძლია.
+ აირჩიე, ვინ შეძლებს \"ჩემი Story-ი\"-ზე დაპოსტილის ნახვას. პარამეტრებში ცვლილებების შეტანა ყოველთვის შეგიძლია.
Signal-ის ყველა კონტაქტი
@@ -5194,7 +5249,7 @@
- Stories-ები ავტომატურად ქრება 24 საათის შემდეგ. აირჩიე, ვის შეუძლია შენი Story-ის ნახვა ან შექმენი ახალი Stories-ები კონკრეტულ მნახველებისთვის ან ჯგუფებისთვის.
+ Stories-ები ავტომატურად ქრება 24 საათის შემდეგ. აირჩიე, ვის შეუძლია შენი Story-ის ნახვა ან შექმენი ახალი Stories-ები კონკრეტული მნახველებისთვის ან ჯგუფებისთვის.
Stories-ების გამორთვა
@@ -5206,7 +5261,7 @@
გამოვრთოთ Stories-ები?
- Stories-ების გაზიარებას ან ნახვას ვეღარ შეძლებ. შენ მიერ ახლახან გაგზავნილი ნებისმიერი Story-ი კვლავ ხილული იქნება სხვებისთვის, სანამ ვადა არ ამოიწურება.
+ You will no longer be able to share or view stories. Story updates you have recently shared will also be deleted.
Story-ის კონფიდენციალურობა
@@ -5214,7 +5269,7 @@
ვის შეუძლია ამ Story-ის ნახვა
- "\"%1$s“ ჯგუფის წევრებს ამ Story-ის ნახვა და მასზე პასუხის გაცემა შეუძლიათ. ამ ჩატის წევრობის განახლება ჯგუფში შეგიძლია."
+ "\"%1$s“ ჯგუფის წევრებს შეუძლიათ ამ Story-ის ნახვა და მასზე გამოხმაურება. ამ ჩატის წევრობის განახლება ჯგუფში შეგიძლია."
ჯგუფის Story-ის წაშლა
diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml
index 6343117b71..fce92af789 100644
--- a/app/src/main/res/values-kk/strings.xml
+++ b/app/src/main/res/values-kk/strings.xml
@@ -218,7 +218,7 @@
Пайдаланушы аты бойынша іздеу
- Менің сторилерім
+ Менің стористерім
Жаңа сторис
@@ -673,7 +673,7 @@
Жаңа топтар деген не?
Жаңа топтарда @атап өту және топ әкімшілері сияқты функциялар бар және болашақта басқа функциялар да қосылады.
- Жаңартылғанға дейінгі барлық хат тарихы және мультимедиа сақталды.
+ Жаңартылғанға дейінгі барлық хаттар тарихы және мультимедиа сақталды.
Осы топқа қосылуға жіберілген шақыруды қайта қабылдауыңыз керек. Оны қабылдамайынша, топтағы хаттарды ала алмайсыз.
- Бұл топ мүшесі топқа қосылуға жіберілген шақыруды қайта қабылдауы керек. Оны қабылдамайынша, топтағы хаттарды ала алмайды.
@@ -1346,7 +1346,7 @@
Бұл жаңа функция ұнады ма? Бір реттік демеу жіберіп, Signal-ға қолдау көрсетіңіз.
- %1$s чаты және оның %2$s нөмірінен тұратын хаттар тарихы біріктірілді.
+ %1$s деген кісімен жазған хаттарыңыз және оның %2$s деген нөмірі біріктірілді.
%1$s чаты бар хаттар тарихы мен оған тиесілі тағы бір чат біріктірілді.
@@ -1524,7 +1524,7 @@
Сіз
- Менің сториім
+ Менің сторисім
Бұғаттау
@@ -1960,6 +1960,7 @@
%1$s – сіз
Мультимедиа қолжетімді емес.
Бұл мультимедиа файлын бөлісе алатын қолданба табылмады.
+ Close
%2$d әңгімеде %1$d жаңа хат бар
@@ -2343,7 +2344,7 @@
Жіберілген уақыт белгісі буферге көшірілді.
- Сториіңізде жаңартулар осы жерде көрініс табады.
+ Сторисіңізде жаңартулар осы жерде көрсетіледі.
@@ -2748,10 +2749,14 @@
Бейімдеу опциясы
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Қазір емес
+
+
+ Қауіпсіздік параметрлерін реттеу
+
+ Қаражатыңызды қорғаңыз
+
+ Қосымша қауіпсіздік шарасын қосу арқылы телефоныңызды ұстап отырған адамның қаражатыңызды пайдаланбауын қадағалаңыз. Бұл опцияны \"Параметрлер\" бөлімінен өшіріп қоюыңызға болады.
+
+ Төлем құлпын қосу
+
+ Кейін
+
+ Осы қадамды өткізіп жіберу керек пе?
+
+ Бұл қадамды өткізіп жіберсеңіз, телефоныңызды ұстап отырған кез келген адам ақша аудара алады немесе қалпына келтіру сөйлеміңізді көре алады.
+
+ Болдырмау
+
+ Өткізіп жіберу
+
Қаражат қосу
Әмияныңыздың мекенжайы
@@ -4258,7 +4283,7 @@
Видеолар 30 секундтық клиптерге бөлінеді және бірнеше сторис ретінде жіберіледі.
- Сториске жіберілетін видеолардың ұзақтығы 30 секундтан аспау керек.
+ Сториске жіберілетін видеолардың ұзақтығы 30 секундтан аспауы керек.
Басқаға жіберілген хаттар енді дереу кетеді.
- %1$d хат жіберу
@@ -4699,13 +4724,13 @@
Чаттар
- Сторилер
+ Стористер
99+
- Сторис құпиялығы
+ Сторис құпиялылығы
- Менің сторилерім
+ Менің стористерім
Сторис қосу үшін түртіңіз
@@ -4799,6 +4824,8 @@
Көрерменді өшіру
Ешкім жауап жазбаған
+
+ Бұл сториске жауап бере алмайсыз, себебі сіз ендігәрі бұл топтың мүшесі емессіз.
Осы сториске реакция қалдырды
@@ -4816,7 +4843,14 @@
Жою
- Менің сториім
+ Менің сторисім
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Бұл стористі кім көре алады
@@ -4828,7 +4862,7 @@
Мыналардан басқалары…
- Белгілі бір адамдардан стористеріңізді жасыру
+ Кейбір адамдардан стористеріңізді жасыру
- %1$d адам шығарылды
@@ -4851,8 +4885,6 @@
Жауаптар мен реакцияларға рұқсат ету
Сторисіңізді көре алатын адамдарға реакция қалдыруға және жауап жазуға рұқсат ету
-
- Стористеріңізді белгілі бір адамдардан жасырыңыз. Әдепкіде сторисіңізді %1$s көре алады
Signal байланыстары
@@ -4911,10 +4943,26 @@
Тек мына адамдармен бөлісу…
Дайын
+
+ Топтағы стористі өшіру керек пе?
+
+ \"%1$s\" өшіп қалады.
+
+ Жою
+
+ Жеке стористі жою керек пе?
+
+ \"%1$s\" және осы сториске салынған жаңартулар жойылады.
+
+ Жою
+
+ Сторис тек Signal-дың бета нұсқасын пайдаланатындарға ғана қолжетімді.
+
+ Сторис бөліссеңіз, оны Signal-дың бета нұсқасын пайдаланатындар көре алады.
Сторис қосу керек пе?
- Сторисіңізге контент қоссаңыз, Signal-дағы контактілеріңіз оны 24 сағат көре алады. Параметрлер бөліміне кіріп, стористеріңізді кім көре алатынын өзгертуіңізге болады.
+ Сторис салсаңыз, Signal-дағы контактілеріңіз оны 24 сағат ішінде көре алады. Параметрлер бөліміне кіріп, стористеріңізді кім көре алатынын өзгертуіңізге болады.
Сторис қосу
@@ -4923,6 +4971,8 @@
Стористі жіберу мүмкін болмады. Байланысты тексеріп, қайталап көріңіз.
Жіберу
+
+ Өшіру және жою
Стористерді бөлісу және көру
@@ -5060,7 +5110,7 @@
Кейін
- Тек мына көрермендермен бөлісу
+ Көре алатындар
- Жеке стористе · %1$d көрермен
@@ -5071,6 +5121,11 @@
- Топтық стористе · %1$d көрермен
- Топтық стористе · %1$d көрермен
+
+
+ - %1$d мүше
+ - %1$d мүше
+
- %1$s · %2$d көрермен
@@ -5091,9 +5146,9 @@
Өшіру
- Стористі жою керек пе
+ Стористі жою керек пе?
- \"%1$s\" жеке сторисін өшіру керек пе?
+ \"%1$s\" жеке сторисін жою керек пе?
Жою
@@ -5194,9 +5249,9 @@
- Сторис 24 сағаттан кейін өшіп қалады. Сторисіңізді кім көре алатынын таңдаңыз немесе белгілі бір көрермендер немесе топтар ғана көре алатын жаңа стористер жасаңыз.
+ Сторис 24 сағаттан кейін өшіп қалады. Сторисіңізді кім көре алатынын таңдаңыз немесе кейбір көрермендер немесе топтар ғана көре алатын жаңа стористер жасаңыз.
- Стористерді өшіру
+ Стористерді өшіріп қою
Стористерді өшіріп қойсаңыз, бұдан былай стористерді бөлісе немесе көре алмайтын боласыз.
@@ -5206,7 +5261,7 @@
Стористерді өшіру керек пе?
- Бұдан былай стористерді бөлісе немесе көре алмайсыз. Соңғы жіберген стористеріңіздің мерзімі өткенге дейін, оларды басқа адамдар көре алады.
+ Ендігәрі стористерді бөлісе немесе көре алмайсыз. Жақында бөліскен сторис жаңалықтары да жойылады.
Сторис құпиялылығы
@@ -5214,7 +5269,7 @@
Бұл стористі кім көре алады
- "\"%1$s\" тобының мүшелері бұл стористі көре алады және оған жауап бере алады. Топтағы осы чат үшін мүшелік параметрлерін өзгерте аласыз."
+ "%1$s тобының мүшелері бұл стористі көре алады және оған жауап бере алады. Топтағы осы чат үшін мүшелік параметрлерін өзгерте аласыз."
Топтық стористі өшіріп тастау
diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml
index 471d96c019..c24cc13288 100644
--- a/app/src/main/res/values-km/strings.xml
+++ b/app/src/main/res/values-km/strings.xml
@@ -192,7 +192,7 @@
បច្ចុប្បន្នភាព
កុំធ្វើបច្ចុប្បន្នភាព
ព្រមាន
- Signal របស់អ្នកបានផុតកំណត់ហើយ។ អ្នកអាចមើលប្រវត្តិសាររបស់អ្នកប៉ុន្តែអ្នកនឹងមិនអាចផ្ញើរឬទទួលសាររហូតដល់អ្នកធ្វើបច្ចុប្បន្នភាព។
+ កំណែ Signal របស់អ្នកបានផុតកំណត់ហើយ។ អ្នកអាចមើលប្រវត្តិសាររបស់អ្នកបាន ប៉ុន្តែអ្នកនឹងមិនអាចផ្ញើ ឬទទួលសារបានទេ រហូតទាល់តែអ្នកដំឡើងកំណែសិន។
ទំព័រវែបសាយរកមិនឃើញ.
@@ -650,7 +650,7 @@
តើអ្វីជាក្រុមថ្មី?
ក្រុមថ្មី មានមុខងារដូចជា @mentions និងអ្នកគ្រប់គ្រងក្រុម ហើយនឹងគាំទ្រមុខងារបន្ថែមនៅពេលអនាគត។
- ប្រវត្តិសារ និងឯកសារមេឌាទាំងអស់ ត្រូវបានរក្សាទុកមុនពេលដំឡើង។
+ ប្រវត្តិសារ និងឯកសារមេឌៀទាំងអស់ត្រូវបានរក្សាទុកមុនពេលដំឡើងកម្រិត។
អ្នកនឹងត្រូវយល់ព្រមការអញ្ជើញចួលរួមក្រុមនេះម្តងទៀត ហើយនឹងមិនអាចទទួលសារក្នុងក្រុម រហូតដល់អ្នកយល់ព្រម។
- សមាជិកទាំងនេះ នឹងត្រូវយល់ព្រមការអញ្ជើញចួលរួមក្រុមនេះម្តងទៀត ហើយនឹងមិនអាចទទួលសារក្នុងក្រុម រហូតដល់ពួកគេយល់ព្រម៖
@@ -663,7 +663,7 @@
ដំឡើងទៅក្រុមថ្មី
ដំឡើងក្រុមនេះ
ក្រុមថ្មី មានមុខងារដូចជា @mentions និងអ្នកគ្រប់គ្រងក្រុម ហើយនឹងគាំទ្រមុខងារបន្ថែមនៅពេលអនាគត។
- ប្រវត្តិសារ និងឯកសារមេឌាទាំងអស់ នឹងត្រូវរក្សាទុកមុនពេលដំឡើង។
+ ប្រវត្តិសារ និងឯកសារមេឌៀទាំងអស់នឹងត្រូវបានរក្សាទុកមុនពេលដំឡើងកម្រិត។
បានជួបប្រទះបញ្ហាបណ្តាញ។ សាកល្បងម្តងទៀតពេលក្រោយ។
បរាជ័យក្នុងការដំឡើង។
@@ -1476,7 +1476,7 @@
បណ្តាញបរាជ័យ!
លេខមិនទាន់ចុះឈ្មោះ!
លេខដែលអ្នកកំពុងហៅ មិនគាំទ្រសំឡេងសុវត្ថិភាពទេ!
- ទទួលបាន
+ យល់ហើយ
@@ -1886,6 +1886,7 @@
%1$s ទៅអ្នក
ឯកសារមេឌៀលែងមានទៀតហើយ។
មិនអាចស្វែងរកកម្មវិធីដែលអាចចែករំលែកឯកសារមេឌៀនេះ។
+ បិទ
%1$d សារថ្មីក្នុង %2$d ការសន្ទនា
@@ -2259,7 +2260,7 @@
បានចម្លងត្រាពេលវេលាដែលបានផ្ញើ ទៅឃ្លីបបត។
- ការធ្វើបច្ចុប្បន្នភាពចំពោះរឿងរ៉ាវរបស់អ្នកនឹងបង្ហាញនៅទីនេះ។
+ បច្ចុប្បន្នភាពចំពោះរឿងរ៉ាវរបស់អ្នកនឹងបង្ហាញនៅទីនេះ។
@@ -2537,7 +2538,7 @@
ការទូទាត់ (បេតា)
ប្រវែងការសន្ទនាមានកំណត់
រក្សាសារ
- សំអាតប្រវត្តិសារ
+ លុបប្រវត្តិសារ
ភ្ជាប់ឧបករណ៍
ភ្លឺ
ងងឹត
@@ -2579,12 +2580,12 @@
សំឡេង
បង្ហាញឧបករណ៍ផ្ទុក
លុបសារចាស់ៗ?
- សំអាតប្រវត្តិសារ?
- នេះនឹងលុបប្រវត្តិសារ និងឯកសារមេឌៀទាំងអស់ចោលរហូត ចេញពីឧបករណ៍របស់អ្នក ដែលចាស់ជាង %1$s។
+ លុបប្រវត្តិសារឬ?
+ ការធ្វើបែបនេះនឹងលុបប្រវត្តិសារ និងឯកសារមេឌៀទាំងអស់ជាអចិន្ត្រៃយ៍ ពីឧបករណ៍របស់អ្នក ដែលមានរយៈពេលលើសពី %1$s។
នេះ នឹងតម្រឹមការសន្ទនាទាំងអស់ទៅ %1$s សារថ្មីៗបំផុត។
- នេះនឹងលុបប្រវត្តិសារ និងឯកសារមេឌៀទាំងអស់ចោលរហូត។
- តើអ្នកប្រាកដថាចង់លុបប្រវត្តិសារទាំងអស់?
- ប្រវត្តិសារទាំងអស់នឹងត្រូវលុបចោលរហូត។ សកម្មភាពនេះ មិនអាចត្រឡប់ក្រោយទេ។
+ ការធ្វើបែបនេះនឹងលុបប្រវត្តិសារ និងឯកសារមេឌៀទាំងអស់ពីឧបករណ៍របស់អ្នកជាអចិន្ត្រៃយ៍។
+ តើអ្នកប្រាកដថាចង់លុបប្រវត្តិសារទាំងអស់ឬ?
+ ប្រវត្តិសារទាំងអស់នឹងត្រូវលុបចោលជាអចិន្ត្រៃយ៍។ សកម្មភាពនេះមិនអាចត្រឡប់ក្រោយទេ។
លុបទាំងអស់ឥឡូវនេះ
ជារៀងរហូត
1 ឆ្នាំ
@@ -2662,10 +2663,14 @@
ជម្រើសធ្វើផ្សេង
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
កុំទាន់
+
+
+ ការរៀបចំប្រព័ន្ធសុវត្ថិភាព
+
+ ការពារប្រាក់របស់អ្នក
+
+ បន្ថែមស្រទាប់សុវត្ថិភាពមួយទៀត ដើម្បីជួយការពារកុំឲ្យនរណាម្នាក់ដែលមានទូរសព្ទរបស់អ្នកចូលប្រើប្រាស់នូវប្រាក់របស់អ្នកបាន។ អ្នកអាចបិទជម្រើសនេះនៅក្នុងការកំណត់។
+
+ បើកការចាក់សោការទូទាត់
+
+ ពេលក្រោយ
+
+ រំលងជំហាននេះឬ?
+
+ ការរំលងជំហាននេះអាចអនុញ្ញាតឲ្យនរណាម្នាក់ដែលមានសិទ្ធិចូលប្រើទូរសព្ទរបស់អ្នក ផ្ទេរប្រាក់ ឬមើលឃ្លាស្តាររបស់អ្នកបាន។
+
+ បោះបង់
+
+ រំលង
+
បន្ថែមថវិកា
អាសយដ្ឋានកាបូបរបស់អ្នក
@@ -3879,7 +3904,7 @@
ពេលវេលាតាមលំនាំដើមសម្រាប់ការសន្ទនាថ្មីៗ
កំណត់ថេរវេលានៃការលុបសារសម្រាប់រាល់ការសន្ទនាថ្មីៗដែលចាប់ផ្ដើមដោយអ្នក
- គ្រប់គ្រងរឿងរ៉ាវរបស់អ្នក និងអ្នកដែលអាចមើលពួកវា
+ គ្រប់គ្រងរឿងរ៉ាវរបស់អ្នក និងអ្នកដែលអាចមើលវាបាន
តម្រូវឲ្យចាក់សោអេក្រង់ Android ឬប្រើស្នាមម្រាមដៃដើម្បីផ្ទេរប្រាក់
មិនអាចបើកមុខងារចាក់សោការបង់ប្រាក់បាន
@@ -4157,7 +4182,7 @@
បន្ថែមសារ
ការបញ្ជូនសារបន្តលឿនជាងមុន
- វីដេអូនឹងត្រូវបានកាត់តម្រឹមជាឃ្លីបខ្លីៗដែលមានរយៈពេល 30 វិនាទី ហើយផ្ញើទៅជារឿងរ៉ាវជាច្រើន។
+ វីដេអូនឹងត្រូវបានតម្រឹមជាឃ្លីបដែលមានរយៈពេល 30 វិនាទី ហើយផ្ញើជារឿងរ៉ាវជាច្រើន។
វីដេអូដែលបានផ្ញើទៅរឿងរ៉ាវមិនអាចវែងជាង 30 វិនាទីទេ។
ការបញ្ជូនសារបន្តនឹងផ្ញើចេញទៅភ្លាមៗ
@@ -4631,7 +4656,7 @@
លាក់រឿងរ៉ាវឬ?
- បច្ចុប្បន្នភាពអំពីរឿងរ៉ាវថ្មីៗពី %1$s នឹងមិនបង្ហាញនៅផ្នែកខាងលើបំផុតនៃបញ្ជីរឿងរ៉ាវទៀតទេ។
+ បច្ចុប្បន្នភាពរឿងរ៉ាវថ្មីៗពី %1$s នឹងមិនបង្ហាញនៅផ្នែកខាងលើបំផុតនៃបញ្ជីរឿងរ៉ាវទៀតទេ។
លាក់
@@ -4649,7 +4674,7 @@
លុបរឿងរ៉ាវឬ?
- រឿងរ៉ាវនេះនឹងត្រូវលុបចេញសម្រាប់អ្នក និងអ្នករាល់គ្នាដែលបានទទួលវា។
+ រឿងរ៉ាវនេះនឹងត្រូវបានលុបចោលសម្រាប់អ្នក និងមនុស្សគ្រប់គ្នាដែលបានទទួលវា។
មិនអាចរក្សាទុក
@@ -4692,6 +4717,8 @@
ដកអ្នកមើលចេញ
មិនទាន់មានការឆ្លើយតបទេ
+
+ អ្នកមិនអាចឆ្លើយតបទៅនឹងរឿងរ៉ាវនេះទេ ដោយសារអ្នកលែងជាសមាជិកនៃក្រុមនេះទៀតហើយ។
បានប្រតិកម្មនឹងរឿងរ៉ាវ
@@ -4710,6 +4737,12 @@
លុប
រឿងរ៉ាវរបស់ខ្ញុំ
+
+
+ - %1$d viewers
+
+
+ View
អ្នកដែលអាចមើលរឿងរ៉ាវនេះបាន
@@ -4741,9 +4774,7 @@
អនុញ្ញាតការឆ្លើយតប និងការប្រតិកម្ម
- អនុញ្ញាតឲ្យមនុស្សដែលអាចមើលរឿងរបស់អ្នកប្រតិកម្ម និងឆ្លើយតប
-
- លាក់រឿងរ៉ាវរបស់អ្នកពីមនុស្សជាក់លាក់។ តាមលំនាំដើម រឿងរ៉ាវរបស់អ្នកត្រូវបានចែករំលែកជាមួយ %1$s របស់អ្នក
+ អនុញ្ញាតឲ្យមនុស្សដែលអាចមើលរឿងរ៉ាវរបស់អ្នក ប្រតិកម្ម និងឆ្លើយតបបាន
អ្នកភ្ជាប់ទំនាក់ទំនងក្នុង Signal
@@ -4755,7 +4786,7 @@
មានពួកគេនៅក្នុងប្រព័ន្ធទំនាក់ទំនងរបស់អ្នក
- "មនុស្សដែលអ្នកភ្ជាប់ជាមួយអាចមើលឃើញឈ្មោះ និងរូបថតរបស់អ្នក ហើយអាចមើលឃើញការបង្ហោះទៅកាន់ \"រឿងរ៉ាវរបស់ខ្ញុំ\" លុះត្រាតែអ្នកលាក់វាពីពួកគេ។"
+ "អ្នកភ្ជាប់ទំនាក់ទំនងជាមួយអ្នកអាចមើលឃើញឈ្មោះ និងរូបថតរបស់អ្នក ហើយអាចមើលឃើញសារបង្ហោះទៅកាន់រឿងរ៉ាវរបស់ខ្ញុំ លើកលែងតែអ្នកលាក់វាមិនឲ្យពួកគេឃើញ។"
បញ្ចូលអ្នកមើល
@@ -4802,18 +4833,36 @@
គ្រាន់តែចែករំលែកជាមួយ…
បញ្ចប់
+
+ ដករឿងរ៉ាវក្រុមចេញឬ?
+
+ \"%1$s\" នឹងត្រូវបានដកចេញ។
+
+ លុបចេញ
+
+ លុបរឿងរ៉ាវឯកជនឬ?
+
+ \"%1$s\" និងបច្ចុប្បន្នភាពដែលបានចែករំលែកចំពោះរឿងរ៉ាវនេះនឹងត្រូវបានលុប។
+
+ លុប
+
+ រឿងរ៉ាវមានសម្រាប់តែអ្នកប្រើ Signal Beta ប៉ុណ្ណោះ។
+
+ ប្រសិនបើអ្នកចែករំលែករឿងរ៉ាវមួយ វានឹងអាចមើលឃើញដោយមនុស្សដែលនៅលើ Signal Beta ប៉ុណ្ណោះ។
បញ្ចូលទៅក្នុងរឿងរ៉ាវឬទេ?
- ការបញ្ចូលខ្លឹមសារទៅក្នុងរឿងរ៉ាវរបស់អ្នកអនុញ្ញាតឲ្យមនុស្សដែលអ្នកបានភ្ជាប់ជាមួយក្នុង Signal មើលវារយៈពេល 24 ម៉ោង។ អ្នកអាចផ្លាស់ប្តូរនៅក្នុងការកំណត់បាន ដើម្បីកំណត់ថាតើនរណាខ្លះដែលអាចមើលរឿងរ៉ាវរបស់អ្នកបាន។
+ ការបញ្ចូលខ្លឹមសារទៅក្នុងរឿងរ៉ាវរបស់អ្នកអនុញ្ញាតឲ្យអ្នកភ្ជាប់ទំនាក់ទំនងក្នុង Signal អាចមើលវាបានរយៈពេល 24 ម៉ោង។ អ្នកអាចផ្លាស់ប្តូរអ្នកដែលអាចមើលរឿងរ៉ាវរបស់អ្នកនៅក្នុងការកំណត់។
បញ្ចូលទៅរឿងរ៉ាវ
កែអ្នកមើល
- មិនអាចផ្ញើរឿងរ៉ាវទេ។ សូមពិនិត្យមើលសេវាអ៊ីនធឺណិតរបស់អ្នក ហើយព្យាយាមម្តងទៀត។
+ មិនអាចផ្ញើរឿងរ៉ាវបានទេ។ សូមពិនិត្យមើលសេវាអ៊ីនធឺណិតរបស់អ្នក រួចព្យាយាមម្តងទៀត។
ផ្ញើ
+
+ បិទ និងលុប
ចែករំលែក និងមើលរឿងរ៉ាវ
@@ -4958,6 +5007,10 @@
- រឿងរ៉ាវក្រុម · អ្នកមើល %1$d នាក់
+
+
+ - សមាជិក %1$d នាក់
+
- %1$s · អ្នកមើល %2$d នាក់
@@ -5004,7 +5057,7 @@
អូសទៅស្តាំដើម្បីចាកចេញ
- ទទួលបាន
+ យល់ហើយ
បើកម៉ឺនុយបរិបទ
@@ -5088,7 +5141,7 @@
បិទរឿងរ៉ាវឬ?
- អ្នកនឹងមិនអាចចែករំលែក ឬមើលរឿងរ៉ាវទៀតទេ។ រឿងរ៉ាវទាំងឡាយដែលអ្នកបានផ្ញើនាពេលថ្មីៗនេះនឹងនៅតែអាចមើលឃើញដោយអ្នកដទៃ រហូតដល់ពួកវាផុតកំណត់។
+ អ្នកនឹងមិនអាចចែករំលែក ឬមើលរឿងរ៉ាវបានទៀតទេ។ បច្ចុប្បន្នភាពរឿងរ៉ាវដែលអ្នកបានចែករំលែកនាពេលថ្មីៗនេះក៏នឹងត្រូវបានលុបចោលផងដែរ។
ឯកជនភាពនៃរឿងរ៉ាវ
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 1fff308a7b..a3ee146701 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -673,7 +673,7 @@
ಹೊಸ ಗುಂಪುಗಳೆಂದರೇನು?
ಹೊಸ ಗುಂಪುಗಳು @ಉಲ್ಲೇಖಗಳು ಮತ್ತು ಗುಂಪು ನಿರ್ವಾಹಕರಂತಹ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊಂದಿವೆ, ಮತ್ತು ಭವಿಷ್ಯದಲ್ಲಿ ಹೆಚ್ಚಿನ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ.
- ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ನವೀಕರಣದ ಮೊದಲು ಇರಿಸಲಾಗಿದೆ.
+ ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ನವೀಕರಣದ ಮೊದಲಿನಿಂದಲೂ ಇರಿಸಲಾಗಿದೆ.
ಈ ಗುಂಪಿಗೆ ಮತ್ತೆ ಸೇರಲು ನೀವು ಆಹ್ವಾನವನ್ನು ಸ್ವೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ, ಮತ್ತು ನೀವು ಸ್ವೀಕರಿಸುವವರೆಗೆ ಗುಂಪು ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ.
- ಈ ಸದಸ್ಯರು ಮತ್ತೆ ಈ ಗುಂಪಿಗೆ ಸೇರಲು ಆಹ್ವಾನವನ್ನು ಸ್ವೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ ಮತ್ತು ಅವರು ಸ್ವೀಕರಿಸುವವರೆಗೆ ಗುಂಪು ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ:
@@ -688,7 +688,7 @@
ಹೊಸ ಗುಂಪಿಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ
ಈ ಗುಂಪನ್ನು ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ
ಹೊಸ ಗುಂಪುಗಳು @ಉಲ್ಲೇಖಗಳು ಮತ್ತು ಗುಂಪು ನಿರ್ವಾಹಕರಂತಹ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊಂದಿವೆ, ಮತ್ತು ಭವಿಷ್ಯದಲ್ಲಿ ಹೆಚ್ಚಿನ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ.
- ಅಪ್ಗ್ರೇಡ್ಗೂ ಮೊದಲಿನ ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ಇಡಲಾಗಿದೆ.
+ ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ನವೀಕರಣದ ಮೊದಲಿನಿಂದಲೂ ಇರಿಸಲಾಗುತ್ತದೆ.
ತಾತ್ಕಾಲಿಕ ನೆಟ್ವರ್ಕ್ ತೊಂದರೆ ಉಂಟಾಯಿತು . ನಂತರ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ .
ಅಪ್ಗ್ರೇಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ.
@@ -1346,9 +1346,9 @@
ಹೊಸ ಫೀಚರ್ ಇಷ್ಟವಾಯಿತೇ? ಒಂದು ಬಾರಿಯ ದೇಣಿಗೆಯೊಂದಿಗೆ Signal ಬೆಂಬಲಿಸಿ ನೆರವಾಗಿ.
- %1$s ನೊಂದಿಗಿನ ನಿಮ್ಮ ಮೆಸೇಜ್ ಇತಿಹಾಸ ಮತ್ತು %2$s ಅವರ ನಂಬರ್ ಅನ್ನು ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ.
+ %1$s ಅವರೊಂದಿಗಿನ ನಿಮ್ಮ ಮೆಸೇಜ್ ಇತಿಹಾಸ ಮತ್ತು ಅವರ ನಂಬರ್ %2$s ಅನ್ನು ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ.
- %1$s ಮತ್ತು ಅವರಿಗೆ ಸೇರಿದ ಬೇರೊಂದು ಚಾಟ್ ನೊಂದಿಗಿನ ನಿಮ್ಮ ಮೆಸೇಜ್ ಇತಿಹಾಸವನ್ನು ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ.
+ %1$s ಅವರೊಂದಿಗಿನ ನಿಮ್ಮ ಮೆಸೇಜ್ ಇತಿಹಾಸ ಮತ್ತು ಅವರಿಗೆ ಸೇರಿದ ಬೇರೊಂದು ಚಾಟ್ ಅನ್ನು ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ.
%1$s ಅವರು ಗ್ರೂಪ್ ಕಾಲ್ ಆರಂಭಿಸಿದ್ದಾರೆ · %2$s
@@ -1857,7 +1857,7 @@
ನಿಮ್ಮ ಸ್ಟೋರಿಗೆ %1$s ಪ್ರತಿಕ್ರಿಯಿಸಿದ್ದಾರೆ
- ತಮ್ಮ ಸ್ಟೋರಿಗೆ %1$s ಪ್ರತಿಕ್ರಿಯಿಸಿದ್ದಾರೆ
+ ಅವರ ಸ್ಟೋರಿಗೆ %1$s ಪ್ರತಿಕ್ರಿಯಿಸಿದ್ದಾರೆ
Molly ನವೀಕರಿಸಿ
@@ -1960,6 +1960,7 @@
%1$s ಅವರಿಂದ ನಿಮಗೆ
ಮೀಡಿಯಾ ಇನ್ನು ಲಭ್ಯವಿಲ್ಲ.
ಈ ಮೀಡಿಯಾ ಹಂಚಿಕೊಳ್ಳಲು ಒಂದು ಆಪ್ ಕಂಡುಕೊಳ್ಳಲಾಗುತ್ತಿಲ್ಲ.
+ ಮುಚ್ಚಿ
%2$dಸಂಭಾಷಣೆಗಳಲ್ಲಿ %1$d ಹೊಸ ಸಂದೇಶಗಳು
@@ -2666,10 +2667,10 @@
ಸ್ಟೊರೇಜ್ ಪರಿಶೀಲಿಸಿ
ಹಳೆಯ ಸಂದೇಶವನ್ನು ಅಳಿಸುವುದೇ?
ಸಂದೇಶ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸುವುದೇ?
- ಇದು ನಿಮ್ಮ ಸಾಧನದಿಂದ %1$s ಗಿಂತ ಹಳೆಯದಾಗಿರುವ ಎಲ್ಲಾ ಸಂದೇಶಗಳ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುತ್ತದೆ.
+ %1$s ಗಿಂತ ಹಳೆಯದಾಗಿರುವ ಎಲ್ಲಾ ಸಂದೇಶಗಳ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ಇದು ನಿಮ್ಮ ಸಾಧನದಿಂದ ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿಹಾಕುತ್ತದೆ.
ಇದು ಎಲ್ಲಾ ಸಂಭಾಷಣೆಗಳನ್ನು %1$s ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳಿಗೆ ಶಾಶ್ವತವಾಗಿ ಟ್ರಿಮ್ ಮಾಡುತ್ತದೆ.
- ಇದು ನಿಮ್ಮ ಸಾಧನದಿಂದ ಎಲ್ಲಾ ಸಂದೇಶಗಳ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುತ್ತದೆ.
- ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸವನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?
+ ಎಲ್ಲಾ ಸಂದೇಶಗಳ ಇತಿಹಾಸ ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ಇದು ನಿಮ್ಮ ಸಾಧನದಿಂದ ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿಹಾಕುತ್ತದೆ.
+ ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸವನ್ನು ನೀವು ಖಚಿತವಾಗಿ ಅಳಿಸಿಹಾಕಲು ಬಯಸುವಿರಾ?
ಎಲ್ಲಾ ಸಂದೇಶ ಇತಿಹಾಸವನ್ನು ಶಾಶ್ವತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ.
ಎಲ್ಲವನ್ನು ಈಗಲೇ ಅಳಿಸಿ
ಎಂದೆಂದಿಗೂ
@@ -2748,10 +2749,14 @@
ಆಯ್ಕೆಯನ್ನು ಅಗತ್ಯಾನುಗುಣಗೊಳಿಸಿರಿ
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
ಈಗಲ್ಲ
+
+
+ ಭದ್ರತಾ ಸೆಟ್ ಅಪ್
+
+ ನಿಮ್ಮ ಹಣವನ್ನು ರಕ್ಷಿಸಿಕೊಳ್ಳಿರಿ
+
+ ಭದ್ರತೆಯ ಮತ್ತೊಂದು ಮಟ್ಟವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಫೋನ್ ಹೊಂದಿರುವ ವ್ಯಕ್ತಿಯು ನಿಮ್ಮ ಹಣ ಮುಟ್ಟುವುದನ್ನು ತಡೆಯಲು ಸಹಾಯ ಮಾಡಿ. ಈ ಆಯ್ಕೆಯನ್ನು ನೀವು ಸೆಟ್ಟಿಂಗ್ ಗಳಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು.
+
+ ಪಾವತಿ ಲಾಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ
+
+ ಈಗಲ್ಲ
+
+ ಈ ಹಂತವನ್ನು ಬಿಟ್ಟುಬಿಡಲೇ?
+
+ ಈ ಹಂತವನ್ನು ಬಿಟ್ಟುಬಿಡುವುದರಿಂದ ನಿಮ್ಮ ಫೋನ್ ಮುಟ್ಟಲು ಸಾಧ್ಯವಿರುವ ಯಾರಾದರೂ ಹಣವನ್ನು ವರ್ಗಾಯಿಸಬಹುದು ಅಥಾ ನಿಮ್ಮ ರಿಕವರಿ ಪದಗುಚ್ಛವನ್ನು ವೀಕ್ಷಿಸಬಹುದು.
+
+ ರದ್ದುಮಾಡಿ
+
+ ಬಿಟ್ಟು ಮುಂದುವರಿ
+
ಫಂಡ್ಗಳನ್ನು ಸೇರಿಸಿ
ನಿಮ್ಮ ವಾಲೆಟ್ ವಿಳಾಸ
@@ -4256,9 +4281,9 @@
ಮೆಸೇಜ್ ಸೇರಿಸಿ
ಫಾಸ್ಟರ್ ಫಾರ್ವರ್ಡ್ಗಳು
- ವಿಡಿಯೋಗಳನ್ನು 30s ಕ್ಲಿಪ್ಗಳಿಗೆ ಟ್ರಿಮ್ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು ಅನೇಕ ಸ್ಟೋರೀಸ್ ಆಗಿ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.
+ ವಿಡಿಯೋಗಳನ್ನು 30s ಕ್ಲಿಪ್ ಗಳಾಗಿ ಟ್ರಿಮ್ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು ಅನೇಕ ಸ್ಟೋರೀಸ್ ಆಗಿ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.
- ಸ್ಟೋರೀಸ್ಗೆ ಕಳುಹಿಸಿದ ವಿಡಿಯೋಗಳು 30s ಗಿಂತ ದೀರ್ಘವಾಗಿರುವಂತಿಲ್ಲ.
+ ಸ್ಟೋರೀಸ್ ಗೆ ಕಳುಹಿಸಿದ ವಿಡಿಯೋಗಳು 30s ಗಿಂತ ದೀರ್ಘವಾಗಿರುವಂತಿಲ್ಲ.
ಫಾರ್ವರ್ಡ್ ಮಾಡಲಾದ ಮೆಸೇಜ್ಗಳನ್ನು ಈಗ ತಕ್ಷಣವೇ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.
- %1$d ಮೆಸೇಜ್ಗಳನ್ನು ಕಳುಹಿಸಿ
@@ -4733,9 +4758,9 @@
ಮರುಪ್ರಯತ್ನಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ
- ಸ್ಟೋರಿ ಮರೆ ಮಾಡಲೇ?
+ ಸ್ಟೋರಿ ಮರೆ ಮಾಡಬೇಕೇ?
- %1$s ಅವರಿಂದ ಹೊಸ ಸ್ಟೋರ್ ಅಪ್ಡೇಟ್ಗಳು ಇನ್ನುಮುಂದೆ ಸ್ಟೋರೀಸ್ ಲಿಸ್ಟ್ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಕಾಣಿಸುವುದಿಲ್ಲ.
+ %1$s ಅವರಿಂದ ಸ್ಟೋರೀ ಅಪ್ಡೇಟ್ ಗಳು ಇನ್ನುಮುಂದೆ ಸ್ಟೋರೀಸ್ ಲಿಸ್ಟ್ ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಕಾಣಿಸುವುದಿಲ್ಲ.
ಅಡಗಿಸು
@@ -4752,9 +4777,9 @@
%1$s ಅವರ ಸ್ಟೋರಿ
- ಸ್ಟೋರಿ ಅಳಿಸುವುದೇ?
+ ಸ್ಟೋರಿ ಅಳಿಸಿಹಾಕಬೇಕೇ?
- ಈ ಸ್ಟೋರಿಯನ್ನು ನಿಮಗೆ ಹಾಗೂ ಇದನ್ನು ಸ್ವೀಕರಿಸಿದ ಎಲ್ಲರಿಗೂ ಅಳಿಸಲಾಗುತ್ತದೆ.
+ ಈ ಸ್ಟೋರಿಯನ್ನು ನಿಮಗೂ ಹಾಗು ಇದನ್ನು ಸ್ವೀಕರಿಸಿದ ಎಲ್ಲರಿಗೂ ಅಳಿಸಿಹಾಕಲಾಗುತ್ತದೆ.
ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ
@@ -4799,6 +4824,8 @@
ವೀಕ್ಷಕರನ್ನು ತೆಗೆದುಹಾಕಿ
ಇನ್ನೂ ಯಾವುದೇ ಪ್ರತ್ಯುತ್ತರವಿಲ್ಲ
+
+ ಈ ಸ್ಟೋರಿಗೆ ನೀವು ಉತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ, ಯಾಕೆಂದರೆ ನೀವೀಗ ಈ ಗ್ರೂಪ್ ನ ಸದಸ್ಯರಾಗಿ ಉಳಿದಿಲ್ಲ.
ಸ್ಟೋರಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಲಾಗಿದೆ
@@ -4817,6 +4844,13 @@
ಅಳಿಸು
ನನ್ನ ಸ್ಟೋರಿ
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
ಈ ಸ್ಟೋರಿಯನ್ನು ಯಾರು ವೀಕ್ಷಿಸಬಹುದು
@@ -4851,8 +4885,6 @@
ಉತ್ತರಗಳು & ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ಅನುಮತಿಸಿ
ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ವೀಕ್ಷಿಸಬಹುದಾದ ಜನರು ಪ್ರತಿಕ್ರಿಯಿಸಲಿ ಮತ್ತು ಉತ್ತರಿಸಲಿ
-
- ನಿರ್ದಿಷ್ಟ ಜನರಿಂದ ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ಮರೆಮಾಡಿ. ಡೀಫಾಲ್ಟ್ ಆಗಿ, ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ನಿಮ್ಮ %1$s ಅವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ
Signal ಸಂಪರ್ಕಗಳು
@@ -4864,11 +4896,11 @@
ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ಸಂಪರ್ಕಗಳಲ್ಲಿ ಅವರನ್ನು ಹೊಂದಲಾಗುತ್ತಿದೆ
- "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ನಿಮ್ಮ ಹೆಸರು ಮತ್ತು ಫೊಟೋವನ್ನು ನೋಡಬಹುದು ಮತ್ತು ನೀವು ಮರೆಮಾಡದ ಹೊರತಾಗಿ \"ನನ್ನ ಸ್ಟೋರಿ\" ಯ ಪೋಸ್ಟ್ಗಳನ್ನು ನೋಡಬಹುದು"
+ "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ನಿಮ್ಮ ಹೆಸರು ಮತ್ತು ಫೊಟೋವನ್ನು ನೋಡಬಹುದು ಮತ್ತು ನೀವು ಮರೆಮಾಡದ ಹೊರತಾಗಿ \"ನನ್ನ ಸ್ಟೋರಿ\" ಯ ಪೋಸ್ಟ್ ಗಳನ್ನು ನೋಡಬಹುದು"
ವೀಕ್ಷಕರನ್ನು ಸೇರಿಸಿ
- ಖಾಸಗಿ ಸ್ಟೋರಿ ಅಳಿಸಿ
+ ಖಾಸಗಿ ಸ್ಟೋರಿ ಅಳಿಸಿಹಾಕಿರಿ
%1$s ತೆಗೆದುಹಾಕಲೇ?
@@ -4911,10 +4943,26 @@
ಇವರೊಂದಿಗೆ ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ…
ಮುಗಿದಿದೆ
+
+ ಗ್ರೂಪ್ ಸ್ಟೋರಿ ತೆಗೆದುಹಾಕೋಣವೇ?
+
+ \"%1$s\" ಅವರನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.
+
+ ತೆಗೆದುಹಾಕಿ
+
+ ಖಾಸಗಿ ಸ್ಟೋರಿ ಅಳಿಸಿಹಾಕುವುದೇ?
+
+ \"%1$s\" ಮತ್ತು ಈ ಸ್ಟೋರಿಗೆ ಹಂಚಿಕೊಂಡ ಅಪ್ಡೇಟ್ ಗಳನ್ನು ಅಳಿಸಿಹಾಕಲಾಗುತ್ತದೆ.
+
+ ಅಳಿಸು
+
+ Signal ಬೀಟಾ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ ಸ್ಟೋರೀಸ್ ಲಭ್ಯ ಇವೆ.
+
+ ನೀವೊಂದು ಸ್ಟೋರಿ ಹಂಚಿಕೊಂಡರೆ, Signal ಬೀಟಾದಲ್ಲಿರುವ ಜನರಿಗೆ ಮಾತ್ರ ಅದು ಲಭ್ಯವಾಗಲಿದೆ.
ಸ್ಟೋರಿಗೆ ಸೇರಿಸುವುದೇ?
- ನಿಮ್ಮ ಸ್ಟೋರಿಗೆ ವಿಷಯ ಸೇರಿಸುವುದು 24 ಗಂಟೆಗಳ ಕಾಲ ನಿಮ್ಮ Signal ಸಂಪರ್ಕಗಳು ಅದನ್ನು ವೀಕ್ಷಿಸಲು ಅನುಮತಿಸುತ್ತವೆ. ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ಯಾರು ವೀಕ್ಷಿಸಬಹುದು ಎಂಬುದನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳು ನಲ್ಲಿ ನೀವು ಬದಲಾಯಿಸಬಹುದು.
+ ನಿಮ್ಮ ಸ್ಟೋರಿಗೆ ವಿಷಯಗಳನ್ನು ಸೇರಿಸಿದಾಗ 24 ಗಂಟೆಗಳ ಕಾಲ ನಿಮ್ಮ Signal ಸಂಪರ್ಕಗಳು ಅದನ್ನು ವೀಕ್ಷಿಸಲು ಅನುಮತಿ ಇರುತ್ತದೆ. ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ಯಾರು ವೀಕ್ಷಿಸಬಹುದು ಎಂಬುದನ್ನುಸೆಟ್ಟಿಂಗ್ ಗಳಲ್ಲಿ ನೀವು ಬದಲಾಯಿಸಬಹುದು.
ಸ್ಟೋರಿಗೆ ಸೇರಿಸಿ
@@ -4923,8 +4971,10 @@
ಸ್ಟೋರಿ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಸಂಪರ್ಕ ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.
ಕಳುಹಿಸು
+
+ ಆಫ್ ಮಾಡಿ ಮತ್ತು ಅಳಿಸಿಹಾಕಿರಿ
- ಸ್ಟೋರೀಸ್ ಹಂಚಿಕೊಳ್ಳಿ & ವೀಕ್ಷಿಸಿ
+ ಸ್ಟೋರೀಸ್ ಹಂಚಿಕೊಳ್ಳಿ ಮತ್ತು ವೀಕ್ಷಿಸಿ
ಈ ಆಯ್ಕೆಯನ್ನು ಆಫ್ ಮಾಡಿದಾಗ ಸ್ಟೋರೀಸ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ವೀಕ್ಷಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
@@ -4997,7 +5047,7 @@
ನಿಮ್ಮ ಸ್ಟೋರಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಿದ್ದಾರೆ
- ಸ್ಟೋರಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಲಾಗಿದೆ
+ ಒಂದು ಸ್ಟೋರಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಲಾಗಿದೆ
@@ -5060,17 +5110,22 @@
ಈಗಲ್ಲ
- ಇವರೊಂದಿಗೆ ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ
+ ಇವರಿಗಷ್ಟೇ ಶೇರ್ ಮಾಡಿ
- - Private story · %1$d viewer
+ - ಖಾಸಗಿ ಸ್ಟೋರಿ · %1$d ವೀಕ್ಷಕ
- ಖಾಸಗಿ ಸ್ಟೋರಿ · %1$d ವೀಕ್ಷಕರು
- - Group story · %1$d viewer
+ - ಗ್ರೂಪ್ ಸ್ಟೋರಿ · %1$d ವೀಕ್ಷಕ
- ಗ್ರೂಪ್ ಸ್ಟೋರಿ · %1$d ವೀಕ್ಷಕರು
+
+
+ - %1$d ಸದಸ್ಯ
+ - %1$d ಸದಸ್ಯರು
+
- %1$s · %2$d viewer
@@ -5079,11 +5134,11 @@
ನಿಮ್ಮ ವೀಕ್ಷಕರನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ
- ಸ್ಟೋರಿ ಸೆಟ್ಟಿಂಗ್ಗಳು
+ ಸ್ಟೋರಿ ಸೆಟ್ಟಿಂಗ್ ಗಳು
ಸ್ಟೋರಿ ತೆಗೆದುಹಾಕಿ
- ಸ್ಟೋರಿ ಅಳಿಸಿ
+ ಸ್ಟೋರಿ ಅಳಿಸಿಹಾಕಿರಿ
ಗ್ರೂಪ್ ಸ್ಟೋರಿ ತೆಗೆದುಹಾಕೋಣವೇ?
@@ -5091,9 +5146,9 @@
ತೆಗೆದುಹಾಕಿ
- ಸ್ಟೋರಿ ಅಳಿಸುವುದೇ?
+ ಸ್ಟೋರಿ ಅಳಿಸಿಹಾಕಬೇಕೇ?
- ಖಾಸಗಿ ಸ್ಟೋರಿ \"%1$s\" ಅಳಿಸುವುದೇ?
+ ಖಾಸಗಿ ಸ್ಟೋರಿ \"%1$s\" ಅಳಿಸಿಹಾಕಬೇಕೇ?
ಅಳಿಸು
@@ -5169,7 +5224,7 @@
ನನ್ನ ಸ್ಟೋರಿ ಗೌಪ್ಯತೆ
- ಮೈ ಸ್ಟೋರಿ ಪೋಸ್ಟ್ಗಳನ್ನು ಯಾರು ನೋಡಬಹುದು ಎಂದು ಆಯ್ಕೆ ಮಾಡಿರಿ. ನೀವು ಸೆಟ್ಟಿಂಗ್ ಗಳಲ್ಲಿ ಯಾವಾಗ ಬೇಕಾದರೂ ಬದಲಾವಣೆ ಮಾಡಬಹುದು.
+ ಮೈ ಸ್ಟೋರಿ ಪೋಸ್ಟ್ ಗಳನ್ನು ಯಾರು ನೋಡಬಹುದು ಎಂದು ಆಯ್ಕೆ ಮಾಡಿರಿ. ನೀವು ಸೆಟ್ಟಿಂಗ್ ಗಳಲ್ಲಿ ಯಾವಾಗ ಬೇಕಾದರೂ ಬದಲಾವಣೆ ಮಾಡಬಹುದು.
ಎಲ್ಲಾ Signal ಸಂಪರ್ಕಗಳು
@@ -5194,11 +5249,11 @@
- 24 ಗಂಟೆಗಳ ನಂತರ ಸ್ಟೋರೀಸ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರೆಯಾಗುತ್ತವೆ. ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ಯಾರು ವೀಕ್ಷಿಸಬಹುದು ಎಂದು ಆಯ್ಕೆ ಮಾಡಿ ಅಥವಾ ನಿರ್ದಿಷ್ಟ ವೀಕ್ಷಕರು ಅಥವಾ ಗ್ರೂಪ್ಗಳೊಂದಿಗೆ ಹೊಸ ಸ್ಟೋರೀಸ್ ರಚಿಸಿ.
+ 24 ಗಂಟೆಗಳ ನಂತರ ಸ್ಟೋರೀಸ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರೆಯಾಗುತ್ತವೆ. ನಿಮ್ಮ ಸ್ಟೋರಿಯನ್ನು ಯಾರು ವೀಕ್ಷಿಸಬಹುದು ಎಂದು ಆಯ್ಕೆ ಮಾಡಿ ಅಥವಾ ನಿರ್ದಿಷ್ಟ ವೀಕ್ಷಕರು ಅಥವಾ ಗ್ರೂಪ್ ಗಳೊಂದಿಗೆ ಹೊಸ ಸ್ಟೋರೀಸ್ ರಚಿಸಿ.
ಸ್ಟೋರೀಸ್ ಆಫ್ ಮಾಡಿ
- ಸ್ಟೋರೀಸ್ನಿಂದ ಹೊರಗುಳಿಯಲು ನೀವು ಆಯ್ಕೆ ಮಾಡಿದರೆ, ನಿಮಗೆ ಇನ್ನು ಸ್ಟೋರೀಸ್ ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
+ ಸ್ಟೋರೀಸ್ ನಿಂದ ಹೊರಗುಳಿಯಲು ನೀವು ಆಯ್ಕೆ ಮಾಡಿದರೆ, ಇನ್ನು ನಿಮಗೆ ಸ್ಟೋರೀಸ್ ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
ಸ್ಟೋರೀಸ್ ಆನ್ ಮಾಡಿ
@@ -5206,7 +5261,7 @@
ಸ್ಟೋರೀಸ್ ಆಫ್ ಮಾಡಬಹುದೇ?
- ನಿಮಗಿನ್ನು ಸ್ಟೋರೀಸ್ ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ನೀವು ಇತ್ತೀಚೆಗೆ ಕಳುಹಿಸಿದ ಯಾವುದೇ ಸ್ಟೋರೀಗಳ ಅವಧಿ ಮುಗಿಯುವ ತನಕ ಇತತರತು ಅದನ್ನು ವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ.
+ ಸ್ಟೋರೀಸ್ ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ವೀಕ್ಷಿಸಲು ನಿಮಗೆ ಇನ್ನು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ಇತ್ತೀಚೆಗೆ ಹಂಚಿಕೊಂಡ ಸ್ಟೋರಿ ಅಪ್ಡೇಟ್ ಗಳನ್ನು ಕೂಡಾ ಅಳಿಸಿಹಾಕಲಾಗುತ್ತದೆ.
ಸ್ಟೋರಿ ಗೌಪ್ಯತೆ
@@ -5214,7 +5269,7 @@
ಈ ಸ್ಟೋರಿಯನ್ನು ಯಾರು ವೀಕ್ಷಿಸಬಹುದು
- "ಗ್ರೂಪ್ \"%1$s\" ನ ಸದಸ್ಯರು ಈ ಸ್ಟೋರಿಯನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ಉತ್ತರಿಸಬಹುದು. ಈ ಗ್ರೂಪ್ನಲ್ಲಿನ ಈ ಚಾಟ್ಗೆ ನೀವು ಸದಸ್ಯತ್ವವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು."
+ "ಗ್ರೂಪ್ %1$s ನ ಸದಸ್ಯರು ಈ ಸ್ಟೋರಿಯನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ಉತ್ತರಿಸಬಹುದು. ಈ ಗ್ರೂಪ್ ನಲ್ಲಿನ ಈ ಚಾಟ್ ಗೆ ನೀವು ಸದಸ್ಯತ್ವವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು."
ಗ್ರೂಪ್ ಸ್ಟೋರಿ ತೆಗೆದುಹಾಕಿ
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index ce58b2d9b0..31390b3260 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -192,7 +192,7 @@
업데이트
업데이트하지 않음
경고
- Signal 버전이 만료되었습니다. 지금까지의 메세지를 읽을 수는 있지만 업데이트 하기 전까지 메세지를 보내거나 받을 수 없습니다.
+ Signal 버전이 만료되었습니다. 이전 메세지 기록은 읽을 수 있지만 업데이트하기 전까지 메세지를 보내거나 받을 수 없습니다.
웹 브라우저를 찾을 수 없습니다.
@@ -650,7 +650,7 @@
새 그룹이 무엇인가요?
새 그룹에는 @멘션 및 그룹 관리자와 같은 기능이 있으며 향후 더 많은 기능을 지원할 예정입니다.
- 모든 메시지 기록 및 미디어는 업그레이드 전에 보관되었습니다.
+ 모든 업그레이드 전 메시지 기록과 미디어를 보관했습니다.
그룹에 다시 가입하려면 초대를 수락해야 하며 수락할 때까지 그룹 메시지를 받지 않습니다.
- 이 멤버들이 그룹에 다시 가입하려면 초대를 수락해야 하며 수락할 때까지 그룹 메시지를 받지 않습니다.
@@ -663,7 +663,7 @@
새 그룹으로 업그레이드
그룹 업그레이드
새 그룹에는 @멘션 및 그룹 관리자와 같은 기능이 있으며 향후 더 많은 기능을 지원할 예정입니다.
- 모든 메시지 기록 및 미디어는 업그레이드 전에 보관됩니다.
+ 모든 업그레이드 전 메시지 기록과 미디어를 보관합니다.
네트워크 오류가 발생했습니다. 나중에 다시 시도하세요.
업그레이드하지 못했습니다.
@@ -1288,9 +1288,9 @@
새로운 기능이 마음에 드시나요? 1회성 기부로 Signal을 지원해 주세요.
- %1$s 님과 해당 사용자 번호 %2$s의 메시지 기록이 병합되었습니다.
+ %1$s 님과 해당 사용자 번호 %2$s의 메시지 기록을 병합했습니다.
- %1$s 님 및 해당 사용자에게 속하는 다른 채팅이 병합되었습니다.
+ %1$s 님과의 메시지 기록과 해당 사용자가 속하는 다른 채팅의 메시지 기록을 병합했습니다.
%1$s 님이 그룹 통화를 시작했습니다(%2$s).
@@ -1886,6 +1886,7 @@
보낸 사람: %1$s 님, 받는 사람: 나
미디어를 더 이상 이용할 수 없습니다.
미디어를 공유할 수 있는 앱을 찾을 수 없습니다.
+ 닫기
대화 %2$d개 내 새 메시지 %1$d개
@@ -2579,12 +2580,12 @@
오디오
저장 공간 검토
오래된 메시지를 삭제하시겠습니까?
- 메시기 기록을 지우시겠습니까?
- 이를 통해 %1$s보다 오래된 모든 메시지 기록과 미디어가 기기에서 영구적으로 삭제됩니다.
+ 메시기 기록을 삭제할까요?
+ %1$s보다 오래된 모든 메시지 기록과 미디어를 기기에서 영구적으로 삭제합니다.
이를 통해 모든 대화가 %1$s개의 가장 최근 메시지만 제외하고 영구적으로 삭제됩니다.
- 이 대화의 모든 메시지와 미디어가 영구 삭제됩니다.
- 모든 메시지 기록을 삭제하시겠습니까?
- 모든 메시지 기록이 영구 삭제됩니다. 다시 되돌릴 수 없습니다.
+ 이 기기의 모든 메시지 기록과 미디어를 영구 삭제합니다.
+ 모든 메시지 기록을 삭제할까요?
+ 모든 메시지 기록을 영구 삭제합니다. 이 작업은 다시 되돌릴 수 없습니다.
모두 지우기
영원히
1년
@@ -2662,10 +2663,14 @@
옵션 설정하기
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
나중에
+
+
+ 보안 설정
+
+ 자금 보호
+
+ 사용자의 휴대폰을 손에 넣은 사람이 자금에 액세스할 수 없도록 보안을 한층 강화하세요. 이 옵션은 설정에서 비활성화 할 수 있습니다.
+
+ 결제 잠금 사용
+
+ 나중에
+
+ 이 단계를 건너뛸까요?
+
+ 이 단계를 건너 뛰면 사용자의 휴대폰 기기를 손에 넣은 사람이 자금을 이체하거나 복구 단계를 볼 수 있습니다.
+
+ 취소
+
+ 건너뛰기
+
자금 추가
지갑 주소
@@ -4649,7 +4674,7 @@
스토리를 삭제할까요?
- 나를 포함해 이 스토리를 받은 모든 사람에게서 해당 스토리가 삭제됩니다.
+ 나를 포함해 이 스토리를 받은 모든 사람에게서 해당 스토리를 삭제합니다.
저장할 수 없음
@@ -4692,6 +4717,8 @@
볼 수 있는 사람 제거
답장 없음
+
+ 더 이상 이 그룹의 멤버가 아니므로 이 스토리에 답장할 수 없습니다.
스토리에 반응함
@@ -4710,10 +4737,16 @@
삭제
내 스토리
+
+
+ - %1$d viewers
+
+
+ View
이 스토리를 볼 수 있는 사람
- 스토리 숨길 대상
+ 다음 사용자에게서 스토리 숨기기
모든 Signal 커넥션
@@ -4742,8 +4775,6 @@
답장 및 반응 허용
스토리를 볼 수 있는 사용자의 반응 및 답장 허용
-
- 특정 사용자에게 내 스토리가 표시되지 않습니다. 내 스토리는 기본적으로 %1$s와(과) 공유됩니다.
Signal 커넥션
@@ -4763,7 +4794,7 @@
%1$s 님을 제거할까요?
- 이 사용자는 더 이상 내 스토리를 볼 수 없게 됩니다.
+ 이 사용자는 더 이상 내 스토리를 볼 수 없습니다.
삭제
@@ -4791,7 +4822,7 @@
URL 입력 또는 붙여넣기
- 스토리를 볼 수 있도록 링크 공유
+ 내 스토리를 볼 수 있는 사람과 링크 공유
검색
@@ -4802,6 +4833,22 @@
다음 사용자와만 공유…
확인
+
+ 그룹 스토리를 제거할까요?
+
+ \'%1$s\'을(를) 제거합니다.
+
+ 삭제
+
+ 비공개 스토리를 삭제할까요?
+
+ \'%1$s\' 및 이 스토리에 공유된 업데이트를 삭제합니다.
+
+ 삭제
+
+ 스토리는 Signal 베타 사용자에게만 제공됩니다.
+
+ 스토리를 공유하면 Signal 베타를 사용 중인 사용자에게만 스토리가 제공됩니다.
스토리에 추가할까요?
@@ -4814,6 +4861,8 @@
스토리를 보낼 수 없습니다. 연결을 확인하고 다시 시도하세요.
보내기
+
+ 끄기 및 삭제
스토리 공유 및 보기
@@ -4827,7 +4876,7 @@
- 볼 수 있는 사람 %1$d명
- 스토리 이름 짓기
+ 스토리 이름 지정
스토리 이름(필수)
@@ -4887,7 +4936,7 @@
내 스토리에 반응함
- 스토리에 반응했습니다.
+ 스토리에 반응함
@@ -4958,6 +5007,10 @@
- 그룹 스토리 · 볼 수 있는 사람 %1$d명
+
+
+ - 멤버 %1$d명
+
- %1$s · 볼 수 있는 사람 %2$d명
@@ -4973,7 +5026,7 @@
그룹 스토리를 제거할까요?
- 이 목록에서 스토리를 지웁니다. 이 그룹의 스토리는 계속 볼 수 있습니다.
+ 이 목록에서 스토리를 제거합니다. 이 그룹의 스토리는 계속 볼 수 있습니다.
삭제
@@ -5022,7 +5075,7 @@
모든 커넥션을 검토했습니다. 보내기를 탭하여 계속하세요.
- Signal을 다시 설치했거나 기기를 변경했을 수 있는 커넥션이 %1$d개 있습니다. 스토리를 공유하기 전에 해당 사용자의 안전 번호를 검토하거나 스토리에서 이들을 제거하세요.
+ Signal을 다시 설치하거나 기기를 변경했을 수 있는 커넥션이 %1$d개 있습니다. 스토리를 공유하기 전에 해당 사용자의 안전 번호를 검토하거나 스토리에서 이들을 제거하세요.
안전 번호 확인
@@ -5076,11 +5129,11 @@
- 스토리는 24시간이 지나면 자동으로 사라집니다. 스토리를 볼 수 있는 사람을 선택하거나, 스토리룰 볼 수 있는 사람이나 그룹을 지정하여 새 스토리를 만드세요.
+ 스토리는 24시간이 지나면 자동으로 사라집니다. 스토리를 볼 수 있는 사람을 선택하거나, 스토리를 볼 수 있는 사람이나 그룹을 지정하여 새 스토리를 만드세요.
스토리 끄기
- 스토리 기능을 끄면 더 이상 스토리를 보거나 공유할 수 없게 됩니다.
+ 스토리 기능을 끄면 더 이상 스토리를 보거나 공유할 수 없습니다.
스토리 켜기
@@ -5088,7 +5141,7 @@
스토리를 끌까요?
- 더 이상 스토리를 공유하거나 볼 수 없게 됩니다. 최근 공유한 스토리는 24시간 후 자동 삭제될 때까지 스토리를 받은 모든 사람에게 표시됩니다.
+ 더 이상 스토리를 공유하거나 볼 수 없습니다. 최근 공유한 스토리 업데이트도 삭제합니다.
스토리 개인정보보호
@@ -5096,7 +5149,7 @@
이 스토리를 볼 수 있는 사람
- "\"%1$s\" 그룹 멤버는 이 스토리를 보고 답장할 수 있습니다. 그룹에서 이 채팅에 대한 멤버십을 업데이트할 수 있습니다."
+ "'%1$s' 그룹 멤버는 이 스토리를 보고 여기에 답장할 수 있습니다. 그룹에서 이 채팅에 대한 멤버십을 업데이트할 수 있습니다."
그룹 스토리 제거
diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml
index e849dcfc3e..6fbd3509f9 100644
--- a/app/src/main/res/values-ky/strings.xml
+++ b/app/src/main/res/values-ky/strings.xml
@@ -1782,9 +1782,9 @@
Белекке төшбелги алдыңыз
- Окуяңызга %1$s деген сезимин билдирди
+ Окуяңызга %1$s деген реакция кылды
- Окуясына %1$s деген сезимин билдирди
+ Окуясына %1$s деген реакция кылды
Molly\'ды жаңыртуу
@@ -1886,6 +1886,7 @@
%1$s сизге
Мындай медиафайл жок.
Ушул медиафайлды бөлүшө турган колдонмо табылган жок.
+ Жабуу
%2$d сүйлөшүүдө %1$d жаңы билдирүү
@@ -2571,7 +2572,7 @@
Wi-Fi колдонууда
Роуминг колдонууда
Медианы авто-жүктөө
- Билдирүү таржымалы
+ Билдирүүлөр таржымалы
Сактагычтын колдонулушу
Сүрөттөр
Видеолор
@@ -2579,12 +2580,12 @@
Аудио
Сактагычты карап көрүү
Эски билдирүүлөрдү өчүрөсүзбү?
- Билдирүү таржымалы тазалансынбы?
- Түзмөгүңүздөн %1$s эскирген бардык билдирүү таржымалы жана медиа биротоло жок кылынат.
+ Билдирүүлөр таржымалын тазалайсызбы?
+ Түзмөгүңүздөн %1$s эскирген бардык билдирүүлөр жана медиа файлдар өчүрүлөт.
Бул аракет эң акыркы билдирүүлөрүн бардык сүйлөшүүлөрүн %1$s чейин биротоло кыскартат.
- Түзмөгүңүздөн бардык билдирүү таржымалы жана медиа биротоло жок кылынат.
- Бардык билдирүү таржымалын чын эле өчүргүңүз келеби?
- Бардык билдирүү таржымалы биротоло өчүрүлөт. Бул аракетти артка кайтаруу мүмкүн эмес.
+ Түзмөгүңүздөн бардык билдирүүлөр жана медиа файлдар биротоло өчүрүлөт.
+ Бардык билдирүүлөрдү чын эле өчүрөсүзбү?
+ Бардык билдирүүлөр биротоло өчүп, аларды кайра калыбына келтире албайсыз.
Бардыгын өчүрүү
Биротоло
1 жылга
@@ -2662,10 +2663,14 @@
Ыңгайлаштыруу опциясы
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
Азыр эмес
+
+
+ Коопсуздук параметрлери
+
+ Каражаттарыңызды коргоңуз
+
+ Дагы бир коргоо этабы менен телефонуңуздагы каражаттарыңызды бекемирээк коргоңуз. Бул параметрди Тууралоо бөлүмүнөн өчүрүп койсоңуз болот.
+
+ Төлөмдү кулпулоону иштетүү
+
+ Азыр эмес
+
+ Бул кадамды өткөрүп жибересизби?
+
+ Бул кадамды өткөрүп жиберсеңиз, телефонуңузга каалаган адам кирип, каражаттарыңызды өткөрүп алышы же калыбына келтирүүчү сүйлөмдү көрүшү мүмкүн.
+
+ Жокко чыгаруу
+
+ Өткөрүп жиберүү
+
Каражат кошуу
Капчыгыңыздын дареги
@@ -3879,7 +3904,7 @@
Жаңы маектер үчүн демейки таймер
Сиз баштаган бардык жаңы маектер үчүн демейки жоголуп кетүүчү билдирүүлөр таймерин коюңуз.
- Окуяларыңызды тескеп, кимдер көрө ала турганын чечиңиз
+ Окуяларыңызды тескеп, аларды кимдер көрө ала турганын чечиңиз
Акча жөнөтүү үчүн Android түзмөгүнүн экран кулпусун же манжа изин талап кылуу
Төлөм кулпусу иштебей жатат
@@ -4157,7 +4182,7 @@
Билдирүү кошуу
Тезирээк багытоо
- Видеолор 30 секунддук клиптер түрүндө кесилип, бир нече окуялар түрүндө жөнөтүлөт.
+ Видеолор 30 секунддук клиптерге ажыратылып, бир нече окуя түрүндө жөнөтүлөт.
Окуялар түрүндө жөнөтүлүүчү видеолор 30 секунддан ашпашы керек.
Багытталган билдирүүлөр азыр дароо жөнөтүлөт.
@@ -4631,13 +4656,13 @@
Окуя жашырылсынбы?
- %1$s жаңыртуулары мындан ары окуялар тизмесинин башында көрүнбөйт.
+ %1$s бөлүшкөн жаңы окуялар мындан ары окуялардын башында көрүнбөйт.
Жашыруу
Окуя жашырылган
- Жашыруун окуялар
+ Жашырылган окуялар
- %1$d көрүү
@@ -4692,6 +4717,8 @@
Көрүүчүнү алып салуу
Азырынча жооп жок
+
+ Бул топтон чыгып кеткениңизден улам, бул окуяга жооп бере албайсыз.
Окуяга реакция кылды
@@ -4710,6 +4737,12 @@
Өчүрүү
Менин окуям
+
+
+ - %1$d viewers
+
+
+ View
Бул окуяны кимдер көрө алат
@@ -4741,9 +4774,7 @@
Жоопторго жана реакцияларга уруксат берүү
- Окуяңызды көрө алган адамдарга жооп берип, реакция кылууга мүмкүнчүлүк берүү
-
- Окуяңызды белгилүү бир адамдардан жашырып койсоңуз болот. Демейки боюнча, окуяңыз %1$s менен бөлүшүлөт
+ Окуяңызды көрө алган адамдарга жооп берип, реакция кылуу үчүн мүмкүнчүлүк бериңиз
Signal байланыштары
@@ -4755,7 +4786,7 @@
Алардын тутумдук байланыштарыңызда болушу
- "Сиздин байланыштарыңыз аты-жөнүңүздү жана сүрөтүңүздү көрө алат жана алардан жашырбасаңыз, \"Менин окуям\" постторун көрө алышат."
+ "Байланыштарыңыз аты-жөнүңүз менен сүрөтүңүздү көрүп, алардан жашырбасаңыз, \"Менин окуям\" бөлүмүндөгү постторду көрө алышат."
Көрүүчү кошуу
@@ -4771,7 +4802,7 @@
Бул аракетти артка кайтарууга болбойт.
- Окуянын атын түзөтүү
+ Окуянын аталышын түзөтүү
Окуянын аталышы
@@ -4791,7 +4822,7 @@
URL дарегин териңиз же чаптаңыз
- Окуяңызды көрүүчүлөр менен шилтемени бөлүшүңүз
+ Окуяңыздын көүүчүлөрү менен шилтемени бөлүшүңүз
Издөө
@@ -4802,18 +4833,36 @@
Ушул адамдарга гана көрүнсүн…
Бүттү
+
+ Топтогу окуяны алып саласызбы?
+
+ \"%1$s\" өчүрүлөт.
+
+ Өчүрүү
+
+ Жеке окуяны өчүрөсүзбү?
+
+ \"%1$s\" жана ушул окуяда бөлүшүлгөн жаңылыктар да өчүп калат.
+
+ Өчүрүү
+
+ Окуяларды Signal\'дын бета версиясынын колдонуучулары гана көрө алышат.
+
+ Окуя бөлүшсөңүз, Signal\'дын бета версиясындагы адамдарга гана көрүнөт.
Окуяга кошулсунбу?
- Окуяңызга мазмун кошуу Signal байланыштарыңызга аны 24 саат бою көрүүгө мүмкүнчүлүк берет. Окуяңызды ким көрө аларын \"Тууралоодон\" өзгөртө аласыз.
+ Окуяңызга ар кандай нерселерди кошуп турсаңыз, ал Signal байланыштарыңызга 24 саат бою көрүнүп турат. Окуяңызды кимдер көрө аларын \"Тууралоо\" бөлүмүнөн өзгөртө аласыз.
Окуяга кошуу
Көрүүчүлөрдү түзөтүү
- Окуя жөнөтүлбөй койду. Туташууңузду текшерип, кайра аракет кылыңыз.
+ Окуя жөнөтүлгөн жок. Байланышты текшерип, кайталап көрүңүз.
Жөнөтүү
+
+ Өчүрүү жана жок кылуу
Окуяларды бөлүшүү жана көрүү
@@ -4837,7 +4886,7 @@
Бул жер бош калбашы керек.
- Бул аталыштагы окуя бар.
+ Мындай аталыштагы окуя бар.
Баарын тандоо
@@ -4949,7 +4998,7 @@
Азыр эмес
- Ушул адамдар менен гана бөлүшүү:
+ Ким менен бөлүшөсүз:
- Жеке окуя · %1$d жолу көрүлдү
@@ -4958,6 +5007,10 @@
- Топтук окуя · %1$d жолу көрүлдү
+
+
+ - %1$d мүчө
+
- %1$s · %2$d жолу көрүлдү
@@ -4965,7 +5018,7 @@
Кимдер көрө ала турганын тандоо үчүн басыңыз
- Окуя тууралоо
+ Окуяны тууралоо
Окуяны алып салуу
@@ -5088,7 +5141,7 @@
Окуяларды өчүрөсүзбү?
- Окуяларды бөлүшө да, көрө да албай каласыз. Буга чейин жөнөткөн соңку окуялар мөөнөтү бүткөнгө чейин башкаларга көрүнө берет.
+ Окуяларды бөлүшө албай же көрө албай каласыз. Окуяларда жакында бөлүшүлгөн жаңылыктар да өчүп калат.
Окуянын купуялыгы
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index db3be4443d..b0a27e0cb2 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -2108,6 +2108,7 @@
%1$s siuntė jums
Medija daugiau nebeprieinama.
Nepavyksta rasti programėlės, galinčios bendrinti šią mediją.
+ Užverti
%1$d naujų(-os) žinutės(-ių) %2$d pokalbyje(-iuose)
@@ -2920,10 +2921,14 @@
Tinkinti parinktį
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -3076,6 +3081,26 @@
Ne dabar
+
+
+ Saugumo konfigūracija
+
+ Apsaugok savo pinigus
+
+ Pridėk papildomą saugumo lygmenį, kad kitam žmogui perėmus tavo telefoną apsaugotum savo pinigus. Šią parinktį gali išjungti nustatymuose.
+
+ Įjunk mokėjimo užraktą
+
+ Ne dabar
+
+ Praleisti šį žingsnį?
+
+ Praleidus šį žingsnį yra rizika, kad kitas žmogus, turėdamas tavo telefoną, galės pervesti pinigus ar pažiūrėti tavo atkūrimo frazę.
+
+ Atsisakyti
+
+ Praleisti
+
Pridėti lėšų
Jūsų piniginės adresas
@@ -5013,6 +5038,8 @@
Pašalinti žiūrovą
Atsakymų kol kas nėra
+
+ Negali atsakyti į šią istoriją, nes nebesi šios grupės narys.
Sureagavo į istoriją
@@ -5031,6 +5058,15 @@
Ištrinti
Mano istorija
+
+
+ - %1$d viewer
+ - %1$d viewers
+ - %1$d viewers
+ - %1$d viewers
+
+
+ View
Kas gali žiūrėti šią istoriją
@@ -5069,8 +5105,6 @@
Leisti atsakymus ir reakcijas
Leisti žmonėms, kurie gali peržiūrėti jūsų istoriją, reaguoti ir atsakyti
-
- Slėpkite savo istoriją nuo konkrečių žmonių. Pagal numatymą, jūsų istorija yra bendrinama su jūsų %1$s
„Signal“ kontaktai
@@ -5129,6 +5163,22 @@
Bendrinti tik su…
Atlikta
+
+ Pašalinti grupės istoriją?
+
+ „%1$s“ bus pašalinta.
+
+ Šalinti
+
+ Ištrinti privačią istoriją?
+
+ „%1$s“ ir šios istorijos atnaujinimai bus ištrinti.
+
+ Ištrinti
+
+ Istorijos prieinamos tik „Signal“ beta versijos naudotojams.
+
+ Jei pasidalinsi istorija, ją matys tik „Signal“ beta versiją naudojantys žmonės.
Pridėti į istoriją?
@@ -5141,6 +5191,8 @@
Nepavyko išsiųsti istorijos. Patikrinkite interneto ryšį ir bandykite dar kartą.
Siųsti
+
+ Išjungti ir ištrinti
Bendrinti ir žiūrėti istorijas
@@ -5297,6 +5349,13 @@
- Grupės istorija · žiūrovų: %1$d
- Grupės istorija · žiūrovų: %1$d
+
+
+ - %1$d narys
+ - %1$d nariai
+ - %1$d nario
+ - %1$d narių
+
- %1$s · Peržiūrėjo: %2$d
@@ -5442,7 +5501,7 @@
Išjungti Istorijas?
- Nebegalėsi nei bendrinti, nei žiūrėti istorijų. Visos neseniai tavo nusiųstos istorijos tebebus matomos kitiems tol, kol galios.
+ Nebegalėsi nei bendrinti, nei žiūrėti istorijų. Tai, ką pastaruoju metu bendrinai šioje istorijoje, taip pat bus ištrinta.
Istorijų privatumas
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index f21f69992d..962c1a375a 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -696,7 +696,7 @@
Kas ir \"Jaunās grupas\"
Jaunajām grupām ir funkcijas kā @pieminēšana un grupu administratori, un nākotnē atbalstīs papildus funkcijas.
- Visa ziņu vēsure un faili tika paturēti.
+ Visa ziņu vēsure un faili tika saglabāta pirms atjaunināšanas.
Jums būs jāpieņem uzaicinājums vēlreiz pievienoties šai grupai un nesaņemsiet šīs grupas ziņas, kamēr uzaicinājumu nepieņemsiet.
- Šim dalībniekam būs jāpieņem uzaicinājums vēlreiz pievienoties šai grupai, un dalībnieks nesaņems šīs grupas ziņas, kamēr nepieņems uzaicinājumu:
@@ -713,7 +713,7 @@
Pārveidot par jauno grupu
Pārveidot šo grupu
Jaunajām grupām ir funkcijas kā @pieminēšana un grupu administratori, un nākotnē atbalstīs papildus funkcijas.
- Visa ziņu vēsture un multivide tiks saglabāta kā bija pirms pārveidošanas.
+ Visa ziņu vēsture un multivide tiks saglabāta pirms atjaunināšanas.
Radās tīkla kļūda. Vēlāk mēģiniet vēlreiz.
Neizdevās jaunināt.
@@ -2034,6 +2034,7 @@
%1$s jums
Mediju fails vairs nav pieejams
Nevar atrast lietotni, kas varētu kopīgot šo multivides saturu.
+ Aizvērt
%1$d jaunas ziņas %2$dsarunās
@@ -2743,7 +2744,7 @@
Izmantojot Wi-Fi
Izmantojot viesabonēšanau
Multivides automātiskā lejupielāde
- Ziņas vēsture
+ Ziņu vēsture
Krātuves lietojums
Attēli
Video
@@ -2834,10 +2835,14 @@
Pielāgot opciju
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2990,6 +2995,26 @@
Ne tagad
+
+
+ Drošības iestatījumi
+
+ Aizsargājiet savu naudu
+
+ Palīdziet nepieļaut, lai cita persona ar jūsu tālruni piekļūtu jūsu naudas līdzekļiem, pievienojot vēl vienu drošības līmeni. Šo opciju varat izslēgt iestatījumos.
+
+ Ieslēgt maksājumu bloķēšanu
+
+ Ne tagad
+
+ Vai izlaist šo darbību?
+
+ Izlaižot šo darbību, ikviens, kam ir fiziska piekļuve jūsu tālrunim, var pārskaitīt naudas līdzekļus vai skatīt jūsu atgūšanas frāzi.
+
+ Atcelt
+
+ Izlaist
+
Papildināt līdzekļus
Jūsu maciņa adrese
@@ -4837,9 +4862,9 @@
Pieskarieties, lai mēģinātu vēlreiz
- Paslēpt stāstu?
+ Vai paslēpt stāstu?
- Stāstu atjauninājumi no %1$s vairs neparādīsies stāstu saraktsta augšgalā.
+ %1$s stāstu atjauninājumi vairs neparādīsies stāstu saraksta augšgalā.
Slēpt
@@ -4893,7 +4918,7 @@
Vēl nav skatījumu
- Iespējojiet skatīšanas apliecinājumus, lai uzzinātu, kuri lietotāji ir redzējuši jūsu stāstus.
+ Ieslēdziet lasīšanas apliecinājumus, lai uzzinātu, kuri lietotāji ir redzējuši jūsu stāstus.
Atvērt iestatījumus
@@ -4906,6 +4931,8 @@
Noņemt skatītāju
Vēl nav atbilžu
+
+ Jūs nevarat atbildēt uz šo stāstu, jo vairs neesat šīs grupas dalībnieks.
Reaģēja uz stāstu
@@ -4924,6 +4951,14 @@
Dzēst
Mans stāsts
+
+
+ - %1$d viewers
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Kas var skatīt šo stāstu
@@ -4959,9 +4994,7 @@
Atļaut atbildes un reakcijas
- Ļaut cilvēkiem, kuri var skatīt jūsu stāstu, reaģēt un atbildēt
-
- Paslēpt jūsu stāstu no specifiskiem cilvēkiem. Pēc noklusējuma, jūsu stāsts ir kopīgots ar jūsu %1$s
+ Ļaut reaģēt un atbildēt tiem cilvēkiem, kuri var skatīt jūsu stāstu
Signal draugi
@@ -4973,7 +5006,7 @@
Pievienošanas savā kontaktu sarakstā
- "Jūsu pazīstamie var redzēt jūsu vārdu un bildi, un var redzēt jaunumus \"Mani stāsti\" sadaļā, ja vien jūs to neesat paslēpis no viņiem."
+ "Jūsu kontakti var redzēt jūsu vārdu un attēlu, un var redzēt jaunumus \"Mani stāsti\" sadaļā, ja vien jūs to neesat paslēpis no viņiem."
Pievienot skatītāju
@@ -5020,22 +5053,40 @@
Kopīgot tikai ar…
Darīts
+
+ Vai noņemt grupas stāstu?
+
+ \"%1$s\" tiks noņemts.
+
+ Noņemt
+
+ Vai dzēst privāto stāstu?
+
+ \"%1$s\" un ar šo stāstu saistītie ieraksti tiks dzēsti.
+
+ Dzēst
+
+ Stāsti ir pieejami tikai Signal beta lietotājiem.
+
+ Ja kopīgosiet stāstu, tas būs pieejams tikai personām, kuras izmanto Signal beta versiju.
Pievienot stāstam?
- Pievienojot saturu jūsu stāstam ļauj Signal pazīstamajiem to apskatīt 24 stundas. Iestatījumos jūs varat mainīt to, kurš var apskatīt jūsu stāstu.
+ Satura pievienošana jūsu stāstam ļauj Signal kontaktiem to apskatīt 24 stundas. Iestatījumos varat mainīt to, kas var apskatīt jūsu stāstu.
Pievienot stāstam
Rediģēt skatītājus
- Stāstu nevarēja nosūtīt. Pārbaudiet jūsu pieslēgumu un mēģiniet vēlreiz.
+ Stāstu nevarēja nosūtīt. Pārbaudiet pieslēgumu un mēģiniet vēlreiz.
Sūtīt
+
+ Izslēgt un izdzēst
- Kopīgot & skatīt stāstus
+ Kopīgot un skatīt stāstus
- Jūs vairs nevarēsiet kopīgot un skatīt stāstus, kad šī opcija ir izslēgta.
+ Jūs vairs nevarēsiet kopīgot un skatīt stāstus, ja šī opcija būs izslēgta.
Izvēlēties skatītājus
@@ -5049,7 +5100,7 @@
Stāsta nosaukums
- Stāsta nosaukums (nepieciešams)
+ Stāsta nosaukums (obligāts)
Skatītāji
@@ -5174,16 +5225,22 @@
Kopīgot tikai ar
- - Privāts stāsts · %1$d skatītājs
+ - Privāts stāsts · %1$d skatītāji
- Privāts stāsts · %1$d skatītājs
- Privāts stāsts · %1$d skatītāji
- - Grupas stāsts · %1$d skatītājs
+ - Grupas stāsts · %1$d skatītāji
- Grupas stāsts · %1$d skatītājs
- Grupas stāsts · %1$d skatītāji
+
+
+ - %1$d dalībnieki
+ - %1$d dalībnieks
+ - %1$d dalībnieki
+
- %1$s · %2$d skatītāji
@@ -5324,7 +5381,7 @@
Vai izslēgt stāstus?
- Jūs nevarēsiet kopīgot vai skatīt stāstus. Citi lietotāji varēs redzēt visus jūsu nesen nosūtītos stāstus līdz to termiņa beigām.
+ Jūs nevarēsiet kopīgot vai skatīt stāstus. Tiks dzēsti arī jūsu nesen veiktie ar stāstu saistītie ieraksti.
Stāsta privātums
@@ -5347,7 +5404,7 @@
Eksportējiet SMS ziņas
- Varat eksportēt SMS ziņas uz tālruņa SMS datu bāzi. Tas ļauj citām jūsu tālruņa SMS lietotnēm piekļūt tām un importēt tās. Tādējādi netiek izveidots koplietojams SMS ziņu vēstures fails.
+ Varat eksportēt SMS ziņas uz tālruņa SMS datu bāzi. Tas ļauj citām jūsu tālruņa SMS lietotnēm tām piekļūt un importēt. Tādējādi netiek izveidots koplietojams SMS ziņu vēstures fails.
Turpināt
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 4201aa7500..43a96ad0f1 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -193,7 +193,7 @@
Aжурирај
Не ажурирај
Предупредување
- Вашата верзија на Signal е истечена. Можете да ја видите историјата на пораки, но нема да можете да испраќате и примате пораки додека не ажурирате.
+ Вашата верзија на Signal е застарена. Можете да ја видите историјата на вашите пораки, но нема да можете да испраќате или примате пораки сè додека не ја ажурирате апликацијата.
Не е пронајден веб прелистувач.
@@ -1960,6 +1960,7 @@
%1$s до Вас
Медијата повеќе не е достапна.
Не е пронајдена апликација која може да го сподели овој тип на медија.
+ Затвори
%1$d нови пораки во %2$d разговори
@@ -2343,7 +2344,7 @@
Времето на испраќање е копирано во таблата со исечоци.
- Новостите за Вашата приказна ќе бидат прикажани овде.
+ Новостите на вашата приказна ќе бидат прикажани овде.
@@ -2665,10 +2666,10 @@
Аудио
Прегледај склад
Да ги отстранам старите пораки?
- Да ја избришам историјата на пораки?
- Ова трајно ќе ја избрише цела историја на разговори и медија од Вашиот уред постари од %1$s.
+ Сакате да ја исчистите историјата на пораки?
+ Ова трајно ќе ја избрише цела историја на пораки и медија од вашиот уред постари од %1$s.
Ова трајно ќе ги скрати сите разговори до %1$s најскорешни пораки.
- Ова трајно ќе ја избрише цела историја на пораки и медија од Вашиот уред.
+ Ова трајно ќе ја избрише цела историја на пораки и медија од вашиот уред.
Дали сте сигурни дека сакате да ја избришете цела историја на пораки?
Целата историја на пораки ќе биде трајно отстранета. Ова дејство е неповратно.
Избриши сѐ веднаш
@@ -2748,10 +2749,14 @@
Сопствена опција
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Не сега
+
+
+ Поставувања за безбедност
+
+ Заштитете ги вашите средства
+
+ Додајте дополнително ниво на безбедност за да спречите личност со вашиот телефон да има пристап до вашите средства. Можете да ја оневозможите оваа опција во Поставувањата.
+
+ Овозможете заклучување за плаќање
+
+ Не сега
+
+ Сакате да го прескокнете овој чекор?
+
+ Прескокнувањето на овој чекор овозможува секој што има физички пристап до вашиот телефон да префрла средства или да ја види вашата резервна фраза.
+
+ Откажи
+
+ Прескокни
+
Додај средства
Адреса на Вашиот паричник
@@ -3976,7 +4001,7 @@
Стандарден тајмер за нови разговори
Поставете стандарден тајмер за пораки што исчезнуваат за сите нови разговори започнати од Вас.
- Смени ги поставувањата за приказните и одреди кој може да ги види
+ Сменете ги поставувањата за приказните и одредете кој може да ги види
Барајте заклучување на екранот на Android или отпечаток од прст за префрлање средства.
Не може да се овозможи заклучување за плаќање
@@ -4711,9 +4736,9 @@
Нема скорешни ажурирања за прикажување во моментов.
- Сокриј приказна
+ Скријте ја приказна
- Врати приказна
+ Вратете ја видливоста на приказната
Препрати
@@ -4733,9 +4758,9 @@
Допрете за да се обидете повторно
- Да се сокрие приказната?
+ Сакате да ја скриете приказната?
- Новите ажурирања на приказната од %1$s повеќе нема да се појавуваат на врвот на листата со приказни.
+ Новостите на приказната од %1$s повеќе нема да се појавуваат на врвот на листата со приказни.
Сокриј
@@ -4752,9 +4777,9 @@
Приказна на %1$s
- Да се избрише приказната?
+ Сакате да ја избришете приказната?
- Оваа приказна ќе биде избришана за Вас и сите кои ја примиле.
+ Оваа приказна ќе биде избришана за вас и сите кои ја примиле.
Неуспешно зачувување
@@ -4799,6 +4824,8 @@
Отстрани го гледачот
Сè уште нема одговори
+
+ Не можете да одговорите на приказната бидејќи повеќе не сте член на оваа група.
Реагираше на приказната
@@ -4817,10 +4844,17 @@
Избриши
Моја приказна
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Кој може да ја види оваа приказна
- Сокриј приказна од
+ Скријте ја приказната од
Сите Signal врски
@@ -4850,9 +4884,7 @@
Дозволи одговори и реакции
- Дозволете им на луѓето кои можат да ја видат Вашата приказна да реагираат и одговорат
-
- Сокриј ја приказната од одредени луѓе. Стандардно, Вашата приказна се споделува со Вашите %1$s
+ Дозволете им на луѓето кои можат да ја видат вашата приказна да реагираат и одговорат
Signal врски
@@ -4864,7 +4896,7 @@
Ги имате во контактите на телефонот
- "Вашите врски можат да го видат Вашето име и слика и да ги гледаат објавите во „Моја приказна”, освен ако не го сокриете тоа од нив."
+ "Вашите врски можат да ги видат вашето име и слика и да ги гледаат објавите во „Моја приказна”, освен ако не ги скриете од нив."
Додај гледач
@@ -4872,7 +4904,7 @@
Да се отстрани %1$s?
- Оваа личност повеќе нема да ја види Вашата приказна.
+ Оваа личност повеќе нема да ја гледа вашата приказна.
Отстрани
@@ -4900,7 +4932,7 @@
Внеси или залепи URL
- Споделете линк со гледачите на Вашата приказна
+ Споделете линк со гледачите на вашата приказна
Барај
@@ -4911,20 +4943,38 @@
Споделете само со…
Готово
+
+ Дали сакате да ја отстраните групната приказна?
+
+ „%1$s“ ќе се отстрани.
+
+ Отстрани
+
+ Сакате да ја избришете приватната приказна?
+
+ „%1$s“ и новостите споделени на оваа приказна ќе бидат избришани.
+
+ Избриши
+
+ Приказните се достапни само за бета корисниците на Signal.
+
+ Ако споделите приказна, таа ќе биде достапна само за корисниците на Signal бета.
- Да се додаде во приказната?
+ Сакате да се додаде на приказна?
- Со додавање содржина во Вашата приказна им овозможувате на Вашите Signal врски да ја гледаат следните 24 часа. Можете да промените кој може да ја гледа Вашата приказна во поставките.
+ Со додавање содржина на вашата приказна им овозможувате на вашите Signal врски да ја гледаат следните 24 часа. Можете да промените кој може да ја гледа вашата приказна во поставувањата.
- Додај во приказна
+ Додајте како приказна
Уреди гледачи
- Приказната не може да се испрати. Проверете ја Вашата интернет конекција и обидете се повторно.
+ Приказната не можеше да се испрати. Проверете ја интернет врската и обидете се повторно.
Испрати
+
+ Исклучи и избриши
- Сподели и гледај приказни
+ Споделувајте и гледајте приказни
Кога оваа опција е исклучена нема да можете да споделувате и гледате приказни.
@@ -4937,7 +4987,7 @@
- %1$d гледачи
- Именувај ја приказната
+ Именувајте ја приказната
Име на приказна (задолжително)
@@ -4951,7 +5001,7 @@
Избери сѐ
- Изберете го Вашиот тип на приказна
+ Изберете го типот на вашата приказна
Нова приватна приказна
@@ -4977,9 +5027,9 @@
Приказната е испратена
- Не успеа да се испрати приказната
+ Испраќањето на приказната е неуспешно
- Види приказна
+ Видете ја приказната
Види профилна слика
@@ -4995,7 +5045,7 @@
Реагиравте на приказната на %1$s
- Реагираше на Вашата приказна
+ Реагираше на вашата приказна
Реагираше на приказна
@@ -5060,10 +5110,10 @@
Не сега
- Споделете само со…
+ Споделете само со
- - Приватна приказна · %1$dгледач
+ - Приватна приказна · %1$d гледач
- Приватна приказна · %1$d гледачи
@@ -5071,6 +5121,11 @@
- Групна приказна · %1$d гледач
- Групна приказна · %1$d гледачи
+
+
+ - %1$d член
+ - %1$d членови
+
- %1$s · %2$d гледач
@@ -5085,13 +5140,13 @@
Избришете ја приказната
- Дали сакате да ја отстраните приказната на групата?
+ Дали сакате да ја отстраните групната приказна?
- Со ова ќе се отстрани приказната од оваа листа. Ќе можете сè уште да ги видите приказните од оваа група.
+ Со ова ќе се отстрани приказната од оваа листа. Ќе можете сè уште да ги гледате приказните од оваа група.
Отстрани
- Да се избрише приказната?
+ Сакате да ја избришете приказната?
Дали сакате да ја избришете приватната приказна „%1$s“?
@@ -5206,7 +5261,7 @@
Дали сакате да ги исклучите приказните?
- Повеќе нема да можете да споделувате или гледате приказни. Приказните кои сте ги испратиле неодамна ќе им бидат видливи на останатите сè додека не истечат.
+ Повеќе нема да можете да споделувате или гледате приказни. Неодамна споделените новости на приказната исто така ќе бидат избришани.
Приватност на приказна
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 3d1c827f62..1a491474cc 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -218,7 +218,7 @@
ഉപയോക്തൃനാമം ഉപയോഗിച്ച് കണ്ടെത്തുക
- എന്റെ സ്റ്റോറീസ്
+ എന്റെ സ്റ്റോറികൾ
പുതിയ സ്റ്റോറി
@@ -673,7 +673,7 @@
പുതിയ ഗ്രൂപ്പുകൾ എന്താണ്?
പുതിയ ഗ്രൂപ്പുകൾക്ക് @സൂചനകള്, ഗ്രൂപ്പ് അഡ്മിനുകൾ എന്നിവ പോലുള്ള സവിശേഷതകളുണ്ട്, മാത്രമല്ല ഭാവിയിൽ കൂടുതൽ സവിശേഷതകളെ പിന്തുണയ്ക്കുകയും ചെയ്യും.
- എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും നവീകരിക്കുന്നതിന് മുമ്പായി സൂക്ഷിച്ചിരിക്കുന്നു.
+ അപ്ഗ്രേഡിന് മുമ്പുള്ള എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും സൂക്ഷിച്ചിരിക്കുന്നു.
ഈ ഗ്രൂപ്പിൽ വീണ്ടും ചേരുന്നതിനുള്ള ഒരു ക്ഷണം നിങ്ങൾ സ്വീകരിക്കേണ്ടതുണ്ട്, നിങ്ങൾ സ്വീകരിക്കുന്നതുവരെ ഗ്രൂപ്പ് സന്ദേശങ്ങൾ ലഭിക്കില്ല.
- ഈ അംഗത്തിന് ഈ ഗ്രൂപ്പിൽ വീണ്ടും ചേരുന്നതിനുള്ള ക്ഷണം സ്വീകരിക്കേണ്ടതുണ്ട്, മാത്രമല്ല അവർ അംഗീകരിക്കുന്നതുവരെ ഗ്രൂപ്പ് സന്ദേശങ്ങൾ ലഭിക്കുകയുമില്ല:
@@ -688,7 +688,7 @@
പുതിയ ഗ്രൂപ്പിലേക്ക് അപ്ഗ്രേഡുചെയ്യുക
ഈ ഗ്രൂപ്പ് അപ്ഗ്രേഡുചെയ്യുക
പുതിയ ഗ്രൂപ്പുകൾക്ക് @സൂചനകള്, ഗ്രൂപ്പ് അഡ്മിനുകൾ എന്നിവ പോലുള്ള സവിശേഷതകളുണ്ട്, മാത്രമല്ല ഭാവിയിൽ കൂടുതൽ സവിശേഷതകളെ പിന്തുണയ്ക്കുകയും ചെയ്യും.
- എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും നവീകരിക്കുന്നതിന് മുമ്പായി സൂക്ഷിച്ച് വയ്ക്കും.
+ അപ്ഗ്രേഡിന് മുമ്പുള്ള എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും സൂക്ഷിച്ച് വയ്ക്കുന്നതാണ്.
ഒരു നെറ്റ്വർക്ക് പിശക് നേരിട്ടു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.
അപ്ഗ്രേഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു
@@ -1524,7 +1524,7 @@
നിങ്ങൾ
- എന്റെ കഥ
+ എന്റെ സ്റ്റോറി
തടയുക
@@ -1960,6 +1960,7 @@
%1$s എന്നയാൾ നിങ്ങൾക്ക് അയച്ചത്
മീഡിയ ഇനി ലഭ്യമല്ല.
ഈ മീഡിയ പങ്കിടാൻ കഴിയുന്ന ഒരു അപ്ലിക്കേഷൻ കണ്ടെത്താനായില്ല.
+ അടയ്ക്കുക
%2$d സംഭാഷണങ്ങളിൽ %1$d പുതിയ സന്ദേശങ്ങൾ
@@ -2200,7 +2201,7 @@
%1$s · സ്റ്റോറി
- നിങ്ങൾ · സ്റ്റോറി
+ നിങ്ങളുടെ · സ്റ്റോറി
ഇനി ലഭ്യമല്ല
@@ -2605,7 +2606,7 @@
ഒറ്റത്തവണ സംഭാവന
സ്വകാര്യത
- സ്റ്റോറീസ്
+ സ്റ്റോറികൾ
MMS യൂസർ ഏജൻറ്
സ്വമേധയാലുള്ള MMS ക്രമീകരണങ്ങൾ
MMSC URL
@@ -2666,11 +2667,11 @@
സ്റ്റോറജ് അവലോകനം ചെയ്യുക
പഴയ സന്ദേശങ്ങൾ ഇല്ലാതാക്കണോ?
സന്ദേശ ചരിത്രം മായ്ക്കണോ?
- നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്നുള്ള %1$s-നേക്കാൾ പഴയ എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും ഇത് ശാശ്വതമായി ഇല്ലാതാക്കും.
+ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്നുള്ള %1$s എന്നതിൽ കൂടുതൽ പഴക്കമുള്ള എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും ഇത് ശാശ്വതമായി ഇല്ലാതാക്കും.
ഇത് ഏറ്റവും പുതിയ %1$s സന്ദേശങ്ങളിലേക്ക് എല്ലാ സംഭാഷണങ്ങളും ശാശ്വതമായി കുറയ്ക്കും (ട്രിം ചെയ്യും).
ഇത് നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് എല്ലാ സന്ദേശ ചരിത്രവും മീഡിയയും ശാശ്വതമായി ഇല്ലാതാക്കും
- എല്ലാ സന്ദേശ ചരിത്രവും നീക്കംചെയ്യണം എന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?
- എല്ലാ സന്ദേശ ചരിത്രവും ശാശ്വതമായി നീക്കംചെയ്യപ്പെടും. പിന്നെ ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല.
+ എല്ലാ സന്ദേശ ചരിത്രവും നീക്കം ചെയ്യണം എന്ന് നിങ്ങൾക്ക് തീർച്ചയാണോ?
+ എല്ലാ സന്ദേശ ചരിത്രവും ശാശ്വതമായി നീക്കം ചെയ്യപ്പെടും. പിന്നെ ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല.
എല്ലാം ഇപ്പോൾ ഇല്ലാതാക്കുക
എന്നേക്കും
1 വർഷം
@@ -2748,10 +2749,14 @@
ഓപ്ഷൻ ഇച്ഛാനുസൃതമാക്കുക
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
ഇപ്പോൾ വേണ്ട
+
+
+ സുരക്ഷാ സജ്ജീകരണം
+
+ നിങ്ങളുടെ ഫണ്ടുകൾ സംരക്ഷിക്കുക
+
+ സുരക്ഷയുടെ മറ്റൊരു തലം ചേർത്തുകൊണ്ട് നിങ്ങളുടെ ഫണ്ട് ആക്സസ് ചെയ്യുന്നതിൽ നിന്നും നിങ്ങളുടെ ഫോൺ കൈവശമുള്ള ഒരു വ്യക്തിയെ തടയുക. നിങ്ങൾ ഈ ഓപ്ഷൻ ക്രമീകരണങ്ങളിൽ പ്രവർത്തനരഹിതമാക്കാൻ കഴിയുന്നതാണ്.
+
+ പേയ്മെന്റ് ലോക്ക് പ്രവർത്തനക്ഷമമാക്കുക
+
+ ഇപ്പോൾ വേണ്ട
+
+ ഈ ഘട്ടം ഒഴിവാക്കണോ?
+
+ ഈ ഘട്ടം ഒഴിവാക്കിയാൽ, നിങ്ങളുടെ ഫോണിലേക്ക് നേരിട്ട് ആക്സസ് ഉള്ള ആർക്കും ഫണ്ട് കൈമാറ്റം ചെയ്യാനോ നിങ്ങളുടെ വീണ്ടെടുക്കൽ പദം കാണാനോ കഴിഞ്ഞേക്കാം.
+
+ റദ്ദാക്കുക
+
+ ഒഴിവാക്കുക
+
ഫണ്ടുകൾ ചേർക്കുക
നിങ്ങളുടെ വാലറ്റ് വിലാസം
@@ -4256,7 +4281,7 @@
ഒരു സന്ദേശം ചേര്ക്കുക
അതിവേഗ ഫോര്വേഡുകള്
- വീഡിയോകൾ 30 സെക്കൻഡ് ദൈർഘ്യമുള്ള ക്ലിപ്പുകളായി ട്രിം ചെയ്ത് ഒന്നിലധികം സ്റ്റോറീസായി അയയ്ക്കും.
+ വീഡിയോകൾ 30 സെക്കൻഡ് ദൈർഘ്യമുള്ള ക്ലിപ്പുകളായി ട്രിം ചെയ്ത് ഒന്നിലധികം സ്റ്റോറീസായി അയയ്ക്കും.
സ്റ്റോറികളിലേക്ക് അയയ്ക്കുന്ന വീഡിയോകളുടെ ദൈർഘ്യം 30 സെക്കൻഡിൽ കൂടരുത്.
കൈമാറിയ സന്ദേശങ്ങള് ഇപ്പോൾ ഉടനടി അയയ്ക്കുന്നു.
@@ -4699,13 +4724,13 @@
ചാറ്റുകൾ
- സ്റ്റോറീസ്
+ സ്റ്റോറികൾ
99+
- സ്റ്റോറി സ്വകാര്യത
+ സ്റ്റോറിയുടെ സ്വകാര്യത
- എന്റെ കഥകള്
+ എന്റെ സ്റ്റോറികൾ
ഒരു സ്റ്റോറി ചേർക്കാൻ ടാപ്പ് ചെയ്യുക
@@ -4735,13 +4760,13 @@
സ്റ്റോറി മറയ്ക്കണോ?
- %1$s എന്നയാളിൽ നിന്നുള്ള പുതിയ സ്റ്റോറി അപ്ഡേറ്റുകൾ ഇനി സ്റ്റോറീസ് ലിസ്റ്റിന്റെ മുകളിൽ വരില്ല.
+ %1$s എന്നയാളിൽ നിന്നുള്ള പുതിയ സ്റ്റോറി അപ്ഡേറ്റുകൾ ഇനിമുതൽ സ്റ്റോറീസ് ലിസ്റ്റിന്റെ മുകളിൽ ദൃശ്യമാകുന്നതല്ല.
മറയ്ക്കുക
സ്റ്റോറി മറച്ചു
- മറച്ച സ്റ്റോറീസ്
+ മറച്ച സ്റ്റോറികൾ
- %1$d കാഴ്ച
@@ -4754,7 +4779,7 @@
സ്റ്റോറി ഇല്ലാതാക്കണോ?
- നിങ്ങൾക്കും ഇത് ലഭിച്ച എല്ലാവർക്കുമായി ഈ സ്റ്റോറി ഇല്ലാതാക്കപ്പെടും.
+ നിങ്ങൾക്കും ഇത് ലഭിച്ച എല്ലാവർക്കും ഈ സ്റ്റോറി ഇല്ലാതാക്കപ്പെടും.
സംരക്ഷിക്കാനായില്ല
@@ -4799,6 +4824,8 @@
കാണുന്നയാളെ നീക്കം ചെയ്യുക
ഇതുവരെ മറുപടികളൊന്നുമില്ല
+
+ നിങ്ങൾ നിലവിൽ ഈ ഗ്രൂപ്പിൽ അംഗമല്ലാത്തതിനാൽ, നിങ്ങൾക്ക് ഈ സ്റ്റോറിക്ക് മറുപടി അയയ്ക്കാൻ കഴിയില്ല.
സ്റ്റോറിയോട് പ്രതികരിച്ചു
@@ -4806,7 +4833,7 @@
മറുപടികൾ
- ഈ സ്റ്റോറിയോട് പ്രതികരിച്ചു
+ ഈ സ്റ്റോറിയോട് പ്രതികരിക്കുക
%1$s എന്നയാൾക്ക് സ്വകാര്യമായി മറുപടി നൽകുന്നു
@@ -4816,7 +4843,14 @@
ഇല്ലാതാക്കൂ
- എന്റെ കഥ
+ എന്റെ സ്റ്റോറി
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
ആർക്കൊക്കെ ഈ സ്റ്റോറി കാണാനാകും
@@ -4828,7 +4862,7 @@
ഇനിപ്പറയുന്നവര് ഒഴികെ എല്ലാവരും…
- നിർദ്ദിഷ്ട ആളുകളിൽ നിന്ന് നിങ്ങളുടെ സ്റ്റോറി മറയ്ക്കുക
+ കുറച്ച് ആളുകളിൽ നിന്ന് നിങ്ങളുടെ സ്റ്റോറി മറയ്ക്കുക
- %1$d ആളെ ഒഴിവാക്കി
@@ -4851,8 +4885,6 @@
മറുപടികളും പ്രതികരണങ്ങളും അനുവദിക്കുക
നിങ്ങളുടെ സ്റ്റോറി കാണാൻ കഴിയുന്ന ആളുകളെ പ്രതികരിക്കാനും മറുപടി നൽകാനും അനുവദിക്കുക
-
- നിർദ്ദിഷ്ട ആളുകളിൽ നിന്ന് നിങ്ങളുടെ സ്റ്റോറി മറയ്ക്കുക. ഡിഫോൾട്ടായി നിങ്ങളുടെ സ്റ്റോറി നിങ്ങളുടെ %1$s എന്നതുമായി പങ്കിട്ട നിലയിലായിരിക്കും
Signal കണക്ഷനുകൾ
@@ -4864,7 +4896,7 @@
നിങ്ങളുടെ സിസ്റ്റം കോൺടാക്റ്റുകളിൽ ചേർത്ത്
- "നിങ്ങളുടെ കണക്ഷനുകൾക്ക് നിങ്ങളുടെ പേരും ഫോട്ടോയും കാണാനാകും, നിങ്ങൾ മറയ്ക്കാത്ത പക്ഷം അവർക്ക് നിങ്ങൾ \"എന്റെ സ്റ്റോറിയിൽ\" ചേർക്കുന്ന പോസ്റ്റുകളും കാണാനാകും."
+ "നിങ്ങളുടെ കണക്ഷനുകൾക്ക് നിങ്ങളുടെ പേരും ഫോട്ടോയും കാണാനാകും, മാത്രമല്ല നിങ്ങൾ മറയ്ക്കാത്ത പക്ഷം അവർക്ക് നിങ്ങൾ \"എന്റെ സ്റ്റോറിയിൽ\" ചേർക്കുന്ന പോസ്റ്റുകളും കാണാനാകും."
കാഴ്ച്ചക്കാരെ ചേർക്കുക
@@ -4872,7 +4904,7 @@
%1$sഎന്നയാളെ നീക്കം ചെയ്യണോ?
- ഈ വ്യക്തിക്ക് ഇനി നിങ്ങളുടെ സ്റ്റോറി കാണാനാകില്ല.
+ ഈ വ്യക്തിക്ക് ഇനിമുതൽ നിങ്ങളുടെ സ്റ്റോറി കാണാൻ കഴിയുന്നതല്ല.
നീക്കംചെയ്യൂ
@@ -4900,7 +4932,7 @@
ഒരു യുആർഎൽ ടൈപ്പ് ചെയ്യുകയോ ഒട്ടിക്കുകയോ ചെയ്യുക
- നിങ്ങളുടെ സ്റ്റോറിയുടെ കാഴ്ച്ചക്കാർക്കായി ഒരു ലിങ്ക് പങ്കിടുക
+ നിങ്ങളുടെ സ്റ്റോറിയുടെ കാഴ്ച്ചക്കാരുമായി ഒരു ലിങ്ക് പങ്കിടുക
തിരയുക
@@ -4911,22 +4943,40 @@
ഇനിപ്പറയുന്നവരുമായി മാത്രം പങ്കിടുക…
ചെയ്തു
+
+ ഗ്രൂപ്പ് സ്റ്റോറി ഇല്ലാതാക്കണോ?
+
+ \"%1$s\" നീക്കം ചെയ്യപ്പെടും.
+
+ നീക്കംചെയ്യൂ
+
+ സ്വകാര്യ സ്റ്റോറി ഇല്ലാതാക്കണോ?
+
+ ഈ സ്റ്റോറിയിലേക്ക് പങ്കിട്ട \"%1$s\" എന്നതും അപ്ഡേറ്റുകളും ഇല്ലാതാക്കപ്പെടും.
+
+ ഇല്ലാതാക്കൂ
+
+ Signal ബീറ്റ ഉപയോക്താക്കൾക്ക് മാത്രമേ സ്റ്റോറികൾ ലഭ്യമാകൂ.
+
+ നിങ്ങൾ ഒരു സ്റ്റോറി പങ്കിടുകയാണെങ്കിൽ, അത് Signal ബീറ്റയിലുള്ള ആളുകൾക്ക് മാത്രമേ ലഭ്യമാകൂ.
സ്റ്റോറിയിലേക്ക് ചേർക്കണോ?
- നിങ്ങളുടെ സ്റ്റോറിയിലേക്ക് ഉള്ളടക്കം ചേർക്കുന്നതിലൂടെ നിങ്ങളുടെ Signal കണക്ഷനുകളെ നിങ്ങൾ 24 മണിക്കൂർ നേരത്തേക്ക് അത് കാണാൻ അനുവദിക്കുന്നു. നിങ്ങളുടെ സ്റ്റോറി ആർക്കൊക്കെ കാണാമെന്നത് നിങ്ങൾക്ക് ക്രമീകരണങ്ങളിൽ നിന്ന് എഡിറ്റ് ചെയ്യാം.
+ നിങ്ങളുടെ സ്റ്റോറിയിലേക്ക് ഉള്ളടക്കം ചേർക്കുന്നതിലൂടെ നിങ്ങളുടെ Signal കണക്ഷനുകളെ 24 മണിക്കൂർ നേരത്തേക്ക് അത് കാണാൻ നിങ്ങൾ അനുവദിക്കുന്നു. നിങ്ങളുടെ സ്റ്റോറി ആർക്കൊക്കെ കാണാമെന്ന് നിങ്ങൾക്ക് ക്രമീകരണങ്ങളിൽ മാറ്റാൻ കഴിയുന്നതാണ്.
സ്റ്റോറിയിലേക്ക് ചേർക്കുക
കാഴ്ച്ചക്കാരെ എഡിറ്റ് ചെയ്യുക
- സ്റ്റോറി അയയ്ക്കാനായില്ല. നിങ്ങളുടെ കണക്ഷൻ പരിശോധിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.
+ സ്റ്റോറി അയയ്ക്കാൻ കഴിഞ്ഞില്ല. നിങ്ങളുടെ കണക്ഷൻ പരിശോധിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.
അയയ്ക്കുക
+
+ ഓഫ് ചെയ്ത ശേഷം ഇല്ലാതാക്കുക
- സ്റ്റോറീസ് പങ്കിടുകയും കാണുകയും ചെയ്യുക
+ സ്റ്റോറികൾ പങ്കിടുകയും കാണുകയും ചെയ്യുക
- ഈ ഓപ്ഷൻ ഓഫായിരിക്കുമ്പോൾ നിങ്ങൾക്ക് സ്റ്റോറീസ് കാണാനോ അത് പങ്കിടാനോ കഴിയില്ല.
+ ഈ ഓപ്ഷൻ ഓഫായിരിക്കുമ്പോൾ നിങ്ങൾക്ക് സ്റ്റോറികൾ കാണാനോ അത് പങ്കിടാനോ കഴിയില്ല.
കാഴ്ച്ചക്കാരെ തിരഞ്ഞെടുക്കുക
@@ -4977,7 +5027,7 @@
അയച്ച സ്റ്റോറി
- സ്റ്റോറി അയയ്ക്കാനായില്ല
+ സ്റ്റോറി അയയ്ക്കാൻ കഴിഞ്ഞില്ല
സ്റ്റോറി കാണുക
@@ -5060,7 +5110,7 @@
ഇപ്പോൾ വേണ്ട
- ഇനിപ്പറയുന്നവരുമായി മാത്രം പങ്കിടുക
+ ഇവർക്ക് പങ്കിടൂ
- സ്വകാര്യ സ്റ്റോറി · %1$d ആൾ കണ്ടു
@@ -5071,6 +5121,11 @@
- ഗ്രൂപ്പ് സ്റ്റോറി · %1$d ആൾ കണ്ടു
- ഗ്രൂപ്പ് സ്റ്റോറി · %1$d കാഴ്ചക്കാർ
+
+
+ - %1$d അംഗം
+ - %1$d അംഗങ്ങൾ
+
- %1$s · %2$d ആൾ കണ്ടു
@@ -5087,7 +5142,7 @@
ഗ്രൂപ്പ് സ്റ്റോറി ഇല്ലാതാക്കണോ?
- ഇത് ഈ ലിസ്റ്റിൽ നിന്ന് സ്റ്റോറി നീക്കം ചെയ്യും. എന്നിരുന്നാലും, ഈ ഗ്രൂപ്പിൽ നിന്നുള്ള സ്റ്റോറികൾ നിങ്ങൾക്ക് തുടർന്നും കാണാനാകും.
+ ഇത് ഈ ലിസ്റ്റിൽ നിന്ന് സ്റ്റോറി നീക്കം ചെയ്യും. എന്നിരുന്നാലും, ഈ ഗ്രൂപ്പിൽ നിന്നുള്ള സ്റ്റോറികൾ നിങ്ങൾക്ക് തുടർന്നും കാണാൻ കഴിയും.
നീക്കം ചെയ്യുക
@@ -5139,7 +5194,7 @@
എല്ലാ കണക്ഷനുകളും അവലോകനം ചെയ്തു, തുടരുന്നതിന് അയയ്ക്കുക എന്നതിൽ ടാപ്പ് ചെയ്യുക.
- Signal വീണ്ടും ഇൻസ്റ്റാൾ ചെയ്യുകയോ ഉപകരണങ്ങൾ മാറുകയോ ചെയ്തിട്ടുണ്ടാകാവുന്ന %1$d കണക്ഷനുകൾ നിങ്ങൾക്കുണ്ട്. നിങ്ങളുടെ സ്റ്റോറി അവരുമായി പങ്കിടുന്നതിന് മുമ്പ് അവരുടെ സുരക്ഷാ നമ്പറുകൾ അവലോകനം ചെയ്യുകയോ അവരെ നിങ്ങളുടെ സ്റ്റോറിയിൽ നിന്ന് നീക്കം ചെയ്യുന്നത് പരിഗണിക്കുകയോ ചെയ്യുക.
+ Signal വീണ്ടും ഇൻസ്റ്റാൾ ചെയ്യുകയോ ഉപകരണങ്ങൾ മാറുകയോ ചെയ്തിട്ടുണ്ടാകാവുന്ന %1$d കണക്ഷനുകൾ നിങ്ങൾക്കുണ്ട്. നിങ്ങളുടെ സ്റ്റോറി അവരുമായി പങ്കിടുന്നതിന് മുമ്പ് അവരുടെ സുരക്ഷാ നമ്പറുകൾ അവലോകനം ചെയ്യുകയോ അവരെ നിങ്ങളുടെ സ്റ്റോറിയിൽ നിന്ന് നീക്കം ചെയ്യുന്നതിനെ കുറിച്ച് ചിന്തിക്കുകയോ ചെയ്യുക.
സുരക്ഷാ നമ്പർ ഉറപ്പാക്കു
@@ -5169,7 +5224,7 @@
എന്റെ സ്റ്റോറിയുടെ സ്വകാര്യത
- എന്റെ സ്റ്റോറിയിലേക്കുള്ള പോസ്റ്റുകൾ ആർക്കൊക്കെ കാണാനാകും എന്ന് തിരഞ്ഞെടുക്കുക. നിങ്ങൾക്ക് എപ്പോൾ വേണമെങ്കിലും ക്രമീകരണങ്ങളിൽ മാറ്റം വരുത്താവുന്നതാണ്.
+ എന്റെ സ്റ്റോറിയിലേക്കുള്ള പോസ്റ്റുകൾ ആർക്കൊക്കെ കാണാൻ കഴിയുമെന്ന് തിരഞ്ഞെടുക്കുക. നിങ്ങൾക്ക് എപ്പോൾ വേണമെങ്കിലും ക്രമീകരണങ്ങളിൽ മാറ്റം വരുത്താവുന്നതാണ്.
എല്ലാ Signal കണക്ഷനുകളും
@@ -5194,7 +5249,7 @@
- 24 മണിക്കൂറിന് ശേഷം സ്റ്റോറികൾ സ്വയമേവ അപ്രത്യക്ഷമാകും. നിങ്ങളുടെ സ്റ്റോറി ആർക്കൊക്കെ കാണാനാകുമെന്ന് തിരഞ്ഞെടുക്കുകയോ നിർദ്ദിഷ്ട കാഴ്ചക്കാരെയോ ഗ്രൂപ്പുകളെയോ ഉപയോഗിച്ച് പുതിയ സ്റ്റോറികൾ സൃഷ്ടിക്കുകയോ ചെയ്യുക.
+ 24 മണിക്കൂറിന് ശേഷം സ്റ്റോറികൾ സ്വയമേവ അപ്രത്യക്ഷമാകും. നിങ്ങളുടെ സ്റ്റോറി ആർക്കൊക്കെ കാണാൻ കഴിയുമെന്ന് തീരുമാനിക്കുകയോ കുറച്ച് കാഴ്ചക്കാരെയോ ഗ്രൂപ്പുകളെയോ ഉപയോഗിച്ച് പുതിയ സ്റ്റോറികൾ സൃഷ്ടിക്കുകയോ ചെയ്യുക.
സ്റ്റോറികൾ ഓഫാക്കുക
@@ -5206,9 +5261,9 @@
സ്റ്റോറികൾ ഓഫാക്കണോ?
- നിങ്ങൾക്ക് ഇനിമുതൽ സ്റ്റോറികൾ പങ്കിടാനോ കാണാനോ കഴിയില്ല. നിങ്ങൾ അടുത്തിടെ അയച്ച എല്ലാ സ്റ്റോറികളും കാലഹരണപ്പെടുന്നതുവരെ മറ്റുള്ളവർക്ക് തുടർന്നും ദൃശ്യമാകും.
+ നിങ്ങൾക്ക് ഇനിമുതൽ സ്റ്റോറികൾ പങ്കിടാനോ കാണാനോ കഴിയില്ല. നിങ്ങൾ അടുത്തിടെ പങ്കിട്ട സ്റ്റോറി അപ്ഡേറ്റുകളും ഇല്ലാതാക്കപ്പെടും.
- സ്റ്റോറി സ്വകാര്യത
+ സ്റ്റോറിയുടെ സ്വകാര്യത
diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml
index e56dd2085d..e5caf5ab22 100644
--- a/app/src/main/res/values-mr/strings.xml
+++ b/app/src/main/res/values-mr/strings.xml
@@ -358,8 +358,8 @@
संचयनमध्ये जतन करायचे?
- - हा मिडिया संचयनामध्ये जतन केल्याने आपल्या डिव्हाईस वरील इतर ॲप्सना त्यात प्रवेश करण्याची अनुमती मिळेल.\n\nसुरू ठेवायचे?
- - सर्व %1$d मिडिया संचयन मध्ये जतन केल्याने आपल्या डिव्हाईस वरील इतर ॲप्सना त्यात प्रवेश करण्याची अनुमती मिळेल.\n\nसुरू ठेवायचे?
+ - हा मिडिया संग्रहणामध्ये जतन केल्याने आपल्या डिव्हाईस वरील इतर ॲप्सना त्यात प्रवेश करण्याची अनुमती मिळेल.\n\nसुरू ठेवायचे?
+ - सर्व %1$d मिडिया संग्रहणामध्ये जतन केल्याने आपल्या डिव्हाईस वरील इतर ॲप्सना त्यात प्रवेश करण्याची अनुमती मिळेल.\n\nसुरू ठेवायचे?
- संचयनमध्ये संलग्न जतन करण्यात त्रुटी!
@@ -367,12 +367,12 @@
संचयनमध्ये लिहिण्यात अक्षम!
- - संलग्न जतन करत आहे
+ - संलग्नक जतन करत आहे
- %1$d संलग्नके जतन करत आहे
- - संलग्न संचयनमध्ये जतन करत आहे…
- - %1$d संलग्नके संचयनामध्ये जतन करत आहे…
+ - संलग्नक संग्रहणामध्ये जतन करत आहे…
+ - %1$d संलग्नके संग्रहणामध्ये जतन करत आहे…
प्रलंबित…
डेटा (Signal)
@@ -418,14 +418,14 @@
- निवडलेले संभाषणे हटवायचे?
- - हे निवडलेले संभाषणे कायमचे हटवेल.
- - हे निवडलेले %1$d संभाषणे कायमचे हटवेल.
+ - हे निवडलेले संभाषण कायमचे हटवेल.
+ - हे निवडलेली %1$d संभाषणे कायमची हटवेल.
हटवत आहे
निवडलेले संभाषण हटवत आहे…
- - संभाषण आर्काईव्ह केले
- - %1$d संभाषणे आर्काईव्ह केली
+ - संभाषण संग्रहित केले
+ - %1$d संभाषणे संग्रहित केली
अनडू करा
@@ -673,7 +673,7 @@
नवीन गट काय आहेत?
नवीन गटांमध्ये @उल्लेख आणि गट अॅडमिन सारखे वैशिष्ट्ये आहेत, आणि भविष्यात आम्ही अधिक वैशिष्ट्यांना समर्थन देऊ.
- सर्व संदेश इतिहास आणि मिडिया श्रेणीसुधारणेपूर्वी ठेवले जातात.
+ सर्व संदेश इतिहास आणि मिडिया श्रेणीसुधारणेपूर्वी ठेवण्यात आले आहेत.
या गटात पुन्हा सामील होण्यासाठी आपल्याला आमंत्रण स्वीकार करावे लागेल, आणि आपण स्वीकार करेपर्यंत आपल्याला गट संदेश प्राप्त होणार नाहीत.
- या गटात पुन्हा सामील होण्यासाठी या सदस्याला आमंत्रण स्वीकार करावे लागेल, आणि स्वीकार करेपर्यंत त्याला गट संदेश प्राप्त होणार नाहीत:
@@ -887,7 +887,7 @@
- - %1$s ने व्यक्ती आमंत्रित केली
+ - %1$s ने 1 व्यक्तीला आमंत्रित केले
- %1$s ने %2$d व्यक्तींना आमंत्रित केले
@@ -926,8 +926,8 @@
आपण %1$s ला पाठवलेले आमंत्रण रद्द करू इच्छिता?
- - %1$s द्वारा पाठवलेले आमंत्रण आपण मागे घेऊ इच्छिता?
- - %1$s द्वारा पाठवलेली %2$d आमंत्रणे मागे घेऊ इच्छिता?
+ - आपण %1$s द्वारे पाठवलेले आमंत्रण मागे घेऊ इच्छिता?
+ - %1$s द्वारे पाठवलेली %2$d आमंत्रणे मागे घेऊ इच्छिता?
@@ -1035,8 +1035,8 @@
- निवडलेले आयटम हटवायचे?
- - हे निवडलेली फाईल कायमची हटवेल. या आयटम सोबत संबंधित कुठलाही संदेश मजकूर देखील हटविला जाईल.
- - हे निवडलेल्या सर्व %1$d फायली कायमच्या हटवेल. या आयटम सोबत संबंधित कुठलाही संदेश मजकूर देखील हटविला जाईल.
+ - हे निवडलेली फाईल कायमची हटवेल. या घटकाशी संबंधित कुठलाही संदेश मजकूर देखील हटविला जाईल.
+ - हे निवडलेल्या सर्व %1$d फायली कायमच्या हटवेल. या घटकांशी संबंधित कुठलाही संदेश मजकूर देखील हटविला जाईल.
हटवत आहे
संदेश हटवत आहे…
@@ -1168,13 +1168,13 @@
आपण नवीन गटात जोडले जाऊ शकले नाही आणि त्यात सामील होण्यासाठी आपणास आमंत्रित केले गेले आहे.
चॅट सत्र ताजेतवाने झाले
- - सदस्य नवीन गटात जोडला जाऊ शकत नाही आणि त्यात सामील होण्यासाठी आमंत्रित केले गेले आहे.
- - %1$s सदस्य नवीन गटात जोडले जाऊ शकले नाही आणि त्यात सामील होण्यासाठी आमंत्रित केले गेले आहे.
+ - नवीन गटात सदस्य जोडला जाऊ शकत नाही आणि त्याला सामील होण्यासाठी आमंत्रित केले गेले आहे.
+ - %1$s सदस्य नवीन गटात जोडले जाऊ शकत नाहीत आणि त्यांना सामील होण्यासाठी आमंत्रित केले गेले आहे.
- - सदस्य नवीन गटात जोडला जाऊ शकत नाही आणि त्यातून तो काढला गेला आहे.
- - %1$s सदस्य नवीन गटात जोडले जाऊ शकले नाही आणि त्यातून ते काढले गेले आहेत.
+ - सदस्य नवीन गटात जोडला जाऊ शकत नाही आणि त्यातून त्याला काढून टाकले आहे.
+ - %1$s सदस्य नवीन गटात जोडले जाऊ शकत नाहीत आणि त्यातून त्यांना काढून टाकले आहे.
@@ -1219,23 +1219,23 @@
आपण %1$s ला गटात आमंत्रित केले.
%1$s ने आपल्याला गटात आमंत्रित केले.
- - %1$s ने 1 व्यक्तींला गटात आमंत्रित केले.
- - %1$s ने %2$d व्यक्तींना गटात आमंत्रित केले.
+ - %1$s ने 1 व्यक्तीला ग्रुपमध्ये आमंत्रित केले.
+ - %1$s ने %2$d व्यक्तींना ग्रुपमध्ये आमंत्रित केले.
आपल्याला गटात निमंत्रित केले गेले होते.
- - 1 व्यक्ती गटात आमंत्रित केली गेली होती.
- - %1$d व्यक्तीना गटात आमंत्रित केले गेले होते.
+ - 1 व्यक्तीला ग्रुपमध्ये आमंत्रित केले गेले होते.
+ - %1$d व्यक्तींना गटात आमंत्रित केले गेले होते.
- - आपण गटाचे आमंत्रण मागे घेतले.
- - आपण गटाची %1$d आमंत्रणे मागे घेतली.
+ - आपण ग्रुपचे आमंत्रण मागे घेतले.
+ - आपण ग्रुपची %1$d आमंत्रणे मागे घेतली.
- - %1$s ने गटाचे आमंत्रण मागे घेतले.
- - %1$s ने गटाची %2$d आमंत्रणे मागे घेतली.
+ - %1$s ने ग्रुपचे आमंत्रण मागे घेतले.
+ - %1$s ने ग्रुपची %2$d आमंत्रणे मागे घेतली.
कुणीतरी गटाचे आमंत्रण रद्द केले.
आपण गटाचे आमंत्रण रद्द केले.
@@ -1316,8 +1316,8 @@
%1$s ने गट लिंक द्वारे सामिल होण्यासाठी विनंती केली.
- - %1$s ने गट लिंकद्वारे सामील होण्यासाठी विनंती केली आणि त्यांची विनंती रद्द केली.
- - %1$s ने गट लिंकद्वारे सामील होण्यासाठी विनंती केली आणि त्यांच्या %2$d विनंत्या रद्द केल्या.
+ - %1$s ने विनंती केली आणि ग्रुप लिंकद्वारे सामील होण्यासाठी त्यांची विनंती रद्द केली.
+ - %1$s ने विनंती केली आणि ग्रुप लिंकद्वारे सामील होण्याच्या %2$d विनंत्या रद्द केल्या.
@@ -1524,7 +1524,7 @@
आपण
- माझ्या स्टोरी
+ माझी स्टोरी
अवरोधित करा
@@ -1960,6 +1960,7 @@
%1$s कडून आपणाला
मिडिया आता उपलब्ध नाही.
हे मिडिया शेअर करण्यासाठी सक्षम असे अॅप सापडू शकले नाही.
+ बंद करा
%2$d संभाषणांमध्ये %1$d नवीन संदेश
@@ -2198,9 +2199,9 @@
आपण
मूळ संदेश आढळला नाही
- %1$s . स्टोरी
+ %1$s स्टोरी
- आपण . स्टोरी
+ तुमची · स्टोरी
आता उपलब्ध नाही
@@ -2343,7 +2344,7 @@
क्लिपबोर्डवर पाठवलेला टाइमस्टॅम्प कॉपी केला.
- आपल्या स्टोरीचे अपडेट्स येथे दाखवले जातील.
+ आपल्या स्टोरीची अद्यतने येथे दाखवली जातील.
@@ -2669,7 +2670,7 @@
हे आपल्या डिव्हाईसवरून %1$s पेक्षा जुने सर्व संदेश इतिहास आणि मिडिया कायमचे हटवेल.
हे सर्व संभाषणे %1$s सर्वात अलीकडील संदेश वर कायमचे ट्रिम करेल.
हे आपल्या डिव्हाईसवरून सर्व संदेश इतिहास आणि मिडिया कायमचे हटवेल.
- सर्व संदेश इतिहास हटवायची आपणास खात्री आहे का?
+ आपण खात्रीने सर्व संदेश इतिहास हटवू इच्छिता?
सर्व संदेश इतिहास कायमचा हटवला जाईल. ही क्रिया मागे घेतली जाऊ शकत नाही.
सर्व आता हटवा
नेहमीसाठी
@@ -2748,10 +2749,14 @@
पर्याय सानुकूलित करा
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
आता नाही
+
+
+ सुरक्षितता सेटअप
+
+ आपल्या निधीचे संरक्षण करा
+
+ सुरक्षिततेचा आणखी एक स्तर जोडून आपल्या फोनसह आपल्या निधीमध्ये प्रवेश करण्यापासून रोखण्यास मदत करा. आपण सेटिंग्ज मध्ये हा पर्याय अक्षम करू शकता.
+
+ पेमेंट लॉक सक्षम करा
+
+ आता नाही
+
+ ही पायरी वगळायची?
+
+ ही पायरी वगळल्यास आपल्या फोनचा भौतिक अॅक्सेस असलेल्या कोणालाही निधी हस्तांतरित करण्यास किंवा आपला पुर्नप्राप्ती वाक्यांश पाहू शकण्याची अनुमती मिळू शकते.
+
+ रद्द करा
+
+ वगळा
+
फंड जोडा
आपला वॉलेट पत्ता
@@ -4735,7 +4760,7 @@
स्टोरी लपवायची?
- %1$s कडील नवीन स्टोरी अपडेट्स यापुढे सूचीच्या शीर्षस्थानी दिसणार नाहीत.
+ %1$s कडील नवीन स्टोरी अपडेट्स यापुढे स्टोरीज सूचीच्या शीर्षस्थानी दिसणार नाहीत.
लपवा
@@ -4750,9 +4775,9 @@
फॉर्वर्ड करा
- %1$s\'च्या स्टोरीज
+ %1$s\'च्या स्टोरी
- स्टोरी हटवायची ?
+ स्टोरी हटवायची?
ही स्टोरी तुमच्यासाठी आणि ती प्राप्त झालेल्या प्रत्येकासाठी हटवली जाईल.
@@ -4786,7 +4811,7 @@
अद्याप कोणतीही दृश्ये नाहीत
- आपल्या स्टोरीज कोणी पाहिल्या आहेत ते पाहण्यासाठी पोच वाचा ला सक्षम करा.
+ आपल्या स्टोरीज कोणी पाहिल्या आहेत ते पाहण्यासाठी वाचल्याची पोच सक्षम करा.
सेटिंग्ज वर जा
@@ -4799,6 +4824,8 @@
दर्शकाला हटवा
अद्याप कोणतीही प्रत्युत्तरे नाहीत
+
+ आपण या स्टोरीज ला उत्तर देऊ शकणार नाही कारण आपण यापुढे या ग्रुपचे सदस्य नाही.
स्टोरीला प्रतिक्रिया दिली
@@ -4817,6 +4844,13 @@
हटवा
माझी स्टोरी
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
ही स्टोरी कोण पाहू शकतात
@@ -4850,9 +4884,7 @@
प्रत्त्युत्तरे & प्रतिक्रिया अनुमती द्या
- जे लोक तुमची कथा पाहू शकतात त्यांना प्रतिक्रिया द्या आणि उत्तर द्या
-
- विशिष्ट लोकांपासून आपली स्टोरी लपवा. पूर्वनिर्धारितपणे, आपली स्टोरी आपल्या %1$sसह शेअर करा
+ जे लोक तुमची स्टोरी पाहू शकतात त्यांना प्रतिक्रिया द्या आणि उत्तर द्या
Signal कनेक्शन्स
@@ -4864,7 +4896,7 @@
ते आपल्या सिस्टम संपर्कांमध्ये असणे
- "आपले कनेक्शन आपले नाव आणि फोटो पाहू शकतात आणि \"माझी स्टोरी\" वरील पोस्ट पाहू शकतात जोपर्यंत आपण ते त्यांच्यापासून लपवत नाही."
+ "आपले कनेक्शन्स आपले नाव आणि फोटो पाहू शकतात, आणि जोपर्यंत आपण ते त्यांच्यापासून लपवत नाही तोपर्यंत \"माझी स्टोरी\" वरील पोस्ट पाहू शकतात."
दर्शक जोडा
@@ -4900,7 +4932,7 @@
URL टाइप करा किंवा पेस्ट करा
- आपल्या स्टोरी दर्शकांसह लिंक शेअर करा
+ आपल्या स्टोरीच्या दर्शकांसह लिंक शेअर करा
शोध
@@ -4911,10 +4943,26 @@
फक्त …सोबत शेअर करा
ठीक
+
+ ग्रुप स्टोरी काढायची?
+
+ \"%1$s\" ला हटवण्यात येईल.
+
+ काढा
+
+ खाजगी स्टोरी हटवायची?
+
+ \"%1$s\" आणि या स्टोरीजला शेअर केलेली अद्यतने हटवली जातील.
+
+ काढून टाका
+
+ स्टोरीज या फक्त Signal बिटा वापरकर्त्यांना उपलब्ध असतील.
+
+ आपण स्टोरीज शेअर केल्यास, ती केवळ Signal बिटा वरील लोकांना उपलब्ध असेल.
- स्टोरीत जोडायचे?
+ स्टोरी मध्ये जोडायचे?
- आपल्या स्टोरी मध्ये काही जोडल्याने आपल्या Signal कनेक्शन्सला २४ तास ते पाहण्याची अनुमती मिळते. आपली स्टोरी कोण पाहू शकते हे आपण सेटिंग्जमध्ये बदलू शकता.
+ आपल्या स्टोरी मध्ये अतिरिक्त मजकूर जोडल्याने आपल्या Signal कनेक्शन्सला 24 तास ते पाहण्याची अनुमती मिळते. आपली स्टोरी कोण पाहू शकते हे आपण सेटिंग्जमध्ये बदलू शकता.
स्टोरीत जोडा
@@ -4923,8 +4971,10 @@
स्टोरी पाठवता आली नाही. आपले कनेक्शन तपासा आणि पुन्हा प्रयत्न करा.
पाठवा
+
+ बंद करा आणि हटवा
- स्टोरीज पहा & शेअर करा
+ स्टोरीज शेअर करा व पहा
हा पर्याय बंद असताना आपण यापुढे स्टोरीज शेअर करू किंवा पाहू शकणार नाही.
@@ -4937,7 +4987,7 @@
- %1$d दर्शक
- स्टोरी नाव
+ स्टोरीला नाव द्या
स्टोरी नाव (आवश्यक)
@@ -4953,11 +5003,11 @@
आपल्या स्टोरीचा प्रकार निवडा
- नविन खाजगी स्टोरी
+ नवीन खाजगी स्टोरी
केवळ विशिष्ट लोकांसाठी दृश्यमान
- गट स्टोरी
+ ग्रुप स्टोरी
विद्यमान गटामध्ये शेअर करा
@@ -4969,7 +5019,7 @@
उत्तर पाठवत आहे…
- ही स्टोरी आता उपलब्ध नाही.
+ ही स्टोरी यापुढे उपलब्ध नाही.
इंटरनेट कनेक्शन नाही
@@ -4993,7 +5043,7 @@
बंद करा
- आपण %1$sच्या स्टोरीवर प्रतिक्रिया दिली आहे
+ आपण %1$s च्या स्टोरीवर प्रतिक्रिया दिली
आपल्या स्टोरीवर प्रतिक्रिया दिली
@@ -5071,6 +5121,11 @@
- ग्रुप स्टोरी · %1$d दर्शक
- ग्रुप स्टोरी · %1$d दर्शक
+
+
+ - %1$d सदस्य
+ - %1$d सदस्य
+
- %1$s · %2$d दर्शक
@@ -5085,13 +5140,13 @@
स्टोरी हटवा
- गट स्टोरी काढायची?
+ ग्रुप स्टोरी काढायची?
- हे स्टोरीला या यादीतून काढून टाकेल. आपण अद्याप या गटातून स्टोरीज पाहू शकाल.
+ हे या यादीतून ही स्टोरी काढून टाकेल. आपण अद्याप या ग्रुपमधून स्टोरीज पाहू शकाल.
काढा
- स्टोरी हटवायची ?
+ स्टोरी हटवायची?
\"%1$s\" खाजगी स्टोरी हटवायची?
@@ -5139,7 +5194,7 @@
सर्व कनेक्शन्सचे पुनरावलोकन करण्यात आले आहे, पुढे सुरू ठेवण्यासाठी टॅप करा.
- ज्यांनी कदाचित Signal पुन्हा इन्स्टॉल केले आहे किंवा उपकरणे बदलली आहेत अशी आपणाकडे %1$d कनेक्शन्स आहेत. आपली स्टोरी त्याच्या सोबत शेअर करण्यापूर्वी त्यांच्या सुरक्षितता क्रमांकांचे पुनरावलोकन करा किंवा त्यांना आपल्या स्टोरीमधून हटवण्याचा विचार करा.
+ ज्यांनी कदाचित Signal पुन्हा इन्स्टॉल केले आहे किंवा उपकरणे बदलली आहेत अशी आपणाकडे %1$d कनेक्शन्स आहेत. आपली स्टोरी त्यांच्या सोबत शेअर करण्यापूर्वी त्यांच्या सुरक्षितता क्रमांकांचे पुनरावलोकन करा किंवा त्यांना आपल्या स्टोरीमधून हटवण्याचा विचार करा.
सुरक्षितता नंबर सत्यापित करा
@@ -5169,7 +5224,7 @@
माझ्या स्टोरीची गोपनीयता
- माझ्या स्टोरीवरील पोस्ट्स कोण पाहू शकतात ते निवडा. आपण सेटिंग्जमध्ये बदल करू शकता.
+ माझ्या स्टोरीवरील पोस्ट्स कोण पाहू शकतात ते निवडा. आपण नेहमी सेटिंग्जमध्ये बदल करू शकता.
सर्व Signal कनेक्शन्स
@@ -5202,11 +5257,11 @@
स्टोरीज सुरु करा
- इतरांकडील स्टोरीज पहा आणि शेअर करा, 24 तासांनंतर स्टोरीज आपोआप अदृश्य होतील.
+ इतरांकडील स्टोरीज पहा आणि शेअर करा, 24 तासांनंतर स्टोरीज आपोआप अदृश्य होतात.
- स्टोरीज बंद करा?
+ स्टोरीज बंद करायच्या?
- आपण यापुढे स्टोरीज पाहू किंवा शेअर करु शकणार नाही. आपण अलिकडेच पाठविलेल्या स्टोरीज कालबाह्य होत नाहीत तोपर्यंत इतरांना अद्याप दृश्यमान असतील.
+ आपण यापुढे स्टोरीज शेअर किंवा पाहू शकणार नाही. आपण अलिकडेच शेअर केलेले स्टोरीज अद्यतने देखील हटवली जातील.
स्टोरी गोपनीयता
@@ -5214,7 +5269,7 @@
ही स्टोरी कोण पाहू शकतात
- "\"%1$s\" ग्रुपचे सदस्य ही स्टोरी पाहू आणि उत्तर देऊ शकतात. या चॅटसाठी आपण ग्रुपमध्ये सदस्यत्व अद्ययावत करु शकता."
+ "%1$s गटाचे सदस्य ही स्टोरी पाहू आणि उत्तर देऊ शकतात. या चॅटसाठी आपण गटामध्ये सदस्यत्व अद्ययावत करु शकता."
ग्रुप स्टोरी हटवा
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index 2c65a0c183..2f72e90ce9 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -192,7 +192,7 @@
Kemas Kini
Jangan Update
Amaran
- Versi aplikasi Signal anda telah tamat tempoh. Anda boleh melihat sejarah mesej anda tetapi anda tidak boleh untuk menghantar dan menerima mesej sehinggalah anda update.
+ Versi aplikasi Signal anda telah tamat tempoh. Anda boleh melihat sejarah mesej anda tetapi tidak boleh menghantar dan menerima mesej sehinggalah anda mengemas kini.
Pelayar web tidak dijumpai.
@@ -650,7 +650,7 @@
Apakah Kumpulan Baru?
Kumpulan Baharu mempunyai ciri-ciri seperti @sebutan dan pentadbir kumpulan, dan akan menyokong lebih banyak ciri pada masa akan datang.
- Semua sejarah mesej dan media telah disimpan sebelum penaiktarafan.
+ Semua sejarah mesej dan media telah disimpan sebelum naik taraf dibuat.
Anda perlu menerima jemputan untuk menyertai kumpulan ini sekali lagi dan tidak akan mendapat mesej kumpulan sehingga anda menerimanya.
- Ahli-ahli ini perlu menerima jemputan untuk menyertai kumpulan ini sekali lagi dan tidak akan mendapat mesej kumpulan sehingga mereka menerimanya:
@@ -663,7 +663,7 @@
Naik taraf ke Group Baru
Upgrade group ini
Kumpulan Baharu mempunyai ciri-ciri seperti @sebutan dan pentadbir kumpulan, dan akan menyokong lebih banyak ciri pada masa akan datang.
- Semua sejarah mesej dan media akan disimpan sebelum penaiktarafan.
+ Semua sejarah mesej dan media akan disimpan sebelum naik taraf dibuat.
Menghadapi ralat network. Cuba lagi kemudian.
Gagal menaik taraf
@@ -1886,6 +1886,7 @@
%1$s kepada anda
Media tidak lagi tersedia.
Tidak menemui aplikasi yang dapat kongsikan media ini.
+ Tutup
%1$d mesej baru dalam %2$d perbualan
@@ -2120,9 +2121,9 @@
Anda
Mesej asal tidak dijumpai
- %1$s . Cerita
+ %1$s · Cerita
- Anda . Cerita
+ Anda · Cerita
Tiada lagi
@@ -2580,11 +2581,11 @@
Semak simpanan
Padamkan mesej lama?
Kosongkan sejarah mesej?
- Tindakan ini akan memadamkan semua sejarah mesej dan media daripada peranti anda yang lebih lama dari %1$s.
+ Ini akan memadam semua sejarah mesej dan media daripada peranti anda yang lebih daripada %1$s.
Tindakan ini akan memotong semua perbualan sehingga %1$s mesej terkini secara kekal.
- Tindakan ini akan memadamkan semua sejarah mesej dan media daripada peranti anda secara kekal.
- Adakah anda pasti mahu memadamkan semua sejarah mesej?
- Semua sejarah mesej akan dialih keluar secara kekal. Tindakan ini tidak dapat dibuat asal.
+ Ini akan memadam semua sejarah mesej dan media daripada peranti anda secara kekal.
+ Adakah anda pasti mahu memadam semua sejarah mesej?
+ Semua sejarah mesej akan dialih keluar secara kekal. Tindakan ini tidak boleh diulang.
Padamkan semua sekarang
Selama-lamanya
1 tahun
@@ -2662,10 +2663,14 @@
Sesuaikan pilihan
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
Bukan Sekarang
+
+
+ Persediaan keselamatan
+
+ Lindungi dana anda
+
+ Bantu menghalang seseorang yang mempunyai telefon anda daripada mengakses dana anda dengan menambah satu lagi lapisan keselamatan. Anda boleh nyahdayakan pilihan ini dalam Tetapan.
+
+ Dayakan kunci pembayaran
+
+ Bukan sekarang
+
+ Langkau langkah ini?
+
+ Melangkau langkah ini boleh membenarkan sesiapa sahaja yang mempunyai akses fizikal kepada telefon anda untuk memindahkan dana atau melihat frasa pemulihan anda.
+
+ Batal
+
+ Langkau
+
Tambah dana
Alamat Dompet Anda
@@ -4157,7 +4182,7 @@
Tambah mesej
Ciri ajuan lebih pantas
- Video akan dipotong kepada klip 30s dan dihantar sebagai Cerita pelbagai.
+ Video akan dipotong kepada klip 30s dan dihantar sebagai beberapa Cerita.
Video yang dihantar ke Cerita tidak boleh melebihi 30s.
Mesej dimajukan kini dihantar serta-merta.
@@ -4631,7 +4656,7 @@
Sembunyikan cerita?
- Kemas kini cerita terbaru daripada %1$s tidak akan muncul di bahagian atas senarai cerita lagi.
+ Kemas kini cerita terbaru daripada %1$s tidak akan muncul dalam senarai teratas cerita lagi.
Sembunyikan
@@ -4649,7 +4674,7 @@
Padam cerita?
- Cerita ini akan dipadamkan untuk anda dan semua orang yang telah menerimanya.
+ Cerita ini akan dipadam untuk anda dan semua orang yang telah menerimanya.
Tidak boleh menyimpan
@@ -4692,14 +4717,16 @@
Alih keluar penonton
Tiada balasan lagi
+
+ Anda tidak boleh membalas cerita ini kerana anda bukan lagi ahli kumpulan ini.
- Telah bereaksi kepada cerita
+ Telah menghantar reaksi kepada cerita
Tontonan
Balasan
- Bereaksi kepada cerita ini
+ Telah menghantar reaksi kepada cerita ini
Balas secara peribadi kepada %1$s
@@ -4710,8 +4737,14 @@
Padam
Cerita Saya
+
+
+ - %1$d viewers
+
+
+ View
- Siapa yang boleh tonton cerita ini
+ Siapa boleh tonton cerita ini
Sembunyikan cerita daripada
@@ -4735,15 +4768,13 @@
- %1$d orang
- Pilih siapa yang boleh lihat cerita anda. Perubahan tidak akan mempengaruhi cerita yang anda telah hantar.
+ Pilih siapa yang boleh tonton cerita anda. Perubahan tidak akan mempengaruhi cerita yang anda telah hantar.
Balasan & reaksi
Benarkan balasan & reaksi
- Benarkan orang yang boleh melihat cerita anda bereaksi dan balas
-
- Sembunyikan cerita anda daripada orang tertentu. Dengan lalai, cerita anda dikongsikan dengan %1$s anda
+ Benarkan orang yang boleh menonton cerita anda menghantar reaksi dan membalas
Hubungan Signal
@@ -4763,7 +4794,7 @@
Alih keluar %1$s?
- Orang ini tidak lagi akan dapat melihat cerita anda.
+ Orang ini tidak lagi dapat melihat cerita anda.
Alih keluar
@@ -4791,7 +4822,7 @@
Taip atau tampal URL
- Kongsi pautan dengan tontonan cerita anda
+ Kongsi pautan dengan penonton cerita anda
Cari
@@ -4802,10 +4833,26 @@
Hanya berkongsi dengan…
Selesai
+
+ Alih keluar cerita kumpulan?
+
+ \" %1$s \" akan dialih keluar.
+
+ Alih keluar
+
+ Padam cerita peribadi?
+
+ \" %1$s \" dan kemas kini yang dikongsi kepada cerita ini akan dipadamkan.
+
+ Padam
+
+ Cerita tersedia untuk pengguna beta Signal sahaja.
+
+ Jika anda berkongsi cerita, ia hanya akan tersedia kepada orang yang menggunakan Signal beta.
Tambah ke cerita?
- Menambah kandungan ke cerita anda membenarkan hubungan Signal melihat ia selama 24 jam. Anda boleg menukar siapa yang boleh melihat cerita anda dalam Tetapan.
+ Menambah kandungan ke cerita membenarkan hubungan Signal anda melihatnya selama 24 jam. Anda boleh menukar siapa yang boleh menonton cerita anda dalam Tetapan.
Tambah ke cerita
@@ -4814,10 +4861,12 @@
Cerita tidak boleh dihantar. Periksa sambungan anda dan cuba lagi.
Hantar
+
+ Matikan dan padam
Kongsi & Lihat Cerita
- Anda tidak lagi dapat berkongsi atau melihat Cerita apabila pilihan ini dimatikan.
+ Anda tidak lagi dapat berkongsi atau menonton Cerita apabila pilihan ini dimatikan.
Pilih penonton
@@ -4859,7 +4908,7 @@
Menghantar balasan…
- Cerita ini tidak tersedia lagi.
+ Cerita ini tidak lagi tersedia.
Tiada Sambungan Internet
@@ -4867,7 +4916,7 @@
Hantar cerita
- Gagal untuk menghantar cerita
+ Gagal menghantar cerita
Lihat cerita
@@ -4883,11 +4932,11 @@
Matikan
- Anda bereaksi kepada cerita %1$s
+ Anda menghantar reaksi kepada cerita %1$s
- Bereaksi kepada cerita anda
+ Menghantar reaksi kepada cerita anda
- Bereaksi kepada cerita
+ Menghantar reaksi kepada cerita
@@ -4952,11 +5001,15 @@
Hanya kongsi dengan
- - Cerita peribadi . %1$d tontonan
+ - Cerita peribadi · %1$d penonton
- - Cerita kumpulan . %1$d tontonan
+ - Cerita kumpulan · %1$d penonton
+
+
+
+ - %1$d ahli
@@ -5088,15 +5141,15 @@
Matikan cerita?
- Anda tidak lagi boleh berkongsi atau melihat cerita. Sebarang cerita yang anda hantar baru-baru ini masih boleh dilihat oleh orang lain sehingga ia tamat tempoh.
+ Anda tidak lagi boleh berkongsi atau menonton cerita. Cerita yang anda hantar baru-baru ini juga akan dipadam.
Privasi cerita
- Siapa yang boleh tonton cerita ini
+ Siapa boleh tonton cerita ini
- "Ahli kumpulan \"%1$s\" boleh menonton dan membalas cerita ini. Anda boleh kemas kini keahlian untuk sembang ini dalam kumpulan."
+ "Ahli kumpulan %1$s boleh menonton dan membalas cerita ini. Anda boleh kemas kini keahlian untuk sembang ini dalam kumpulan."
Alih keluar cerita kumpulan
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index 7d8e0d8749..2347568266 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -192,7 +192,7 @@
အပ်ဒိတ် လုပ်
အပ်ဒိတ် မလုပ်
သတိပေးချက်
- သင်၏ Signal ဗားရှင်း သက်တမ်းကုန်သွားပြီ။ သင်၏ မက်ဆေ့ခ်ျမှတ်တမ်းကို သင်ကြည့်နိုင်သည်။ သို့သော် အပ်ဒိတ် မလုပ်မချင်း မက်ဆေ့ခ်ျများပို့ခြင်း သို့မဟုတ် လက်ခံခြင်း မလုပ်နိုင်ပါ။
+ သင်၏ Signal ဗားရှင်း သက်တမ်းကုန်သွားပြီ။ သင်၏ မက်ဆေ့ချ်မှတ်တမ်းကို သင်ကြည့်နိုင်သော်လည်း အပ်ဒိတ် မလုပ်မချင်း မက်ဆေ့ချ်များပို့ခြင်း သို့မဟုတ် လက်ခံခြင်း မလုပ်နိုင်ပါ။
Web browser ကိုရှာမတွေ့ပါ
@@ -650,7 +650,7 @@
အဖွဲ့အသစ်များ ဆိုတာဘာလဲ။
အဖွဲ့အသစ်များတွင် @mentions နှင့် အုပ်စု အက်မင်များ ကဲ့သို့သော အင်္ဂါရပ်များရှိသည်။ နောင်တွင်လည်း ပို၍ များပြားသော အင်္ဂါရပ်များကို ထောက်ပံ့လိမ့်မည်။
- မက်ဆေ့ခ်ျ သမိုင်းနှင့် မီဒီယာ အားလုံးကို အဆင့်မြှင့်တင်ခြင်း မပြုမီ သိမ်းဆည်းထားသည်။
+ မက်ဆေ့ချ်မှတ်တမ်းနှင့် မီဒီယာ အားလုံးကို အဆင့်မြှင့်တင်ခြင်း မပြုမီ သိမ်းဆည်းထားပါသည်။
သင် ဤအုပ်စုထဲသို့ ပြန်ဝင်ရန် ဖိတ်ကြားချက်ကို လက်ခံရန် လိုလိမ့်မည်။ သင်လက်ခံပြီးမှ အဖွဲ့လိုက် မက်ဆေ့ခ်ျများကို ရရှိမည် ဖြစ်သည်။
- အဖွဲ့ဝင်များသည် ဤအုပ်စုထဲသို့ ပြန်ဝင်ရန် ဖိတ်ကြားချက်ကိုလက်ခံရန်လိုလိမ့်မည်။ ထိုသူတို့ လက်ခံပြီးမှ အဖွဲ့လိုက် မက်ဆေ့ခ်ျများကို ရရှိမည် ဖြစ်သည်။
@@ -663,7 +663,7 @@
အုပ်စု အသစ်သို့ အဆင့်မြှင့်တင်ပါ။
ဤအုပ်စုကို အဆင့်မြှင့်တင်ပါ။
အဖွဲ့အသစ်များတွင် @mentions နှင့် အုပ်စု အက်မင်များ ကဲ့သို့သော အင်္ဂါရပ်များရှိသည်။ နောင်တွင်လည်း ပို၍ များပြားသော အင်္ဂါရပ်များကို ထောက်ပံ့လိမ့်မည်။
- မက်ဆေ့ခ်ျ သမိုင်းနှင့် မီဒီယာ အားလုံးကို အဆင့်မြှင့်ခြင်း မပြုမီ သိမ်းဆည်းထားသည်။
+ မက်ဆေ့ချ်မှတ်တမ်းနှင့် မီဒီယာ အားလုံးကို အဆင့်မြှင့်တင်ခြင်း မပြုမီ သိမ်းဆည်းသွားပါမည်။
ကွန်ယက် အမှားတစ်ခုနှင့် ကြုံတွေ့ခဲ့သည်။ နောက်မှ ပြန်လည် ကြိုးစားပါ။
အဆင့်မြှင့်ခြင်း မအောင်မြင်ပါ။
@@ -1886,6 +1886,7 @@
%1$s ထံမှ
မီဒီယာမရှိတော့ပါ
ဤမီဒီယာကို ဝေမျှနိုင်သော အပ္ပလီကေးရှင်း မတွေ့ရှိပါ။
+ ပိတ်မယ်
စကားဝိုင်း %2$d တွင် စာပေါင်း %1$d ရှိသည်။
@@ -2537,7 +2538,7 @@
ငွေပေးချေမှုများ (စမ်းသပ်သည့် Beta ဗားရှင်း)
စာလုံးရေ အကန့်အသတ်
မက်ဆေ့များကို သိမ်းထားပါ
- မက်ဆေ့ရာဇဝင်ရှင်းလင်းမယ်
+ မက်ဆေ့ချ်မှတ်တမ်း ရှင်းလင်းရန်
ချိတ်ဆက်ထားသော စက်ပစ္စည်းများ
အလင်း
အမှောင်
@@ -2571,7 +2572,7 @@
ဝိုင်ဖိုင်ကို အသုံးပြုသည့်အခါ
Roaming လုပ်သည့်အခါ
ရုပ်/သံ/ပုံကို အလိုအလျောက် ဒေါင်းလုတ်လုပ်ပါ
- မက်ဆေ့ခ်ျရာဇဝင်
+ မက်ဆေ့ချ်မှတ်တမ်း
သိုလှောင်မှုအသုံးပြုမှု
ဓါတ်ပုံများ
ဗီဒီယိုများ
@@ -2579,12 +2580,12 @@
အသံ
သိုလှောင်မှုကို ပြန်သုံးသပ်မယ်
မက်ဆေ့ခ်ျအဟောင်းများကို ဖျက်မည်လား?
- မက်ဆေ့ရာဇဝင်ကို ရှင်းလင်းမည်လား?
- ၎င်းလုပ်ဆောင်ချက်သည် သင့်စက်ပေါ်ရှိ %1$s ထက်ကြာသော မက်ဆေ့ချ်ရာဇဝင် နှင့် မီဒီယာများကို ဖျက်သိမ်းလိုက်ပါမည်။
+ မက်ဆေ့ချ်မှတ်တမ်းကို ရှင်းလင်းမည်လား။
+ ၎င်းသည် သင့်စက်ရှိ %1$s ထက်ကြာသော မက်ဆေ့ချ်မှတ်တမ်းနှင့် မီဒီယာများကို အပြီးဖျက်ပစ်လိုက်ပါမည်။
၎င်းလုပ်ဆောင်ချက်သည် သင်၏ စကားပြောဆိုမှုများအားလုံးကို နောက်ဆုံးမက်ဆေ့ချ် %1$s ခုထိ ဖြတ်လိုက်ပါမည်။
- ၎င်းလုပ်ဆောင်ချက်သည် သင့်စက်ပေါ်ရှိ မက်ဆေ့ချ်ရာဇဝင် နှင့် မီဒီယာများ အားလုံးကို ဖျက်သိမ်းလိုက်ပါမည်။
- သင်မှ မက်ဆေ့ချ်ရာဇဝင် များအားလုံးကို ဖျက်မည်ဆိုတာ သေချာပါသလား?
- မက်ဆေ့ချ်ရာဇဝင်များအားလုံးကို အမြဲတမ်းဖျက်သိမ်းလုပ်ပါမည်။ ၎င်းလုပ်ဆောင်ချက်ကို ပြန်ရုပ်သိမ်းလို့် မရပါ။
+ ၎င်းသည် သင့်စက်ရှိ မက်ဆေ့ချ်မှတ်တမ်းနှင့် မီဒီယာများ အားလုံးကို အပြီးဖျက်ပစ်လိုက်ပါမည်။
+ မက်ဆေ့ချ်မှတ်တမ်းများ အားလုံးကို ဖျက်လိုသည်မှာ သေချာပါသလား။
+ မက်ဆေ့ချ်မှတ်တမ်းများ အားလုံးကို အပြီးဖယ်ရှားလိုက်ပါမည်။ ဤလုပ်ဆောင်ချက်ကို ပြန်ရုပ်သိမ်း၍ မရပါ။
အားလုံးကို ယခု ဖျက်သိမ်းမယ်
အမြဲတမ်း
1 နှစ်
@@ -2662,10 +2663,14 @@
ရွေးချယ်မှုကို စိတ်ကြိုက်ပြင်ဆင်မယ်
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2818,6 +2823,26 @@
ယခု မလုပ်ပါ
+
+
+ လုံခြုံရေး သတ်မှတ်ချိန်ညှိမှု
+
+ သင်၏ ငွေကြေးကို ကာကွယ်ပါ
+
+ နောက်ထပ် လုံခြုံရေးအလွှာ ပေါင်းထည့်ခြင်းဖြင့် သင်၏ငွေကြေးကို အခြားတစ်ယောက်က ရယူသုံးစွဲခြင်းအား ကူညီတားဆီးပေးပါသည်။ ဤသည်ကို ဆက်တင်တွင် ပိတ်နိုင်ပါသည်။
+
+ ငွေပေးချေမှုလော့ခ်ကို ဖွင့်ရန်
+
+ ယခု မလုပ်ဆောင်သေးပါ။
+
+ ဤအဆင့်ကို ကျော်မည်လား။
+
+ ဤအဆင့်ကို ကျော်လိုက်ခြင်းဖြင့် သင့်ဖုန်းကို ဝင်ရောက်ကြည့်ရှုခွင့်ရှိသည့် မည်သူမဆိုအား ငွေလွှဲရန် သို့မဟုတ် သင်၏ ပြန်လည်ရယူရေး စကားစုကို ကြည့်ရန် ခွင့်ပြုပေးပါသည်။
+
+ မလုပ်တော့ပါ
+
+ ကျော်ပါ။
+
ငွေဖြည့်မယ်
သင့် ပိုက်ဆံအိတ် Wallet လိပ်စာ
@@ -4679,7 +4704,7 @@
ကြည့်ရှုမှုများ မရှိသေးပါ
- သင့်စတိုရီများအား မည်သူ ကြည့်ပြီးပြီလဲကို မြင်နိုင်ရန် ဖတ်ပြီးကြောင်းညွှန်ပြမှုကို ဖွင့်ပါ။
+ သင့်စတိုရီများအား ကြည့်ပြီးသူများကို မြင်နိုင်ရန် ဖတ်ပြီးကြောင်းညွှန်ပြမှုကို ဖွင့်ပါ။
ဆက်တင်သို့ သွားရန်
@@ -4692,6 +4717,8 @@
ကြည့်ရှုသူအား ဖယ်ရှားရန်
ပြန်စာများ မရှိသေးပါ
+
+ သင်သည် ဤအဖွဲ့ဝင် မဟုတ်တော့သောကြောင့် ဤစတိုရီကို စာပြန်နိုင်တော့မည် မဟုတ်ပါ။
စတိုရီကို တုံ့ပြန်မှု ပေးခဲ့ပါသည်
@@ -4710,6 +4737,12 @@
ဖျက်မယ်
ကျွန်ုပ်၏ စတိုရီ
+
+
+ - %1$d viewers
+
+
+ View
ဤစတိုရီကို ကြည့်နိုင်မည့်သူများ
@@ -4742,8 +4775,6 @@
ပြန်စာများနှင့် တုံ့ပြန်မှုများကို ခွင့်ပြုရန်
သင့်စတိုရီကို ကြည့်နိုင်သူများအား တုံ့ပြန်မှု ပေးရန်နှင့် ပြန်စာပို့ရန် ခွင့်ပြုပါ
-
- သင့်စတိုရီကို အချို့သူများအတွက် ဝှက်ပါ။ ပုံသေအားဖြင့် သင့်စတိုရီကို သင့် %1$s နှင့် မျှဝေပါသည်
Signal အဆက်အသွယ်များ
@@ -4802,10 +4833,26 @@
ဖော်ပြထားသူများထံသာ ဝေမျှရန်…
ပြီးပါပြီ
+
+ အဖွဲ့ စတိုရီကို ဖယ်ရှားမည်လား။
+
+ \"%1$s\" ကို ဖယ်ရှားသွားပါမည်။
+
+ ဖယ်ရှားမယ်
+
+ သီးသန့် စတိုရီကို ဖျက်မည်လား။
+
+ \"%1$s\" နှင့် ဤစတိုရီအတွက် ဝေမျှထားသည့် အပ်ဒိတ်များကို ဖျက်သွားပါမည်။
+
+ ဖျက်ပါ
+
+ စတိုရီများကို Signal Beta သုံးစွဲသူများအတွက်သာ ရရှိနိုင်ပါသည်။
+
+ သင်သည် စတိုရီတစ်ခုကို ဝေမျှပါက Signal Beta ရှိ လူများသည် ၎င်းကို မြင်ရပါမည်။
စတိုရီတွင် ပေါင်းထည့်မည်လား။
- သင့်စတိုရီတွင် အကြောင်းအရာ ထည့်ခြင်းဖြင့် သင်၏ Signal အဆက်အသွယ်များအား ၎င်းကို ၂၄ နာရီ ကြည့်ရှုခွင့်ပြုပါသည်။ သင့်စတိုရီအား ကြည့်ရှုနိုင်သူများကို ဆက်တင်တွင် ပြောင်းနိုင်ပါသည်။
+ သင့်စတိုရီတွင် ပေါင်းထည့်လိုက်သော အကြောင်းအရာကို သင်၏ Signal အဆက်အသွယ်များအား ၂၄ နာရီ ကြည့်ရှုခွင့်ပြုပါသည်။ သင့်စတိုရီအား ကြည့်ရှုနိုင်သူများကို ဆက်တင်တွင် ပြောင်းနိုင်ပါသည်။
စတိုရီတွင် ပေါင်းထည့်ရန်
@@ -4814,6 +4861,8 @@
စတိုရီကို ပို့၍ မရနိုင်ပါ။ သင့်ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်ကြိုးစားပါ။
ပေးပို့မယ်
+
+ ပိတ်ပြီး ဖျက်ရန်
စတိုရီများကို မျှဝေကြည့်ရှုရန်
@@ -4949,7 +4998,7 @@
ယခု မလုပ်ဆောင်သေးပါ။
- ဖော်ပြထားသူများထံသာ ဝေမျှရန်
+ ဖော်ပြပါထံသာဝေမျှရန်
- သီးသန့် စတိုရီ · ကြည့်ရှုသူ · %1$d ဦး
@@ -4958,6 +5007,10 @@
- အဖွဲ့ စတိုရီ · ကြည့်ရှုသူ · %1$d ဦး
+
+
+ - %1$d အဖွဲ့ဝင်များ
+
- %1$s · ကြည့်ရှုသူ %2$d ဦး
@@ -5088,7 +5141,7 @@
စတိုရီများကို ပိတ်မည်လား။
- စတိုရီများ ဝေမျှခြင်း သို့မဟုတ် ကြည့်ခြင်းများ လုပ်နိုင်တော့မည် မဟုတ်ပါ။ မကြာသေးမီက ပို့ထားသော စတိုရီများကို သက်တမ်းမကုန်မချင်း အခြားသူများက ဆက်လက်မြင်နိုင်ပါမည်။
+ သင်သည် စတိုရီများ ဝေမျှရန် သို့မဟုတ် ကြည့်ရန် လုပ်ဆောင်နိုင်တော့မည် မဟုတ်ပါ။ မကြာသေးမီက သင် ဝေမျှထားသည့် အပ်ဒိတ်များကိုလည်း ဖျက်ပစ်ပါမည်။
စတိုရီ ကိုယ်ပိုင်အချက်အလက်
@@ -5096,7 +5149,7 @@
ဤစတိုရီကို ကြည့်နိုင်မည့်သူများ
- "\"%1$s\" အဖွဲ့ဝင်များသည် ဤစတိုရီကို ကြည့်ခြင်း၊ အကြောင်းပြန်ခြင်းများ လုပ်နိုင်ပါသည်။ အဖွဲ့အတွင်းရှိ ဤချက်(တ်)အတွက် မန်ဘာပလန်ကို အပ်ဒိတ်လုပ်နိုင်ပါသည်။"
+ "%1$s အဖွဲ့ဝင်များသည် ဤစတိုရီကို ကြည့်ခြင်း၊ အကြောင်းပြန်ခြင်းများ လုပ်နိုင်ပါသည်။ အဖွဲ့အတွင်းရှိ ဤချက်(တ်)အတွက် မန်ဘာပလန်ကို အပ်ဒိတ်လုပ်နိုင်ပါသည်။"
အဖွဲ့စတိုရီကို ဖယ်ရှားရန်
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 23d09eb663..4cc90864ca 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -218,7 +218,7 @@
Søk på brukernavn
- Mine stories
+ Mine storyer
Ny story
@@ -673,7 +673,7 @@
Hva er en \"ny\" gruppe?
Nye grupper har funksjoner som @mentions og gruppeadministratorer, og vil støtte enda flere i fremtiden.
- All meldingshistorikk og alle mediefiler fra før oppgradering har blitt tatt vare på.
+ Alle meldingslogger og mediefiler fra før oppgraderingen, har blitt tatt vare på.
Du må akseptere en invitasjon for å bli med i gruppen igjen, og vil ikke få gruppemeldinger før du har akseptert.
- Dette medlemmet må akseptere en invitasjon for å bli med i gruppen igjen, og vil ikke få gruppemeldinger før det har akseptert:
@@ -688,7 +688,7 @@
Oppgrader til \"ny\" gruppe
Oppgrader denne gruppen
Nye grupper har funksjoner som @mentions og gruppeadministratorer, og vil støtte enda flere i fremtiden.
- All meldingshistorikk og alle mediefiler fra før oppgraderingen blir tatt vare på.
+ Alle meldingslogger og mediefiler fra før oppgraderingen, blir tatt vare på.
Det oppstod en nettverksfeil. Prøv igjen senere.
Kunne ikke oppgradere.
@@ -1542,7 +1542,7 @@
Nettverk mislyktes.
Nummer ikke registrert.
Nummeret du ringte støtter ikke krypterte samtaler.
- Ålreit
+ Skjønner
@@ -1960,6 +1960,7 @@
Fra %1$s til deg
Media er ikke lenger tilgjengelig.
Kan ikke finne app som er i stand til å dele dette mediet.
+ Lukk
%1$d nye meldinger i %2$d samtaler
@@ -2343,7 +2344,7 @@
Tidsstempelet er kopiert til utklippstavlen.
- Varsler om storyen din vil vises her.
+ Oppdateringer av storyen din vises her.
@@ -2605,7 +2606,7 @@
Engangsbeløp
Personvern
- Stories
+ Storyer
MMS-brukeragent
Manuelt MMS-oppsett
MMSC-adresse
@@ -2623,7 +2624,7 @@
Betalinger (Beta)
Lengdegrense for samtaler
Behold meldinger
- Slett meldingshistorikk
+ Slett meldingslogg
Koblede enheter
Lys
Mørk
@@ -2657,7 +2658,7 @@
Ved bruk av Wi-Fi
Ved bruk av dataroaming
Automatisk nedlasting av medier
- Meldingshistorikk
+ Meldingslogg
Lagringsbruk
Bilder
Videoer
@@ -2665,12 +2666,12 @@
Lyd
Se gjennom lagring
Slett eldre meldinger?
- Slett meldingshistorikk?
- Dette vil permanent slette all meldingshistorikk og media som er eldre enn %1$sfra denne din enhet.
+ Vil du slette meldingsloggen?
+ Dette vil permanent slette alle meldingslogger og mediefiler som er eldre enn %1$s fra denne enheten.
Dette vil umiddelbart forkorte alle samtaler til de %1$s siste meldingene.
- Dette vil permanent slette all meldingshistorikk og media fra denne din enhet.
- Er du sikker på at du vil slette all meldingshistorikk?
- All meldingshistorikk vil bli permanent slettet. Denne handlingen kan ikke angres.
+ Dette vil permanent slette alle meldingslogger og mediefiler fra denne enheten.
+ Er du sikker på at du vil slette alle meldingslogger?
+ Alle meldingslogger slettes permanent. Denne handlingen kan ikke angres.
Slett alt nå
For alltid
1 år
@@ -2748,10 +2749,14 @@
Tilpass opsjon
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Ikke nå
+
+
+ Sikkerhetsoppsett
+
+ Beskytt pengene dine
+
+ Legg til ekstra sikkerhetstiltak for å forhindre at uvedkommende som får tak i telefonen din, får tilgang til pengene dine. Du kan slå dette av i innstillingene.
+
+ Aktiver betalingslås
+
+ Ikke nå
+
+ Vil du hoppe over dette trinnet?
+
+ Hvis du hopper over dette trinnet, kan alle som har fysisk tilgang til telefonen din overføre penger og se gjenopprettingsfrasen din.
+
+ Avbryt
+
+ Hopp over
+
Legg til penger
Lommebokadressen din
@@ -3976,7 +4001,7 @@
Standard nedtelling for nye samtaler
Sett standard utløpstid for tidsavgrensede meldinger, for nye samtaler startet av deg.
- Styr storiesene dine og hvem som kan se dem
+ Administrer storyene dine og hvem som kan se dem
Sett opp krav om Android-skjermlås eller fingeravtrykk for å overføre penger
Kan ikke slå på betalingslås
@@ -4256,9 +4281,9 @@
Legg til en melding
Raskere videresending
- Videoene vil kuttes ned til klipp på 30 sekunder og sendes som flere stories.
+ Videoene trimmes ned til klipp på 30 sekunder og sendes som flere storyer.
- Videoer som legges ut på stories kan ikke være lengre enn 30 sekunder.
+ Videoer som legges ut på Storyer kan ikke være lenger enn 30 sekunder.
Videresendte meldinger sendes nå umiddelbart.
- Send %1$d melding
@@ -4699,15 +4724,15 @@
Samtaler
- Stories
+ Storyer
99+
- Personvern for stories
+ Personvern for storyer
- Mine stories
+ Mine storyer
- Trykk for å legge til en ny story
+ Trykk for å legge til en story
Ingen nylige oppdateringer å vise.
@@ -4733,9 +4758,9 @@
Trykk for å prøve igjen
- Skjule storyen?
+ Vil du skjule storyen?
- Nye oppdateringer fra %1$s vises ikke øverst på listen over storyer lenger.
+ Nye oppdateringer av storyer fra %1$s vises ikke øverst på listen over storyer lenger.
Skjul
@@ -4752,7 +4777,7 @@
Story fra %1$s
- Slette storyen?
+ Vil du slette storyen?
Dette vil slette storyen for deg og alle du har delt den med.
@@ -4799,6 +4824,8 @@
Fjern seer
Ingen svar ennå
+
+ Du kan ikke svare på denne storyen fordi du ikke er medlem av denne gruppen lenger.
Reagerte på storyen
@@ -4817,6 +4844,13 @@
Slett
Min story
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Disse kan se denne storyen
@@ -4844,15 +4878,13 @@
- %1$d personer
- Velg ut hvem som kan se storyen din. Dette vil ikke påvirke stories som du allerede har delt.
+ Velg hvem som kan se storyen din. Dette vil ikke påvirke storyer som du allerede har delt.
Svar og reaksjoner
Tillat svar og reaksjoner
Gjør det mulig for de som kan se storyen din å reagere og svare
-
- Skjul storyen din fra utvalgte personer. Storyen din deles automatisk med dine %1$s
Signal-kontakter
@@ -4872,7 +4904,7 @@
Vil du fjerne %1$s?
- Denne personen vil ikke kunne se storyen din lenger.
+ Denne personen kan ikke lenger se storyen din.
Fjern
@@ -4880,7 +4912,7 @@
Dette kan ikke gjøres om.
- Endre navn på story
+ Endre navnet på storyen
Navn på story
@@ -4900,7 +4932,7 @@
Skriv eller lim inn en nettadresse
- Del en link med de som ser storyen din
+ Del en lenke med de som ser storyen din
Søk
@@ -4911,18 +4943,36 @@
Del kun med …
Ferdig
+
+ Vil du fjerne gruppestoryen?
+
+ «%1$s» fjernes.
+
+ Fjern
+
+ Vil du slette den private storyen?
+
+ «%1$s» slettes, sammen med alle tilknyttede oppdateringer.
+
+ Slett
+
+ Storyer er kun tilgjengelig for Signal beta-brukere.
+
+ Hvis du deler en story, vises den kun for personer som bruker Signal beta.
- Legge til i story?
+ Vil du legge til i storyen?
- Signal-kontaktene dine kan se det du legger til i story i 24 timer. Du kan velge hvem som kan se storyen din i Innstillinger.
+ Signal-kontaktene dine kan se det du legger til i storyen din i 24 timer. Du kan velge hvem som kan se storyen din, i Innstillinger.
Legg til i story
Rediger seerlisten
- Storyen kunne ikke sendes. Sjekk internettilkoblingen din og prøv igjen.
+ Storyen kunne ikke sendes. Sjekk internettilkoblingen og prøv igjen.
Send
+
+ Slå av og slett
Del og se storyer
@@ -5060,7 +5110,7 @@
Ikke nå
- Del storyen kun med
+ Del kun med
- Privat story · Sett av %1$d
@@ -5071,6 +5121,11 @@
- Gruppestory · Sett av %1$d
- Gruppestory · Sett av %1$d
+
+
+ - %1$d medlem
+ - %1$d medlemmer
+
- %1$s · Sett av %2$d
@@ -5087,11 +5142,11 @@
Vil du fjerne gruppestoryen?
- Dette vil fjerne storyen fra listen. Du vil fremdeles se de andre storyene fra denne gruppen.
+ Dette vil fjerne storyen fra listen. Du kan fremdeles se de andre storyene fra denne gruppen.
Fjern
- Slette storyen?
+ Vil du slette storyen?
Vil du slette den private storyen «%1$s»?
@@ -5139,7 +5194,7 @@
Alle kontaktene er gjennomgått, trykk på Send for å fortsette.
- Du har %1$d kontakter som kan ha installert Signal på nytt eller byttet enhet. Sjekk sikkerhetsnumrene deres eller fjern dem fra storyen din før du deler storyen din med dem.
+ Du har %1$d kontakter som kan ha installert Signal på nytt eller byttet enhet. Du bør sjekke sikkerhetsnumrene deres eller fjern dem fra storyen din før du eventuelt deler den med dem.
Bekreft sikkerhetsnummer
@@ -5194,27 +5249,27 @@
- Stories forsvinner automatisk etter 24 timer. Velg hvem som kan se storyen din, eller del nye stories med utvalgte personer og grupper.
+ Storyer forsvinner automatisk etter 24 timer. Velg hvem som kan se storyen din, eller del nye storyer med utvalgte personer og grupper.
- Skru av stories
+ Slå av storyer
- Hvis du velger å skru av stories, kan du verken se eller dele stories.
+ Hvis du velger å slå av storyer, kan du verken se eller dele storyer.
- Skru på stories
+ Slå på storyer
- Del dine egne og se andre personers stories. De forsvinner automatisk etter 24 timer.
+ Del dine egne og se andre personers storyer. De forsvinner automatisk etter 24 timer.
- Vil du skru av stories?
+ Vil du slå av storyer?
- Du vil ikke lenger kunne se og dele stories. Storiesene du har delt vil fortsatt være synlige for kontaktene dine til de utløper.
+ Du kan ikke lenger dele eller se storyer. Oppdateringer av storyer som du nylig har delt, slettes også.
- Personvern for stories
+ Personvern for storyer
Disse kan se denne storyen
- "Medlemmene av %1$s kan se og svare på denne storyen. Du kan endre hvem som er med i denne samtalen inne i gruppen."
+ "Medlemmene av %1$s kan se og svare på denne storyen. Du kan endre hvem som er med i denne samtalen, inne i gruppen."
Fjern gruppestoryen
@@ -5229,7 +5284,7 @@
Overfør SMS-meldingene dine
- Du kan eksportere SMS-meldingene dine til minnet på telefonen din. Dette gir andre SMS-apper på telefonen din tilgang til og mulighet til å importere dem. Dette oppretter ikke en delbar fil av SMS-meldingsloggen din.
+ Du kan eksportere SMS-meldingene dine til minnet på telefonen din. Dette gir andre SMS-apper på telefonen din tilgang til og mulighet til å importere dem. Det oppretter ikke en delbar fil av SMS-meldingsloggen din.
Fortsett
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index d6f0d54a91..7b3d656db5 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -1960,6 +1960,7 @@
%1$s naar jou
Media niet langer beschikbaar.
Geen app gevonden waarmee dit bestand met anderen gedeeld kan worden.
+ Sluiten
%1$d nieuwe berichten in %2$d gesprekken
@@ -2666,11 +2667,11 @@
Alle bestanden weergeven
Oude berichten wissen?
Berichtengeschiedenis wissen?
- Dit zal pertinent alle gespreksgeschiedenis en media ouder dan %1$s van dit apparaat wissen.
+ Dit zal alle gespreksgeschiedenis en media ouder dan %1$s permanent van dit apparaat wissen.
Dit zal direct alle gesprekken inkorten tot de %1$s meest recente berichten.
- Dit zal pertinent al je gespreksgeschiedenis en media van dit apparaat wissen.
+ Dit zal al je gespreksgeschiedenis en media van dit apparaat permanent wissen.
Weet je zeker dat je alle gespreksgeschiedenis wilt wissen?
- Alle gespreksgeschiedenis zal pertinent worden gewist. Dit kan niet ongedaan worden gemaakt.
+ Alle gespreksgeschiedenis zal permanent worden gewist. Dit kan niet ongedaan worden gemaakt.
Nu alles wissen
Voor altijd
1 jaar
@@ -2748,10 +2749,14 @@
Instelling personaliseren
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
Niet nu
+
+
+ Veiligheidsinstellingen
+
+ Bescherm je geld
+
+ Voorkom met een extra beveiligingslaag dat iemand anders dan jij via jouw telefoon toegang heeft tot je geld. In instellingen kun je deze optie uitschakelen.
+
+ Betalingsvergrendeling inschakelen
+
+ Niet nu
+
+ Deze stap overslaan?
+
+ Als je deze stap overslaat, kan iemand met fysieke toegang tot je telefoon geld overmaken of je herstelzin bekijken.
+
+ Annuleren
+
+ Overslaan
+
Krediet toevoegen
Het adres van je portemonnee
@@ -4799,6 +4824,8 @@
Gebruiker verwijderen
Nog geen reacties
+
+ Je kunt niet reageren op dit verhaal, omdat je geen lid van deze groep meer bent.
Reageerde op dit verhaal
@@ -4817,6 +4844,13 @@
Wissen
Mijn verhaal
+
+
+ - %1$d viewer
+ - %1$d viewers
+
+
+ View
Wie kan dit verhaal bekijken
@@ -4851,8 +4885,6 @@
Reacties toelaten
Sta personen die je verhaal mogen zien ook toe om te reageren
-
- Met deze optie kun je je verhaal voor specifieke personen verbergen. Je verhaal is standaard zichtbaar voor al je %1$s
Signal-contacten
@@ -4864,7 +4896,7 @@
Hem of haar in je systeemcontactenlijst te hebben staan
- "Je Signal-kennissen kunnen jouw profielnaam en -foto zien en kunnen je “Mijn verhaal”-plaatsingen zien tenzij je die specifiek voor hem of haar verbergt."
+ "Je Signal-contacten kunnen jouw profielnaam en -foto zien en kunnen je “Mijn verhaal”-plaatsingen zien tenzij je die specifiek voor hem of haar verbergt."
Persoon toevoegen
@@ -4911,10 +4943,26 @@
Deel alleen met…
Klaar
+
+ Verhaal verwijderen?
+
+ \"%1$s\" wordt verwijderd.
+
+ Overschrijvingsdetails wissen
+
+ Privéverhaal verwijderen?
+
+ \"%1$s\" en updates die op dit verhaal zijn gedeeld, worden verwijderd.
+
+ Wissen
+
+ Verhalen is alleen beschikbaar voor Signal-beta-gebruikers.
+
+ Als je een verhaal deelt, is dit alleen beschikbaar voor mensen die op Signal-beta zitten.
Toevoegen aan verhaal?
- Wanneer je een nieuw deel aan je verhaal toevoegt dan kunnen je Signal-kennissen dat deel van je verhaal voor de komende 24 uur bekijken. Je kunt in de instellingen aanpassen welke personen je verhaal kunnen bekijken.
+ Wanneer je een nieuw deel aan je verhaal toevoegt dan kunnen je Signal-contacten dat deel van je verhaal voor de komende 24 uur bekijken. Je kunt in de instellingen aanpassen welke personen je verhaal kunnen bekijken.
Een verhaal toevoegen
@@ -4923,6 +4971,8 @@
Je verhaal kan niet worden geüpload. Ga na dat je apparaat met het internet is verbonden en probeer het opnieuw.
Uploaden
+
+ Uitschakelen en verwijderen
Verhaal weergeven & doorsturen
@@ -5071,6 +5121,11 @@
- Groepsverhaal · door %1$d persoon gezien
- Groepsverhaal · door %1$d personen gezien
+
+
+ - %1$d persoon
+ - %1$d personen
+
- %1$s · %2$d keer bekeken.
@@ -5206,7 +5261,7 @@
Verhalen uitzetten?
- Je zult niet langer verhalen kunnen delen of bekijken. Verhalen die je recent verzonden hebt zullen nog steeds zichtbaar zijn tot deze verlopen.
+ Je kunt geen verhalen meer delen of bekijken. Updates die je recent op je verhaal hebt gedeeld, worden ook gewist.
Verhaalprivacy
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index bafad4b706..13852a61b1 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -193,7 +193,7 @@
ਅੱਪਡੇਟ ਕਰੋ
ਅੱਪਡੇਟ ਨਾ ਕਰੋ
ਚੇਤਾਵਨੀ
- Signal ਦੇ ਤੁਹਾਡੇ ਸੰਸਕਰਣ ਦੀ ਮਿਆਦ ਮੁੱਕ ਗਈ ਹੈ। ਤੁਸੀਂ ਆਪਣਾ ਸੁਨੇਹਾ ਇਤਿਹਾਸ ਵੇਖ ਸਕਦੇ ਹੋ ਪਰ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਅੱਪਡੇਟ ਨਹੀਂ ਕਰਦੇ ਉਦੋਂ ਤੱਕ ਤੁਸੀਂ ਸੁਨੇਹੇ ਭੇਜ ਜਾਂ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰ ਸਕੋਗੇ।
+ ਤੁਹਾਡੇ Signal ਦੇ ਵਰਜ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ। ਤੁਸੀਂ ਆਪਣੇ ਪੁਰਾਣੇ ਸੁਨੇਹੇ ਦੇਖ ਸਕਦੇ ਹੋ ਪਰ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣਾ ਵਰਜ਼ਨ ਅੱਪਡੇਟ ਨਹੀਂ ਕਰਦੇ ਉਦੋਂ ਤੱਕ ਤੁਸੀਂ ਨਾ ਹੀ ਸੁਨੇਹੇ ਭੇਜ ਸਕੋਗੇ ਅਤੇ ਨਾ ਹੀ ਪ੍ਰਾਪਤ ਕਰ ਸਕੋਗੇ।
ਕੋਈ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਨਹੀਂ ਲੱਭਿਆ।
@@ -218,7 +218,7 @@
ਵਰਤੋਂਕਾਰ-ਨਾਂ ਨਾਲ ਲੱਭੋ
- ਮੇਰੀਆਂ ਕਹਾਣੀਆਂ
+ ਮੇਰੀਆਂ ਸਟੋਰੀਆਂ
ਨਵੀਂ ਸਟੋਰੀ
@@ -673,7 +673,7 @@
ਨਵੇਂ ਗਰੁੱਪ ਕੀ ਹਨ?
ਨਵੇਂ ਗਰੁੱਪਾਂ ਵਿੱਚ @mentions ਅਤੇ ਗਰੁੱਪ ਐਡਮਿਨ ਵਰਗੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਹਨ, ਅਤੇ ਭਵਿੱਖ ਵਿੱਚ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਨਗੇ।
- ਸੁਨੇਹਿਆਂ ਦੇ ਸਾਰੇ ਪਿਛੋਕੜ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਰੱਖ ਲਿਆ ਗਿਆ ਹੈ।
+ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹਿਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਸੰਭਾਲ ਕੇ ਰੱਖ ਲਿਆ ਗਿਆ ਹੈ।
ਤੁਹਾਨੂੰ ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਦੁਬਾਰਾ ਸ਼ਾਮਲ ਹੋਣ ਦੇ ਸੱਦੇ ਨੂੰ ਮਨਜ਼ੂਰ ਕਰਨਾ ਪਵੇਗਾ, ਅਤੇ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮਨਜ਼ੂਰ ਨਹੀਂ ਕਰਦੇ ਉਦੋਂ ਤੱਕ ਗਰੁੱਪ ਦੇ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੋਣਗੇ।
- ਇਸ ਮੈਂਬਰ ਨੂੰ ਇਸ ਗਰੁੱਪ ਵਿੱਚ ਦੁਬਾਰਾ ਸ਼ਾਮਲ ਹੋਣ ਦੇ ਸੱਦੇ ਨੂੰ ਮਨਜ਼ੂਰ ਕਰਨਾ ਪਵੇਗਾ, ਅਤੇ ਜਦੋਂ ਤਕ ਉਹ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ ਉਦੋਂ ਤੱਕ ਉਸ ਨੂੰ ਗਰੁੱਪ ਦੇ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੋਣਗੇ।
@@ -688,7 +688,7 @@
ਨਵੇਂ ਗਰੁੱਪ ਵਿੱਚ ਅੱਪਗ੍ਰੇਡ ਕਰੋ
ਇਸ ਗਰੁੱਪ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕਰੋ
ਨਵੇਂ ਗਰੁੱਪਾਂ ਵਿੱਚ @mentions ਅਤੇ ਗਰੁੱਪ ਐਡਮਿਨ ਵਰਗੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਹਨ, ਅਤੇ ਭਵਿੱਖ ਵਿੱਚ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਨਗੇ।
- ਸੁਨੇਹਿਆਂ ਦੇ ਸਾਰੇ ਪਿਛੋਕੜ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਰੱਖ ਲਿਆ ਜਾਵੇਗਾ।
+ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹਿਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਸੰਭਾਲ ਕੇ ਰੱਖ ਲਿਆ ਜਾਵੇਗਾ।
ਨੈੱਟਵਰਕ ਤਰੁੱਟੀ ਹੋਈ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।
ਅੱਪਗ੍ਰੇਡ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।
@@ -1524,7 +1524,7 @@
ਤੁਸੀਂ
- ਮੇਰੀ ਕਹਾਣੀ
+ ਮੇਰੀ ਸਟੋਰੀ
ਪਾਬੰਦੀ ਲਾਓ
@@ -1542,7 +1542,7 @@
ਨੈੱਟਵਰਕ ਅਸਫ਼ਲ!
ਨੰਬਰ ਰਜਿਸਟਰ ਨਹੀਂ!
ਜੋ ਨੰਬਰ ਤੁਸੀਂ ਡਾਇਲ ਕੀਤਾ ਸੀ ਉਹ ਸੁਰੱਖਿਅਤ ਆਵਾਜ਼ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ!
- ਮਿਲ ਗਿਆ
+ ਸਮਝ ਗਏ
@@ -1960,6 +1960,7 @@
%1$s ਨੇ ਤੁਹਾਨੂੰ
ਮੀਡੀਆ ਹੁਣ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।
ਇਸ ਮੀਡੀਆ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਦੇ ਯੋਗ ਕੋਈ ਐਪ ਨਹੀਂ ਹੈ।
+ ਬੰਦ ਕਰੋ
%2$d ਗੱਲਬਾਤਾਂ ਵਿੱਚ %1$d ਨਵੇਂ ਸੁਨੇਹੇ
@@ -2198,9 +2199,9 @@
ਤੁਸੀਂ
ਅਸਲ ਸੁਨੇਹਾ ਨਹੀਂ ਲੱਭਿਆ
- %1$s ਕਹਾਣੀ
+ %1$s · ਸਟੋਰੀ
- ਤੁਹਾਡੀ ਕਹਾਣੀ
+ ਤੁਹਾਡੀ ਸਟੋਰੀ
ਹੁਣ ਮੌਜੂਦ ਨਹੀਂ ਹੈ
@@ -2605,7 +2606,7 @@
ਇੱਕ ਵਾਰ ਦਾਨ
ਪਰਦੇਦਾਰੀ
- ਕਹਾਣੀਆਂ
+ ਸਟੋਰੀਆਂ
MMS ਯੂਜ਼ਰ ਏਜੰਟ
ਦਸਤੀ MMS ਸੈਟਿੰਗਾਂ
MMSC URL
@@ -2623,7 +2624,7 @@
ਭੁਗਤਾਨ (ਬੀਟਾ)
ਗੱਲਬਾਤ ਦੀ ਲੰਬਾਈ ਸੀਮਾ
ਸੁਨੇਹੇ ਰੱਖੋ
- ਸੁਨੇਹਾ ਅਤੀਤ ਮਿਟਾਓ
+ ਪੁਰਾਣੇ ਸੁਨੇਹੇ ਮਿਟਾਓ
ਲਿੰਕ ਕੀਤੀਆਂ ਡਿਵਾਈਸਾਂ
ਲਾਈਟ
ਹਨੇਰਾ
@@ -2657,7 +2658,7 @@
ਵਾਈ-ਫਾਈ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ
ਰੋਮਿੰਗ ਸਮੇਂ
ਮੀਡੀਆ ਆਟੋ-ਡਾਊਨਲੋਡ
- ਸੁਨੇਹੇ ਦਾ ਅਤੀਤ
+ ਪੁਰਾਣੇ ਸੁਨੇਹੇ
ਸਟੋਰੇਜ਼ ਦੀ ਵਰਤੋਂ
ਫ਼ੋਟੋ
ਵੀਡੀਓ
@@ -2665,12 +2666,12 @@
ਆਡੀਓ
ਸਟੋਰੇਜ਼ ਦੀ ਝਲਕ
ਪੁਰਾਣੇ ਸੁਨੇਹੇ ਹਟਾਉਣੇ ਹਨ?
- ਸੁਨੇਹਾ ਅਤੀਤ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?
- ਇਹ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਤੋਂ ਸਾਰੇ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਦਾ ਪਿਛੋਕੜ ਅਤੇ ਮੀਡੀਆ ਸਥਾਈ ਤੌਰ ਉੱਤੇ ਹਟਾ ਦੇਵੇਗਾ ਜੋ %1$s ਤੋਂ ਪੁਰਾਣੇ ਹਨ।
+ ਪੁਰਾਣੇ ਸੁਨੇਹੇ ਮਿਟਾਉਣੇ ਹਨ?
+ ਅਜਿਹਾ ਕਰਨ \'ਤੇ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਵਿੱਚੋਂ ਉਹ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹੇ ਅਤੇ ਮੀਡੀਆ ਸਥਾਈ ਤੌਰ \'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ ਜੋ %1$s ਤੋਂ ਪੁਰਾਣਾ ਹੈ।
ਉਹ %1$s ਸਭ ਤੋ ਤਾਜ਼ਾ ਸੁਨੇਹਿਆਂ ਲਈ ਸਾਰੀਆਂ ਗੱਲਬਾਤਾਂ ਦੀ ਸਥਾਈ ਤੌਰ ’ਤੇ ਕਾਂਟ-ਛਾਂਟ ਕਰ ਦੇਵੇਗਾ।
- ਇਹ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਤੋਂ ਸਾਰੇ ਸੁਨੇਹੇ ਅਤੀਤ ਤੇ ਮੀਡੀਏ ਨੂੰ ਪੱਕੇ ਤੌਰ ਉੱਤੇ ਹਟਾ ਦੇਵੇਗਾ।
- ਕੀ ਤੁਸੀਂ ਸਾਰੇ ਸੁਨੇਹੇ ਅਤੀਤ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?
- ਸਾਰੇ ਸੁਨੇਹਾ ਅਤੀਤ ਨੂੰ ਪੱਕੇ ਤੌਰ ਉੱਤੇ ਹਟਾਇਆ ਜਾਵੇਗਾ। ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਪਰਤਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ।
+ ਅਜਿਹਾ ਕਰਨ \'ਤੇ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਵਿੱਚੋਂ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹੇ ਅਤੇ ਮੀਡੀਆ ਸਥਾਈ ਤੌਰ \'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।
+ ਕੀ ਤੁਸੀਂ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹਿਆਂ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?
+ ਸਾਰੇ ਪੁਰਾਣੇ ਸੁਨੇਹਿਆਂ ਨੂੰ ਸਥਾਈ ਤੌਰ \'ਤੇ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਤੁਸੀਂ ਅਣ-ਕੀਤਾ ਨਹੀਂ ਕਰ ਸਕੋਗੇ।
ਹੁਣੇ ਸਾਰੇ ਹਟਾਓ
ਹਮੇਸ਼ਾਂ
1 ਸਾਲ
@@ -2748,10 +2749,14 @@
ਕਸਟਮਾਈਜ਼ ਚੋਣ
+ Turn off stories (with stories on disk)
+ Turn off stories
+ Delete private story
Hide story
Story or profile selector
Stories dialog launcher
Retry send
+ Remove group story
Clear onboarding state
Clears onboarding flag and triggers download of onboarding stories.
Internal Preferences
@@ -2904,6 +2909,26 @@
ਹਾਲੇ ਨਹੀਂ
+
+
+ ਸੁਰੱਖਿਆ ਸੈੱਟਅੱਪ
+
+ ਆਪਣੇ ਫੰਡ ਦੀ ਰੱਖਿਆ ਕਰੋ
+
+ ਸੁਰੱਖਿਆ ਦੀ ਇੱਕ ਵਾਧੂ ਪਰਤ ਜੋੜ ਕੇ ਕਿਸੇ ਵੀ ਵਿਅਕਤੀ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਤੁਹਾਡੇ ਫੰਡ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਣ ਵਿੱਚ ਮਦਦ ਕਰੋ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਵਿਕਲਪ ਨੂੰ ਅਸਮਰੱਥ ਕਰ ਸਕਦੇ ਹੋ।
+
+ ਭੁਗਤਾਨ ਲਾਕ ਨੂੰ ਸਮਰੱਥ ਕਰੋ
+
+ ਹੁਣੇ ਨਹੀਂ
+
+ ਕੀ ਇਸ ਕਦਮ ਨੂੰ ਛੱਡਣਾ ਹੈ?
+
+ ਜੇ ਤੁਸੀਂ ਇਸ ਕਦਮ ਨੂੰ ਛੱਡ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਕੋਈ ਵੀ ਵਿਅਕਤੀ ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਚੁੱਕ ਕੇ ਫੰਡ ਟ੍ਰਾਂਸਫਰ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਤੁਹਾਡੇ ਰਿਕਵਰੀ ਵਾਕ ਨੂੰ ਦੇਖ ਸਕਦਾ ਹੈ।
+
+ ਰੱਦ ਕਰੋ
+
+ ਛੱਡੋ
+
ਫੰਡ ਸ਼ਾਮਲ ਕਰੋ
ਤੁਹਾਡੇ ਵਾਲਟ ਦਾ ਸਿਰਨਾਵਾਂ
@@ -3976,7 +4001,7 @@
ਨਵੀਆਂ ਚੈਟਾਂ ਲਈ ਡਿਫੌਲਟ ਟਾਈਮਰ
ਤੁਹਾਡੇ ਦੁਆਰਾ ਸ਼ੁਰੂ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਨਵੀਆਂ ਚੈਟਾਂ ਲਈ ਅਲੋਪ ਹੋਣ ਵਾਲੇ ਸੁਨੇਹੇ ਦਾ ਡਿਫੌਲਟ ਟਾਈਮਰ ਤੈਅ ਕਰੋ।
- ਆਪਣੀਆਂ ਸਟੋਰੀਆਂ ਨੂੰ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਕੌਣ ਦੇਖ ਸਕਦਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰੋ
+ ਆਪਣੀਆਂ ਸਟੋਰੀਆਂ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਕੌਣ ਦੇਖ ਸਕਦਾ ਹੈ, ਇਹ ਪ੍ਰਬੰਧਿਤ ਕਰੋ
ਫੰਡ ਟ੍ਰਾਂਸਫਰ ਕਰਨ ਲਈ Android ਸਕ੍ਰੀਨ ਲਾਕ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਨੂੰ ਲਾਜ਼ਮੀ ਬਣਾਓ।
ਭੁਗਤਾਨ ਲਾਕ ਨੂੰ ਸਮਰੱਥ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ
@@ -4258,7 +4283,7 @@
ਵੀਡੀਓ ਨੂੰ ਕੱਟ ਕੇ 30 ਸਕਿੰਟ ਦੀਆਂ ਕਲਿੱਪਾਂ ਬਣਾਈਆਂ ਜਾਣਗੀਆਂ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਕਈ ਸਟੋਰੀਆਂ ਦੇ ਰੂਪ ਵਿੱਚ ਭੇਜਿਆ ਜਾਵੇਗਾ।
- ਸਟੋਰੀ ਵਿੱਚ ਭੇਜੇ ਗਏ ਵੀਡੀਓ 30 ਸਕਿੰਟ ਤੋਂ ਲੰਮੇ ਨਹੀਂ ਹੋਣੇ ਚਾਹੀਦੇ।
+ ਸਟੋਰੀ ਵਿੱਚ ਭੇਜੇ ਗਏ ਵੀਡੀਓ 30 ਸਕਿੰਟ ਤੋਂ ਲੰਮੇ ਨਹੀਂ ਹੋ ਸਕਦੇ।
ਅੱਗੇ ਭੇਜੇ ਸੁਨੇਹੇ ਹੁਣ ਫ਼ੌਰਨ ਭੇਜੇ ਜਾਂਦੇ ਹਨ।